@tsdraw/core 0.4.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/utils/pathCodec.ts","../src/store/documentStore.ts","../src/store/stateNode.ts","../src/canvas/viewport.ts","../src/utils/colors.ts","../src/canvas/renderer.ts","../src/input/inputManager.ts","../src/tools/toolManager.ts","../src/tools/pen/states/PenIdleState.ts","../src/utils/vec.ts","../src/tools/pen/states/PenDrawingState.ts","../src/tools/eraser/states/EraserIdleState.ts","../src/utils/geometry.ts","../src/tools/eraser/eraserHitTest.ts","../src/tools/eraser/states/EraserPointingState.ts","../src/tools/eraser/states/EraserErasingState.ts","../src/tools/select/states/SelectIdleState.ts","../src/tools/hand/states/HandIdleState.ts","../src/tools/hand/states/HandDraggingState.ts","../src/editor/Editor.ts","../src/tools/select/selectHelpers.ts"],"names":["getShapeBounds"],"mappings":";;;AAuDO,IAAM,aAAA,GAA2C;AAAA,EACtD,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,EAAA,EAAI;AACN;AAGO,IAAM,qBAAA,GAAwB;AAG9B,IAAM,cAAA,GAAyC;AAAA,EACpD,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,cAAA,EAAgB,SAAA;AAAA,EAChB,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,YAAA,EAAc,SAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,aAAA,EAAe,SAAA;AAAA,EACf,WAAA,EAAa,SAAA;AAAA,EACb,GAAA,EAAK,SAAA;AAAA,EACL,KAAA,EAAO;AACT;AAGO,IAAM,oBAAA,GAAuB;;;AChF7B,SAAS,aAAa,MAAA,EAAwB;AACnD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AACjC;AAGO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AACjC,IAAA,MAAM,MAAc,EAAC;AACrB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AACtC,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAAA,QACb,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA;AAAA,QACjB,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,CAAC;AAAA,OACb,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,SAAS,iBAAiB,IAAA,EAA2B;AAC1D,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAK,IAAA;AACpC;AAEO,SAAS,gBAAgB,IAAA,EAA2B;AACzD,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,OAAO,IAAI,MAAA,GAAS,CAAA,GAAI,IAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,IAAA;AACjD;AAGO,SAAS,kBAAA,CACd,QAAA,EACA,EAAA,EACA,EAAA,EAC4B;AAC5B,EAAA,MAAM,MAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,GAAG,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,EAAG,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;AChDO,IAAM,gBAAN,MAAoB;AAAA,EACjB,KAAA,GAAmB;AAAA,IACzB,EAAA,EAAI,QAAA;AAAA,IACJ,QAAQ,EAAC;AAAA,IACT,iBAAiB;AAAC,GACpB;AAAA,EACQ,QAAmB,EAAC;AAAA,EAE5B,OAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,SAAS,EAAA,EAAgC;AACvC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,0BAAA,GAAsC;AACpC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC/E,IAAA,OAAO,IAAA,CACJ,GAAA,CAAI,CAAC,EAAA,KAAO,KAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAC,CAAA,CACjC,MAAA,CAAO,CAAC,CAAA,KAAkB,KAAK,IAAI,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,mCAAA,GAA+C;AAC7C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,0BAAA,EAA4B,EAAE,OAAA,EAAQ;AAAA,EACxD;AAAA,EAEA,kBAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAAA,EACvC;AAAA,EAEA,iBAAiB,GAAA,EAAsB;AACrC,IAAA,IAAA,CAAK,MAAM,eAAA,GAAkB,GAAA;AAAA,EAC/B;AAAA,EAEA,YAAY,KAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAAA,EAC1B;AAAA,EAEA,WAAA,CAAY,IAAa,OAAA,EAA+B;AACtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AACrC,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,EAAE,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,GAAG,OAAA,EAAS,EAAA,EAAG;AAAA,EACxD;AAAA,EAEA,aAAa,GAAA,EAAsB;AACjC,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAC3B,MAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,MAAM,EAAE,CAAA;AAAA,IAChD;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,GAAA,CAAI,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EACxF;AAAA,EAEA,oBAAA,GAAgC;AAC9B,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,oBAAoB,GAAA,EAA+E;AACjG,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAa;AAC7B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,0BAAA,EAA2B,EAAG;AACrD,MAAA,MAAM,CAAA,GAAI,eAAe,KAAK,CAAA;AAC9B,MAAA,IACE,CAAA,CAAE,IAAA,IAAQ,GAAA,CAAI,IAAA,IACd,EAAE,IAAA,IAAQ,GAAA,CAAI,IAAA,IACd,CAAA,CAAE,QAAQ,GAAA,CAAI,IAAA,IACd,CAAA,CAAE,IAAA,IAAQ,IAAI,IAAA,EACd;AACA,QAAA,GAAA,CAAI,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEA,SAAS,eAAe,KAAA,EAA0E;AAChG,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAE;AAAA,EACtE;AACA,EAAA,MAAM,GAAA,GAAM,mBAAmB,KAAA,CAAM,KAAA,CAAM,UAAU,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACrE,EAAA,IAAI,IAAI,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,GAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,MAAM,CAAA,EAAE;AAC1F,EAAA,IAAI,IAAA,GAAO,GAAA,CAAI,CAAC,CAAA,CAAG,CAAA;AACnB,EAAA,IAAI,IAAA,GAAO,GAAA,CAAI,CAAC,CAAA,CAAG,CAAA;AACnB,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,EAC3B;AACA,EAAA,MAAM,SAAS,aAAA,CAAc,KAAA,CAAM,MAAM,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,KAAA;AAC7D,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAO;AAC9F;;;ACxEO,IAAe,YAAf,MAAyB;AAAA,EAG9B,WAAA,CACY,KACA,MAAA,EACV;AAFU,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACT;AAAA,EALH,OAAO,EAAA,GAAa,MAAA;AAAA,EAOpB,QAAQ,KAAA,EAAuC;AAAA,EAAC;AAAA,EAChD,MAAA,CAAO,OAAiC,GAAA,EAAoB;AAAA,EAAC;AAAA,EAC7D,cAAc,KAAA,EAAmC;AAAA,EAAC;AAAA,EAClD,cAAc,KAAA,EAAmC;AAAA,EAAC;AAAA,EAClD,WAAA,GAAoB;AAAA,EAAC;AAAA,EACrB,UAAU,KAAA,EAA2B;AAAA,EAAC;AAAA,EACtC,QAAQ,KAAA,EAA2B;AAAA,EAAC;AAAA,EACpC,QAAA,GAAiB;AAAA,EAAC;AAAA,EAClB,WAAA,GAAoB;AAAA,EAAC;AACvB;;;ACvCO,SAAS,cAAA,GAA2B;AACzC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA,EAAE;AAC/B;AAGO,SAAS,YAAA,CAAa,QAAA,EAAoB,OAAA,EAAiB,OAAA,EAA2C;AAC3G,EAAA,OAAO;AAAA,IACL,CAAA,EAAA,CAAI,OAAA,GAAU,QAAA,CAAS,CAAA,IAAK,QAAA,CAAS,IAAA;AAAA,IACrC,CAAA,EAAA,CAAI,OAAA,GAAU,QAAA,CAAS,CAAA,IAAK,QAAA,CAAS;AAAA,GACvC;AACF;AAGO,SAAS,YAAA,CAAa,QAAA,EAAoB,KAAA,EAAe,KAAA,EAAyC;AACvG,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS,CAAA;AAAA,IACpC,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS;AAAA,GACtC;AACF;AAEO,SAAS,WAAA,CACd,UACA,OAAA,EACU;AACV,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,OAAA,CAAQ,CAAA,IAAK,QAAA,CAAS,CAAA;AAAA,IACzB,CAAA,EAAG,OAAA,CAAQ,CAAA,IAAK,QAAA,CAAS,CAAA;AAAA,IACzB,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,QAAA,CAAS;AAAA,GACjC;AACF;AAEO,SAAS,WAAA,CAAY,QAAA,EAAoB,EAAA,EAAY,EAAA,EAAsB;AAChF,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,CAAA,EAAG,QAAA,CAAS,IAAI,EAAA,EAAI,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,EAAA,EAAG;AAC/D;AAEO,SAAS,YAAA,CAAa,QAAA,EAAoB,MAAA,EAAgB,OAAA,EAAkB,OAAA,EAA4B;AAC7G,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAG,QAAA,CAAS,IAAA,GAAO,MAAM,CAAC,CAAA;AAC9D,EAAA,IAAI,OAAA,IAAW,IAAA,IAAQ,OAAA,IAAW,IAAA,EAAM;AACtC,IAAA,OAAO,EAAE,GAAG,QAAA,EAAU,IAAA,EAAK;AAAA,EAC7B;AACA,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC1D,EAAA,MAAM,CAAA,GAAI,OAAA,GAAU,UAAA,CAAW,CAAA,GAAI,IAAA;AACnC,EAAA,MAAM,CAAA,GAAI,OAAA,GAAU,UAAA,CAAW,CAAA,GAAI,IAAA;AACnC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,EAAK;AACtB;;;AC/CO,SAAS,iBAAA,CAAkB,YAAoB,KAAA,EAAkC;AACtF,EAAA,MAAM,YAAA,GAAe,eAAe,UAAU,CAAA;AAC9C,EAAA,IAAI,CAAC,cAAc,OAAO,UAAA;AAC1B,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,YAAA;AAC9B,EAAA,OAAO,sBAAsB,YAAY,CAAA;AAC3C;AAGA,SAAS,sBAAsB,KAAA,EAAuB;AACpD,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AAEjB,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,CAAA,EAAG,MAAM,GAAA,CAAI,CAAA;AAAA,IACb,CAAA,EAAG,MAAM,GAAA,CAAI,CAAA;AAAA,IACb,CAAA,EAAG,MAAM,GAAA,CAAI;AAAA,GACf;AACA,EAAA,MAAM,MAAM,QAAA,CAAS,QAAA,CAAS,GAAG,QAAA,CAAS,CAAA,EAAG,SAAS,CAAC,CAAA;AACvD,EAAA,MAAM,OAAA,GAAU,UAAU,GAAA,CAAI,CAAA,GAAI,OAAO,GAAA,EAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA;AAE1D,EAAA,OAAO,SAAS,OAAA,CAAQ,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AACjD;AAEA,SAAS,cAAc,KAAA,EAA2D;AAChF,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAC5C,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,GAAG,GAAG,OAAO,IAAA;AAExC,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,SAAS,UAAA,CAAW,CAAC,IAAK,UAAA,CAAW,CAAC,GAAI,EAAE,CAAA;AAAA,MAC/C,CAAA,EAAG,SAAS,UAAA,CAAW,CAAC,IAAK,UAAA,CAAW,CAAC,GAAI,EAAE,CAAA;AAAA,MAC/C,CAAA,EAAG,SAAS,UAAA,CAAW,CAAC,IAAK,UAAA,CAAW,CAAC,GAAI,EAAE;AAAA,KACjD;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,OAAO;AAAA,IACL,GAAG,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IACtC,GAAG,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IACtC,GAAG,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE;AAAA,GACxC;AACF;AAEA,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AACzD,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC3C;AAEA,SAAS,MAAM,KAAA,EAAuB;AACpC,EAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACnF;AAEA,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAgD;AACtF,EAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,EAAA,MAAM,QAAQ,CAAA,GAAI,GAAA;AAClB,EAAA,MAAM,OAAO,CAAA,GAAI,GAAA;AACjB,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,OAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,OAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAQ,UAAA,GAAa,UAAA;AAC3B,EAAA,MAAM,SAAA,GAAA,CAAa,aAAa,UAAA,IAAc,CAAA;AAE9C,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,SAAA,EAAU;AAAA,EACpC;AAEA,EAAA,MAAM,UAAA,GACJ,YAAY,GAAA,GAAM,KAAA,IAAS,IAAI,UAAA,GAAa,UAAA,CAAA,GAAc,SAAS,UAAA,GAAa,UAAA,CAAA;AAElF,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,eAAe,GAAA,EAAK;AACtB,IAAA,GAAA,GAAA,CAAA,CAAQ,QAAQ,IAAA,IAAQ,KAAA,IAAS,KAAA,GAAQ,IAAA,GAAO,IAAI,CAAA,CAAA,IAAM,EAAA;AAAA,EAC5D,CAAA,MAAA,IAAW,eAAe,KAAA,EAAO;AAC/B,IAAA,GAAA,GAAA,CAAA,CAAQ,IAAA,GAAO,GAAA,IAAO,KAAA,GAAQ,CAAA,IAAK,EAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,GAAA,GAAA,CAAA,CAAQ,GAAA,GAAM,KAAA,IAAS,KAAA,GAAQ,CAAA,IAAK,EAAA;AAAA,EACtC;AAEA,EAAA,OAAO,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,UAAA,EAAY,GAAG,SAAA,EAAU;AAC/C;AAEA,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAgD;AACtF,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,MAAM,UAAU,CAAA,GAAI,GAAA;AACpB,IAAA,OAAO,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAQ;AAAA,EAC9C;AAEA,EAAA,MAAM,UAAU,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA;AAC3C,EAAA,MAAM,aAAa,CAAA,GAAI,EAAA;AACvB,EAAA,MAAM,IAAI,MAAA,IAAU,CAAA,GAAI,KAAK,GAAA,CAAK,UAAA,GAAa,IAAK,CAAC,CAAA,CAAA;AACrD,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,IAAI,UAAA,IAAc,CAAA,IAAK,UAAA,GAAa,CAAA,EAAG;AACrC,IAAA,GAAA,GAAM,MAAA;AACN,IAAA,KAAA,GAAQ,CAAA;AAAA,EACV,CAAA,MAAA,IAAW,aAAa,CAAA,EAAG;AACzB,IAAA,GAAA,GAAM,CAAA;AACN,IAAA,KAAA,GAAQ,MAAA;AAAA,EACV,CAAA,MAAA,IAAW,aAAa,CAAA,EAAG;AACzB,IAAA,KAAA,GAAQ,MAAA;AACR,IAAA,IAAA,GAAO,CAAA;AAAA,EACT,CAAA,MAAA,IAAW,aAAa,CAAA,EAAG;AACzB,IAAA,KAAA,GAAQ,CAAA;AACR,IAAA,IAAA,GAAO,MAAA;AAAA,EACT,CAAA,MAAA,IAAW,aAAa,CAAA,EAAG;AACzB,IAAA,GAAA,GAAM,CAAA;AACN,IAAA,IAAA,GAAO,MAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,MAAA;AACN,IAAA,IAAA,GAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,GAAS,CAAA;AAC3B,EAAA,OAAO;AAAA,IACL,CAAA,EAAA,CAAI,MAAM,KAAA,IAAS,GAAA;AAAA,IACnB,CAAA,EAAA,CAAI,QAAQ,KAAA,IAAS,GAAA;AAAA,IACrB,CAAA,EAAA,CAAI,OAAO,KAAA,IAAS;AAAA,GACtB;AACF;AC9GO,IAAM,iBAAN,MAAgD;AAAA,EAC7C,KAAA,GAA2B,OAAA;AAAA,EAEnC,SAAS,KAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,MAAA,CAAO,GAAA,EAA+B,QAAA,EAAoB,MAAA,EAAuB;AAC/E,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA;AACpC,IAAA,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AACtC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,IAAA,CAAK,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EACd;AAAA,EAEQ,WAAA,CAAY,KAA+B,KAAA,EAAwB;AACzE,IAAA,MAAM,KAAA,GAAA,CAAS,cAAc,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,IAAK,GAAA,IAAO,MAAM,KAAA,CAAM,KAAA;AACrE,IAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,QAAQ,iBAAA,CAAkB,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,KAAK,KAAK,CAAA;AAE7D,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAC/B,MAAA,IAAA,CAAK,kBAAkB,GAAA,EAAK,OAAA,EAAS,OAAO,KAAA,EAAO,KAAA,CAAM,MAAM,IAAI,CAAA;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,KAAA,EAAO,KAAK,CAAA;AACxC,IAAA,MAAM,OAAA,GAAU,SAAA;AAAA,MACd,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,QAAQ,CAA6B,CAAA;AAAA,MACrE;AAAA,KACF;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,GAAA,CAAI,OAAO,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,IAAI,CAAA,MAAO,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IAC9B;AACA,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EACX;AAAA,EAEQ,iBAAA,CACN,GAAA,EACA,OAAA,EACA,KAAA,EACA,OACA,IAAA,EACM;AACN,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC3C,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,GAAA,CAAI,WAAA,CAAY,WAAA,CAAY,IAAA,EAAM,KAAK,CAAC,CAAA;AACxC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAG,GAAG,OAAA,CAAQ,CAAC,EAAG,CAAC,CAAA;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAAA,IACrB;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EACd;AACF;AAEA,IAAM,cAAA,GAAiB,KAAA;AACvB,IAAM,YAAA,GAAe,CAAC,CAAA,KAAc,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,CAAC,CAAA,GAAI,IAAA;AAC7E,IAAM,OAAA,GAAU,CAAC,CAAA,KAAc,IAAA,CAAK,IAAK,CAAA,GAAI,IAAA,CAAK,KAAM,CAAC,CAAA;AACzD,IAAM,aAAa,CAAC,CAAA,KAClB,CAAA,GAAI,GAAA,GAAM,IAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,GAAK,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AAE1D,SAAS,KAAA,CACP,KAAA,EACA,OAAA,EACA,QAAA,EACA,QAAQ,KAAA,EACR;AACA,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,OAAA;AACjB,EAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,QAAA;AACvB,EAAA,MAAM,CAAA,GAAA,CAAK,KAAA,GAAQ,EAAA,KAAO,EAAA,GAAK,EAAA,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA,GAAI,CAAA;AACtD,EAAA,OAAO,KAAA,GAAA,CAAS,QAAQ,KAAA,IAAS,OAAA;AACnC;AAEA,SAAS,YAAA,CAAa,OAAkB,KAAA,EAAe;AACrD,EAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,UAAA;AACzB,EAAA,IAAI,KAAA,CAAM,MAAM,KAAA,EAAO;AACrB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAI,KAAA,GAAQ,GAAA;AAAA,MAClB,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,gBAAA,EAAkB,KAAA;AAAA,MAClB,MAAA,EAAQ,YAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,GAAA;AAAA,IACV,UAAA,EAAY,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA,EAAG,EAAE,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA,IACpD,SAAA,EAAW,IAAA;AAAA,IACX,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AACF;AAEA,SAAS,gBAAgB,KAAA,EAAkB;AACzC,EAAA,MAAM,MAAoD,EAAC;AAC3D,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU;AACtC,IAAA,MAAM,UAAU,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACjD,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,KAAA,CAAM,CAAA;AAAA,MACf,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,KAAA,CAAM,CAAA;AAAA,MACf,UAAU,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,CAAA,CAAE,KAAK,GAAG;AAAA,KAC/C,CAAE,CAAA;AAEF,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7C,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,OAAO,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAC3C,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA;AACzB,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAC,CAAA;AAC7C,IAAA,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,GAAK,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,KAAA,EAAO,QAAA,EAAU,EAAE,QAAA,EAAS;AAC3E,IAAA,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,GAAK,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,KAAA,EAAO,QAAA,EAAU,EAAE,QAAA,EAAS;AAC3E,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,GAAM,EAAE,CAAC,CAAA;AAC9C,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,CAAA,GAAI,KAAK,KAAA,GAAQ,CAAA,CAAA;AACvB,MAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,GAAG,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AAAA,QACvB,GAAG,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA;AAAA,QACvB,UAAU,CAAA,CAAE,QAAA,GAAA,CAAY,CAAA,CAAE,QAAA,GAAW,EAAE,QAAA,IAAY;AAAA,OACpD,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACZ;AAEA,EAAA,IAAI,IAAI,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,MAAM,KAAA,EAAO;AACxC,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,EAAK,CAAA,CAAE,QAAA,GAAW,GAAA;AAAA,EACpC;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,WAAA,CAAY,MAAkC,KAAA,EAAyB;AAC9E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AAAU,MAAA,OAAO,CAAC,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA;AAAA,IAC3C,KAAK,QAAA;AAAU,MAAA,OAAO,CAAC,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,IAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,IAC3D,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL;AACE,MAAA,OAAO,EAAC;AAAA;AAEd;;;ACrLO,IAAM,eAAN,MAAmB;AAAA,EAChB,QAAA,GAAiB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAC9B,OAAA,GAAgB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA;AAAA,EAC7B,SAAA,GAAkB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA;AAAA,EAC/B,MAAA,GAAS,KAAA;AAAA;AAAA,EACT,SAAA,GAAY,KAAA;AAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA;AAAA,EACX,WAAA,GAAc,KAAA;AAAA;AAAA,EAEtB,mBAAA,GAA4B;AAAE,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAAA,EAAG;AAAA,EAC3D,kBAAA,GAA2B;AAAE,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAAA,EAAG;AAAA,EACzD,oBAAA,GAA6B;AAAE,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,SAAA,EAAU;AAAA,EAAG;AAAA,EAE7D,QAAA,GAAoB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA,EAE1C,WAAA,GAAuB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAAW;AAAA,EAChD,UAAA,GAAsB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA,EAC9C,WAAA,GAAuB;AAAE,IAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA,EAEhE,aAAA,GAAyB;AAAE,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAAa;AAAA,EAEpD,WAAA,CAAY,KAAA,EAAe,KAAA,EAAe,QAAA,EAAmB,KAAA,EAAuB;AAClF,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,EAAO,CAAA,EAAG,YAAY,GAAA,EAAI;AACxD,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AACnC,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,EACzC;AAAA,EAEA,WAAA,CAAY,KAAA,EAAe,KAAA,EAAe,QAAA,EAAmB,KAAA,EAAuB;AAClF,IAAA,IAAA,CAAK,SAAA,GAAY,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,CAAA,IAAK,GAAA,EAAI;AAC5E,IAAA,IAAA,CAAK,MAAA,GAAS,SAAS,IAAA,CAAK,MAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG;AAC5E,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,SAAA,GAAkB;AAAA,EAElB;AAAA,EAEA,YAAA,CAAa,KAAA,EAAgB,IAAA,EAAe,IAAA,EAAsB;AAChE,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,WAAW,IAAA,IAAQ,IAAA;AAAA,EAC1B;AAAA,EAEA,SAAA,GAA0B;AACxB,IAAA,OAAO;AAAA,MACL,gBAAA,EAAkB,KAAK,mBAAA,EAAoB;AAAA,MAC3C,eAAA,EAAiB,KAAK,kBAAA,EAAmB;AAAA,MACzC,iBAAA,EAAmB,KAAK,oBAAA,EAAqB;AAAA,MAC7C,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AACF;;;ACvDO,IAAM,cAAN,MAAkB;AAAA,EACf,aAAA,GAAwB,KAAA;AAAA,EACxB,YAAA,GAAiC,IAAA;AAAA,EACjC,MAAA,uBAAqC,GAAA,EAAI;AAAA,EACzC,mBAAA,uBAA+C,GAAA,EAAI;AAAA,EAE3D,cAAc,KAAA,EAAwB;AACpC,IAAA,MAAM,OAAO,KAAA,CAAM,WAAA;AACnB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAA,CAAK,EAAE,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAClE;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,YAAA,CAAa,IAAY,cAAA,EAA8B;AACrD,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,EAAE,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,EAAE,CAAA,wBAAA,CAA0B,CAAA;AAAA,IACvD;AACA,IAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,EAAA,EAAI,cAAc,CAAA;AAAA,EACjD;AAAA,EAEA,QAAQ,EAAA,EAAqB;AAC3B,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,EAAE,CAAA;AAAA,EACxC;AAAA,EAEA,eAAe,EAAA,EAAkB;AAC/B,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,EAAE,CAAA;AACtD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,IAAA,CAAK,YAAA,EAAc,MAAA,GAAS,MAAA,EAAW,cAAc,CAAA;AACrD,IAAA,IAAA,CAAK,aAAA,GAAgB,EAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,SAAA;AACpB,IAAA,IAAA,CAAK,aAAa,OAAA,IAAU;AAAA,EAC9B;AAAA,EAEA,gBAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,eAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,UAAA,CAAW,SAAiB,IAAA,EAAsC;AAChE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,YAAA,EAAc,MAAA,GAAS,MAAA,EAAW,OAAO,CAAA;AAC9C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,YAAA,CAAa,UAAU,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,YAAY,IAAA,EAAiC;AAAE,IAAA,IAAA,CAAK,YAAA,EAAc,gBAAgB,IAAI,CAAA;AAAA,EAAG;AAAA,EACzF,YAAY,IAAA,EAAiC;AAAE,IAAA,IAAA,CAAK,YAAA,EAAc,gBAAgB,IAAI,CAAA;AAAA,EAAG;AAAA,EACzF,SAAA,GAAkB;AAAE,IAAA,IAAA,CAAK,cAAc,WAAA,IAAc;AAAA,EAAG;AAAA,EAExD,QAAQ,IAAA,EAAyB;AAAE,IAAA,IAAA,CAAK,YAAA,EAAc,YAAY,IAAI,CAAA;AAAA,EAAG;AAAA,EACzE,MAAM,IAAA,EAAyB;AAAE,IAAA,IAAA,CAAK,YAAA,EAAc,UAAU,IAAI,CAAA;AAAA,EAAG;AAAA,EAErE,MAAA,GAAe;AAAE,IAAA,IAAA,CAAK,cAAc,QAAA,IAAW;AAAA,EAAG;AAAA,EAClD,SAAA,GAAkB;AAAE,IAAA,IAAA,CAAK,cAAc,WAAA,IAAc;AAAA,EAAG;AAC1D;;;AC/EO,IAAM,YAAA,GAAN,cAA2B,SAAA,CAAU;AAAA,EAC1C,OAAgB,EAAA,GAAK,UAAA;AAAA,EAEZ,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,aAAA,EAAe,IAAI,CAAA;AAAA,EACzC;AACF;;;ACNO,SAAS,IAAA,CAAK,GAAS,CAAA,EAAiB;AAC7C,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACxC;AAEO,SAAS,MAAA,CAAO,GAAS,CAAA,EAAiB;AAC/C,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AACnB,EAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACxB;AAEO,SAAS,YAAA,CAAa,CAAA,EAAS,CAAA,EAAS,CAAA,EAAoB;AACjE,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,IAAK,CAAA;AACvB;AAEO,SAAS,OAAA,CAAQ,CAAA,EAAW,MAAA,GAAS,CAAA,EAAW;AACrD,EAAA,OAAO,OAAO,MAAA,CAAO,SAAA,CAAU,QAAQ,IAAA,CAAK,CAAA,EAAG,MAAM,CAAC,CAAA;AACxD;AAEO,SAAS,QAAQ,CAAA,EAAe;AACrC,EAAA,OAAO,EAAE,CAAA,EAAG,OAAA,CAAQ,EAAE,CAAC,CAAA,EAAG,GAAG,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,IAAK,IAAA,GAAO,QAAQ,CAAA,CAAE,CAAC,IAAI,MAAA,EAAU;AACvF;AAGO,SAAS,QAAA,CAAS,IAAA,EAAY,EAAA,EAAU,KAAA,EAAuB;AACpE,EAAA,MAAM,SAAiB,EAAC;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,IAAI,CAAA,GAAI,KAAA;AACd,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,CAAA,EAAG,QAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACvC,CAAA,EAAG,QAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACvC,GAAG,IAAA,CAAK,CAAA,IAAK,QAAQ,EAAA,CAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,EAAA,CAAG,IAAI,IAAA,CAAK,CAAA,IAAK,CAAC,CAAA,GAAI,EAAA,CAAG,KAAK,IAAA,CAAK;AAAA,KAC1F,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,aAAA,CAAc,KAAa,SAAA,EAA2B;AACpE,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAK,SAAA;AAC7B,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAI,CAAA,GAAI,IAAA;AAClC;AAGO,SAAS,YAAA,CAAa,EAAA,EAAU,MAAA,EAAc,KAAA,EAAqB;AACxE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACxB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,MAAA,CAAO,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,MAAA,CAAO,CAAA;AACzB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA;AAAA,IAC5B,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA;AAAA,IAC5B,GAAG,EAAA,CAAG;AAAA,GACR;AACF;AAEO,SAAS,KAAQ,GAAA,EAAyB;AAC/C,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC3B;;;AC9CO,IAAM,eAAA,GAAN,cAA8B,SAAA,CAAU;AAAA,EAC7C,OAAgB,EAAA,GAAK,aAAA;AAAA,EAEb,UAAA,GAAkC,EAAE,KAAA,EAAO,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI,EAAE;AAAA,EAClE,OAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,YAAA,GAAe,KAAA;AAAA,EACf,MAAA,GAAsB,MAAA;AAAA,EACtB,UAAA,GAAa,KAAA;AAAA,EACb,OAAA,GAAgB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAC7B,cAAA,GAA8B,IAAA;AAAA,EAC9B,WAAA,GAAoB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EACjC,YAAA,GAAe,KAAA;AAAA,EACf,QAAA,GAAW,CAAA;AAAA,EACX,aAAqB,EAAC;AAAA,EAErB,QAAQ,IAAA,EAAkC;AACjD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,IAAQ,EAAE,KAAA,EAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI,EAAE;AAC1D,IAAA,IAAA,CAAK,cAAc,EAAE,GAAG,KAAK,MAAA,CAAO,KAAA,CAAM,qBAAoB,EAAE;AAChE,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA,EAES,aAAA,GAAsB;AAC7B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,KAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,OAAO,QAAA,EAAS;AAClC,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,CAAC,SAAA,EAAW;AACnC,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,GAAA,GAAM,OAAO,mBAAA,EAAoB;AACvC,MAAA,MAAM,SAAA,GAAY,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AAC/C,MAAA,IAAI,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,WAAW,KAAK,SAAA,EAAW;AAC5C,QAAA,IAAA,CAAK,WAAA,GAAc,EAAE,GAAG,GAAA,EAAI;AAC5B,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,MACtB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA;AAAA,EAKS,UAAU,IAAA,EAA0B;AAC3C,IAAA,IAAI,IAAA,EAAM,QAAQ,OAAA,EAAS;AACzB,MAAA,QAAQ,KAAK,MAAA;AAAQ,QACnB,KAAK,MAAA;AACH,UAAA,IAAA,CAAK,MAAA,GAAS,mBAAA;AACd,UAAA,IAAA,CAAK,iBAAiB,EAAE,GAAG,KAAK,MAAA,CAAO,KAAA,CAAM,qBAAoB,EAAE;AACnE,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,IAAA,CAAK,MAAA,GAAS,mBAAA;AACd,UAAA;AAAA;AACJ,IACF;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAES,QAAQ,IAAA,EAA0B;AACzC,IAAA,IAAI,IAAA,EAAM,QAAQ,OAAA,EAAS;AACzB,MAAA,QAAQ,KAAK,MAAA;AAAQ,QACnB,KAAK,UAAA;AACH,UAAA,IAAA,CAAK,MAAA,GAAS,eAAA;AACd,UAAA,IAAA,CAAK,iBAAiB,EAAE,GAAG,KAAK,MAAA,CAAO,KAAA,CAAM,qBAAoB,EAAE;AACnE,UAAA;AAAA,QACF,KAAK,mBAAA;AACH,UAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,UAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,UAAA;AAAA;AACJ,IACF;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAAA,EACjD;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,eAAc,EAAG;AACtC,MAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,YAAA,GAAwB;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CACN,QAAA,EACA,IAAA,EACA,KAAA,EACS;AACT,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,MAAkB,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,KAAA;AAC1D,IAAA,MAAM,CAAA,GAAI,cAAc,IAAI,CAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,QAAA,CAAS,CAAC,EAAG,IAAI,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC5C,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,OAAA,CAAS,IAAI,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK,OAAO,KAAA;AAC3B,IAAA,IAAI,KAAA,CAAM,MAAM,GAAA,CAAI,CAAA,IAAK,MAAM,CAAA,KAAM,GAAA,CAAI,GAAG,OAAO,KAAA;AACnD,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAA,GAAI,CAAA,GAAI,OAAO,OAAO,KAAA;AAC3C,IAAA,OAAO,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,CAAA,GAAI,IAAI,KAAK,CAAA;AAAA,EAC/C;AAAA,EAEQ,YAAY,QAAA,EAAiC;AACnD,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACjC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACvC,QAAA,GAAA,IAAO,OAAO,GAAA,CAAI,CAAC,GAAI,GAAA,CAAI,CAAA,GAAI,CAAC,CAAE,CAAA;AAAA,MACpC;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACtB;AAAA;AAAA,EAGQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,KAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,OAAO,kBAAA,EAAmB;AACzC,IAAA,MAAM,SAAA,GAAY,OAAO,QAAA,EAAS;AAClC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,CAAA,IAAK,GAAA;AACvC,IAAA,IAAA,CAAK,YAAA,GAAe,SAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAgB,SAAA,IAAa,CAAA,KAAM,CAAA,IAAO,CAAA,GAAI,KAAK,CAAA,GAAI,GAAA,IAAS,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,CAAA;AACpF,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA,GAAe,OAAA,CAAQ,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,WAAA,EAAY,GAAI,UAAA,GAAa,MAAA;AAClD,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,EAAE,GAAG,MAAA,EAAO;AAE/B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA2B;AAC5D,IAAA,MAAM,IAAA,GAAO,KAAK,MAAM,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,IAAA,EAAM,IAAA,KAAS,MAAA,GAAS,IAAA,GAAO,MAAA;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA;AAEf,IAAA,IAAI,QAAA,IAAY,IAAA,CAAK,MAAA,KAAW,UAAA,EAAY;AAC1C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAA,EAAS;AAAE,QAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,QAAQ,CAAA;AAAG,QAAA;AAAA,MAAQ;AAC3D,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAA,EAAS;AAAE,QAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,QAAQ,CAAA;AAAG,QAAA;AAAA,MAAQ;AAC3D,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,UAAU,MAAM,CAAA;AAC/D,MAAA,MAAM,OAAA,GAAgB,EAAE,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,GAAG,QAAA,EAAS;AAC9E,MAAA,MAAM,MAAA,GAAsB;AAAA,QAC1B,IAAA,EAAM,UAAA;AAAA,QACN,MAAM,YAAA,CAAa;AAAA,UACjB,EAAE,GAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,QAAA,EAAS;AAAA,UAC1C;AAAA,SACD;AAAA,OACH;AACA,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,QACxB,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,OAAA,CAAQ;AAAA,OAC1B;AACA,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,MAAM,OAAO,CAAC,GAAG,QAAA,CAAS,KAAA,CAAM,UAAU,MAAM,CAAA;AAChD,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACrC,MAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,QACvB;AAAA,UACE,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,IAAA;AAAA,YACV,QAAA,EAAU,KAAK,aAAA,CAAc,IAAA,EAAM,SAAS,KAAA,CAAM,IAAA,EAAM,QAAA,CAAS,KAAA,CAAM,KAAK;AAAA;AAC9E;AACF,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,QAAQ,CAAA;AAAA,EAClC;AAAA;AAAA,EAGQ,UAAA,CAAW,UAAgB,QAAA,EAAwB;AACzD,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,QAAA,EAAS;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB;AAClD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,aAAA,EAAc;AACrC,IAAA,MAAM,UAAgB,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,QAAA,EAAS;AAChD,IAAA,IAAA,CAAK,UAAA,GAAa,CAAC,OAAO,CAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,WAAA,CAAY;AAAA,MACtB,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,GAAG,QAAA,CAAS,CAAA;AAAA,MACZ,GAAG,QAAA,CAAS,CAAA;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,OAAO,SAAA,CAAU,KAAA;AAAA,QACjB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,KAAA,EAAO,CAAA;AAAA,QACP,OAAO,IAAA,CAAK,YAAA;AAAA,QACZ,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAM,IAAA,CAAK,MAAA,KAAW,UAAA,GAAa,UAAA,GAAa,MAAA;AAAA,YAChD,IAAA,EAAM,YAAA,CAAa,CAAC,OAAO,CAAC;AAAA;AAC9B;AACF;AACF,KACD,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA;AAAA,EAGQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA;AACpB,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,KAAA;AAC3B,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAO,EAAE,CAAA;AAC5C,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,EAAE,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,IAAQ,GAAI,MAAA;AACvC,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,KAAA,CAAM,KAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,OAAO,mBAAA,EAAoB;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,OAAO,KAAK,CAAA;AAC3D,IAAA,MAAM,QAAA,GAAW,KAAK,YAAA,GAClB,OAAA,CAAA,CAAS,MAAM,CAAA,IAAK,GAAA,IAAO,IAAI,CAAA,GAC/B,GAAA;AACJ,IAAA,MAAM,EAAA,GAAW,EAAE,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,GAAG,QAAA,EAAS;AAKzE,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,mBAAA,EAAqB;AACxB,QAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,IAAI,MAAA,CAAO,SAAS,MAAA,CAAO,mBAAA,EAAqB,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB;AAC9F,QAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,OAAA,EAAQ;AAC5B,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AACd,QAAA,MAAM,OAAA,GAAU,KAAK,QAAQ,CAAA;AAC7B,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAC5C,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,cAAc,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,KAAA,EAAO,KAAK,OAAO,CAAA;AACxE,QAAA,MAAM,QAAA,GAAW,QAAQ,WAAW,CAAA;AACpC,QAAA,MAAM,GAAA,GAAmB;AAAA,UACvB,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,YAAA,CAAa,CAAC,OAAA,EAAS,EAAE,GAAG,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAC;AAAA,SAC5D;AACA,QAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,UACvB;AAAA,YACE,EAAA;AAAA,YACA,IAAA,EAAM,MAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,GAAG,CAAA;AAAA,cAC3B,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,MAAM,KAAK;AAAA;AACpD;AACF,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,IAAI,MAAA,CAAO,SAAS,MAAA,CAAO,mBAAA,EAAqB,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB;AAC9F,QAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,OAAA,EAAQ;AAC5B,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,MAAM,OAAA,GAAU,KAAK,QAAQ,CAAA;AAC7B,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAC5C,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,EAAS,EAAA,EAAI,CAAC,CAAA;AAC5C,QAAA,IAAA,CAAK,UAAA,GAAa,YAAA;AAClB,QAAA,MAAM,OAAA,GAAuB;AAAA,UAC3B,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,aAAa,YAAY;AAAA,SACjC;AACA,QAAA,MAAM,OAAA,GAAU,CAAC,GAAG,QAAA,EAAU,OAAO,CAAA;AACrC,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AACxC,QAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,UACvB;AAAA,YACE,EAAA;AAAA,YACA,IAAA,EAAM,MAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,OAAA;AAAA,cACV,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAM,KAAK;AAAA;AACnD;AACF,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,OAAA,GAAU,SAAS,KAAA,EAAM;AAC/B,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC1C,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,aAAa,IAAA,CAAK,OAAA;AACxB,QAAA,MAAM,OAAA,GAAU,OAAO,mBAAA,EAAoB;AAC3C,QAAA,MAAM,UAAA,GAAa,CAAC,IAAA,CAAK,UAAA,IAAc,OAAO,aAAA,EAAc;AAC5D,QAAA,IAAI,IAAA,CAAK,UAAA,IAAc,MAAA,CAAO,aAAA,EAAc,EAAG;AAC7C,UAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,QACpB;AACA,QAAA,IAAI,MAAA;AACJ,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAAA,YACjB,OAAA,CAAQ,IAAI,UAAA,CAAW,CAAA;AAAA,YACvB,OAAA,CAAQ,IAAI,UAAA,CAAW;AAAA,WACzB;AACA,UAAA,MAAM,OAAA,GAAU,aAAA,CAAc,KAAA,EAAO,EAAE,CAAA;AACvC,UAAA,MAAM,OAAO,OAAA,GAAU,KAAA;AACvB,UAAA,MAAA,GAAS,YAAA,CAAa,OAAA,EAAS,UAAA,EAAY,IAAI,CAAA;AAAA,QACjD,CAAA,MAAO;AACL,UAAA,MAAA,GAAS,EAAE,GAAG,OAAA,EAAQ;AAAA,QACxB;AACA,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,OAAO,MAAM,CAAA;AAC9D,QAAA,MAAM,OAAA,GAAU,QAAQ,OAAO,CAAA;AAC/B,QAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,OAAA,CAAQ,IAAI,CAAA;AAC9C,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AAAA,QACzC;AACA,QAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI;AAAA,UAC5B,GAAG,OAAA;AAAA,UACH,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,YAAA,CAAa,CAAC,QAAA,IAAY,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,CAAA,EAAG,QAAA,EAAU,CAAC;AAAA,SACvE;AACA,QAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,UACvB;AAAA,YACE,EAAA;AAAA,YACA,IAAA,EAAM,MAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,OAAA;AAAA,cACV,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,MAAM,KAAK;AAAA;AACpD;AACF,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,SAAS,IAAA,CAAK,UAAA;AACpB,QAAA,IAAI,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,YAAA,EAAc;AACtC,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,UAAA,IAAA,CAAK,IAAI,EAAA,CAAG,CAAA;AACZ,UAAA,IAAA,CAAK,IAAI,EAAA,CAAG,CAAA;AACZ,UAAA,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,EAAA,CAAG,CAAA,IAAK,CAAC,CAAA,GAAI,EAAA,CAAG,CAAA;AAAA,QAC7D,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,MAAA,GACpB,IAAA,CAAK,MAAA,CAAO,OAAO,MAAA,GAAS,CAAC,CAAA,EAAI,EAAE,CAAA,GACnC,CAAA;AACJ,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA;AAAA,QAC3C;AACA,QAAA,MAAM,OAAA,GAAU,SAAS,KAAA,EAAM;AAC/B,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC1C,QAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI;AAAA,UAC5B,GAAG,OAAA;AAAA,UACH,IAAA,EAAM,aAAa,MAAM;AAAA,SAC3B;AACA,QAAA,IAAI,KAAK,QAAA,GAAW,aAAA,CAAc,MAAM,KAAA,CAAM,IAAI,IAAI,CAAA,EAAG;AACvD,UAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAAA,QAC1C;AACA,QAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,UACvB;AAAA,YACE,EAAA;AAAA,YACA,IAAA,EAAM,MAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,OAAA;AAAA,cACV,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAM,KAAK;AAAA;AACnD;AACF,SACD,CAAA;AACD,QAAA,IAAI,MAAA,CAAO,SAAS,oBAAA,EAAsB;AACxC,UAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,UAAA,EAAY,IAAA,EAAK,EAAG,CAAC,CAAA;AAC5E,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,aAAA,EAAc;AACxC,UAAA,MAAM,OAAA,GAAU,OAAO,mBAAA,EAAoB;AAC3C,UAAA,MAAM,OAAA,GAAgB;AAAA,YACpB,CAAA,EAAG,CAAA;AAAA,YACH,CAAA,EAAG,CAAA;AAAA,YACH,CAAA,EAAG,KAAK,YAAA,GAAe,OAAA,CAAA,CAAS,QAAQ,CAAA,IAAK,GAAA,IAAO,IAAI,CAAA,GAAI;AAAA,WAC9D;AACA,UAAA,IAAA,CAAK,UAAA,GAAa,CAAC,OAAO,CAAA;AAC1B,UAAA,IAAA,CAAK,OAAO,WAAA,CAAY;AAAA,YACtB,EAAA,EAAI,KAAA;AAAA,YACJ,IAAA,EAAM,MAAA;AAAA,YACN,GAAG,OAAA,CAAQ,CAAA;AAAA,YACX,GAAG,OAAA,CAAQ,CAAA;AAAA,YACX,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAAA,cACnB,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,cAClB,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,cAClB,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAAA,cACnB,OAAO,IAAA,CAAK,YAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,YAAA,CAAa,CAAC,OAAO,CAAC,CAAA,EAAG;AAAA;AAC5D,WACD,CAAA;AACD,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAC1C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,YAAA,IAAA,CAAK,WAAA,GAAc,EAAE,GAAG,OAAA,EAAQ;AAChC,YAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,UAClB;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,OAAO,YAAA,CAAa;AAAA,MACvB,EAAE,EAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,UAAA,EAAY,IAAA,EAAK;AAAE,KAClE,CAAA;AACD,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,UAAU,CAAA;AAAA,EAChC;AACF;;;AC7aO,IAAM,eAAA,GAAN,cAA8B,SAAA,CAAU;AAAA,EAC7C,OAAgB,EAAA,GAAK,aAAA;AAAA,EAEZ,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,IAAI,CAAA;AAAA,EAC7C;AACF;;;ACDO,SAAS,SAAS,MAAA,EAA4C;AACnE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AACrE,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA;AACtB,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA;AACtB,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAClC;AAEO,SAAS,SAAA,CAAU,GAAW,MAAA,EAAwB;AAC3D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,IACf,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,IACf,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,IACf,IAAA,EAAM,EAAE,IAAA,GAAO;AAAA,GACjB;AACF;AAEO,SAAS,UAAA,CAAW,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AACjF,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACxB;AAEO,SAAS,QAAA,CAAS,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AAC/E,EAAA,OAAO,KAAK,IAAA,CAAK,UAAA,CAAW,IAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AAC7C;AAGO,SAAS,iBACd,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACZ,IAAY,EAAA,EACc;AAC1B,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;AAC7B,EAAA,IAAI,UAAU,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AACvC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,EAAE,GAAG,EAAA,GAAK,CAAA,GAAI,IAAI,CAAA,EAAG,EAAA,GAAK,IAAI,EAAA,EAAG;AAC1C;AAGO,SAAS,uBACd,QAAA,EACA,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,IACZ,MAAA,EACS;AACT,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACtD,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,EAAA,EAAI,EAAE,CAAA,IAAK,MAAA,EAAQ,OAAO,IAAA;AACnD,IAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACtD,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,EAAA,EAAI,EAAE,CAAA,IAAK,MAAA,EAAQ,OAAO,IAAA;AACnD,IAAA,MAAM,EAAA,GAAK,iBAAiB,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACpD,IAAA,IAAI,QAAA,CAAS,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,IAAK,MAAA,EAAQ,OAAO,IAAA;AAAA,EACvD;AACA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,OAAO,SAAS,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,IAAI,EAAE,CAAA,IAAK,MAAA,IAAU,QAAA,CAAS,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,IAAK,MAAA;AAAA,EAC/E;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,qBAAA,CACd,EAAA,EAAY,EAAA,EACZ,QAAA,EACQ;AACR,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA;AAClC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,SAAS,EAAA,EAAI,EAAA,EAAI,QAAA,CAAS,CAAC,CAAA,CAAG,CAAA,EAAG,QAAA,CAAS,CAAC,EAAG,CAAC,CAAA;AACjF,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AACxB,IAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACrD,IAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,IAAI,EAAE,CAAA;AACnC,IAAA,IAAI,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,IAAA;AACT;;;AC1FO,IAAM,aAAA,GAAgB;AAEtB,SAAS,gBAAgB,KAAA,EAA8C;AAC5E,EAAA,OAAO,mBAAmB,KAAA,CAAM,KAAA,CAAM,UAAU,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAClE;AAEO,SAAS,cAAA,CACd,KAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,EACS;AACT,EAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,UAAU,aAAA,CAAc,KAAA,CAAM,MAAM,IAAI,CAAA,IAAK,GAAA,IAAO,KAAA,CAAM,KAAA,CAAM,KAAA;AACrF,EAAA,OAAO,qBAAA,CAAsB,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA,IAAK,YAAA;AACrD;AAEO,SAAS,iBACd,KAAA,EACA,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,IACZ,MAAA,EACS;AACT,EAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,UAAU,aAAA,CAAc,KAAA,CAAM,MAAM,IAAI,CAAA,IAAK,GAAA,IAAO,KAAA,CAAM,KAAA,CAAM,KAAA;AACrF,EAAA,OAAO,uBAAuB,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,YAAY,CAAA;AACjE;;;ACvBO,IAAM,mBAAA,GAAN,cAAkC,SAAA,CAAU;AAAA,EACjD,OAAgB,EAAA,GAAK,iBAAA;AAAA,EAEZ,QAAQ,KAAA,EAAuC;AACtD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AACtC,IAAA,MAAM,YAAY,aAAA,GAAgB,IAAA;AAClC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mBAAA,EAAoB;AACjD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mCAAA,EAAoC;AACxE,IAAA,MAAM,OAAkB,EAAC;AAEzB,IAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC3B,MAAA,IAAI,eAAe,KAAA,EAAoB,EAAA,CAAG,GAAG,EAAA,CAAG,CAAA,EAAG,SAAS,CAAA,EAAG;AAC7D,QAAA,IAAA,CAAK,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAiB,IAAI,CAAA;AAAA,EACnC;AAAA,EAES,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,aAAA,EAAc,EAAG;AACrC,MAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,IAAI,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAES,MAAA,CAAO,OAAiC,EAAA,EAAmB;AAClE,IAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAC/B,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,EACnC;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAmB;AAC3C,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAClC,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,EACnC;AACF;;;ACpDO,IAAM,kBAAA,GAAN,cAAiC,SAAA,CAAU;AAAA,EAChD,OAAgB,EAAA,GAAK,gBAAA;AAAA,EAEb,UAAqB,EAAC;AAAA,EAErB,QAAQ,KAAA,EAAuC;AACtD,IAAA,IAAA,CAAK,UAAU,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,oBAAoB,CAAA;AACnD,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA,EAES,aAAA,GAAsB;AAAE,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EAAG;AAAA,EACtC,WAAA,GAAoB;AAAE,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EAAG;AAAA,EAErC,MAAA,GAAe;AAAE,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAAA,EAAG;AAAA,EACnD,QAAA,GAAiB;AAAE,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,EAAG;AAAA,EAExD,KAAA,GAAc;AACpB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AACtC,IAAA,MAAM,YAAY,aAAA,GAAgB,IAAA;AAClC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mBAAA,EAAoB;AAClD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,oBAAA,EAAqB;AACpD,IAAA,MAAM,SAAS,IAAI,GAAA,CAAa,IAAA,CAAK,MAAA,CAAO,oBAAoB,CAAA;AAEhE,IAAA,MAAM,SAAA,GAAY,UAAU,QAAA,CAAS,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,oBAAoB,SAAS,CAAA;AAC9D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,KAAA,CAC5B,mCAAA,EAAoC,CACpC,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAEjC,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC3B,MAAA,IAAI,gBAAA,CAAiB,KAAA,EAAoB,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,EAAG;AACjF,QAAA,MAAA,CAAO,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,CAAC,GAAG,MAAM,CAAA;AACzB,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAmB;AAC3C,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAAA,IACpC;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AAC/B,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,EACnC;AACF;;;ACpDO,IAAM,eAAA,GAAN,cAA8B,SAAA,CAAU;AAAA,EAC7C,OAAgB,EAAA,GAAK,aAAA;AACvB;;;ACFO,IAAM,aAAA,GAAN,cAA4B,SAAA,CAAU;AAAA,EAC3C,OAAgB,EAAA,GAAK,WAAA;AAAA,EAEZ,cAAc,IAAA,EAAkC;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,eAAA,EAAiB,IAAI,CAAA;AAAA,EAC3C;AACF;;;ACNO,IAAM,iBAAA,GAAN,cAAgC,SAAA,CAAU;AAAA,EAC/C,OAAgB,EAAA,GAAK,eAAA;AAAA,EAEZ,cAAc,IAAA,EAAkC;AACvD,IAAA,MAAM,IAAA,GAAO,QAAQ,EAAC;AACtB,IAAA,MAAM,EAAA,GAAK,KAAK,YAAA,IAAgB,CAAA;AAChC,IAAA,MAAM,EAAA,GAAK,KAAK,YAAA,IAAgB,CAAA;AAChC,IAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAAA,EAC1B;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,WAAW,CAAA;AAAA,EACjC;AAAA,EAES,QAAA,GAAiB;AACxB,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,WAAW,CAAA;AAAA,EACjC;AAAA,EAES,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,WAAW,CAAA;AAAA,EACjC;AACF;;;ACCA,IAAI,cAAA,GAAiB,CAAA;AACrB,SAAS,aAAA,GAAyB;AAChC,EAAA,OAAO,CAAA,MAAA,EAAS,OAAO,EAAE,cAAc,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC3D;AAGO,IAAM,SAAN,MAAa;AAAA,EACT,KAAA,GAAuB,IAAI,aAAA,EAAc;AAAA,EACzC,KAAA,GAAsB,IAAI,YAAA,EAAa;AAAA,EACvC,KAAA,GAAqB,IAAI,WAAA,EAAY;AAAA,EACrC,QAAA,GAA2B,IAAI,cAAA,EAAe;AAAA,EACvD,WAAqB,cAAA,EAAe;AAAA,EAC3B,OAAA;AAAA;AAAA,EAED,SAAA,GAAqE;AAAA,IAC3E,KAAA,EAAO,OAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACiB,gBAAA;AAAA;AAAA,EAGjB,WAAA,CAAY,IAAA,GAAsB,EAAC,EAAG;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,mBAAA,EAAqB,IAAA,CAAK,uBAAuB,qBAAA,EAAsB;AACxF,IAAA,IAAA,CAAK,gBAAA,GAAmB;AAAA,MACtB,UAAA,EAAY,CAAC,EAAA,EAAI,IAAA,KAAS,KAAK,KAAA,CAAM,UAAA,CAAW,IAAI,IAAI;AAAA,KAC1D;AACA,IAAA,KAAA,MAAW,WAAA,IAAe,IAAA,CAAK,yBAAA,EAA0B,EAAG;AAC1D,MAAA,IAAA,CAAK,uBAAuB,WAAW,CAAA;AAAA,IACzC;AACA,IAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,eAAA,IAAmB,EAAC,EAAG;AACnD,MAAA,IAAA,CAAK,uBAAuB,UAAU,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,IAAA,CAAK,aAAA,IAAiB,KAAK,CAAA;AAAA,EACvD;AAAA,EAEA,uBAAuB,cAAA,EAAsC;AAC3D,IAAA,KAAA,MAAW,gBAAA,IAAoB,eAAe,iBAAA,EAAmB;AAC/D,MAAA,IAAA,CAAK,MAAM,aAAA,CAAc,IAAI,iBAAiB,IAAA,CAAK,gBAAA,EAAkB,IAAI,CAAC,CAAA;AAAA,IAC5E;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,cAAA,CAAe,EAAA,EAAI,eAAe,cAAc,CAAA;AAAA,EAC1E;AAAA,EAEQ,yBAAA,GAA8C;AACpD,IAAA,OAAO;AAAA,MACL,EAAE,EAAA,EAAI,KAAA,EAAO,cAAA,EAAgB,YAAA,CAAa,IAAI,iBAAA,EAAmB,CAAC,YAAA,EAAc,eAAe,CAAA,EAAE;AAAA,MACjG,EAAE,EAAA,EAAI,QAAA,EAAU,cAAA,EAAgB,eAAA,CAAgB,EAAA,EAAI,iBAAA,EAAmB,CAAC,eAAA,EAAiB,mBAAA,EAAqB,kBAAkB,CAAA,EAAE;AAAA,MAClI,EAAE,IAAI,QAAA,EAAU,cAAA,EAAgB,gBAAgB,EAAA,EAAI,iBAAA,EAAmB,CAAC,eAAe,CAAA,EAAE;AAAA,MACzF,EAAE,EAAA,EAAI,MAAA,EAAQ,cAAA,EAAgB,aAAA,CAAc,IAAI,iBAAA,EAAmB,CAAC,aAAA,EAAe,iBAAiB,CAAA;AAAE,KACxG;AAAA,EACF;AAAA,EAEA,aAAA,GAAyB;AAAE,IAAA,OAAO,aAAA,EAAc;AAAA,EAAG;AAAA,EACnD,YAAA,GAAuB;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EAAM;AAAA,EACpD,SAAS,EAAA,EAAgC;AAAE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA;AAAA,EAAG;AAAA,EAC3E,YAAY,KAAA,EAAoB;AAAE,IAAA,IAAA,CAAK,KAAA,CAAM,YAAY,KAAK,CAAA;AAAA,EAAG;AAAA,EAEjE,aACE,QAAA,EACM;AACN,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,EAAE,EAAE,CAAA;AACzC,MAAA,IAAI,QAAA,IAAY,EAAE,KAAA,EAAO;AACvB,QAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,CAAE,EAAA,EAAI,EAAE,KAAA,EAAO,EAAE,GAAG,QAAA,CAAS,KAAA,EAAO,GAAG,CAAA,CAAE,KAAA,IAAS,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,oBAAA,CAAqB,OAAkB,SAAA,EAAuB;AAC5D,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,SAAA,CAAU,CAAA,GAAI,KAAA,CAAM,CAAA;AAAA,MACvB,CAAA,EAAG,SAAA,CAAU,CAAA,GAAI,KAAA,CAAM,CAAA;AAAA,MACvB,GAAG,SAAA,CAAU;AAAA,KACf;AAAA,EACF;AAAA,EAEA,oBAAA,GAAuB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,oBAAA,EAAqB;AAAA,EAAG;AAAA,EACnE,0BAAA,GAA6B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,0BAAA,EAA2B;AAAA,EAAG;AAAA,EAC/E,mCAAA,GAAsC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,mCAAA,EAAoC;AAAA,EAAG;AAAA,EAEjG,kBAAA,GAAqB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,kBAAA,EAAmB;AAAA,EAAG;AAAA,EAC/D,iBAAiB,GAAA,EAAgB;AAAE,IAAA,IAAA,CAAK,KAAA,CAAM,iBAAiB,GAAG,CAAA;AAAA,EAAG;AAAA,EAErE,eAAe,EAAA,EAAY;AAAE,IAAA,IAAA,CAAK,KAAA,CAAM,eAAe,EAAE,CAAA;AAAA,EAAG;AAAA,EAC5D,gBAAA,GAA2B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAM,gBAAA,EAAiB;AAAA,EAAG;AAAA,EAEnE,mBAAA,GAAsB;AAAE,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,SAAA,EAAU;AAAA,EAAG;AAAA,EACtD,oBAAoB,OAAA,EAA2E;AAAE,IAAA,IAAA,CAAK,YAAY,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,GAAG,OAAA,EAAQ;AAAA,EAAG;AAAA,EAErJ,KAAA,CAAM,IAAY,EAAA,EAAY;AAC5B,IAAA,IAAA,CAAK,SAAS,CAAA,IAAK,EAAA;AACnB,IAAA,IAAA,CAAK,SAAS,CAAA,IAAK,EAAA;AAAA,EACrB;AAAA;AAAA,EAGA,YAAA,CAAa,SAAiB,OAAA,EAA2C;AACvE,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,OAAO,GAAA,EAA+B;AACpC,IAAA,MAAM,MAAA,GAAS,KAAK,0BAAA,EAA2B;AAC/C,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,IAAA,CAAK,oBAAoB,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAClD;AACF;;;ACjHO,SAAS,aAAa,IAAA,EAAuB;AAClD,EAAA,OAAO,IAAA,KAAS,QAAA;AAClB;AAEO,SAASA,gBAAe,KAAA,EAAmC;AAChE,EAAA,MAAM,MAAA,GAAS,mBAAmB,KAAA,CAAM,KAAA,CAAM,UAAU,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACxE,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAA,EAAE;AAAA,EACtE;AAEA,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA;AACtB,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA;AACtB,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,IAAA,GAAO,IAAA;AAEX,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,MAAA,GAAA,CAAU,cAAc,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,IAAK,GAAA,IAAO,MAAM,KAAA,CAAM,KAAA;AACtE,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,GAAO,MAAA,EAAO;AAC9F;AAEO,SAAS,wBAAA,CACd,GACA,CAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACvB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACvB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACvB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC;AAAA,GACzB;AACF;AAEO,SAAS,kBAAA,CAAmB,MAAA,EAAyB,CAAA,EAAW,CAAA,EAAoB;AACzF,EAAA,OAAO,CAAA,IAAK,MAAA,CAAO,IAAA,IAAQ,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,IAAK,MAAA,CAAO,IAAA,IAAQ,CAAA,IAAK,MAAA,CAAO,IAAA;AACjF;AAEO,SAAS,eAAA,CAAgB,GAAoB,CAAA,EAA6B;AAC/E,EAAA,OAAO,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,IAAQ,EAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA;AACjF;AAEO,SAAS,WAAA,CAAY,KAAA,EAAiC,MAAA,EAAkC,OAAA,EAAiB;AAC9G,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAC1B,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK,CAAA;AAAA,IAC5B,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,EAAA,GAAK,IAAI,EAAA,GAAK;AAAA,GAC9B;AACF;AAEO,SAAS,uBAAA,CAAwB,QAAgB,GAAA,EAAiD;AACvG,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgC;AACtD,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AACrC,IAAA,SAAA,CAAU,IAAI,EAAA,EAAI;AAAA,MAChB,GAAG,KAAA,CAAM,CAAA;AAAA,MACT,GAAG,KAAA,CAAM,CAAA;AAAA,MACT,UAAU,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAC3C,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,MAAA,EAAQ,YAAA,CAAa,GAAA,CAAI,IAAI;AAAA,OAC/B,CAAE;AAAA,KACH,CAAA;AAAA,EACH;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,mBAAA,CAAoB,QAAgB,GAAA,EAAwD;AAC1G,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAuC;AAC7D,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,SAAA,CAAU,GAAA,CAAI,IAAI,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,QAAgB,KAAA,EAAiC;AAClF,EAAA,MAAM,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,IAAA;AACnC,EAAA,MAAM,MAAA,GAAS,OAAO,mCAAA,EAAoC;AAG1D,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,CAAA,GAAIA,gBAAe,KAAK,CAAA;AAC9B,IAAA,IACE,kBAAA;AAAA,MACE;AAAA,QACE,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,GAAO,MAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,GAAO;AAAA,OACjB;AAAA,MACA,KAAA,CAAM,CAAA;AAAA,MACN,KAAA,CAAM;AAAA,KACR,EACA;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,sBAAA,CAAuB,QAAgB,GAAA,EAAwC;AAC7F,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE7B,EAAA,IAAI,KAAA,GAAgC,IAAA;AACpC,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AACrC,IAAA,MAAM,CAAA,GAAIA,gBAAe,KAAK,CAAA;AAC9B,IAAA,KAAA,GAAQ,KAAA,GACJ;AAAA,MACE,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,MACjC,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,MACjC,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,MACjC,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,EAAE,IAAI;AAAA,KACnC,GACA,CAAA;AAAA,EACN;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,QAAgB,MAAA,EAAoC;AACpF,EAAA,OAAO,MAAA,CACJ,0BAAA,EAA2B,CAC3B,MAAA,CAAO,CAAC,UAA8B,KAAA,CAAM,IAAA,KAAS,MAAM,CAAA,CAC3D,MAAA,CAAO,CAAC,UAAU,eAAA,CAAgBA,eAAAA,CAAe,KAAK,CAAA,EAAG,MAAM,CAAC,EAChE,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,EAAE,CAAA;AAC5B;AAEO,SAAS,SAAA,CACd,MAAA,EACA,cAAA,EACA,MAAA,EACA,MAAA,EACA;AACA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,cAAA,EAAgB;AACxC,IAAA,MAAA,CAAO,KAAA,CAAM,YAAY,EAAA,EAAI;AAAA,MAC3B,CAAA,EAAG,MAAM,CAAA,GAAI,MAAA;AAAA,MACb,CAAA,EAAG,MAAM,CAAA,GAAI;AAAA,KACd,CAAA;AAAA,EACH;AACF;AAEO,SAAS,aAAA,CACd,MAAA,EACA,WAAA,EACA,MAAA,EACA,KAAA,EACA;AACA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,QAAQ,CAAA,IAAK,WAAA,EAAa;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAErC,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,EAAE,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,EAAE,EAAG,MAAA,EAAQ,KAAK,CAAA;AAEjF,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,MACnD,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,IAAA,EAAM,YAAA;AAAA,QACJ,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,EAAA,KAAO;AACzB,UAAA,MAAM,QAAA,GAAW,EAAE,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,EAAA,CAAG,CAAA,EAAE;AAC9D,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA;AACnD,UAAA,OAAO;AAAA,YACL,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,aAAA,CAAc,CAAA;AAAA,YAC7B,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,aAAA,CAAc,CAAA;AAAA,YAC7B,GAAG,EAAA,CAAG;AAAA,WACR;AAAA,QACF,CAAC;AAAA;AACH,KACF,CAAE,CAAA;AAEF,IAAA,MAAA,CAAO,KAAA,CAAM,YAAY,EAAA,EAAI;AAAA,MAC3B,GAAG,aAAA,CAAc,CAAA;AAAA,MACjB,GAAG,aAAA,CAAc,CAAA;AAAA,MACjB,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,OAAO,QAAA;AAAS,KACnC,CAAA;AAAA,EACH;AACF;AAEO,SAAS,YACd,MAAA,EACA,MAAA,EACA,WAAA,EACA,WAAA,EACA,SACA,eAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAU,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,IAAA;AACpC,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAQ,WAAA,CAAY,IAAA,GAAO,YAAY,IAAI,CAAA;AACnE,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAQ,WAAA,CAAY,IAAA,GAAO,YAAY,IAAI,CAAA;AACnE,EAAA,MAAM,cAAc,MAAA,GAAS,MAAA;AAE7B,EAAA,IAAI,OAAO,WAAA,CAAY,IAAA;AACvB,EAAA,IAAI,OAAO,WAAA,CAAY,IAAA;AACvB,EAAA,IAAI,OAAO,WAAA,CAAY,IAAA;AACvB,EAAA,IAAI,OAAO,WAAA,CAAY,IAAA;AAEvB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,IAAA;AACH,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,OAAO,OAAO,CAAA;AACrD,MAAA;AAAA;AAGJ,EAAA,IAAI,eAAA,EAAiB;AAEnB,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAO,IAAI,CAAA;AACzC,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAO,IAAI,CAAA;AAEzC,IAAA,IAAI,KAAA,GAAQ,QAAQ,WAAA,EAAa;AAC/B,MAAA,KAAA,GAAQ,KAAA,GAAQ,WAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,KAAA,GAAQ,WAAA;AAAA,IAClB;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,KAAA,GAAQ,OAAA;AACR,MAAA,KAAA,GAAQ,KAAA,GAAQ,WAAA;AAAA,IAClB;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,KAAA,GAAQ,OAAA;AACR,MAAA,KAAA,GAAQ,KAAA,GAAQ,WAAA;AAAA,IAClB;AAEA,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,IAAA;AACH,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,WAAA,CAAY,IAAA;AACnB,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA,IAAA,GAAO,YAAY,IAAA,GAAO,KAAA;AAC1B,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,MAAM,SAAA,GAA6B,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAK;AAC5D,EAAA,MAAM,EAAA,GAAA,CAAM,SAAA,CAAU,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,MAAA;AAC/C,EAAA,MAAM,EAAA,GAAA,CAAM,SAAA,CAAU,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,MAAA;AAE/C,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,QAAQ,CAAA,IAAK,WAAA,EAAa;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AACrC,IAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,GAAA,CAAQ,QAAA,CAAS,CAAA,GAAI,YAAY,IAAA,IAAQ,EAAA;AACjE,IAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,GAAA,CAAQ,QAAA,CAAS,CAAA,GAAI,YAAY,IAAA,IAAQ,EAAA;AACjE,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,MACnD,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,IAAA,EAAM,YAAA;AAAA,QACJ,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACzB,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAAA,UACT,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAAA,UACT,GAAG,CAAA,CAAE;AAAA,SACP,CAAE;AAAA;AACJ,KACF,CAAE,CAAA;AAEF,IAAA,MAAA,CAAO,KAAA,CAAM,YAAY,EAAA,EAAI;AAAA,MAC3B,CAAA,EAAG,KAAA;AAAA,MACH,CAAA,EAAG,KAAA;AAAA,MACH,KAAA,EAAO,EAAE,GAAG,KAAA,CAAM,OAAO,QAAA;AAAS,KACnC,CAAA;AAAA,EACH;AACF","file":"index.js","sourcesContent":["// Unique id assigned for each shape\nexport type ShapeId = string;\n\n// Point with optional pressure (z) for styluses\nexport interface Vec3 {\n x: number;\n y: number;\n z?: number;\n}\n\n// Segment of draw strokes can be free (curved) or straight\nexport type SegmentType = 'free' | 'straight';\n\nexport interface DrawSegment {\n type: SegmentType;\n path: string; // base64-encoded points for storage\n}\n\n// Available sizes for strokes\nexport type SizeStyle = 's' | 'm' | 'l' | 'xl';\n\n// Available dash styles for drawing\nexport type DashStyle = 'draw' | 'solid' | 'dashed' | 'dotted';\n\n// Color styles (css-compatible or by palette key)\nexport type ColorStyle = string;\n\n// A single draw shape (stroke)\nexport interface DrawShape {\n id: ShapeId;\n type: 'draw';\n x: number;\n y: number;\n props: {\n color: ColorStyle;\n dash: DashStyle;\n size: SizeStyle;\n scale: number;\n isPen: boolean;\n isComplete: boolean;\n segments: DrawSegment[];\n isClosed?: boolean;\n };\n}\n\nexport type Shape = DrawShape;\n\n// Page holds shapes and camera state\nexport interface PageState {\n id: string;\n shapes: Record<ShapeId, Shape>;\n erasingShapeIds: ShapeId[];\n}\n\n// Stroke sizes in px\nexport const STROKE_WIDTHS: Record<SizeStyle, number> = {\n s: 2,\n m: 3.5,\n l: 5,\n xl: 10,\n};\n\n// Default drag distance squared for segment-mode transitions\nexport const DRAG_DISTANCE_SQUARED = 36;\n\n// Default colors\nexport const DEFAULT_COLORS: Record<string, string> = {\n black: '#1d1d1d',\n grey: '#9fa8b2',\n 'light-violet': '#e085f4',\n violet: '#ae3ec9',\n blue: '#4465e9',\n 'light-blue': '#4ba1f1',\n yellow: '#f1ac4b',\n orange: '#e16919',\n green: '#099268',\n 'light-green': '#4cb05e',\n 'light-red': '#f87777',\n red: '#e03131',\n white: '#ffffff',\n};\n\n// Max points per single stroke before starting a new shape\nexport const MAX_POINTS_PER_SHAPE = 200;\n","import type { Vec3 } from '../types.js';\n\n// Encode points to base64 path (x,y,z alternating)\nexport function encodePoints(points: Vec3[]): string {\n const arr: number[] = [];\n for (const p of points) {\n arr.push(p.x, p.y, p.z ?? 0.5);\n }\n return btoa(JSON.stringify(arr));\n}\n\n// Decode path string to points in local shape space\nexport function decodePoints(path: string): Vec3[] {\n try {\n const arr = JSON.parse(atob(path)) as number[];\n const out: Vec3[] = [];\n for (let i = 0; i < arr.length; i += 3) {\n out.push({\n x: arr[i] ?? 0,\n y: arr[i + 1] ?? 0,\n z: arr[i + 2],\n });\n }\n return out;\n } catch {\n return [];\n }\n}\n\nexport function decodeFirstPoint(path: string): Vec3 | null {\n const pts = decodePoints(path);\n return pts.length > 0 ? pts[0]! : null;\n}\n\nexport function decodeLastPoint(path: string): Vec3 | null {\n const pts = decodePoints(path);\n return pts.length > 0 ? pts[pts.length - 1]! : null;\n}\n\n// Decode segments to flat list of page-space points to render\nexport function decodePathToPoints(\n segments: { path: string }[],\n ox: number,\n oy: number\n): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n for (const seg of segments) {\n const pts = decodePoints(seg.path);\n for (const p of pts) {\n out.push({ x: ox + p.x, y: oy + p.y });\n }\n }\n return out;\n}\n\n","import type { PageState, Shape, ShapeId } from '../types.js';\nimport { STROKE_WIDTHS } from '../types.js';\nimport { decodePathToPoints } from '../utils/pathCodec.js';\n\n// In-memory document store for current page\nexport class DocumentStore {\n private state: PageState = {\n id: 'page-1',\n shapes: {},\n erasingShapeIds: [],\n };\n private order: ShapeId[] = [];\n\n getPage(): PageState {\n return this.state;\n }\n\n getShape(id: ShapeId): Shape | undefined {\n return this.state.shapes[id];\n }\n\n // Shapes organised in sorted order (first at bottom)\n getCurrentPageShapesSorted(): Shape[] {\n const list = this.order.length > 0 ? this.order : Object.keys(this.state.shapes);\n return list\n .map((id) => this.state.shapes[id])\n .filter((s): s is Shape => s != null);\n }\n\n // Shapes in reverse order (topmost first) for hit-testing\n getCurrentPageRenderingShapesSorted(): Shape[] {\n return [...this.getCurrentPageShapesSorted()].reverse();\n }\n\n getErasingShapeIds(): ShapeId[] {\n return [...this.state.erasingShapeIds];\n }\n\n setErasingShapes(ids: ShapeId[]): void {\n this.state.erasingShapeIds = ids;\n }\n\n createShape(shape: Shape): void {\n this.state.shapes[shape.id] = shape;\n this.order.push(shape.id);\n }\n\n updateShape(id: ShapeId, partial: Partial<Shape>): void {\n const existing = this.state.shapes[id];\n if (!existing) return;\n this.state.shapes[id] = { ...existing, ...partial, id };\n }\n\n deleteShapes(ids: ShapeId[]): void {\n for (const id of ids) {\n delete this.state.shapes[id];\n this.order = this.order.filter((i) => i !== id);\n }\n this.state.erasingShapeIds = this.state.erasingShapeIds.filter((i) => !ids.includes(i));\n }\n\n getCurrentPageShapes(): Shape[] {\n return Object.values(this.state.shapes);\n }\n\n // Shape IDs whose bounds intersect the given box for eraser line-segment hit\n getShapeIdsInBounds(box: { minX: number; minY: number; maxX: number; maxY: number }): Set<ShapeId> {\n const ids = new Set<ShapeId>();\n for (const shape of this.getCurrentPageShapesSorted()) {\n const b = getShapeBounds(shape);\n if (\n b.maxX >= box.minX &&\n b.minX <= box.maxX &&\n b.maxY >= box.minY &&\n b.minY <= box.maxY\n ) {\n ids.add(shape.id);\n }\n }\n return ids;\n }\n}\n\nfunction getShapeBounds(shape: Shape): { minX: number; minY: number; maxX: number; maxY: number } {\n if (shape.type !== 'draw') {\n return { minX: shape.x, minY: shape.y, maxX: shape.x, maxY: shape.y };\n }\n const pts = decodePathToPoints(shape.props.segments, shape.x, shape.y);\n if (pts.length === 0) return { minX: shape.x, minY: shape.y, maxX: shape.x, maxY: shape.y };\n let minX = pts[0]!.x;\n let minY = pts[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (const p of pts) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n const stroke = STROKE_WIDTHS[shape.props.size] * shape.props.scale;\n return { minX: minX - stroke, minY: minY - stroke, maxX: maxX + stroke, maxY: maxY + stroke };\n}\n","import type { IEditor } from '../editor/editorTypes.js';\nimport type { Vec3 } from '../types.js';\n\n// Types for tool state events\nexport interface ToolPointerDownInfo {\n point: Vec3;\n}\n\nexport interface ToolPointerMoveInfo {\n screenDeltaX?: number;\n screenDeltaY?: number;\n}\n\nexport interface ToolKeyInfo {\n key: string;\n}\n\nexport type ToolStateTransitionInfo = | ToolPointerDownInfo | ToolPointerMoveInfo | ToolKeyInfo;\n\nexport interface ToolStateContext {\n transition(stateId: string, info?: ToolStateTransitionInfo): void;\n}\n\nexport interface StateNodeConstructor {\n id: string;\n new (ctx: ToolStateContext, editor: IEditor): StateNode;\n}\n\n// State node in the tool state machine\nexport abstract class StateNode {\n static id: string = 'base';\n\n constructor(\n protected ctx: ToolStateContext,\n protected editor: IEditor\n ) {}\n\n onEnter(_info?: ToolStateTransitionInfo): void {}\n onExit(_info?: ToolStateTransitionInfo, _to?: string): void {}\n onPointerDown(_info?: ToolPointerDownInfo): void {}\n onPointerMove(_info?: ToolPointerMoveInfo): void {}\n onPointerUp(): void {}\n onKeyDown(_info?: ToolKeyInfo): void {}\n onKeyUp(_info?: ToolKeyInfo): void {}\n onCancel(): void {}\n onInterrupt(): void {}\n}\n","// Viewport: pan (x,y) and zoom\nexport interface Viewport {\n x: number;\n y: number;\n zoom: number;\n}\n\nexport function createViewport(): Viewport {\n return { x: 0, y: 0, zoom: 1 };\n}\n\n// Screen point to page point\nexport function screenToPage(viewport: Viewport, screenX: number, screenY: number): { x: number; y: number } {\n return {\n x: (screenX - viewport.x) / viewport.zoom,\n y: (screenY - viewport.y) / viewport.zoom,\n };\n}\n\n// Page point to screen point\nexport function pageToScreen(viewport: Viewport, pageX: number, pageY: number): { x: number; y: number } {\n return {\n x: pageX * viewport.zoom + viewport.x,\n y: pageY * viewport.zoom + viewport.y,\n };\n}\n\nexport function setViewport(\n viewport: Viewport,\n updater: { x?: number; y?: number; zoom?: number }\n): Viewport {\n return {\n x: updater.x ?? viewport.x,\n y: updater.y ?? viewport.y,\n zoom: updater.zoom ?? viewport.zoom,\n };\n}\n\nexport function panViewport(viewport: Viewport, dx: number, dy: number): Viewport {\n return { ...viewport, x: viewport.x + dx, y: viewport.y + dy };\n}\n\nexport function zoomViewport(viewport: Viewport, factor: number, centerX?: number, centerY?: number): Viewport {\n const zoom = Math.max(0.1, Math.min(4, viewport.zoom * factor));\n if (centerX == null || centerY == null) {\n return { ...viewport, zoom };\n }\n const pageBefore = screenToPage(viewport, centerX, centerY);\n const x = centerX - pageBefore.x * zoom;\n const y = centerY - pageBefore.y * zoom;\n return { x, y, zoom };\n}\n","import { DEFAULT_COLORS } from '../types.js';\n\nexport type TsdrawRenderTheme = 'light' | 'dark';\n\nexport function resolveThemeColor(colorStyle: string, theme: TsdrawRenderTheme): string {\n const paletteColor = DEFAULT_COLORS[colorStyle];\n if (!paletteColor) return colorStyle;\n if (theme === 'light') return paletteColor;\n return invertAndHueRotate180(paletteColor);\n}\n\n// temporary fix for dark mode colors. eventually make custom dark mode pallete mappings\nfunction invertAndHueRotate180(color: string): string {\n const rgb = parseHexColor(color);\n if (!rgb) return color;\n\n const inverted = {\n r: 255 - rgb.r,\n g: 255 - rgb.g,\n b: 255 - rgb.b,\n };\n const hsl = rgbToHsl(inverted.r, inverted.g, inverted.b);\n const rotated = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l);\n\n return rgbToHex(rotated.r, rotated.g, rotated.b);\n}\n\nfunction parseHexColor(color: string): { r: number; g: number; b: number } | null {\n const normalized = color.trim().toLowerCase();\n if (!normalized.startsWith('#')) return null;\n\n if (normalized.length === 4) {\n return {\n r: parseInt(normalized[1]! + normalized[1]!, 16),\n g: parseInt(normalized[2]! + normalized[2]!, 16),\n b: parseInt(normalized[3]! + normalized[3]!, 16),\n };\n }\n\n if (normalized.length !== 7) return null;\n\n return {\n r: parseInt(normalized.slice(1, 3), 16),\n g: parseInt(normalized.slice(3, 5), 16),\n b: parseInt(normalized.slice(5, 7), 16),\n };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction toHex(value: number): string {\n return Math.round(Math.max(0, Math.min(255, value))).toString(16).padStart(2, '0');\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n const red = r / 255;\n const green = g / 255;\n const blue = b / 255;\n const maxChannel = Math.max(red, green, blue);\n const minChannel = Math.min(red, green, blue);\n const delta = maxChannel - minChannel;\n const lightness = (maxChannel + minChannel) / 2;\n\n if (delta === 0) {\n return { h: 0, s: 0, l: lightness };\n }\n\n const saturation =\n lightness > 0.5 ? delta / (2 - maxChannel - minChannel) : delta / (maxChannel + minChannel);\n\n let hue = 0;\n if (maxChannel === red) {\n hue = ((green - blue) / delta + (green < blue ? 6 : 0)) * 60;\n } else if (maxChannel === green) {\n hue = ((blue - red) / delta + 2) * 60;\n } else {\n hue = ((red - green) / delta + 4) * 60;\n }\n\n return { h: hue, s: saturation, l: lightness };\n}\n\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n if (s === 0) {\n const channel = l * 255;\n return { r: channel, g: channel, b: channel };\n }\n\n const chroma = (1 - Math.abs(2 * l - 1)) * s;\n const hueSegment = h / 60;\n const x = chroma * (1 - Math.abs((hueSegment % 2) - 1));\n let red = 0;\n let green = 0;\n let blue = 0;\n\n if (hueSegment >= 0 && hueSegment < 1) {\n red = chroma;\n green = x;\n } else if (hueSegment < 2) {\n red = x;\n green = chroma;\n } else if (hueSegment < 3) {\n green = chroma;\n blue = x;\n } else if (hueSegment < 4) {\n green = x;\n blue = chroma;\n } else if (hueSegment < 5) {\n red = x;\n blue = chroma;\n } else {\n red = chroma;\n blue = x;\n }\n\n const match = l - chroma / 2;\n return {\n r: (red + match) * 255,\n g: (green + match) * 255,\n b: (blue + match) * 255,\n };\n}\n","import type { Viewport } from './viewport.js';\nimport type { Shape, DrawShape } from '../types.js';\nimport { STROKE_WIDTHS } from '../types.js';\nimport { decodePoints } from '../utils/pathCodec.js';\nimport { resolveThemeColor, type TsdrawRenderTheme } from '../utils/colors.js';\nimport { getStroke } from 'perfect-freehand';\n\n// Renderer interface: renders shapes given 2d canvas context and viewport\nexport interface ICanvasRenderer {\n render(ctx: CanvasRenderingContext2D, viewport: Viewport, shapes: Shape[]): void;\n}\n\n// Default canvas renderer: draws shapes using (optionally) pressure-based width for ipads and whatnot\nexport class CanvasRenderer implements ICanvasRenderer {\n private theme: TsdrawRenderTheme = 'light';\n\n setTheme(theme: TsdrawRenderTheme): void {\n this.theme = theme;\n }\n\n render(ctx: CanvasRenderingContext2D, viewport: Viewport, shapes: Shape[]): void {\n ctx.save();\n ctx.translate(viewport.x, viewport.y);\n ctx.scale(viewport.zoom, viewport.zoom);\n for (const shape of shapes) {\n if (shape.type === 'draw') {\n this.paintStroke(ctx, shape);\n }\n }\n ctx.restore();\n }\n\n private paintStroke(ctx: CanvasRenderingContext2D, shape: DrawShape): void {\n const width = (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n const samples = flattenSegments(shape);\n if (samples.length === 0) return;\n const color = resolveThemeColor(shape.props.color, this.theme);\n\n if (shape.props.dash !== 'draw') {\n this.paintDashedStroke(ctx, samples, width, color, shape.props.dash);\n return;\n }\n\n const config = strokeConfig(shape, width);\n const outline = getStroke(\n samples.map((p) => [p.x, p.y, p.pressure] as [number, number, number]),\n config\n );\n if (outline.length === 0) return;\n\n ctx.fillStyle = color;\n ctx.beginPath();\n const first = outline[0];\n if (!first) return;\n ctx.moveTo(first[0], first[1]);\n for (let i = 1; i < outline.length; i++) {\n const p = outline[i];\n if (p) ctx.lineTo(p[0], p[1]);\n }\n ctx.closePath();\n ctx.fill();\n }\n\n private paintDashedStroke(\n ctx: CanvasRenderingContext2D,\n samples: Array<{ x: number; y: number }>,\n width: number,\n color: string,\n dash: DrawShape['props']['dash']\n ): void {\n if (samples.length === 1) {\n const p = samples[0]!;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(p.x, p.y, width / 2, 0, Math.PI * 2);\n ctx.fill();\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = width;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.setLineDash(getLineDash(dash, width));\n ctx.beginPath();\n ctx.moveTo(samples[0]!.x, samples[0]!.y);\n for (let i = 1; i < samples.length; i++) {\n const p = samples[i]!;\n ctx.lineTo(p.x, p.y);\n }\n ctx.stroke();\n ctx.restore();\n }\n}\n\nconst PRESSURE_FLOOR = 0.025;\nconst STYLUS_CURVE = (t: number) => t * 0.65 + Math.sin((t * Math.PI) / 2) * 0.35;\nconst sineOut = (t: number) => Math.sin((t * Math.PI) / 2);\nconst cubicInOut = (t: number) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\nfunction remap(\n value: number,\n inRange: [number, number],\n outRange: [number, number],\n clamp = false\n) {\n const [lo, hi] = inRange;\n const [outLo, outHi] = outRange;\n const t = (value - lo) / (hi - lo);\n const clamped = clamp ? Math.max(0, Math.min(1, t)) : t;\n return outLo + (outHi - outLo) * clamped;\n}\n\nfunction strokeConfig(shape: DrawShape, width: number) {\n const done = shape.props.isComplete;\n if (shape.props.isPen) {\n return {\n size: 1 + width * 1.2,\n thinning: 0.62,\n streamline: 0.62,\n smoothing: 0.62,\n simulatePressure: false,\n easing: STYLUS_CURVE,\n last: done,\n };\n }\n return {\n size: width,\n thinning: 0.5,\n streamline: remap(width, [9, 16], [0.64, 0.74], true),\n smoothing: 0.62,\n simulatePressure: true,\n easing: sineOut,\n last: done,\n };\n}\n\nfunction flattenSegments(shape: DrawShape) {\n const out: { x: number; y: number; pressure: number }[] = [];\n for (const seg of shape.props.segments) {\n const decoded = decodePoints(seg.path).map((p) => ({\n x: p.x + shape.x,\n y: p.y + shape.y,\n pressure: Math.max(PRESSURE_FLOOR, p.z ?? 0.5),\n }));\n\n if (seg.type === 'free' || decoded.length < 2) {\n out.push(...decoded);\n continue;\n }\n\n const A = decoded[0]!;\n const D = decoded[1]!;\n const len = Math.hypot(D.x - A.x, D.y - A.y);\n if (len === 0) {\n out.push(A);\n continue;\n }\n\n const ux = (D.x - A.x) / len;\n const uy = (D.y - A.y) / len;\n const nudge = Math.min(1, Math.floor(len / 4));\n const B = { x: A.x + ux * nudge, y: A.y + uy * nudge, pressure: A.pressure };\n const C = { x: D.x - ux * nudge, y: D.y - uy * nudge, pressure: D.pressure };\n const count = Math.max(4, Math.floor(len / 16));\n out.push(A);\n for (let i = 1; i <= count; i++) {\n const t = i / (count + 1);\n const e = cubicInOut(t);\n out.push({\n x: B.x + (C.x - B.x) * e,\n y: B.y + (C.y - B.y) * e,\n pressure: B.pressure + (C.pressure - B.pressure) * e,\n });\n }\n out.push(D);\n }\n\n if (out.length > 0 && !shape.props.isPen) {\n for (const p of out) p.pressure = 0.5;\n }\n return out;\n}\n\nfunction getLineDash(dash: DrawShape['props']['dash'], width: number): number[] {\n switch (dash) {\n case 'dashed': return [width * 2, width * 2];\n case 'dotted': return [Math.max(1, width * 0.25), width * 2];\n case 'solid':\n case 'draw':\n default:\n return [];\n }\n}\n","import type { Vec3 } from '../types.js';\n\n// Normalized pointer input (page space, with pressure)\nexport interface PointerInput {\n currentPagePoint: Vec3;\n originPagePoint: Vec3;\n previousPagePoint: Vec3;\n isPen: boolean;\n shiftKey: boolean;\n ctrlKey: boolean;\n isDragging: boolean;\n}\n\n// Input manager: captures pointer events and gives page-space coords + modifiers\nexport class InputManager {\n private _current: Vec3 = { x: 0, y: 0 };\n private _origin: Vec3 = { x: 0, y: 0 }; // Where pointer_down occured\n private _previous: Vec3 = { x: 0, y: 0 }; // Where pointer was before most recent update\n private _isPen = false; // Whether input is from a stylus\n private _shiftKey = false; // Whether shift is pressed\n private _ctrlKey = false; // Whether ctrl is pressed\n private _metaKey = false; // Whether meta is pressed\n private _isDragging = false; // Whether pointer is dragging\n\n getCurrentPagePoint(): Vec3 { return { ...this._current }; }\n getOriginPagePoint(): Vec3 { return { ...this._origin }; }\n getPreviousPagePoint(): Vec3 { return { ...this._previous }; }\n\n getIsPen(): boolean { return this._isPen; }\n\n getShiftKey(): boolean { return this._shiftKey; }\n getCtrlKey(): boolean { return this._ctrlKey; }\n getAccelKey(): boolean { return this._ctrlKey || this._metaKey; }\n\n getIsDragging(): boolean { return this._isDragging; }\n\n pointerDown(pageX: number, pageY: number, pressure?: number, isPen?: boolean): void {\n this._origin = { x: pageX, y: pageY, z: pressure ?? 0.5 };\n this._current = { ...this._origin };\n this._previous = { ...this._origin };\n this._isDragging = false;\n if (isPen !== undefined) this._isPen = isPen;\n }\n\n pointerMove(pageX: number, pageY: number, pressure?: number, isPen?: boolean): void {\n this._previous = { ...this._current };\n this._current = { x: pageX, y: pageY, z: pressure ?? this._current.z ?? 0.5 };\n this._isPen = isPen ?? this._isPen;\n if (this._origin.x !== this._current.x || this._origin.y !== this._current.y) {\n this._isDragging = true;\n }\n }\n\n pointerUp(): void {\n // Keep current. caller can reset if needed\n }\n\n setModifiers(shift: boolean, ctrl: boolean, meta?: boolean): void {\n this._shiftKey = shift;\n this._ctrlKey = ctrl;\n this._metaKey = meta ?? ctrl;\n }\n\n getInputs(): PointerInput {\n return {\n currentPagePoint: this.getCurrentPagePoint(),\n originPagePoint: this.getOriginPagePoint(),\n previousPagePoint: this.getPreviousPagePoint(),\n isPen: this._isPen,\n shiftKey: this._shiftKey,\n ctrlKey: this._ctrlKey,\n isDragging: this._isDragging,\n };\n }\n}\n","import type {\n StateNode,\n StateNodeConstructor,\n ToolKeyInfo,\n ToolPointerDownInfo,\n ToolPointerMoveInfo,\n ToolStateTransitionInfo,\n} from '../store/stateNode.js';\n\nexport type DefaultToolId = 'pen' | 'eraser' | 'select' | 'hand';\nexport type ToolId = DefaultToolId | (string & {});\n\nexport interface ToolDefinition {\n id: ToolId;\n initialStateId: string;\n stateConstructors: StateNodeConstructor[];\n}\n\n// Manages current tool and passes pointer/key events to state nodes\nexport class ToolManager {\n private currentToolId: ToolId = 'pen';\n private currentState: StateNode | null = null;\n private states: Map<string, StateNode> = new Map();\n private toolInitialStateIds: Map<ToolId, string> = new Map();\n\n registerState(state: StateNode): void {\n const ctor = state.constructor as StateNodeConstructor;\n if (this.states.has(ctor.id)) {\n throw new Error(`Tool state '${ctor.id}' is already registered.`);\n }\n this.states.set(ctor.id, state);\n }\n\n registerTool(id: ToolId, initialStateId: string): void {\n if (this.toolInitialStateIds.has(id)) {\n throw new Error(`Tool '${id}' is already registered.`);\n }\n this.toolInitialStateIds.set(id, initialStateId);\n }\n\n hasTool(id: ToolId): boolean {\n return this.toolInitialStateIds.has(id);\n }\n\n setCurrentTool(id: ToolId): void {\n const initialStateId = this.toolInitialStateIds.get(id);\n if (!initialStateId) return;\n const nextState = this.states.get(initialStateId);\n if (!nextState) return;\n\n this.currentState?.onExit?.(undefined, initialStateId);\n this.currentToolId = id;\n this.currentState = nextState;\n this.currentState.onEnter?.();\n }\n\n getCurrentToolId(): ToolId {\n return this.currentToolId;\n }\n\n getCurrentState(): StateNode | null {\n return this.currentState;\n }\n\n transition(stateId: string, info?: ToolStateTransitionInfo): void {\n const next = this.states.get(stateId);\n if (!next) return;\n this.currentState?.onExit?.(undefined, stateId);\n this.currentState = next;\n this.currentState.onEnter?.(info);\n }\n\n pointerDown(info: ToolPointerDownInfo): void { this.currentState?.onPointerDown?.(info); }\n pointerMove(info: ToolPointerMoveInfo): void { this.currentState?.onPointerMove?.(info); }\n pointerUp(): void { this.currentState?.onPointerUp?.(); }\n\n keyDown(info: ToolKeyInfo): void { this.currentState?.onKeyDown?.(info); }\n keyUp(info: ToolKeyInfo): void { this.currentState?.onKeyUp?.(info); }\n\n cancel(): void { this.currentState?.onCancel?.(); }\n interrupt(): void { this.currentState?.onInterrupt?.(); }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class PenIdleState extends StateNode {\n static override id = 'pen_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('pen_drawing', info);\n }\n}","import type { Vec3 } from '../types.js';\n\nexport function dist(a: Vec3, b: Vec3): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nexport function sqDist(a: Vec3, b: Vec3): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return dx * dx + dy * dy;\n}\n\nexport function withinRadius(a: Vec3, b: Vec3, r: number): boolean {\n return dist(a, b) <= r;\n}\n\nexport function toFixed(n: number, digits = 2): number {\n return Number(Number.prototype.toFixed.call(n, digits));\n}\n\nexport function roundPt(p: Vec3): Vec3 {\n return { x: toFixed(p.x), y: toFixed(p.y), z: p.z != null ? toFixed(p.z) : undefined };\n}\n\n// Calculate bwtween two interpolated points\nexport function lerpPath(from: Vec3, to: Vec3, steps: number): Vec3[] {\n const result: Vec3[] = [];\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n result.push({\n x: toFixed(from.x + (to.x - from.x) * t),\n y: toFixed(from.y + (to.y - from.y) * t),\n z: from.z != null && to.z != null ? toFixed(from.z + (to.z - from.z) * t) : to.z ?? from.z,\n });\n }\n return result;\n}\n\n// Snap angle to the nearest division\nexport function quantizeAngle(rad: number, divisions: number): number {\n const step = (Math.PI * 2) / divisions;\n return Math.round(rad / step) * step;\n}\n\n// Rotate point around an origin\nexport function rotateAround(pt: Vec3, origin: Vec3, angle: number): Vec3 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const rx = pt.x - origin.x;\n const ry = pt.y - origin.y;\n return {\n x: origin.x + rx * c - ry * s,\n y: origin.y + rx * s + ry * c,\n z: pt.z,\n };\n}\n\nexport function tail<T>(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n","import {\n StateNode,\n type ToolKeyInfo,\n type ToolPointerDownInfo,\n} from '../../../store/stateNode.js';\nimport type { DrawShape, DrawSegment, Vec3 } from '../../../types.js';\nimport { STROKE_WIDTHS, MAX_POINTS_PER_SHAPE } from '../../../types.js';\nimport { encodePoints, decodePoints, decodeFirstPoint, decodeLastPoint } from '../../../utils/pathCodec.js';\nimport { dist, sqDist, withinRadius, toFixed, roundPt, lerpPath, tail, quantizeAngle, rotateAround } from '../../../utils/vec.js';\n\ntype StrokePhase = 'free' | 'straight' | 'starting_straight' | 'starting_free';\n\n// State for when pen is being used\nexport class PenDrawingState extends StateNode {\n static override id = 'pen_drawing';\n\n private _startInfo: ToolPointerDownInfo = { point: { x: 0, y: 0, z: 0.5 } };\n private _target: DrawShape | undefined;\n private _isPenDevice = false;\n private _hasPressure = false;\n private _phase: StrokePhase = 'free';\n private _extending = false;\n private _anchor: Vec3 = { x: 0, y: 0 };\n private _pendingAnchor: Vec3 | null = null;\n private _lastSample: Vec3 = { x: 0, y: 0 };\n private _shouldMerge = false;\n private _pathLen = 0;\n private _activePts: Vec3[] = [];\n\n override onEnter(info?: ToolPointerDownInfo): void {\n this._startInfo = info ?? { point: { x: 0, y: 0, z: 0.5 } };\n this._lastSample = { ...this.editor.input.getCurrentPagePoint() };\n this.beginStroke();\n }\n\n override onPointerMove(): void {\n const inputs = this.editor.input;\n const penActive = inputs.getIsPen();\n if (this._isPenDevice && !penActive) {\n this.beginStroke();\n return;\n }\n if (this._hasPressure) {\n const cur = inputs.getCurrentPagePoint();\n const threshold = 1 / this.editor.getZoomLevel();\n if (dist(cur, this._lastSample) >= threshold) {\n this._lastSample = { ...cur };\n this._shouldMerge = false;\n } else {\n this._shouldMerge = true;\n }\n } else {\n this._shouldMerge = false;\n }\n this.advanceStroke();\n }\n\n // Shift: start a new straight segment\n // Maybe add a specific key for snapping or turning drawing into a proper shape?\n\n override onKeyDown(info?: ToolKeyInfo): void {\n if (info?.key === 'Shift') {\n switch (this._phase) {\n case 'free':\n this._phase = 'starting_straight';\n this._pendingAnchor = { ...this.editor.input.getCurrentPagePoint() };\n break;\n case 'starting_free':\n this._phase = 'starting_straight';\n break;\n }\n }\n this.advanceStroke();\n }\n\n override onKeyUp(info?: ToolKeyInfo): void {\n if (info?.key === 'Shift') {\n switch (this._phase) {\n case 'straight':\n this._phase = 'starting_free';\n this._pendingAnchor = { ...this.editor.input.getCurrentPagePoint() };\n break;\n case 'starting_straight':\n this._pendingAnchor = null;\n this._phase = 'free';\n break;\n }\n }\n this.advanceStroke();\n }\n\n override onPointerUp(): void {\n this.endStroke();\n }\n\n override onCancel(): void {\n this.ctx.transition('pen_idle', this._startInfo);\n }\n\n override onInterrupt(): void {\n if (!this.editor.input.getIsDragging()) {\n this.ctx.transition('pen_idle', this._startInfo);\n }\n }\n\n private canClosePath(): boolean {\n return true;\n }\n\n private detectClosure(\n segments: DrawSegment[],\n size: DrawShape['props']['size'],\n scale: number\n ): boolean {\n if (!this.canClosePath() || segments.length === 0) return false;\n const w = STROKE_WIDTHS[size];\n const first = decodeFirstPoint(segments[0]!.path);\n const lastSeg = segments[segments.length - 1];\n const end = decodeLastPoint(lastSeg!.path);\n if (!first || !end) return false;\n if (first.x === end.x && first.y === end.y) return false;\n if (this._pathLen <= w * 4 * scale) return false;\n return withinRadius(first, end, w * 2 * scale);\n }\n\n private measurePath(segments: DrawSegment[]): number {\n let sum = 0;\n for (const seg of segments) {\n const pts = decodePoints(seg.path);\n for (let i = 0; i < pts.length - 1; i++) {\n sum += sqDist(pts[i]!, pts[i + 1]!);\n }\n }\n return Math.sqrt(sum);\n }\n\n // Start a new shape, when user starts a stroke\n private beginStroke(): void {\n const inputs = this.editor.input;\n const origin = inputs.getOriginPagePoint();\n const penActive = inputs.getIsPen();\n const z = this._startInfo?.point?.z ?? 0.5;\n this._isPenDevice = penActive;\n this._hasPressure = (penActive && z !== 0) || (z > 0 && z < 0.5) || (z > 0.5 && z < 1);\n const pressure = this._hasPressure ? toFixed(z * 1.25) : 0.5;\n this._phase = inputs.getShiftKey() ? 'straight' : 'free';\n this._extending = false;\n this._lastSample = { ...origin };\n\n const sorted = this.editor.store.getCurrentPageShapesSorted();\n const prev = tail(sorted) as DrawShape | undefined;\n const existing = prev?.type === 'draw' ? prev : undefined;\n this._target = existing;\n\n if (existing && this._phase === 'straight') {\n const prevSeg = tail(existing.props.segments);\n if (!prevSeg) { this.spawnShape(origin, pressure); return; }\n const prevEnd = decodeLastPoint(prevSeg.path);\n if (!prevEnd) { this.spawnShape(origin, pressure); return; }\n this._extending = true;\n const local = this.editor.getPointInShapeSpace(existing, origin);\n const localPt: Vec3 = { x: toFixed(local.x), y: toFixed(local.y), z: pressure };\n const newSeg: DrawSegment = {\n type: 'straight',\n path: encodePoints([\n { x: prevEnd.x, y: prevEnd.y, z: pressure },\n localPt,\n ]),\n };\n this._anchor = {\n x: existing.x + prevEnd.x,\n y: existing.y + prevEnd.y,\n };\n this._pendingAnchor = null;\n const segs = [...existing.props.segments, newSeg];\n this._pathLen = this.measurePath(segs);\n this.editor.updateShapes([\n {\n id: existing.id,\n type: 'draw',\n props: {\n segments: segs,\n isClosed: this.detectClosure(segs, existing.props.size, existing.props.scale),\n },\n },\n ]);\n return;\n }\n\n this.spawnShape(origin, pressure);\n }\n\n // Create a new shape, when we need a new drawing shape \n private spawnShape(originPt: Vec3, pressure: number): void {\n this._anchor = { ...originPt };\n const drawStyle = this.editor.getCurrentDrawStyle();\n const id = this.editor.createShapeId();\n const firstPt: Vec3 = { x: 0, y: 0, z: pressure };\n this._activePts = [firstPt];\n this.editor.createShape({\n id,\n type: 'draw',\n x: originPt.x,\n y: originPt.y,\n props: {\n color: drawStyle.color,\n dash: drawStyle.dash,\n size: drawStyle.size,\n scale: 1,\n isPen: this._hasPressure,\n isComplete: false,\n segments: [\n {\n type: this._phase === 'straight' ? 'straight' : 'free',\n path: encodePoints([firstPt]),\n },\n ],\n },\n });\n const shape = this.editor.getShape(id) as DrawShape | undefined;\n if (!shape) {\n this.ctx.transition('pen_idle', this._startInfo);\n return;\n }\n this._pathLen = 0;\n this._target = shape;\n }\n\n // Update the drawing shape, while user is drawing\n private advanceStroke(): void {\n const target = this._target;\n const inputs = this.editor.input;\n if (!target) return;\n\n const shape = this.editor.getShape(target.id) as DrawShape | undefined;\n if (!shape) return;\n\n const { id, props: { size, scale } } = target;\n const { segments } = shape.props;\n const curPt = inputs.getCurrentPagePoint();\n const local = this.editor.getPointInShapeSpace(shape, curPt);\n const pressure = this._hasPressure\n ? toFixed((curPt.z ?? 0.5) * 1.25)\n : 0.5;\n const pt: Vec3 = { x: toFixed(local.x), y: toFixed(local.y), z: pressure };\n\n // Straight: straight lines, eg. holding shift\n // Free: smooth drawings so drawings doesnt look geometrical\n\n switch (this._phase) {\n case 'starting_straight': {\n const pending = this._pendingAnchor;\n if (!pending) break;\n if (sqDist(pending, inputs.getCurrentPagePoint()) <= this.editor.options.dragDistanceSquared) break;\n this._anchor = { ...pending };\n this._pendingAnchor = null;\n this._phase = 'straight';\n const prevSeg = tail(segments);\n if (!prevSeg) break;\n const prevEnd = decodeLastPoint(prevSeg.path);\n if (!prevEnd) break;\n const anchorLocal = this.editor.getPointInShapeSpace(shape, this._anchor);\n const anchorPt = roundPt(anchorLocal);\n const seg: DrawSegment = {\n type: 'straight',\n path: encodePoints([prevEnd, { ...anchorPt, z: pressure }]),\n };\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: [...segments, seg],\n isClosed: this.detectClosure(segments, size, scale),\n },\n },\n ]);\n break;\n }\n case 'starting_free': {\n const pending = this._pendingAnchor;\n if (!pending) break;\n if (sqDist(pending, inputs.getCurrentPagePoint()) <= this.editor.options.dragDistanceSquared) break;\n this._anchor = { ...pending };\n this._pendingAnchor = null;\n this._phase = 'free';\n const prevSeg = tail(segments);\n if (!prevSeg) break;\n const prevEnd = decodeLastPoint(prevSeg.path);\n if (!prevEnd) break;\n const interpolated = lerpPath(prevEnd, pt, 6);\n this._activePts = interpolated;\n const freeSeg: DrawSegment = {\n type: 'free',\n path: encodePoints(interpolated),\n };\n const allSegs = [...segments, freeSeg];\n this._pathLen = this.measurePath(allSegs);\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: allSegs,\n isClosed: this.detectClosure(allSegs, size, scale),\n },\n },\n ]);\n break;\n }\n case 'straight': {\n const updated = segments.slice();\n const lastSeg = updated[updated.length - 1];\n if (!lastSeg) break;\n const anchorPage = this._anchor;\n const current = inputs.getCurrentPagePoint();\n const shouldSnap = !this._extending || inputs.getIsDragging();\n if (this._extending && inputs.getIsDragging()) {\n this._extending = false;\n }\n let pagePt: Vec3;\n if (shouldSnap) {\n const angle = Math.atan2(\n current.y - anchorPage.y,\n current.x - anchorPage.x\n );\n const snapped = quantizeAngle(angle, 24);\n const diff = snapped - angle;\n pagePt = rotateAround(current, anchorPage, diff);\n } else {\n pagePt = { ...current };\n }\n const localPt = this.editor.getPointInShapeSpace(shape, pagePt);\n const fixedPt = roundPt(localPt);\n const segStart = decodeFirstPoint(lastSeg.path);\n if (segStart) {\n this._pathLen += dist(segStart, fixedPt);\n }\n updated[updated.length - 1] = {\n ...lastSeg,\n type: 'straight',\n path: encodePoints([segStart ?? fixedPt, { ...fixedPt, z: pressure }]),\n };\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: updated,\n isClosed: this.detectClosure(segments, size, scale),\n },\n },\n ]);\n break;\n }\n case 'free': {\n const cached = this._activePts;\n if (cached.length && this._shouldMerge) {\n const last = cached[cached.length - 1]!;\n last.x = pt.x;\n last.y = pt.y;\n last.z = last.z != null ? Math.max(last.z, pt.z ?? 0) : pt.z;\n } else {\n this._pathLen += cached.length\n ? dist(cached[cached.length - 1]!, pt)\n : 0;\n cached.push({ x: pt.x, y: pt.y, z: pt.z });\n }\n const updated = segments.slice();\n const lastSeg = updated[updated.length - 1]!;\n updated[updated.length - 1] = {\n ...lastSeg,\n path: encodePoints(cached),\n };\n if (this._pathLen < STROKE_WIDTHS[shape.props.size] * 4) {\n this._pathLen = this.measurePath(updated);\n }\n this.editor.updateShapes([\n {\n id,\n type: 'draw',\n props: {\n segments: updated,\n isClosed: this.detectClosure(updated, size, scale),\n },\n },\n ]);\n if (cached.length > MAX_POINTS_PER_SHAPE) {\n this.editor.updateShapes([{ id, type: 'draw', props: { isComplete: true } }]);\n const newId = this.editor.createShapeId();\n const curPage = inputs.getCurrentPagePoint();\n const firstPt: Vec3 = {\n x: 0,\n y: 0,\n z: this._hasPressure ? toFixed((curPage.z ?? 0.5) * 1.25) : 0.5,\n };\n this._activePts = [firstPt];\n this.editor.createShape({\n id: newId,\n type: 'draw',\n x: curPage.x,\n y: curPage.y,\n props: {\n color: shape.props.color,\n dash: shape.props.dash,\n size: shape.props.size,\n scale: shape.props.scale,\n isPen: this._hasPressure,\n isComplete: false,\n segments: [{ type: 'free', path: encodePoints([firstPt]) }],\n },\n });\n const created = this.editor.getShape(newId) as DrawShape | undefined;\n if (created) {\n this._target = created;\n this._lastSample = { ...curPage };\n this._pathLen = 0;\n }\n }\n break;\n }\n }\n }\n\n private endStroke(): void {\n if (!this._target) return;\n this.editor.updateShapes([\n { id: this._target.id, type: 'draw', props: { isComplete: true } },\n ]);\n this.ctx.transition('pen_idle');\n }\n}\n","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class EraserIdleState extends StateNode {\n static override id = 'eraser_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('eraser_pointing', info);\n }\n}","export interface Bounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport function boundsOf(points: { x: number; y: number }[]): Bounds {\n if (points.length === 0) return { minX: 0, minY: 0, maxX: 0, maxY: 0 };\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (const p of points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { minX, minY, maxX, maxY };\n}\n\nexport function padBounds(b: Bounds, amount: number): Bounds {\n return {\n minX: b.minX - amount,\n minY: b.minY - amount,\n maxX: b.maxX + amount,\n maxY: b.maxY + amount,\n };\n}\n\nexport function sqDistance(ax: number, ay: number, bx: number, by: number): number {\n const dx = bx - ax;\n const dy = by - ay;\n return dx * dx + dy * dy;\n}\n\nexport function distance(ax: number, ay: number, bx: number, by: number): number {\n return Math.sqrt(sqDistance(ax, ay, bx, by));\n}\n\n// Closest point on segment A-B to point P\nexport function closestOnSegment(\n ax: number, ay: number,\n bx: number, by: number,\n px: number, py: number\n): { x: number; y: number } {\n const dx = bx - ax;\n const dy = by - ay;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return { x: ax, y: ay };\n const t = Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / lenSq));\n return { x: ax + t * dx, y: ay + t * dy };\n}\n\n// Hit-test (does line segment (ax,ay) - (bx,by) come within margin of the polyline?)\nexport function segmentTouchesPolyline(\n polyline: { x: number; y: number }[],\n ax: number, ay: number,\n bx: number, by: number,\n margin: number\n): boolean {\n for (let i = 0; i < polyline.length - 1; i++) {\n const p = polyline[i]!;\n const q = polyline[i + 1]!;\n const n1 = closestOnSegment(p.x, p.y, q.x, q.y, ax, ay);\n if (distance(n1.x, n1.y, ax, ay) <= margin) return true;\n const n2 = closestOnSegment(p.x, p.y, q.x, q.y, bx, by);\n if (distance(n2.x, n2.y, bx, by) <= margin) return true;\n const n3 = closestOnSegment(ax, ay, bx, by, p.x, p.y);\n if (distance(n3.x, n3.y, p.x, p.y) <= margin) return true;\n }\n if (polyline.length === 1) {\n const p = polyline[0]!;\n return distance(p.x, p.y, ax, ay) <= margin || distance(p.x, p.y, bx, by) <= margin;\n }\n return false;\n}\n\n// Minimum distance from point to polyline\nexport function minDistanceToPolyline(\n px: number, py: number,\n polyline: { x: number; y: number }[]\n): number {\n if (polyline.length === 0) return Infinity;\n if (polyline.length === 1) return distance(px, py, polyline[0]!.x, polyline[0]!.y);\n let best = Infinity;\n for (let i = 0; i < polyline.length - 1; i++) {\n const a = polyline[i]!;\n const b = polyline[i + 1]!;\n const n = closestOnSegment(a.x, a.y, b.x, b.y, px, py);\n const d = distance(n.x, n.y, px, py);\n if (d < best) best = d;\n }\n return best;\n}\n","import type { DrawShape } from '../../types.js';\nimport { STROKE_WIDTHS } from '../../types.js';\nimport { decodePathToPoints } from '../../utils/pathCodec.js';\nimport { minDistanceToPolyline, segmentTouchesPolyline, boundsOf, padBounds } from '../../utils/geometry.js';\n\nexport const ERASER_MARGIN = 4;\n\nexport function shapePagePoints(shape: DrawShape): { x: number; y: number }[] {\n return decodePathToPoints(shape.props.segments, shape.x, shape.y);\n}\n\nexport function pointHitsShape(\n shape: DrawShape,\n pageX: number,\n pageY: number,\n margin: number\n): boolean {\n const pts = shapePagePoints(shape);\n if (pts.length === 0) return false;\n const strokeMargin = margin + (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n return minDistanceToPolyline(pageX, pageY, pts) <= strokeMargin;\n}\n\nexport function segmentHitsShape(\n shape: DrawShape,\n ax: number, ay: number,\n bx: number, by: number,\n margin: number\n): boolean {\n const pts = shapePagePoints(shape);\n if (pts.length === 0) return false;\n const strokeMargin = margin + (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n return segmentTouchesPolyline(pts, ax, ay, bx, by, strokeMargin);\n}\n\nexport { boundsOf, padBounds };\n","import {\n StateNode,\n type ToolPointerMoveInfo,\n type ToolStateTransitionInfo,\n} from '../../../store/stateNode.js';\nimport type { DrawShape } from '../../../types.js';\nimport type { ShapeId } from '../../../types.js';\nimport { pointHitsShape, ERASER_MARGIN } from '../eraserHitTest.js';\n\n// State for when eraser is being pressed but not dragged\nexport class EraserPointingState extends StateNode {\n static override id = 'eraser_pointing';\n\n override onEnter(_info?: ToolStateTransitionInfo): void {\n const zoom = this.editor.getZoomLevel();\n const tolerance = ERASER_MARGIN / zoom;\n const pt = this.editor.input.getCurrentPagePoint();\n const allShapes = this.editor.store.getCurrentPageRenderingShapesSorted();\n const hits: ShapeId[] = [];\n\n for (const shape of allShapes) {\n if (shape.type !== 'draw') continue;\n if (pointHitsShape(shape as DrawShape, pt.x, pt.y, tolerance)) {\n hits.push(shape.id);\n }\n }\n this.editor.setErasingShapes(hits);\n }\n\n override onPointerMove(info?: ToolPointerMoveInfo): void {\n if (this.editor.input.getIsDragging()) {\n this.ctx.transition('eraser_erasing', info);\n }\n }\n\n override onPointerUp(): void {\n this.finish();\n }\n\n override onExit(_info?: ToolStateTransitionInfo, to?: string): void {\n if (to !== 'eraser_erasing') {\n this.editor.setErasingShapes([]);\n }\n }\n\n override onCancel(): void {\n this.editor.setErasingShapes([]);\n this.ctx.transition('eraser_idle');\n }\n\n private finish(): void {\n const ids = this.editor.getErasingShapeIds();\n if (ids.length > 0) {\n this.editor.store.deleteShapes(ids);\n this.editor.setErasingShapes([]);\n }\n this.ctx.transition('eraser_idle');\n }\n}\n","import { StateNode, type ToolStateTransitionInfo } from '../../../store/stateNode.js';\nimport type { DrawShape } from '../../../types.js';\nimport type { ShapeId } from '../../../types.js';\nimport { segmentHitsShape, boundsOf, padBounds, ERASER_MARGIN } from '../eraserHitTest.js';\n\n// State for when eraser is being used\nexport class EraserErasingState extends StateNode {\n static override id = 'eraser_erasing';\n\n private _marked: ShapeId[] = [];\n\n override onEnter(_info?: ToolStateTransitionInfo): void {\n this._marked = [...this.editor.getErasingShapeIds()];\n this.sweep();\n }\n\n override onPointerMove(): void { this.sweep(); }\n override onPointerUp(): void { this.finish(); }\n\n override onExit(): void { this.editor.setErasingShapes([]); }\n override onCancel(): void { this.ctx.transition('eraser_idle'); }\n\n private sweep(): void {\n const zoom = this.editor.getZoomLevel();\n const tolerance = ERASER_MARGIN / zoom;\n const cur = this.editor.input.getCurrentPagePoint();\n const prev = this.editor.input.getPreviousPagePoint();\n const hitIds = new Set<ShapeId>(this.editor.getErasingShapeIds());\n\n const sweepArea = padBounds(boundsOf([prev, cur]), tolerance);\n const nearby = this.editor.store.getShapeIdsInBounds(sweepArea);\n const candidates = this.editor.store\n .getCurrentPageRenderingShapesSorted()\n .filter((s) => nearby.has(s.id));\n\n for (const shape of candidates) {\n if (shape.type !== 'draw') continue;\n if (segmentHitsShape(shape as DrawShape, prev.x, prev.y, cur.x, cur.y, tolerance)) {\n hitIds.add(shape.id);\n }\n }\n this._marked = [...hitIds];\n this.editor.setErasingShapes(this._marked);\n }\n\n private finish(): void {\n const ids = this.editor.getErasingShapeIds();\n if (ids.length > 0) {\n this.editor.store.deleteShapes(ids);\n }\n this.editor.setErasingShapes([]);\n this._marked = [];\n this.ctx.transition('eraser_idle');\n }\n}\n","import { StateNode } from '../../../store/stateNode.js';\n\nexport class SelectIdleState extends StateNode {\n static override id = 'select_idle';\n}","import { StateNode, type ToolPointerDownInfo } from '../../../store/stateNode.js';\n\nexport class HandIdleState extends StateNode {\n static override id = 'hand_idle';\n\n override onPointerDown(info?: ToolPointerDownInfo): void {\n this.ctx.transition('hand_dragging', info);\n }\n}","import { StateNode, type ToolPointerMoveInfo } from '../../../store/stateNode.js';\n\nexport class HandDraggingState extends StateNode {\n static override id = 'hand_dragging';\n\n override onPointerMove(info?: ToolPointerMoveInfo): void {\n const move = info ?? {};\n const dx = move.screenDeltaX ?? 0;\n const dy = move.screenDeltaY ?? 0;\n if (dx === 0 && dy === 0) return;\n this.editor.panBy(dx, dy);\n }\n\n override onPointerUp(): void {\n this.ctx.transition('hand_idle');\n }\n\n override onCancel(): void {\n this.ctx.transition('hand_idle');\n }\n\n override onInterrupt(): void {\n this.ctx.transition('hand_idle');\n }\n}","import { DocumentStore } from '../store/documentStore.js';\nimport type { Viewport } from '../canvas/viewport.js';\nimport { createViewport, screenToPage } from '../canvas/viewport.js';\nimport { CanvasRenderer } from '../canvas/renderer.js';\nimport { InputManager } from '../input/inputManager.js';\nimport type { ToolStateContext } from '../store/stateNode.js';\nimport { ToolManager, type ToolDefinition, type ToolId } from '../tools/toolManager.js';\nimport { PenIdleState } from '../tools/pen/states/PenIdleState.js';\nimport { PenDrawingState } from '../tools/pen/states/PenDrawingState.js';\nimport { EraserIdleState } from '../tools/eraser/states/EraserIdleState.js';\nimport { EraserPointingState } from '../tools/eraser/states/EraserPointingState.js';\nimport { EraserErasingState } from '../tools/eraser/states/EraserErasingState.js';\nimport { SelectIdleState } from '../tools/select/states/SelectIdleState.js';\nimport { HandIdleState } from '../tools/hand/states/HandIdleState.js';\nimport { HandDraggingState } from '../tools/hand/states/HandDraggingState.js';\nimport type { ShapeId, Shape, DrawShape, ColorStyle, DashStyle, SizeStyle } from '../types.js';\nimport type { Vec3 } from '../types.js';\nimport { DRAG_DISTANCE_SQUARED } from '../types.js';\n\nexport interface EditorOptions {\n dragDistanceSquared?: number;\n toolDefinitions?: ToolDefinition[];\n initialToolId?: ToolId;\n}\n\nlet shapeIdCounter = 0;\nfunction createShapeId(): ShapeId {\n return `shape:${String(++shapeIdCounter).padStart(6, '0')}`;\n}\n\n// Main editor: document store, viewport, input, tools, renderer\nexport class Editor {\n readonly store: DocumentStore = new DocumentStore();\n readonly input: InputManager = new InputManager();\n readonly tools: ToolManager = new ToolManager();\n readonly renderer: CanvasRenderer = new CanvasRenderer();\n viewport: Viewport = createViewport();\n readonly options: { dragDistanceSquared: number };\n // Default draw style\n private drawStyle: { color: ColorStyle; dash: DashStyle; size: SizeStyle } = {\n color: 'black',\n dash: 'draw',\n size: 'm',\n };\n private readonly toolStateContext: ToolStateContext;\n\n // Creates a new editor instance with the given options (with defaults if not provided)\n constructor(opts: EditorOptions = {}) {\n this.options = { dragDistanceSquared: opts.dragDistanceSquared ?? DRAG_DISTANCE_SQUARED };\n this.toolStateContext = {\n transition: (id, info) => this.tools.transition(id, info),\n };\n for (const defaultTool of this.getDefaultToolDefinitions()) {\n this.registerToolDefinition(defaultTool);\n }\n for (const customTool of opts.toolDefinitions ?? []) {\n this.registerToolDefinition(customTool);\n }\n this.tools.setCurrentTool(opts.initialToolId ?? 'pen');\n }\n\n registerToolDefinition(toolDefinition: ToolDefinition): void {\n for (const stateConstructor of toolDefinition.stateConstructors) {\n this.tools.registerState(new stateConstructor(this.toolStateContext, this));\n }\n this.tools.registerTool(toolDefinition.id, toolDefinition.initialStateId);\n }\n\n private getDefaultToolDefinitions(): ToolDefinition[] {\n return [\n { id: 'pen', initialStateId: PenIdleState.id, stateConstructors: [PenIdleState, PenDrawingState] },\n { id: 'eraser', initialStateId: EraserIdleState.id, stateConstructors: [EraserIdleState, EraserPointingState, EraserErasingState] },\n { id: 'select', initialStateId: SelectIdleState.id, stateConstructors: [SelectIdleState] },\n { id: 'hand', initialStateId: HandIdleState.id, stateConstructors: [HandIdleState, HandDraggingState] },\n ];\n }\n\n createShapeId(): ShapeId { return createShapeId(); }\n getZoomLevel(): number { return this.viewport.zoom; }\n getShape(id: ShapeId): Shape | undefined { return this.store.getShape(id); }\n createShape(shape: Shape): void { this.store.createShape(shape); }\n\n updateShapes(\n partials: Array<{ id: ShapeId; type: string; props?: Partial<DrawShape['props']> }>\n ): void {\n for (const p of partials) {\n const existing = this.store.getShape(p.id) as DrawShape | undefined;\n if (existing && p.props) {\n this.store.updateShape(p.id, { props: { ...existing.props, ...p.props } });\n }\n }\n }\n\n // Page point to shape local point (for draw shapes: subtract shape pos)\n getPointInShapeSpace(shape: DrawShape, pagePoint: Vec3): Vec3 {\n return {\n x: pagePoint.x - shape.x,\n y: pagePoint.y - shape.y,\n z: pagePoint.z,\n };\n }\n\n getCurrentPageShapes() { return this.store.getCurrentPageShapes(); }\n getCurrentPageShapesSorted() { return this.store.getCurrentPageShapesSorted(); }\n getCurrentPageRenderingShapesSorted() { return this.store.getCurrentPageRenderingShapesSorted(); }\n\n getErasingShapeIds() { return this.store.getErasingShapeIds(); }\n setErasingShapes(ids: ShapeId[]) { this.store.setErasingShapes(ids); }\n\n setCurrentTool(id: ToolId) { this.tools.setCurrentTool(id); }\n getCurrentToolId(): ToolId { return this.tools.getCurrentToolId(); }\n\n getCurrentDrawStyle() { return { ...this.drawStyle }; }\n setCurrentDrawStyle(partial: Partial<{ color: ColorStyle; dash: DashStyle; size: SizeStyle }>) { this.drawStyle = { ...this.drawStyle, ...partial }; }\n \n panBy(dx: number, dy: number) {\n this.viewport.x += dx;\n this.viewport.y += dy;\n }\n\n // Convert screen coords to page coords\n screenToPage(screenX: number, screenY: number): { x: number; y: number } {\n return screenToPage(this.viewport, screenX, screenY);\n }\n\n // Render current page to 2d canvas context\n render(ctx: CanvasRenderingContext2D) {\n const shapes = this.getCurrentPageShapesSorted();\n const erasingIds = new Set(this.getErasingShapeIds());\n const visible = shapes.filter((s) => !erasingIds.has(s.id));\n this.renderer.render(ctx, this.viewport, visible);\n }\n}\n","import { decodePoints, encodePoints, decodePathToPoints } from '../../utils/pathCodec.js';\nimport { STROKE_WIDTHS, type DrawShape, type DrawSegment, type ShapeId, type Vec3 } from '../../types.js';\nimport type { Editor } from '../../editor/Editor.js';\n\nexport interface SelectionBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se';\n\nexport interface TransformSnapshot {\n x: number;\n y: number;\n segments: Array<{ type: DrawSegment['type']; points: Vec3[] }>;\n}\n\nexport function isSelectTool(tool: string): boolean {\n return tool === 'select';\n}\n\nexport function getShapeBounds(shape: DrawShape): SelectionBounds {\n const points = decodePathToPoints(shape.props.segments, shape.x, shape.y);\n if (points.length === 0) {\n return { minX: shape.x, minY: shape.y, maxX: shape.x, maxY: shape.y };\n }\n\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n\n for (const p of points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n\n const stroke = (STROKE_WIDTHS[shape.props.size] ?? 3.5) * shape.props.scale;\n return { minX: minX - stroke, minY: minY - stroke, maxX: maxX + stroke, maxY: maxY + stroke };\n}\n\nexport function normalizeSelectionBounds(\n a: { x: number; y: number },\n b: { x: number; y: number }\n): SelectionBounds {\n return {\n minX: Math.min(a.x, b.x),\n minY: Math.min(a.y, b.y),\n maxX: Math.max(a.x, b.x),\n maxY: Math.max(a.y, b.y),\n };\n}\n\nexport function boundsContainPoint(bounds: SelectionBounds, x: number, y: number): boolean {\n return x >= bounds.minX && x <= bounds.maxX && y >= bounds.minY && y <= bounds.maxY;\n}\n\nexport function boundsIntersect(a: SelectionBounds, b: SelectionBounds): boolean {\n return a.maxX >= b.minX && a.minX <= b.maxX && a.maxY >= b.minY && a.minY <= b.maxY;\n}\n\nexport function rotatePoint(point: { x: number; y: number }, center: { x: number; y: number }, radians: number) {\n const dx = point.x - center.x;\n const dy = point.y - center.y;\n const c = Math.cos(radians);\n const s = Math.sin(radians);\n return {\n x: center.x + dx * c - dy * s,\n y: center.y + dx * s + dy * c,\n };\n}\n\nexport function buildTransformSnapshots(editor: Editor, ids: ShapeId[]): Map<ShapeId, TransformSnapshot> {\n const snapshots = new Map<ShapeId, TransformSnapshot>();\n for (const id of ids) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n snapshots.set(id, {\n x: shape.x,\n y: shape.y,\n segments: shape.props.segments.map((seg) => ({\n type: seg.type,\n points: decodePoints(seg.path),\n })),\n });\n }\n return snapshots;\n}\n\nexport function buildStartPositions(editor: Editor, ids: ShapeId[]): Map<ShapeId, { x: number; y: number }> {\n const positions = new Map<ShapeId, { x: number; y: number }>();\n for (const id of ids) {\n const shape = editor.getShape(id);\n if (!shape) continue;\n positions.set(id, { x: shape.x, y: shape.y });\n }\n return positions;\n}\n\nexport function getTopShapeAtPoint(editor: Editor, point: { x: number; y: number }) {\n const margin = 6 / editor.viewport.zoom;\n const shapes = editor.getCurrentPageRenderingShapesSorted();\n\n // Iterate in rendering order so first hit matches top shape\n for (const shape of shapes) {\n if (shape.type !== 'draw') continue;\n const b = getShapeBounds(shape);\n if (\n boundsContainPoint(\n {\n minX: b.minX - margin,\n minY: b.minY - margin,\n maxX: b.maxX + margin,\n maxY: b.maxY + margin,\n },\n point.x,\n point.y\n )\n ) {\n return shape;\n }\n }\n\n return null;\n}\n\nexport function getSelectionBoundsPage(editor: Editor, ids: ShapeId[]): SelectionBounds | null {\n if (ids.length === 0) return null;\n\n let union: SelectionBounds | null = null;\n for (const id of ids) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n const b = getShapeBounds(shape);\n union = union\n ? {\n minX: Math.min(union.minX, b.minX),\n minY: Math.min(union.minY, b.minY),\n maxX: Math.max(union.maxX, b.maxX),\n maxY: Math.max(union.maxY, b.maxY),\n }\n : b;\n }\n\n return union;\n}\n\nexport function getShapesInBounds(editor: Editor, bounds: SelectionBounds): ShapeId[] {\n return editor\n .getCurrentPageShapesSorted()\n .filter((shape): shape is DrawShape => shape.type === 'draw')\n .filter((shape) => boundsIntersect(getShapeBounds(shape), bounds))\n .map((shape) => shape.id);\n}\n\nexport function applyMove(\n editor: Editor,\n startPositions: Map<ShapeId, { x: number; y: number }>,\n deltaX: number,\n deltaY: number\n) {\n for (const [id, start] of startPositions) {\n editor.store.updateShape(id, {\n x: start.x + deltaX,\n y: start.y + deltaY,\n });\n }\n}\n\nexport function applyRotation(\n editor: Editor,\n startShapes: Map<ShapeId, TransformSnapshot>,\n center: { x: number; y: number },\n delta: number\n) {\n for (const [id, snapshot] of startShapes) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n\n const rotatedOrigin = rotatePoint({ x: snapshot.x, y: snapshot.y }, center, delta);\n // Rotate absolute points around selection center, then re-localize back into the shapes coordinate space\n const segments = snapshot.segments.map((segment) => ({\n type: segment.type,\n path: encodePoints(\n segment.points.map((pt) => {\n const absolute = { x: snapshot.x + pt.x, y: snapshot.y + pt.y };\n const rotated = rotatePoint(absolute, center, delta);\n return {\n x: rotated.x - rotatedOrigin.x,\n y: rotated.y - rotatedOrigin.y,\n z: pt.z,\n };\n })\n ),\n }));\n\n editor.store.updateShape(id, {\n x: rotatedOrigin.x,\n y: rotatedOrigin.y,\n props: { ...shape.props, segments },\n });\n }\n}\n\nexport function applyResize(\n editor: Editor,\n handle: ResizeHandle,\n startBounds: SelectionBounds,\n startShapes: Map<ShapeId, TransformSnapshot>,\n pointer: { x: number; y: number },\n lockAspectRatio: boolean\n) {\n const minSize = 8 / editor.viewport.zoom;\n const startW = Math.max(0.0001, startBounds.maxX - startBounds.minX);\n const startH = Math.max(0.0001, startBounds.maxY - startBounds.minY);\n const aspectRatio = startW / startH;\n\n let minX = startBounds.minX;\n let minY = startBounds.minY;\n let maxX = startBounds.maxX;\n let maxY = startBounds.maxY;\n\n switch (handle) {\n case 'nw':\n minX = Math.min(pointer.x, startBounds.maxX - minSize);\n minY = Math.min(pointer.y, startBounds.maxY - minSize);\n break;\n case 'ne':\n maxX = Math.max(pointer.x, startBounds.minX + minSize);\n minY = Math.min(pointer.y, startBounds.maxY - minSize);\n break;\n case 'sw':\n minX = Math.min(pointer.x, startBounds.maxX - minSize);\n maxY = Math.max(pointer.y, startBounds.minY + minSize);\n break;\n case 'se':\n maxX = Math.max(pointer.x, startBounds.minX + minSize);\n maxY = Math.max(pointer.y, startBounds.minY + minSize);\n break;\n }\n\n if (lockAspectRatio) {\n // Keep dragged corner constrained to the original ratio while opposite corner stays to be the stationary anchor resize\n let nextW = Math.max(minSize, maxX - minX);\n let nextH = Math.max(minSize, maxY - minY);\n\n if (nextW / nextH > aspectRatio) {\n nextH = nextW / aspectRatio;\n } else {\n nextW = nextH * aspectRatio;\n }\n\n if (nextW < minSize) {\n nextW = minSize;\n nextH = nextW / aspectRatio;\n }\n\n if (nextH < minSize) {\n nextH = minSize;\n nextW = nextH * aspectRatio;\n }\n\n switch (handle) {\n case 'nw':\n minX = startBounds.maxX - nextW;\n minY = startBounds.maxY - nextH;\n maxX = startBounds.maxX;\n maxY = startBounds.maxY;\n break;\n case 'ne':\n minX = startBounds.minX;\n minY = startBounds.maxY - nextH;\n maxX = startBounds.minX + nextW;\n maxY = startBounds.maxY;\n break;\n case 'sw':\n minX = startBounds.maxX - nextW;\n minY = startBounds.minY;\n maxX = startBounds.maxX;\n maxY = startBounds.minY + nextH;\n break;\n case 'se':\n minX = startBounds.minX;\n minY = startBounds.minY;\n maxX = startBounds.minX + nextW;\n maxY = startBounds.minY + nextH;\n break;\n }\n }\n\n const newBounds: SelectionBounds = { minX, minY, maxX, maxY };\n const sx = (newBounds.maxX - newBounds.minX) / startW;\n const sy = (newBounds.maxY - newBounds.minY) / startH;\n\n for (const [id, snapshot] of startShapes) {\n const shape = editor.getShape(id);\n if (!shape || shape.type !== 'draw') continue;\n const nextX = newBounds.minX + (snapshot.x - startBounds.minX) * sx;\n const nextY = newBounds.minY + (snapshot.y - startBounds.minY) * sy;\n const segments = snapshot.segments.map((segment) => ({\n type: segment.type,\n path: encodePoints(\n segment.points.map((p) => ({\n x: p.x * sx,\n y: p.y * sy,\n z: p.z,\n }))\n ),\n }));\n\n editor.store.updateShape(id, {\n x: nextX,\n y: nextY,\n props: { ...shape.props, segments },\n });\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@tsdraw/core",
3
+ "version": "0.4.0",
4
+ "description": "the core engine for tsdraw",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/tsdraw/tsdraw.git",
8
+ "directory": "packages/tsdraw-core"
9
+ },
10
+ "homepage": "https://github.com/tsdraw/tsdraw/tree/main/packages/tsdraw-core",
11
+ "bugs": {
12
+ "url": "https://github.com/tsdraw/tsdraw/issues"
13
+ },
14
+ "type": "module",
15
+ "main": "./dist/index.cjs",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "import": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
+ },
24
+ "require": {
25
+ "types": "./dist/index.d.cts",
26
+ "default": "./dist/index.cjs"
27
+ }
28
+ }
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "sideEffects": false,
37
+ "scripts": {
38
+ "build": "tsup",
39
+ "typecheck": "tsc --noEmit",
40
+ "test": "vitest run",
41
+ "test:watch": "vitest",
42
+ "prepublishOnly": "npm run build && npm run test"
43
+ },
44
+ "devDependencies": {
45
+ "tsup": "^8.3.5",
46
+ "typescript": "^5.6.3",
47
+ "vitest": "^3.2.4"
48
+ },
49
+ "dependencies": {
50
+ "perfect-freehand": "^1.2.3"
51
+ }
52
+ }