@domternal/extension-markdown 0.12.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/parser/mathRules.ts","../src/parser/state.ts","../src/parser/parser.ts","../src/pastePlugin.ts","../src/serializer/state.ts","../src/serializer/specs.ts","../src/serializer/serializer.ts","../src/Markdown.ts","../src/download.ts"],"names":[],"mappings":";;;;;;;;AASA,IAAM,cAAA,GAA6B,CAAC,KAAA,EAAO,MAAA,KAAW;AACpD,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA;AACpB,EAAA,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,KAAM,IAAc,OAAO,KAAA;AACzD,EAAA,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAC,CAAA,KAAM,IAAM,OAAO,KAAA;AAErD,EAAA,IAAI,MAAM,KAAA,GAAQ,CAAA;AAClB,EAAA,OAAO,GAAA,GAAM,MAAM,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA;AACrC,IAAA,IAAI,SAAS,EAAA,EAAc;AAEzB,MAAA,GAAA,IAAO,CAAA;AACP,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,EAAA,EAAM;AACnB,IAAA,IAAI,IAAA,KAAS,IAAe,OAAO,KAAA;AACnC,IAAA,GAAA,IAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,KAAA,CAAM,MAAA,IAAU,GAAA,KAAQ,KAAA,GAAQ,GAAG,OAAO,KAAA;AAIrD,EAAA,IAAI,IAAA,CAAK,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA;AACnD,EAAA,IAAI,IAAA,CAAK,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,GAAA,GAAM,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA;AACjD,EAAA,IAAI,IAAA,CAAK,KAAK,KAAA,CAAM,GAAA,CAAI,OAAO,GAAA,GAAM,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA;AAEjD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,aAAA,EAAe,IAAI,CAAC,CAAA;AAC7C,IAAA,KAAA,CAAM,UAAU,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,GAAG,GAAG,CAAA;AAAA,EAChD;AACA,EAAA,KAAA,CAAM,MAAM,GAAA,GAAM,CAAA;AAClB,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,IAAM,aAAA,GAA2B,CAAC,KAAA,EAAO,SAAA,EAAW,SAAS,MAAA,KAAW;AACtE,EAAA,MAAM,KAAA,GAAA,CAAS,MAAM,MAAA,CAAO,SAAS,KAAK,CAAA,KAAM,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA,CAAA;AAC3E,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,OAAO,OAAO,CAAA;AAChD,EAAA,IAAI,CAAC,SAAA,CAAU,UAAA,CAAW,IAAI,GAAG,OAAO,KAAA;AAExC,EAAA,MAAM,aAAa,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,SAAS,IAAI,CAAA;AAClE,EAAA,IAAI,CAAC,UAAA,IAAc,SAAA,CAAU,IAAA,EAAK,KAAM,MAAM,OAAO,KAAA;AACrD,EAAA,IAAI,QAAQ,OAAO,IAAA;AAEnB,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,WAAW,SAAA,GAAY,CAAA;AAC3B,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,GAAU,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAAA,EACxC,CAAA,MAAO;AACL,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,OAAO,QAAA,GAAW,SAAS,QAAA,EAAA,EAAY;AACrC,MAAA,MAAM,SAAA,GAAA,CAAa,MAAM,MAAA,CAAO,QAAQ,KAAK,CAAA,KAAM,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,IAAK,CAAA,CAAA;AAC7E,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,KAAA,CAAM,WAAW,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAC,CAAA;AAC9D,MAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,IAAA,EAAM;AACxB,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,QAAA,IAAY,CAAA;AACZ,QAAA;AAAA,MACF;AACA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AACA,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,OAAA,GAAU,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,YAAA,EAAc,IAAI,CAAC,CAAA;AAC5C,EAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,EAAA,KAAA,CAAM,MAAM,CAAC,SAAA,EAAW,UAAA,GAAa,SAAA,GAAY,IAAI,QAAQ,CAAA;AAC7D,EAAA,KAAA,CAAM,IAAA,GAAO,UAAA,GAAa,SAAA,GAAY,CAAA,GAAI,QAAA;AAC1C,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,SAAS,kBAAkB,EAAA,EAAsB;AACtD,EAAA,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU,eAAe,cAAc,CAAA;AAC/D;AAEO,SAAS,iBAAiB,EAAA,EAAsB;AAErD,EAAA,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,cAAc,aAAA,EAAe;AAAA,IACzD,GAAA,EAAK,CAAC,WAAA,EAAa,WAAA,EAAa,cAAc,MAAM;AAAA,GACrD,CAAA;AACH;AC1EA,SAAS,UAAA,CAAW,GAAW,CAAA,EAA0B;AACvD,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA,IAAU,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAA,EAAG;AAC1D,IAAA,OAAQ,CAAA,CAAsD,QAAA;AAAA,MAAA,CAC3D,CAAA,CAAE,IAAA,IAAQ,EAAA,KAAO,CAAA,CAAE,IAAA,IAAQ,EAAA;AAAA,KAC9B;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACrB,MAAA;AAAA,EACQ,KAAA;AAAA,EACT,QAAyB,IAAA,CAAK,IAAA;AAAA,EAEtC,YAAY,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,EAAE,IAAA,EAAM,MAAA,CAAO,WAAA,EAAa,KAAA,EAAO,MAAM,OAAA,EAAS,EAAC,EAAG,gBAAA,EAAkB,KAAA;AAAM,KAChF;AAAA,EACF;AAAA,EAEQ,GAAA,GAAkB;AACxB,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAC9C,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAM,IAAI,MAAM,gCAAgC,CAAA;AACzE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,KAAI,CAAE,IAAA;AAAA,EACpB;AAAA,EAEA,KAAK,IAAA,EAAoB;AACvB,IAAA,IAAA,CAAK,GAAA,EAAI,CAAE,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,QAAQ,IAAA,EAAoB;AAC1B,IAAA,IAAI,SAAS,EAAA,EAAI;AACjB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,CAAE,OAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACvC,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAC9C,IAAA,MAAM,SAAS,IAAA,KAAS,MAAA,GAAY,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA,GAAI,IAAA;AAC7D,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI,MAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,SAAS,IAAA,EAAkB;AACzB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,UAAU,IAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA;AAAA,EAC5C;AAAA,EAEA,OAAA,CAAQ,IAAA,EAAgB,KAAA,EAAqB,OAAA,EAAmC;AAC9E,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,CAAc,KAAA,EAAO,SAAS,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,MAAS,CAAA;AACtF,IAAA,IAAI,IAAA,KAAS,MAAM,OAAO,IAAA;AAC1B,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,IAAA,EAAgB,KAAA,GAAsB,IAAA,EAAM,mBAAmB,KAAA,EAAa;AACnF,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,EAAC,EAAG,gBAAA,EAAkB,CAAA;AAAA,EAChE;AAAA,EAEA,SAAA,GAA2B;AACzB,IAAA,IAAI,KAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI;AAC7B,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAM,IAAI,MAAM,gCAAgC,CAAA;AACzE,IAAA,IAAI,MAAM,gBAAA,IAAoB,KAAA,CAAM,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AACjE,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,cAAc,KAAA,CAAM,KAAA,EAAO,MAAM,OAAO,CAAA;AAChE,IAAA,IAAI,IAAA,KAAS,MAAM,OAAO,IAAA;AAC1B,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,IAAA,EAAoB;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI;AAC7B,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAM,IAAI,MAAM,gCAAgC,CAAA;AACzE,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,cAAc,KAAA,CAAM,KAAA,EAAO,MAAM,OAAO,CAAA;AAClE,MAAA,IAAI,MAAA,KAAW,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,IACvC;AACA,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,IAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAA,GAAiB;AACf,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,OAAQ,SAAA,EAAU;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI;AAC7B,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAM,IAAI,MAAM,gCAAgC,CAAA;AACzE,IAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,cAAc,KAAA,CAAM,KAAA,EAAO,MAAM,OAAO,CAAA;AAC/D,IAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAC/E,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;;;ACjGA,SAAS,QAAA,CAAS,OAAc,IAAA,EAA6B;AAC3D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAChC,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,KAAA;AACjD;AAEA,SAAS,UAAU,KAAA,EAA6C;AAC9D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AACnC,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,mCAAA,CAAoC,IAAA,CAAK,KAAK,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,EAAA,OAAO,KAAA,KAAU,MAAA,GAAY,IAAA,GAAO,EAAE,WAAW,KAAA,EAAM;AACzD;AAEA,SAAS,QAAQ,KAAA,EAAsB;AACrC,EAAA,OAAA,CAAQ,KAAA,CAAM,YAAY,EAAC,EACxB,OAAO,CAAC,KAAA,KAAU,MAAM,IAAA,KAAS,MAAA,IAAU,MAAM,IAAA,KAAS,cAAc,EACxE,GAAA,CAAI,CAAC,UAAU,KAAA,CAAM,OAAO,CAAA,CAC5B,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,IAAM,WAAA,GAAc,qBAAA;AAOpB,SAAS,kBAAA,CAAmB,KAAa,MAAA,EAAwB;AAC/D,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AACxC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AACxC,EAAA,IACE,aAAa,MAAA,IACb,QAAA,KAAa,UACb,UAAA,KAAe,MAAA,IACf,aAAa,MAAA,EACb;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAgC;AAClD,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACnC,IAAA,MAAM,YAAY,IAAA,CAAK,UAAA;AACvB,IAAA,IAAI,SAAA,EAAW,WAAA,KAAgB,IAAA,EAAM,OAAO,IAAA;AAC5C,IAAA,MAAM,QAAQ,SAAA,CAAU,UAAA;AACxB,IAAA,IAAI,KAAA,EAAO,MAAA,KAAW,IAAA,EAAM,OAAO,IAAA;AAInC,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,QAAQ,EAAE,CAAA;AAC/C,IAAA,OAAO,KAAA,KAAU,IAAA,GAAO,IAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAyB;AAC5C,IAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,KAAA,KAAU;AACtC,MAAA,IAAI,KAAA,KAAU,CAAA,IAAK,KAAA,CAAM,WAAA,EAAa;AACpC,QAAA,MAAM,SAAmB,EAAC;AAC1B,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,WAAA,EAAa,EAAA,EAAI,WAAA,KAAgB;AAC9C,UAAA,IAAI,WAAA,KAAgB,CAAA,IAAK,WAAA,CAAY,MAAA,EAAQ;AAC3C,YAAA,MAAM,YAAY,WAAA,CAAY,IAAA,IAAQ,EAAA,EAAI,OAAA,CAAQ,aAAa,EAAE,CAAA;AACjE,YAAA,IAAI,aAAa,EAAA,EAAI;AACnB,cAAA,MAAA,CAAO,IAAA;AAAA,gBACJ,WAAA,CAAgE,SAAS,QAAQ;AAAA,eACpF;AAAA,YACF;AACA,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,QACzB,CAAC,CAAA;AACD,QAAA,QAAA,CAAS,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA;AAC/C,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACrB,CAAC,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,OAAO,EAAE,OAAA,EAAS,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAI,EAAG,QAAQ,CAAA;AAAA,EAChF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAyB;AACpC,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAO,IAAA;AACxB,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,KAAU;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACxB,CAAC,CAAA;AACD,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,CAAC,CAAA;AAC/C,IAAA,IAAI,QAAQ,IAAA,KAAS,UAAA,IAAc,OAAA,CAAQ,UAAA,KAAe,GAAG,OAAO,OAAA;AACpE,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,IAAA,KAAS;AACxB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,CAAC,IAAA,KAAS,WAAW,IAAI,CAAA,KAAM,IAAI,CAAA,EAAG,OAAO,OAAA;AAC9D,IAAA,OAAO,SAAS,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,OAAO,IAAI,GAAG,CAAA;AAChB;AAEA,SAAS,gBAAgB,MAAA,EAA4B;AACnD,EAAA,MAAM,EAAA,GAAK,IAAI,UAAA,CAAW,SAAA,EAAW,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,CAAA;AACnE,EAAA,MAAM,iBACJ,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,KAAM,MAAA,IAC1B,OAAO,KAAA,CAAM,UAAU,MAAM,MAAA,IAC7B,MAAA,CAAO,MAAM,WAAW,CAAA,KAAM,UAC9B,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,KAAM,MAAA;AAClC,EAAA,IAAI,CAAC,cAAA,EAAgB,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA;AACvC,EAAA,IAAI,OAAO,KAAA,CAAM,OAAO,MAAM,MAAA,EAAW,EAAA,CAAG,QAAQ,OAAO,CAAA;AAC3D,EAAA,IAAI,OAAO,KAAA,CAAM,QAAQ,MAAM,MAAA,EAAW,EAAA,CAAG,QAAQ,eAAe,CAAA;AACpE,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,KAAM,MAAA,EAAW;AACtC,IAAA,EAAA,CAAG,OAAA,CAAQ,CAAC,MAAA,EAAQ,SAAA,EAAW,UAAU,CAAC,CAAA;AAC1C,IAAA,EAAA,CAAG,GAAA,CAAI,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,OAAO,KAAA,CAAM,YAAY,CAAA,KAAM,MAAA,oBAA6B,EAAE,CAAA;AAClE,EAAA,IAAI,OAAO,KAAA,CAAM,WAAW,CAAA,KAAM,MAAA,mBAA4B,EAAE,CAAA;AAChE,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,qBAAqB,MAAA,EAAgC;AACnE,EAAA,MAAM,EAAA,GAAK,gBAAgB,MAAM,CAAA;AACjC,EAAA,MAAM,WAAyC,EAAC;AAEhD,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,EAA2B,MAAA,KAA0B;AACzE,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACnC,MAAA,IAAI,YAAY,MAAA,EAAW;AACzB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MACjE;AACA,MAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAuC,MAAA,CAAO,MAAM,IAAI,CAAA;AAEtE,EAAA,MAAM,KAAA,GAAQ,CACZ,SAAA,EACA,QAAA,EACA,UACA,QAAA,KACS;AACT,IAAA,MAAM,IAAA,GAAO,KAAK,QAAQ,CAAA;AAC1B,IAAA,IAAI,SAAS,MAAA,EAAW;AAGtB,MAAA,MAAM,YAAA,GAAe,QAAA,KAAa,WAAA,GAAc,IAAA,CAAK,WAAW,CAAA,GAAI,MAAA;AACpE,MAAA,QAAA,CAAS,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA,GAAI,CAAC,KAAA,KAAU;AACzC,QAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA;AAAA,MAC7D,CAAA;AACA,MAAA,QAAA,CAAS,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,CAAA,GAAI,CAAC,KAAA,KAAU;AAC1C,QAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,MAClD,CAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,GAAG,SAAS,CAAA,KAAA,CAAO,CAAA,GAAI,CAAC,OAAO,KAAA,KAAU;AAChD,MAAA,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,QAAA,GAAW,KAAK,KAAK,IAAI,CAAA;AAAA,IAChD,CAAA;AACA,IAAA,QAAA,CAAS,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,CAAA,GAAI,CAAC,KAAA,KAAU;AAC1C,MAAA,KAAA,CAAM,SAAA,EAAU;AAAA,IAClB,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,SAAA,EAAmB,QAAA,KAA2B;AAChE,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAClC,IAAA,IAAI,SAAS,MAAA,EAAW;AAEtB,MAAA,MAAA,CAAO,CAAA,EAAG,SAAS,CAAA,KAAA,CAAA,EAAS,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,CAAA;AAChD,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,GAAG,SAAS,CAAA,KAAA,CAAO,CAAA,GAAI,CAAC,OAAO,KAAA,KAAU;AAChD,MAAA,KAAA,CAAM,QAAA;AAAA,QACJ,IAAA,CAAK,MAAA;AAAA,UACH,SAAA,KAAc,MAAA,GACV,EAAE,IAAA,EAAM,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA,EAAG,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,OAAO,GAAE,GACjE;AAAA;AACN,OACF;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,CAAA,GAAI,CAAC,KAAA,KAAU;AAC1C,MAAA,KAAA,CAAM,UAAU,IAAI,CAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,SAAA,EAAmB,QAAA,KAA2B;AAC1D,IAAA,MAAM,QAAA,GAAW,KAAK,QAAQ,CAAA;AAC9B,IAAA,MAAM,aAAA,GAAgB,KAAK,WAAW,CAAA;AACtC,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,aAAA,KAAkB,MAAA,EAAW;AAC3D,IAAA,QAAA,CAAS,GAAG,SAAS,CAAA,KAAA,CAAO,CAAA,GAAI,CAAC,OAAO,KAAA,KAAU;AAChD,MAAA,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC,MAAA,KAAA,CAAM,SAAS,aAAa,CAAA;AAAA,IAC9B,CAAA;AACA,IAAA,QAAA,CAAS,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,CAAA,GAAI,CAAC,KAAA,KAAU;AAC1C,MAAA,KAAA,CAAM,SAAA,EAAU;AAChB,MAAA,KAAA,CAAM,SAAA,EAAU;AAAA,IAClB,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,KAA+B;AAChD,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,QAAA,CAAS,IAAI,IAAI,MAAM;AAAA,MAEvB,CAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,CAAM,aAAa,WAAW,CAAA;AAC9B,EAAA,KAAA,CAAM,SAAA,EAAW,SAAA,EAAW,CAAC,KAAA,MAAW,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAC,CAAA,IAAK,CAAA,KAAM,WAAW,CAAA;AAChG,EAAA,KAAA,CAAM,cAAc,YAAY,CAAA;AAChC,EAAA,KAAA,CAAM,eAAe,YAAY,CAAA;AACjC,EAAA,KAAA,CAAM,cAAA,EAAgB,aAAA,EAAe,CAAC,KAAA,KAAU;AAC9C,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,KAAK,GAAG,CAAA;AAClD,IAAA,OAAO,EAAE,OAAO,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAE;AAAA,EACnE,CAAC,CAAA;AACD,EAAA,KAAA,CAAM,aAAa,UAAU,CAAA;AAC7B,EAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,EAAA,KAAA,CAAM,MAAM,UAAU,CAAA;AACtB,EAAA,IAAA,CAAK,MAAM,aAAa,CAAA;AACxB,EAAA,IAAA,CAAK,MAAM,WAAW,CAAA;AACtB,EAAA,MAAA,CAAO,YAAA,EAAc,aAAA,EAAe,YAAA,EAAc,aAAa,CAAA;AAE/D,EAAA,QAAA,CAAS,QAAQ,CAAA,GAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACrC,IAAA,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,EAC1C,CAAA;AACA,EAAA,QAAA,CAAS,MAAM,CAAA,GAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACnC,IAAA,KAAA,CAAM,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,EAC7B,CAAA;AACA,EAAA,QAAA,CAAS,cAAc,CAAA,GAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAC3C,IAAA,KAAA,CAAM,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,EAC7B,CAAA;AACA,EAAA,QAAA,CAAS,WAAW,CAAA,GAAI,CAAC,KAAA,KAAU;AACjC,IAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,KAAK,WAAW,CAAA;AACtC,EAAA,QAAA,CAAS,WAAW,CAAA,GAAI,CAAC,KAAA,KAAU;AACjC,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,KAAA,CAAM,OAAA,CAAQ,eAAe,IAAI,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,WAAW,CAAA,IAAK,KAAK,WAAW,CAAA;AAC3D,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,EAA2B,OAAA,EAAiB,QAAA,KAAkC;AAClG,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtC,MAAA,MAAM,QAAQ,aAAA,CAAc,IAAA,KAAS,WAAA,GAAc,EAAE,UAAS,GAAI,IAAA;AAClE,MAAA,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,KAAA,EAAO,IAAA,KAAS,EAAA,GAAK,EAAC,GAAI,CAAC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAAA,IAC5E,CAAA;AACA,IAAA,QAAA,CAAS,OAAO,CAAA,GAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACpC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,GAAO,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACtD,MAAA,YAAA,CAAa,OAAO,KAAA,CAAM,OAAA,EAAS,QAAA,KAAa,EAAA,GAAK,OAAO,QAAQ,CAAA;AAAA,IACtE,CAAA;AACA,IAAA,QAAA,CAAS,YAAY,CAAA,GAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACzC,MAAA,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAAA,IACzC,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,KAAK,gBAAgB,CAAA;AAChD,EAAA,QAAA,CAAS,IAAI,CAAA,GAAI,CAAC,KAAA,KAAU;AAC1B,IAAA,IAAI,kBAAA,KAAuB,MAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,oBAAoB,IAAI,CAAA;AAAA,EAC9E,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AACxC,EAAA,QAAA,CAAS,aAAa,CAAA,GAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAC1C,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,MAAA,KAAA,CAAM,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AACrC,IAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,IAAA,KAAA,CAAM,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC3B,IAAA,KAAA,CAAM,UAAU,YAAY,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,UAAA,CAAW,UAAU,MAAM,CAAA;AAC3B,EAAA,UAAA,CAAW,MAAM,QAAQ,CAAA;AACzB,EAAA,UAAA,CAAW,KAAK,QAAQ,CAAA;AACxB,EAAA,UAAA,CAAW,QAAQ,MAAM,CAAA;AAEzB,EAAA,MAAM,SAAA,GAAY,KAAK,OAAO,CAAA;AAC9B,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,QAAA,CAAS,OAAO,CAAA,GAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACpC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA;AACjC,MAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,MAAA,MAAM,GAAA,GAAM,QAAQ,KAAK,CAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,EAAE,GAAA,EAAK,GAAA,EAAK,GAAA,KAAQ,EAAA,GAAK,IAAA,GAAO,GAAA,EAAK,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA,EAAE;AACnF,MAAA,IAAI,UAAU,QAAA,EAAU;AACtB,QAAA,KAAA,CAAM,OAAA,CAAQ,WAAW,KAAK,CAAA;AAC9B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,aAAA,CAAc,KAAK,CAAA;AAC3C,MAAA,IAAI,UAAU,IAAA,EAAM;AACpB,MAAA,IAAI,KAAA,CAAM,OAAA,EAAQ,CAAE,IAAA,KAAS,WAAA,EAAa;AACxC,QAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,KAAK,YAAY,CAAA;AACxC,EAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,IAAA,QAAA,CAAS,aAAa,CAAA,GAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAC1C,MAAA,KAAA,CAAM,QAAQ,cAAA,EAAgB,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAAA,IACxD,CAAA;AAAA,EACF;AACA,EAAA,MAAM,aAAA,GAAgB,KAAK,WAAW,CAAA;AACtC,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,QAAA,CAAS,YAAY,CAAA,GAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACzC,MAAA,KAAA,CAAM,QAAQ,aAAA,EAAe,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAAA,IACvD,CAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,EAA0B;AAC9B,MAAA,MAAM,KAAA,GAAQ,IAAI,kBAAA,CAAmB,MAAM,CAAA;AAC3C,MAAA,YAAA,CAAa,OAAO,EAAA,CAAG,KAAA,CAAM,QAAA,EAAU,EAAE,CAAC,CAAA;AAC1C,MAAA,OAAO,kBAAA,CAAmB,KAAA,CAAM,MAAA,EAAO,EAAG,MAAM,CAAA;AAAA,IAClD;AAAA,GACF;AACF;AAGO,SAAS,aAAA,CAAc,UAAkB,MAAA,EAAwB;AACtE,EAAA,OAAO,oBAAA,CAAqB,MAAM,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA;AACpD;ACpVO,IAAM,sBAAA,GAAyB,IAAI,SAAA,CAAU,eAAe;AAInE,IAAM,YAAA,GACJ,sFAAA;AACF,IAAM,aAAA,GACJ,sJAAA;AAEK,SAAS,kBAAkB,IAAA,EAAuB;AACvD,EAAA,OAAO,aAAa,IAAA,CAAK,IAAI,CAAA,IAAK,aAAA,CAAc,KAAK,IAAI,CAAA;AAC3D;AAEO,SAAS,oBAAoB,SAAA,EAAyC;AAC3E,EAAA,OAAO,IAAI,MAAA,CAAO;AAAA,IAChB,GAAA,EAAK,sBAAA;AAAA,IACL,KAAA,EAAO;AAAA,MACL,WAAA,CAAY,MAAM,KAAA,EAAO;AACvB,QAAA,MAAM,YAAY,KAAA,CAAM,aAAA;AACxB,QAAA,IAAI,SAAA,KAAc,MAAM,OAAO,KAAA;AAG/B,QAAA,IAAI,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAA,KAAM,IAAI,OAAO,KAAA;AAClD,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,YAAY,CAAA;AAC3C,QAAA,IAAI,SAAS,EAAA,IAAM,CAAC,iBAAA,CAAkB,IAAI,GAAG,OAAO,KAAA;AAEpD,QAAA,IAAI,IAAA,CAAK,MAAM,SAAA,CAAU,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,IAAA,EAAM,OAAO,KAAA;AAEtE,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,SAAA,EAAU,CAAE,KAAA,CAAM,IAAI,CAAA;AAAA,QAC9B,CAAA,CAAA,MAAQ;AAGN,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,UAAA;AAC1B,QAAA,MAAM,KAAA,GACJ,IAAI,OAAA,CAAQ,UAAA,KAAe,KAAK,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,KAAS,WAAA,GAClE,IAAI,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA,GAC7B,IAAI,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AACjC,QAAA,IAAA,CAAK,QAAA,CAAS,KAAK,KAAA,CAAM,EAAA,CAAG,iBAAiB,KAAK,CAAA,CAAE,gBAAgB,CAAA;AACpE,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AACF,GACD,CAAA;AACH;;;ACXA,IAAM,SAAA,GAAY,KAAA;AAGX,SAAS,YAAA,CAAa,MAAc,IAAA,EAAsB;AAC/D,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,GAAU,IAAA,CAAK,QAAQ,EAAA,GAAM,EAAA;AAC/C,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5C,IAAA,GAAA,GAAM,KAAK,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,CAAC,EAAE,MAAM,CAAA;AAAA,EACrC;AACA,EAAA,MAAM,SAAS,GAAA,GAAM,CAAA,GAAI,IAAI,MAAA,CAAO,GAAA,GAAM,CAAC,CAAA,GAAI,GAAA;AAC/C,EAAA,IAAI,IAAA,KAAS,IAAI,OAAO,MAAA,IAAU,KAAK,UAAA,CAAW,GAAG,IAAI,GAAA,GAAM,EAAA,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,MAAM,EAAA,IAAM,MAAA;AAC3C;AAEO,IAAM,0BAAN,MAA8B;AAAA,EAC1B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAA8B,EAAC;AAAA,EAC/B,UAAA;AAAA,EAED,KAAA,GAAQ,EAAA;AAAA,EACR,GAAA,GAAM,EAAA;AAAA,EACN,MAAA,GAAwB,IAAA;AAAA,EACxB,WAAA,GAAc,KAAA;AAAA;AAAA;AAAA;AAAA,EAId,YAAA,GAAe,KAAA;AAAA,EAEvB,WAAA,CAAY,KAAA,EAAgC,OAAA,GAAqC,EAAC,EAAG;AACnF,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,IAAA;AAAA,EAC1C;AAAA,EAEA,IAAA,CAAK,IAAA,EAA2B,OAAA,EAAiB,QAAA,EAAyB;AACxE,IAAA,MAAM,SAAA,GAAY,KAAK,QAAA,CAAS,IAAA;AAAA,MAC9B,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAAE,OAAA,KAAY,OAAA,IAAW,CAAA,CAAE,QAAA,KAAa;AAAA,KACpE;AACA,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,KAAa,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,CAAA;AAAA,EAC7F;AAAA,EAEQ,UAAA,CAAW,OAAO,CAAA,EAAS;AACjC,IAAA,IAAI,IAAA,CAAK,WAAW,IAAA,EAAM;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAQ,OAAQ,GAAA,IAAO,IAAA;AACjC,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,IAAI,WAAW,IAAA,CAAK,KAAA;AAEpB,MAAA,IAAI,MAAM,QAAA,CAAS,MAAA;AACnB,MAAA,OAAO,GAAA,GAAM,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,OAAO,GAAA,GAAM,CAAC,CAAC,CAAA,EAAG,GAAA,IAAO,CAAA;AAC9D,MAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAChC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,QAAA,GAAW,IAAA;AAAA,IACxD;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CAAU,KAAA,EAAe,UAAA,EAA2B,IAAA,EAAc,CAAA,EAAqB;AACrF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA;AACjB,IAAA,IAAA,CAAK,KAAA,CAAM,cAAc,KAAK,CAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,IAAS,KAAA;AACd,IAAA,CAAA,EAAE;AACF,IAAA,IAAA,CAAK,KAAA,GAAQ,GAAA;AACb,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAChC;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAQ,OAAQ,GAAA,IAAO,IAAA;AAAA,EACnC;AAAA,EAEA,MAAM,OAAA,EAAwB;AAC5B,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAI,IAAA,CAAK,UAAU,EAAA,IAAM,IAAA,CAAK,SAAQ,EAAG,IAAA,CAAK,OAAO,IAAA,CAAK,KAAA;AAC1D,IAAA,IAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,GAAA,IAAO,OAAA;AAAA,EACzC;AAAA;AAAA,EAGA,WAAW,IAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AAAA,EAEA,IAAA,CAAK,IAAA,EAAc,MAAA,GAAS,IAAA,EAAY;AACtC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAEzB,MAAA,IAAI,CAAC,MAAA,IAAU,IAAA,CAAK,UAAA,CAAW,GAAG,KAAK,aAAA,CAAc,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG;AACnE,QAAA,IAAA,CAAK,GAAA,GAAM,KAAK,GAAA,CAAI,KAAA,CAAM,GAAG,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,KAAA;AAAA,MACtD;AACA,MAAA,IAAA,CAAK,OAAO,MAAA,GAAS,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,YAAY,CAAA,GAAI,IAAA;AACzD,MAAA,IAAI,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA,OAAQ,GAAA,IAAO,IAAA;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,IAAA,EAAc,MAAA,EAAgB,KAAA,EAAqB;AACxD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAC5C,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,IAAA,CAAK,IAAA;AAAA,QACH,kBAAA;AAAA,QACA,IAAA,CAAK,IAAA,CAAK,MAAA,GACN,CAAA,WAAA,EAAc,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,uCAAA,CAAA,GAC5B,CAAA,WAAA,EAAc,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,4CAAA,CAAA;AAAA,QAChC,KAAK,IAAA,CAAK;AAAA,OACZ;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ;AACrB,QAAA,IAAI,IAAA,CAAK,KAAK,aAAA,EAAe;AAC3B,UAAA,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,QACzB;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AACtC,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,EACtC;AAAA,EAEA,cAAc,MAAA,EAAsB;AAClC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,IAAA,EAAM,OAAA,EAAS,KAAA,KAAU;AACvC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,YAAA,CAAa,MAAA,EAAgB,cAAA,GAAiB,IAAA,EAAY;AACxD,IAAA,IAAA,CAAK,YAAA,GAAe,cAAA;AACpB,IAAA,MAAM,SAAiB,EAAC;AACxB,IAAA,IAAI,QAAA,GAAW,EAAA;AAEf,IAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAAqB,KAAA,KAAwB;AAC7D,MAAA,IAAI,KAAA,GAAyB,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,EAAC;AAGlD,MAAA,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC7B,QAAA,IAAI,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA,KAAM,QAAW,OAAO,IAAA;AACrD,QAAA,IAAA,CAAK,IAAA;AAAA,UACH,kBAAA;AAAA,UACA,CAAA,WAAA,EAAc,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,6CAAA,CAAA;AAAA,UAC5B,KAAK,IAAA,CAAK;AAAA,SACZ;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAC,CAAA;AAKD,MAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,WAAA,EAAa;AACnD,QAAA,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC7B,UAAA,IAAI,KAAA,GAAQ,CAAA,KAAM,MAAA,CAAO,UAAA,EAAY,OAAO,KAAA;AAC5C,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AACnC,UAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,KAAM,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA,CAAA;AAAA,QAC/E,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,OAAA,GAAU,QAAA;AACd,MAAA,QAAA,GAAW,EAAA;AAGX,MAAA,IACE,MAAM,MAAA,KAAW,IAAA,IACjB,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACtC,QAAA,OAAO,MAAM,wBAAA,KAA6B,IAAA;AAAA,MAC5C,CAAC,CAAA,EACD;AACA,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,EAAA;AAE1B,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,OAAO,SAAA,GAAY,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,KAAK,MAAA,CAAO,SAAS,CAAC,CAAA,EAAG,SAAA,IAAa,CAAA;AAClF,QAAA,IAAI,UAAU,IAAA,CAAK,MAAA;AACnB,QAAA,OAAO,OAAA,GAAU,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAO,OAAA,GAAU,CAAC,CAAC,CAAA,EAAG,OAAA,IAAW,CAAA;AAC9E,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACpC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,OAAO,CAAA;AAC1C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,QAAA,IAAI,IAAA,KAAS,EAAA,IAAM,KAAA,KAAU,EAAA,EAAI;AAC/B,UAAA,OAAA,IAAW,IAAA;AACX,UAAA,QAAA,GAAW,KAAA;AACX,UAAA,IAAI,SAAS,EAAA,EAAI;AAGf,YAAA,KAAA,GAAQ,OAAO,KAAA,EAAM;AACrB,YAAA,IAAA,GAAO,IAAA;AAAA,UACT,CAAA,MAAO;AACL,YAAA,IAAA,GAAQ,IAAA,CAAsD,SAAS,IAAI,CAAA;AAAA,UAC7E;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,GAAS,CAAA,GAAI,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,MAAA;AAC3D,MAAA,MAAM,KAAA,GAAQ,UAAU,MAAA,IAAa,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,KAAW,KAAA;AAC7E,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,IAAU,KAAA,GAAQ,CAAA,GAAI,CAAA,CAAA;AAIxC,MAAA,KAAA,EAAO,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAK,CAAA,EAAA,EAAK;AACnC,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,QAAA,IAAI,SAAS,MAAA,EAAW;AACxB,QAAA,IAAI,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA,EAAG,YAAY,IAAA,EAAM;AAClD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,UAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,UAAA,IAAI,UAAU,MAAA,EAAW;AACzB,UAAA,IAAI,KAAK,KAAA,CAAM,KAAA,CAAM,KAAK,IAAI,CAAA,EAAG,YAAY,IAAA,EAAM;AACnD,UAAA,IAAI,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,EAAG;AAClB,YAAA,IAAI,IAAI,CAAA,EAAG;AACT,cAAA,KAAA,GAAQ;AAAA,gBACN,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,gBACnB,IAAA;AAAA,gBACA,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,gBACnB,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,GAAI,GAAG,GAAG;AAAA,eAC3B;AAAA,YACF,CAAA,MAAA,IAAW,IAAI,CAAA,EAAG;AAChB,cAAA,KAAA,GAAQ;AAAA,gBACN,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,gBACnB,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,gBACvB,IAAA;AAAA,gBACA,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,eACvB;AAAA,YACF;AACA,YAAA,SAAS,KAAA;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,GAAO,CAAA;AACX,MAAA,OAAO,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,GAAG,CAAA,EAAG;AAC1C,QAAA,MAAM,UAAA,GAAa,OAAO,IAAI,CAAA;AAC9B,QAAA,MAAM,QAAA,GAAW,MAAM,IAAI,CAAA;AAC3B,QAAA,IAAI,UAAA,KAAe,MAAA,IAAa,QAAA,KAAa,MAAA,EAAW;AACxD,QAAA,IAAI,CAAC,UAAA,CAAW,EAAA,CAAG,QAAQ,CAAA,EAAG;AAC9B,QAAA,IAAA,IAAQ,CAAA;AAAA,MACV;AACA,MAAA,OAAO,IAAA,GAAO,OAAO,MAAA,EAAQ;AAC3B,QAAA,MAAM,IAAA,GAAO,OAAO,GAAA,EAAI;AACxB,QAAA,IAAI,SAAS,MAAA,EAAW;AACxB,QAAA,IAAA,CAAK,IAAA,CAAK,KAAK,UAAA,CAAW,IAAA,EAAM,OAAO,MAAA,EAAQ,KAAK,GAAG,KAAK,CAAA;AAAA,MAC9D;AAGA,MAAA,IAAI,OAAA,KAAY,EAAA,EAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAGrC,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAO,MAAA,CAAO,SAAS,GAAA,EAAK;AAC1B,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAChC,UAAA,IAAI,SAAS,MAAA,EAAW;AACxB,UAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,UAAA,IAAA,CAAK,IAAA,CAAK,KAAK,UAAA,CAAW,IAAA,EAAM,MAAM,MAAA,EAAQ,KAAK,GAAG,KAAK,CAAA;AAC3D,UAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,QACtB;AAEA,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,IAAS,IAAA,CAAK,MAAA,EAAQ;AAC/C,UAAA,IAAA,CAAK,IAAA;AAAA,YACH,KAAK,UAAA,CAAW,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,IACvC,IAAA,CAAK,IAAA,IAAQ,EAAA,CAAA,GACd,KAAK,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAAA,YACjD;AAAA,WACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,QACjC;AACA,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,IAAA,EAAM,OAAA,EAAS,KAAA,KAAU;AACvC,MAAA,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,IACtB,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,EAAM,OAAO,UAAU,CAAA;AAChC,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,EACtB;AAAA,EAEA,UAAA,CAAW,IAAA,EAAc,KAAA,EAAe,UAAA,EAA6C;AACnF,IAAA,IAAI,KAAK,MAAA,KAAW,IAAA,IAAQ,KAAK,MAAA,CAAO,IAAA,KAAS,KAAK,IAAA,EAAM;AAC1D,MAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IACnB,CAAA,MAAA,IAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IACnB;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,UAAA;AACrB,IAAA,MAAM,YAAY,IAAA,CAAK,WAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,KAAA,KAAU;AACtC,MAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,OAAA,EAAS,IAAA,CAAK,WAAW,CAAC,CAAA;AAC3C,MAAA,IAAA,CAAK,UAAU,KAAA,EAAO,UAAA,CAAW,KAAK,CAAA,EAAG,MAAM,MAAM;AACnD,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AAAA,MAChC,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,WAAA,GAAc,SAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,CAAI,GAAA,EAAa,WAAA,GAAc,KAAA,EAAe;AAG5C,IAAA,IAAI,UAAU,GAAA,CAAI,OAAA,CAAQ,kBAAA,EAAoB,CAAC,GAAG,CAAA,KAAc;AAC9D,MAAA,IAAI,MAAM,GAAA,EAAK;AACb,QAAA,OAAO,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,GAAI,IAAI,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,KAAK,EAAE,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,EAAE,CAAA,GAC3F,CAAA,GACA,IAAA,GAAO,CAAA;AAAA,MACb;AAEA,MAAA,IAAI,CAAA,KAAM,GAAA,EAAK,OAAO,SAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,EAAE,CAAA,GAAI,KAAA,GAAQ,CAAA;AACjE,MAAA,OAAO,IAAA,GAAO,CAAA;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,GAAU,OAAA,CACP,OAAA,CAAQ,cAAA,EAAgB,MAAM,CAAA,CAC9B,OAAA,CAAQ,sBAAA,EAAwB,UAAU,CAAA,CAC1C,OAAA,CAAQ,mBAAA,EAAqB,SAAS,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,IAAA,EAAY,IAAA,EAAe,MAAA,EAAgB,KAAA,EAAuB;AAC3E,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACtC,IAAA,IAAI,IAAA,KAAS,QAAW,OAAO,EAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA;AACtC,IAAA,OAAO,OAAO,UAAU,QAAA,GAAW,KAAA,GAAQ,MAAM,IAAA,EAAM,IAAA,EAAM,QAAQ,KAAK,CAAA;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAA,GAAiB;AACf,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AACF,CAAA;;;ACjXA,SAAS,UAAA,CAAW,MAAc,IAAA,EAA6B;AAC7D,EAAA,MAAM,KAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACtC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,KAAK,KAAA,GAAQ,IAAA;AAC7D;AAEA,SAAS,UAAA,CAAW,MAAc,IAAA,EAA6B;AAC7D,EAAA,MAAM,KAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACtC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,IAAA;AACvE;AAGA,SAAS,mBAAA,CAAoB,OAAgC,IAAA,EAAoB;AAC/E,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,EAAM,WAAW,CAAA;AAC9C,EAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,MAAA,EAAQ;AAC9C,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,iDAAA,EAAmD,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACjG;AACA,EAAA,IAAI,UAAA,CAAW,IAAA,EAAM,YAAY,CAAA,KAAM,IAAA,EAAM;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,8CAAA,EAAgD,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EAC9F;AACA,EAAA,IACE,UAAA,CAAW,MAAM,iBAAiB,CAAA,KAAM,QACxC,UAAA,CAAW,IAAA,EAAM,sBAAsB,CAAA,KAAM,IAAA,EAC7C;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,yDAAA,EAA2D,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACzG;AACF;AAEA,SAAS,sBAAsB,GAAA,EAAqB;AAElD,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,MAAM,CAAA;AACvC;AAEA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAA;AACvC;AAGA,SAAS,UAAA,CAAW,IAAA,EAAY,MAAA,EAAgB,KAAA,EAAwB;AACtE,EAAA,MAAM,IAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACvC,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,SAAA,CAAU,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,KAAA;AACxF,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAClC,EAAA,IACE,CAAC,OAAA,CAAQ,MAAA,IACT,OAAA,CAAQ,IAAA,KAAS,IAAA,IACjB,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAC,MAAM,IAAA,EAC5C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,KAAU,MAAA,CAAO,UAAA,GAAa,CAAA,IAAK,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,CAAE,KAAK,CAAA;AACvF;AAEA,SAAS,UAAU,IAAA,EAA2B;AAC5C,EAAA,MAAM,KAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACzC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,KAAK,KAAA,GAAQ,IAAA;AAC7D;AAEA,SAAS,SAAS,IAAA,EAA6B;AAC7C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA;AAC5B,EAAA,OAAO,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACnD;AAMA,SAAS,aAAA,CAAc,OAAgC,IAAA,EAAsB;AAC3E,EAAA,MAAM,MAAM,IAAI,uBAAA;AAAA,IACd,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,IACzC,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA;AAAW,GACjC;AACA,EAAA,GAAA,CAAI,cAAc,IAAI,CAAA;AACtB,EAAA,KAAA,MAAW,OAAA,IAAW,GAAA,CAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,IAAA,EAAM,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,QAAQ,CAAA;AAC9F,EAAA,MAAM,GAAA,GAAM,IAAI,MAAA,EAAO;AAGvB,EAAA,IAAI,KAAK,UAAA,GAAa,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAC7C,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,0CAAA,EAA4C,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EAC1F;AACA,EAAA,OACE,GAAA,CAGG,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,IAAA,EAAK,CAEL,OAAA,CAAQ,cAAc,KAAK,CAAA;AAElC;AAEA,SAAS,aAAa,SAAA,EAAkC;AACtD,EAAA,IAAI,SAAA,KAAc,UAAU,OAAO,OAAA;AACnC,EAAA,IAAI,SAAA,KAAc,SAAS,OAAO,MAAA;AAClC,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,KAAA,GAAgC,CAAC,KAAA,EAAO,IAAA,KAAS;AACrD,EAAA,IAAI,IAAA,CAAK,eAAe,CAAA,EAAG;AAE3B,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,MAAM,aAAgC,EAAC;AAEvC,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,UAAA,EAAY,QAAA,KAAa;AAC1C,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,IAAA,EAAM,WAAA,EAAa,SAAA,KAAc;AAE5C,MAAA,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA,IAAK,CAAA,IAAK,CAAA,IAAA,CAAM,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG;AACpF,QAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,sDAAA,EAAwD,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MACtG;AACA,MAAA,IAAI,UAAA,CAAW,IAAA,EAAM,YAAY,CAAA,KAAM,IAAA,EAAM;AAC3C,QAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,wDAAA,EAA0D,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MACxG;AACA,MAAA,IAAI,UAAA,CAAW,IAAA,EAAM,eAAe,CAAA,KAAM,IAAA,EAAM;AAC9C,QAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,gEAAA,EAAkE,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MAChH;AACA,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,UAAA,CAAW,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,MAC/C,CAAA,MAAO;AAGL,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,WAAW,CAAA;AAC1C,QAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,MAAW,UAAA,CAAW,SAAS,KAAK,IAAA,CAAA,EAAO;AAC/D,UAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,gFAAA,EAAkF,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,QAChI;AAAA,MACF;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IACvC,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACjB,CAAC,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,MAAM,CAAA,EAAG,UAAA,CAAW,MAAM,CAAA;AACpF,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAA4B;AACxC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAA,EAAY,EAAG,CAAC,EAAA,EAAI,CAAA,KAAM,KAAA,CAAM,CAAC,KAAK,EAAE,CAAA;AAC5E,IAAA,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,GAAG,QAAQ,CAAA,GAAI,IAAA;AACjC,EAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,SAAA,IAAa,EAAE,CAAC,CAAA;AACjC,EAAA,KAAA,CAAM,aAAA,EAAc;AACpB,EAAA,KAAA,CAAM,KAAA;AAAA,IACJ,KAAK,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAA,IAAe,CAAC,EAAA,EAAI,MAAM,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA,IAAK,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA;AAAA,GACtG;AACA,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,KAAA,CAAM,aAAA,EAAc;AACpB,IAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AACvB,CAAA;AAEO,IAAM,sBAAA,GAAiE;AAAA,EAC5E,IAAA,EAAM,CAAC,KAAA,EAAO,IAAA,KAAS;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA;AAAA,EAC5B,CAAA;AAAA,EAEA,SAAA,EAAW,CAAC,KAAA,EAAO,IAAA,KAAS;AAC1B,IAAA,mBAAA,CAAoB,OAAO,IAAI,CAAA;AAC/B,IAAA,KAAA,CAAM,aAAa,IAAI,CAAA;AACvB,IAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,OAAA,EAAS,CAAC,KAAA,EAAO,IAAA,KAAS;AACxB,IAAA,mBAAA,CAAoB,OAAO,IAAI,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA,IAAK,CAAA;AAC3C,IAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAC,CAAA,EAAG,CAAC,CAAC,IAAI,GAAG,CAAA;AAC7D,IAAA,KAAA,CAAM,YAAA,CAAa,MAAM,KAAK,CAAA;AAC9B,IAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,UAAA,EAAY,CAAC,KAAA,EAAO,IAAA,KAAS;AAC3B,IAAA,KAAA,CAAM,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM;AACtC,MAAA,KAAA,CAAM,cAAc,IAAI,CAAA;AAAA,IAC1B,CAAC,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,SAAA,EAAW,CAAC,KAAA,EAAO,IAAA,KAAS;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA;AAC5C,IAAA,MAAM,QAAQ,GAAA,CAAI,MAAA,CAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,IAAQ,CAAC,EAAE,CAAA,EAAG,IAAI,CAAC,GAAA,KAAQ,IAAI,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA;AAEpF,IAAA,MAAM,QAAA,GAAA,CAAY,UAAA,CAAW,IAAA,EAAM,UAAU,KAAK,EAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,IAAK,EAAA;AAC5F,IAAA,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,QAAA,GAAW,IAAI,CAAA;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,KAAK,CAAA;AAClC,IAAA,KAAA,CAAM,aAAA,EAAc;AACpB,IAAA,KAAA,CAAM,MAAM,KAAK,CAAA;AACjB,IAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,cAAA,EAAgB,CAAC,KAAA,EAAO,IAAA,KAAS;AAC/B,IAAA,KAAA,CAAM,MAAM,KAAK,CAAA;AACjB,IAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,SAAA,EAAW,CAAC,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,KAAU;AACzC,IAAA,KAAA,IAAS,IAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,YAAY,CAAA,EAAA,EAAK;AAClD,MAAA,IAAI,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,KAAS,KAAK,IAAA,EAAM;AACtC,QAAA,KAAA,CAAM,MAAM,MAAM,CAAA;AAClB,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,EAAY,CAAC,KAAA,EAAO,IAAA,KAAS;AAC3B,IAAA,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,EACzC,CAAA;AAAA,EAEA,WAAA,EAAa,CAAC,KAAA,EAAO,IAAA,KAAS;AAC5B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA,IAAK,CAAA;AAC3C,IAAA,MAAM,WAAW,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,UAAA,GAAa,CAAC,CAAA,CAAE,MAAA;AACrD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA;AACtC,IAAA,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,CAAC,KAAA,KAAU;AACxC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,GAAQ,KAAK,CAAA;AACnC,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,MAAM,IAAI,MAAA,GAAS,IAAA;AAAA,IACzD,CAAC,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,QAAA,EAAU,CAAC,KAAA,EAAO,IAAA,KAAS;AACzB,IAAA,KAAA,CAAM,cAAc,IAAI,CAAA;AAAA,EAC1B,CAAA;AAAA,EAEA,QAAA,EAAU,CAAC,KAAA,EAAO,IAAA,KAAS;AACzB,IAAA,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,EACzC,CAAA;AAAA,EAEA,QAAA,EAAU,CAAC,KAAA,EAAO,IAAA,KAAS;AACzB,IAAA,KAAA,CAAM,KAAA,CAAM,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,KAAM,IAAA,GAAO,GAAA,GAAM,GAAG,CAAA,EAAA,CAAI,CAAA;AAC9D,IAAA,KAAA,CAAM,cAAc,IAAI,CAAA;AAAA,EAC1B,CAAA;AAAA,EAEA,KAAA,EAAO,CAAC,KAAA,EAAO,IAAA,KAAS;AACtB,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA;AAClC,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,IAAA,CAAK,kBAAA,EAAoB,2BAAA,EAA6B,IAAA,CAAK,KAAK,IAAI,CAAA;AAC1E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACzC,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAC3C,IAAA,IAAK,UAAU,IAAA,IAAQ,KAAA,KAAU,UAAe,MAAA,KAAW,IAAA,IAAQ,WAAW,MAAA,EAAY;AACxF,MAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,oDAAA,EAAsD,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACpG;AACA,IAAA,MAAM,GAAA,GAAe,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AACtC,IAAA,KAAA,CAAM,KAAA;AAAA,MACJ,CAAA,EAAA,EAAK,MAAM,GAAA,CAAI,OAAO,QAAQ,QAAA,GAAW,GAAA,GAAM,EAAE,CAAC,CAAA,EAAA,EAAK,sBAAsB,GAAG,CAAC,GAC/E,KAAA,KAAU,IAAA,GAAO,KAAK,eAAA,CAAgB,KAAK,CAAC,CAAA,CAAA,CAAA,GAAM,EACpD,CAAA,CAAA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,EAC3C,CAAA;AAAA,EAEA,KAAA;AAAA,EACA,UAAU,MAAM;AAAA,EAEhB,CAAA;AAAA,EAEA,OAAA,EAAS,CAAC,KAAA,EAAO,IAAA,KAAS;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,0DAAA,EAA4D,IAAA,CAAK,KAAK,IAAI,CAAA;AACxG,IAAA,KAAA,CAAM,cAAc,IAAI,CAAA;AAAA,EAC1B,CAAA;AAAA,EAEA,cAAA,EAAgB,CAAC,KAAA,EAAO,IAAA,KAAS;AAC/B,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AAC3B,MAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AACrB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,MAAM,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,YAAA,CAAa,MAAM,KAAK,CAAA;AAC9B,IAAA,KAAA,CAAM,MAAM,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,cAAA,EAAgB,CAAC,KAAA,EAAO,IAAA,KAAS;AAC/B,IAAA,KAAA,CAAM,cAAc,IAAI,CAAA;AAAA,EAC1B,CAAA;AAAA,EAEA,KAAA,EAAO,CAAC,KAAA,EAAO,IAAA,KAAS;AACtB,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,SAAS,IAAI,CAAA;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,EAAA,GAAK,KAAA,GAAQ,IAAA,KAAS,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA;AAAA,EACtF,CAAA;AAAA,EAEA,OAAA,EAAS,CAAC,KAAA,EAAO,IAAA,KAAS;AACxB,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,SAAS,IAAI,CAAA;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,EAAA,GAAK,IAAA,GAAO,KAAA,KAAU,IAAA,GAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA;AAClF,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,kCAAA,EAAoC,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EAClF,CAAA;AAAA,EAEA,UAAA,EAAY,CAAC,KAAA,EAAO,IAAA,KAAS;AAC3B,IAAA,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,UAAA,CAAW,MAAM,OAAO,CAAA,IAAK,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,EACpD,CAAA;AAAA,EAEA,SAAA,EAAW,CAAC,KAAA,EAAO,IAAA,KAAS;AAC1B,IAAA,KAAA,CAAM,MAAM,MAAM,CAAA;AAClB,IAAA,KAAA,CAAM,KAAK,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA,IAAK,IAAI,KAAK,CAAA;AACjD,IAAA,KAAA,CAAM,aAAA,EAAc;AACpB,IAAA,KAAA,CAAM,MAAM,IAAI,CAAA;AAChB,IAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,eAAA,EAAiB,CAAC,KAAA,EAAO,IAAA,KAAS;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,kBAAA,EAAoB,qDAAA,EAAuD,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACtG;AACF;AAEO,IAAM,gBAAA,GAAqD;AAAA,EAChE,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,wBAAA,EAA0B,IAAA,EAAK;AAAA,EAC/E,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,wBAAA,EAA0B,IAAA,EAAK;AAAA,EAC/E,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,wBAAA,EAA0B,IAAA,EAAK;AAAA,EACjF,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,KAAA,KAAU,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG,EAAE,CAAA;AAAA,IAC5E,KAAA,EAAO,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,KAAA,KAAU,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IAChF,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,CAAC,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,KAAW,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,GAAI,GAAA,GAAM,GAAA;AAAA,IAChF,KAAA,EAAO,CAAC,MAAA,EAAQ,IAAA,EAAM,QAAQ,KAAA,KAAU;AACtC,MAAA,IAAI,WAAW,IAAA,EAAM,MAAA,EAAQ,KAAA,GAAQ,CAAC,GAAG,OAAO,GAAA;AAChD,MAAA,MAAM,IAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACvC,MAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAC5B,MAAA,OAAO,KAAK,qBAAA,CAAsB,OAAO,IAAA,KAAS,QAAA,GAAW,OAAO,EAAE,CAAC,CAAA,EACrE,KAAA,KAAU,OAAO,CAAA,EAAA,EAAK,eAAA,CAAgB,KAAK,CAAC,MAAM,EACpD,CAAA,CAAA,CAAA;AAAA,IACF;AAAA;AAEJ;;;AC3TO,SAAS,yBACd,KAAA,GAAyC,EAAC,EAC1C,OAAA,GAAqC,EAAC,EAClB;AACpB,EAAA,MAAM,QAAQ,EAAE,GAAG,sBAAA,EAAwB,GAAG,MAAM,KAAA,EAAM;AAC1D,EAAA,MAAM,QAAQ,EAAE,GAAG,gBAAA,EAAkB,GAAG,MAAM,KAAA,EAAM;AACpD,EAAA,OAAO;AAAA,IACL,UAAU,IAAA,EAAuC;AAC/C,MAAA,MAAM,QAAQ,IAAI,uBAAA,CAAwB,EAAE,KAAA,EAAO,KAAA,IAAS,OAAO,CAAA;AACnE,MAAA,IAAI,KAAK,WAAA,EAAa;AAGpB,QAAA,KAAA,CAAM,aAAa,IAAI,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,cAAc,IAAI,CAAA;AAAA,MAC1B;AACA,MAAA,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,MAAA,EAAO,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,EAAG,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,IAClF;AAAA,GACF;AACF;AAOO,SAAS,iBAAA,CACd,IAAA,EACA,OAAA,GAAoC,EAAC,EACZ;AACzB,EAAA,MAAM,EAAE,KAAA,EAAO,GAAG,iBAAA,EAAkB,GAAI,OAAA;AACxC,EAAA,OAAO,wBAAA,CAAyB,KAAA,EAAO,iBAAiB,CAAA,CAAE,UAAU,IAAI,CAAA;AAC1E;;;ACGO,SAAS,YAAY,MAAA,EAAyC;AACnE,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,wBAAA,EAAyB;AACnE,EAAA,OAAO,UAAA,CAAW,SAAA,CAAU,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC9C;AAEO,IAAM,QAAA,GAAW,UAAU,MAAA,CAAyC;AAAA,EACzE,IAAA,EAAM,UAAA;AAAA,EAEN,UAAA,GAAa;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACT;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,GAA8B;AAC5B,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,UAAA,EAAY;AAAA,KACd;AAAA,EACF,CAAA;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,MAAA;AAClC,IAAA,IAAI,WAAW,MAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,qBAAqB,MAAM,CAAA;AAC7E,IAAA,IAAA,CAAK,QAAQ,UAAA,KAAe,wBAAA,CAAyB,KAAK,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AAAA,MAC7E,UAAA,EAAY,KAAK,OAAA,CAAQ;AAAA,KAC1B,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,KAAmC;AACpD,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,oBAAA,CAAqB,MAAM,CAAA;AACnD,MAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,IACtB,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,gBACE,CAAC,QAAA,KACD,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AACvB,QAAA,MAAM,MAAM,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA,CAAE,MAAM,QAAQ,CAAA;AAClD,QAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,UAAA;AAG1B,QAAA,MAAM,UACJ,GAAA,CAAI,OAAA,CAAQ,UAAA,KAAe,CAAA,IAAK,UAAU,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,KAAS,cAClE,KAAA,CAAM,OAAA,CAAQ,QAAO,GACrB,GAAA,CAAI,QAAQ,MAAA,EAAO;AACzB,QAAA,OAAO,QAAA,CAAS,aAAA,CAAe,OAAA,IAAW,EAAoB,CAAA;AAAA,MAChE,CAAA;AAAA,MAEF,kBAAA,EACE,CAAC,QAAA,EAAkB,OAAA,KACnB,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AACvB,QAAA,MAAM,MAAM,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA,CAAE,MAAM,QAAQ,CAAA;AAClD,QAAA,OAAO,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,MAAA,IAAyB,OAAO,CAAA;AAAA,MACjE;AAAA,KACJ;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,GAAwB;AACtB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAA,SAAc,EAAC;AACjC,IAAA,OAAO;AAAA,MACL,oBAAoB,MAAM;AACxB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,MAAA;AAClC,QAAA,IAAI,WAAW,MAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,qBAAqB,MAAM,CAAA;AAC7E,QAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,MAAA;AAC5B,QAAA,IAAI,MAAA,KAAW,IAAA,EAAM,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAC1F,QAAA,OAAO,MAAA;AAAA,MACT,CAAC;AAAA,KACH;AAAA,EACF;AACF,CAAC;;;AC3HM,SAAS,gBAAA,CACd,MAAA,EACA,QAAA,GAAW,aAAA,EACc;AACzB,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,MAAA,CAAO,QAAQ,CAAA,EAAG,EAAE,IAAA,EAAM,6BAAA,EAA+B,CAAA;AAChF,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACzC,EAAA,MAAA,CAAO,IAAA,GAAO,GAAA;AACd,EAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,EAAA,MAAA,CAAO,GAAA,GAAM,UAAA;AACb,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,MAAA,CAAO,KAAA,EAAM;AACb,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACvB,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["/**\n * markdown-it rules for LaTeX math: `$...$` inline and `$$` blocks. Only\n * registered when the schema actually has the math nodes.\n */\nimport type MarkdownIt from 'markdown-it';\n\ntype RuleInline = Parameters<MarkdownIt['inline']['ruler']['after']>[2];\ntype RuleBlock = Parameters<MarkdownIt['block']['ruler']['after']>[2];\n\nconst mathInlineRule: RuleInline = (state, silent) => {\n const start = state.pos;\n if (state.src.charCodeAt(start) !== 0x24 /* $ */) return false;\n if (state.src.charCodeAt(start + 1) === 0x24) return false;\n\n let pos = start + 1;\n while (pos < state.posMax) {\n const code = state.src.charCodeAt(pos);\n if (code === 0x5c /* \\ */) {\n // Skip escaped characters so \\$ inside the formula does not terminate.\n pos += 2;\n continue;\n }\n if (code === 0x24) break;\n if (code === 0x0a /* \\n */) return false;\n pos += 1;\n }\n if (pos >= state.posMax || pos === start + 1) return false;\n // Currency guards, matching the usual $-math conventions: no whitespace\n // right after the opening or before the closing dollar, and no digit\n // right after the closing one (\"$5 and $10\").\n if (/\\s/.test(state.src.charAt(start + 1))) return false;\n if (/\\s/.test(state.src.charAt(pos - 1))) return false;\n if (/\\d/.test(state.src.charAt(pos + 1))) return false;\n\n if (!silent) {\n const token = state.push('math_inline', '', 0);\n token.content = state.src.slice(start + 1, pos);\n }\n state.pos = pos + 1;\n return true;\n};\n\nconst mathBlockRule: RuleBlock = (state, startLine, endLine, silent) => {\n const start = (state.bMarks[startLine] ?? 0) + (state.tShift[startLine] ?? 0);\n const lineEnd = state.eMarks[startLine];\n const firstLine = state.src.slice(start, lineEnd);\n if (!firstLine.startsWith('$$')) return false;\n\n const singleLine = firstLine.length > 4 && firstLine.endsWith('$$');\n if (!singleLine && firstLine.trim() !== '$$') return false;\n if (silent) return true;\n\n let content: string;\n let nextLine = startLine + 1;\n if (singleLine) {\n content = firstLine.slice(2, -2).trim();\n } else {\n const lines: string[] = [];\n let closed = false;\n for (; nextLine < endLine; nextLine++) {\n const lineStart = (state.bMarks[nextLine] ?? 0) + (state.tShift[nextLine] ?? 0);\n const line = state.src.slice(lineStart, state.eMarks[nextLine]);\n if (line.trim() === '$$') {\n closed = true;\n nextLine += 1;\n break;\n }\n lines.push(line);\n }\n if (!closed) return false;\n content = lines.join('\\n');\n }\n\n const token = state.push('math_block', '', 0);\n token.content = content;\n token.map = [startLine, singleLine ? startLine + 1 : nextLine];\n state.line = singleLine ? startLine + 1 : nextLine;\n return true;\n};\n\nexport function addMathInlineRule(md: MarkdownIt): void {\n md.inline.ruler.after('escape', 'math_inline', mathInlineRule);\n}\n\nexport function addMathBlockRule(md: MarkdownIt): void {\n // The alt list lets $$ interrupt a paragraph, the same way fences do.\n md.block.ruler.after('fence', 'math_block', mathBlockRule, {\n alt: ['paragraph', 'reference', 'blockquote', 'list'],\n });\n}\n","/**\n * Markdown parse state: token stream in, ProseMirror nodes out. Same shape as\n * prosemirror-markdown's parse state, built on `@domternal/pm` types.\n */\nimport { Mark } from '@domternal/pm/model';\nimport type { Attrs, MarkType, Node as PMNode, NodeType, Schema } from '@domternal/pm/model';\n\ninterface StackFrame {\n type: NodeType;\n attrs: Attrs | null;\n content: PMNode[];\n /** Discard the frame when it closes empty (paragraph split around a block image). */\n discardWhenEmpty: boolean;\n}\n\nfunction maybeMerge(a: PMNode, b: PMNode): PMNode | null {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n return (a as PMNode & { withText: (text: string) => PMNode }).withText(\n (a.text ?? '') + (b.text ?? '')\n );\n }\n return null;\n}\n\nexport class MarkdownParseState {\n readonly schema: Schema;\n private readonly stack: StackFrame[];\n private marks: readonly Mark[] = Mark.none;\n\n constructor(schema: Schema) {\n this.schema = schema;\n this.stack = [\n { type: schema.topNodeType, attrs: null, content: [], discardWhenEmpty: false },\n ];\n }\n\n private top(): StackFrame {\n const frame = this.stack[this.stack.length - 1];\n if (frame === undefined) throw new Error('markdown parse stack underflow');\n return frame;\n }\n\n /** The node type currently being built (for split decisions). */\n topType(): NodeType {\n return this.top().type;\n }\n\n push(node: PMNode): void {\n this.top().content.push(node);\n }\n\n addText(text: string): void {\n if (text === '') return;\n const content = this.top().content;\n const last = content[content.length - 1];\n const node = this.schema.text(text, this.marks);\n const merged = last !== undefined ? maybeMerge(last, node) : null;\n if (merged !== null) {\n content[content.length - 1] = merged;\n } else {\n content.push(node);\n }\n }\n\n openMark(mark: Mark): void {\n this.marks = mark.addToSet(this.marks);\n }\n\n closeMark(type: MarkType): void {\n this.marks = type.removeFromSet(this.marks);\n }\n\n addNode(type: NodeType, attrs: Attrs | null, content?: PMNode[]): PMNode | null {\n const node = type.createAndFill(attrs, content, type.isInline ? this.marks : undefined);\n if (node === null) return null;\n this.push(node);\n return node;\n }\n\n openNode(type: NodeType, attrs: Attrs | null = null, discardWhenEmpty = false): void {\n this.stack.push({ type, attrs, content: [], discardWhenEmpty });\n }\n\n closeNode(): PMNode | null {\n if (this.marks.length > 0) this.marks = Mark.none;\n const frame = this.stack.pop();\n if (frame === undefined) throw new Error('markdown parse stack underflow');\n if (frame.discardWhenEmpty && frame.content.length === 0) return null;\n const node = frame.type.createAndFill(frame.attrs, frame.content);\n if (node === null) return null;\n this.push(node);\n return node;\n }\n\n /**\n * Close the innermost frame and reopen the same type after inserting\n * `node` as a sibling: how a block-level image escapes its paragraph.\n */\n splitAround(node: PMNode): void {\n const frame = this.stack.pop();\n if (frame === undefined) throw new Error('markdown parse stack underflow');\n if (frame.content.length > 0) {\n const closed = frame.type.createAndFill(frame.attrs, frame.content);\n if (closed !== null) this.push(closed);\n }\n this.push(node);\n this.openNode(frame.type, frame.attrs, true);\n }\n\n /** Build the final document; called once after all tokens are consumed. */\n finish(): PMNode {\n while (this.stack.length > 1) this.closeNode();\n const frame = this.stack.pop();\n if (frame === undefined) throw new Error('markdown parse stack underflow');\n const doc = frame.type.createAndFill(frame.attrs, frame.content);\n if (doc === null) throw new Error('markdown parse produced an invalid document');\n return doc;\n }\n}\n","/**\n * Markdown to ProseMirror parser. markdown-it produces the token stream; the\n * handler set is derived from what the schema actually contains, so Markdown\n * features without a schema counterpart degrade to plain text instead of\n * failing (tables without the table extension, strikethrough without the\n * strike mark, and so on).\n */\nimport MarkdownIt from 'markdown-it';\nimport { Fragment } from '@domternal/pm/model';\nimport type { Node as PMNode, NodeType, Schema } from '@domternal/pm/model';\nimport { addMathBlockRule, addMathInlineRule } from './mathRules.js';\nimport { MarkdownParseState } from './state.js';\n\ntype Token = ReturnType<MarkdownIt['parse']>[number];\ntype TokenHandler = (state: MarkdownParseState, token: Token) => void;\n\nexport interface MarkdownParser {\n /** Parse a Markdown string into a document node of the schema. */\n parse(markdown: string): PMNode;\n}\n\nfunction attrFrom(token: Token, name: string): string | null {\n const value = token.attrGet(name);\n return value === null || value === '' ? null : value;\n}\n\nfunction cellAlign(token: Token): Record<string, string> | null {\n const style = token.attrGet('style');\n if (style === null) return null;\n const match = /text-align:\\s*(left|center|right)/.exec(style);\n const align = match?.[1];\n return align === undefined ? null : { textAlign: align };\n}\n\nfunction altText(token: Token): string {\n return (token.children ?? [])\n .filter((child) => child.type === 'text' || child.type === 'text_special')\n .map((child) => child.content)\n .join('');\n}\n\nconst TASK_PREFIX = /^\\[( |x|X)\\](?: |$)/;\n\n/**\n * GFM task lists arrive as bullet lists whose items start with a checkbox\n * marker. A bullet list converts only when EVERY item carries the marker:\n * the schema does not allow mixing task and plain items in one list.\n */\nfunction transformTaskLists(doc: PMNode, schema: Schema): PMNode {\n const taskList = schema.nodes['taskList'];\n const taskItem = schema.nodes['taskItem'];\n const bulletList = schema.nodes['bulletList'];\n const listItem = schema.nodes['listItem'];\n if (\n taskList === undefined ||\n taskItem === undefined ||\n bulletList === undefined ||\n listItem === undefined\n ) {\n return doc;\n }\n\n const itemMarker = (item: PMNode): string | null => {\n if (item.type !== listItem) return null;\n const paragraph = item.firstChild;\n if (paragraph?.isTextblock !== true) return null;\n const first = paragraph.firstChild;\n if (first?.isText !== true) return null;\n // A marked marker (e.g. bold) is styled text, not a GFM checkbox.\n // Escaped brackets are indistinguishable after inline parsing and\n // convert too; that divergence from cmark-gfm is accepted.\n if (first.marks.length > 0) return null;\n const match = TASK_PREFIX.exec(first.text ?? '');\n return match === null ? null : (match[1] ?? ' ');\n };\n\n const convertItem = (item: PMNode): PMNode => {\n const marker = itemMarker(item);\n const children: PMNode[] = [];\n item.forEach((child, _offset, index) => {\n if (index === 0 && child.isTextblock) {\n const inline: PMNode[] = [];\n child.forEach((inlineChild, _o, inlineIndex) => {\n if (inlineIndex === 0 && inlineChild.isText) {\n const stripped = (inlineChild.text ?? '').replace(TASK_PREFIX, '');\n if (stripped !== '') {\n inline.push(\n (inlineChild as PMNode & { withText: (text: string) => PMNode }).withText(stripped)\n );\n }\n return;\n }\n inline.push(inlineChild);\n });\n children.push(child.copy(Fragment.from(inline)));\n return;\n }\n children.push(child);\n });\n return taskItem.create({ checked: marker === 'x' || marker === 'X' }, children);\n };\n\n const map = (node: PMNode): PMNode => {\n if (node.isLeaf) return node;\n const mapped: PMNode[] = [];\n node.forEach((child) => {\n mapped.push(map(child));\n });\n const rebuilt = node.copy(Fragment.from(mapped));\n if (rebuilt.type !== bulletList || rebuilt.childCount === 0) return rebuilt;\n const items: PMNode[] = [];\n rebuilt.forEach((item) => {\n items.push(item);\n });\n if (!items.every((item) => itemMarker(item) !== null)) return rebuilt;\n return taskList.create(null, items.map(convertItem));\n };\n\n return map(doc);\n}\n\nfunction buildMarkdownIt(schema: Schema): MarkdownIt {\n const md = new MarkdownIt('default', { html: false, linkify: true });\n const hasTableSchema =\n schema.nodes['table'] !== undefined &&\n schema.nodes['tableRow'] !== undefined &&\n schema.nodes['tableCell'] !== undefined &&\n schema.nodes['tableHeader'] !== undefined;\n if (!hasTableSchema) md.disable('table');\n if (schema.nodes['image'] === undefined) md.disable('image');\n if (schema.marks['strike'] === undefined) md.disable('strikethrough');\n if (schema.marks['link'] === undefined) {\n md.disable(['link', 'linkify', 'autolink']);\n md.set({ linkify: false });\n }\n // Each rule registers only when its node exists: an inline-math-only\n // schema must not produce math_block tokens nobody handles.\n if (schema.nodes['mathInline'] !== undefined) addMathInlineRule(md);\n if (schema.nodes['mathBlock'] !== undefined) addMathBlockRule(md);\n return md;\n}\n\nexport function createMarkdownParser(schema: Schema): MarkdownParser {\n const md = buildMarkdownIt(schema);\n const handlers: Record<string, TokenHandler> = {};\n\n const handleTokens = (state: MarkdownParseState, tokens: Token[]): void => {\n for (const token of tokens) {\n const handler = handlers[token.type];\n if (handler === undefined) {\n throw new Error(`No markdown token handler for \"${token.type}\"`);\n }\n handler(state, token);\n }\n };\n\n const node = (name: string): NodeType | undefined => schema.nodes[name];\n\n const block = (\n tokenName: string,\n nodeName: string,\n getAttrs?: (token: Token) => Record<string, unknown> | null,\n fallback?: 'paragraph'\n ): void => {\n const type = node(nodeName);\n if (type === undefined) {\n // Wrapper missing from the schema: content flows into the parent,\n // textblocks fall back to plain paragraphs.\n const fallbackType = fallback === 'paragraph' ? node('paragraph') : undefined;\n handlers[`${tokenName}_open`] = (state) => {\n if (fallbackType !== undefined) state.openNode(fallbackType);\n };\n handlers[`${tokenName}_close`] = (state) => {\n if (fallbackType !== undefined) state.closeNode();\n };\n return;\n }\n handlers[`${tokenName}_open`] = (state, token) => {\n state.openNode(type, getAttrs?.(token) ?? null);\n };\n handlers[`${tokenName}_close`] = (state) => {\n state.closeNode();\n };\n };\n\n const inlineMark = (tokenName: string, markName: string): void => {\n const type = schema.marks[markName];\n if (type === undefined) {\n // Mark missing from the schema: keep the text, drop the formatting.\n ignore(`${tokenName}_open`, `${tokenName}_close`);\n return;\n }\n handlers[`${tokenName}_open`] = (state, token) => {\n state.openMark(\n type.create(\n tokenName === 'link'\n ? { href: attrFrom(token, 'href'), title: attrFrom(token, 'title') }\n : null\n )\n );\n };\n handlers[`${tokenName}_close`] = (state) => {\n state.closeMark(type);\n };\n };\n\n const cell = (tokenName: string, nodeName: string): void => {\n const cellType = node(nodeName);\n const paragraphType = node('paragraph');\n if (cellType === undefined || paragraphType === undefined) return;\n handlers[`${tokenName}_open`] = (state, token) => {\n state.openNode(cellType, cellAlign(token));\n state.openNode(paragraphType);\n };\n handlers[`${tokenName}_close`] = (state) => {\n state.closeNode();\n state.closeNode();\n };\n };\n\n const ignore = (...tokenNames: string[]): void => {\n for (const name of tokenNames) {\n handlers[name] = () => {\n // Structural token with no ProseMirror counterpart.\n };\n }\n };\n\n block('paragraph', 'paragraph');\n block('heading', 'heading', (token) => ({ level: Number(token.tag.slice(1)) || 1 }), 'paragraph');\n block('blockquote', 'blockquote');\n block('bullet_list', 'bulletList');\n block('ordered_list', 'orderedList', (token) => {\n const start = Number(token.attrGet('start') ?? '1');\n return { start: Number.isFinite(start) && start >= 1 ? start : 1 };\n });\n block('list_item', 'listItem');\n block('table', 'table');\n block('tr', 'tableRow');\n cell('th', 'tableHeader');\n cell('td', 'tableCell');\n ignore('thead_open', 'thead_close', 'tbody_open', 'tbody_close');\n\n handlers['inline'] = (state, token) => {\n handleTokens(state, token.children ?? []);\n };\n handlers['text'] = (state, token) => {\n state.addText(token.content);\n };\n handlers['text_special'] = (state, token) => {\n state.addText(token.content);\n };\n handlers['softbreak'] = (state) => {\n state.addText(' ');\n };\n\n const hardBreakType = node('hardBreak');\n handlers['hardbreak'] = (state) => {\n if (hardBreakType !== undefined) {\n state.addNode(hardBreakType, null);\n } else {\n state.addText(' ');\n }\n };\n\n const codeBlockType = node('codeBlock') ?? node('paragraph');\n if (codeBlockType !== undefined) {\n const addCodeBlock = (state: MarkdownParseState, content: string, language: string | null): void => {\n const text = content.replace(/\\n$/, '');\n const attrs = codeBlockType.name === 'codeBlock' ? { language } : null;\n state.addNode(codeBlockType, attrs, text === '' ? [] : [schema.text(text)]);\n };\n handlers['fence'] = (state, token) => {\n const language = token.info.trim().split(/\\s+/)[0] ?? '';\n addCodeBlock(state, token.content, language === '' ? null : language);\n };\n handlers['code_block'] = (state, token) => {\n addCodeBlock(state, token.content, null);\n };\n }\n\n const horizontalRuleType = node('horizontalRule');\n handlers['hr'] = (state) => {\n if (horizontalRuleType !== undefined) state.addNode(horizontalRuleType, null);\n };\n\n const codeMarkType = schema.marks['code'];\n handlers['code_inline'] = (state, token) => {\n if (codeMarkType === undefined) {\n state.addText(token.content);\n return;\n }\n const mark = codeMarkType.create(null);\n state.openMark(mark);\n state.addText(token.content);\n state.closeMark(codeMarkType);\n };\n\n inlineMark('strong', 'bold');\n inlineMark('em', 'italic');\n inlineMark('s', 'strike');\n inlineMark('link', 'link');\n\n const imageType = node('image');\n if (imageType !== undefined) {\n handlers['image'] = (state, token) => {\n const src = attrFrom(token, 'src');\n if (src === null) return;\n const alt = altText(token);\n const attrs = { src, alt: alt === '' ? null : alt, title: attrFrom(token, 'title') };\n if (imageType.isInline) {\n state.addNode(imageType, attrs);\n return;\n }\n const image = imageType.createAndFill(attrs);\n if (image === null) return;\n if (state.topType().name === 'paragraph') {\n state.splitAround(image);\n } else {\n state.addText(alt);\n }\n };\n }\n\n const mathInlineType = node('mathInline');\n if (mathInlineType !== undefined) {\n handlers['math_inline'] = (state, token) => {\n state.addNode(mathInlineType, { latex: token.content });\n };\n }\n const mathBlockType = node('mathBlock');\n if (mathBlockType !== undefined) {\n handlers['math_block'] = (state, token) => {\n state.addNode(mathBlockType, { latex: token.content });\n };\n }\n\n return {\n parse(markdown: string): PMNode {\n const state = new MarkdownParseState(schema);\n handleTokens(state, md.parse(markdown, {}));\n return transformTaskLists(state.finish(), schema);\n },\n };\n}\n\n/** One-shot convenience wrapper around {@link createMarkdownParser}. */\nexport function parseMarkdown(markdown: string, schema: Schema): PMNode {\n return createMarkdownParser(schema).parse(markdown);\n}\n","/**\n * Markdown paste: when the clipboard carries plain text that looks like\n * Markdown (and no HTML flavor), parse it into rich content. Plain prose,\n * bare URLs (linkPastePlugin territory), and code block targets pass through.\n */\nimport { Slice } from '@domternal/pm/model';\nimport { Plugin, PluginKey } from '@domternal/pm/state';\nimport type { MarkdownParser } from './parser/parser.js';\n\nexport const markdownPastePluginKey = new PluginKey('markdownPaste');\n\n// Bounded quantifiers: unbounded `+` goes quadratic on pathological pastes\n// like thousands of `[` (CodeQL); 999 covers any real span or row.\nconst BLOCK_SYNTAX =\n /^(#{1,6} |> |[-*+] |\\d+\\. |```|\\$\\$|\\[( |x|X)\\] |\\|.{1,999}\\||(---|\\*\\*\\*|___)\\s*$)/m;\nconst INLINE_SYNTAX =\n /(\\*\\*[^*\\n]{1,999}\\*\\*|__[^_\\n]{1,999}__|\\[[^\\]\\n]{1,999}\\]\\([^)\\n]{1,999}\\)|`[^`\\n]{1,999}`|~~[^~\\n]{1,999}~~|!\\[[^\\]\\n]{0,999}\\]\\([^)\\n]{1,999}\\))/;\n\nexport function looksLikeMarkdown(text: string): boolean {\n return BLOCK_SYNTAX.test(text) || INLINE_SYNTAX.test(text);\n}\n\nexport function markdownPastePlugin(getParser: () => MarkdownParser): Plugin {\n return new Plugin({\n key: markdownPastePluginKey,\n props: {\n handlePaste(view, event) {\n const clipboard = event.clipboardData;\n if (clipboard === null) return false;\n // An HTML flavor means a rich source; ProseMirror's own paste\n // handling preserves more fidelity than a Markdown reparse.\n if (clipboard.getData('text/html') !== '') return false;\n const text = clipboard.getData('text/plain');\n if (text === '' || !looksLikeMarkdown(text)) return false;\n // Inside code blocks, pasted text stays literal.\n if (view.state.selection.$from.parent.type.spec.code === true) return false;\n\n let doc;\n try {\n doc = getParser().parse(text);\n } catch {\n // A parser failure must fall back to the default plain-text paste,\n // never escape the paste event handler.\n return false;\n }\n const first = doc.content.firstChild;\n const slice =\n doc.content.childCount === 1 && first !== null && first.type.name === 'paragraph'\n ? new Slice(first.content, 0, 0)\n : new Slice(doc.content, 0, 0);\n view.dispatch(view.state.tr.replaceSelection(slice).scrollIntoView());\n return true;\n },\n },\n });\n}\n","/**\n * Markdown serializer state machine. Same output semantics as\n * prosemirror-markdown's serializer (delimiter stacking, tight lists, mark\n * mixing, enclosing-whitespace expelling) but built on `@domternal/pm` so the\n * package never pulls in a second prosemirror-model instance.\n */\nimport type { Mark, Node as PMNode } from '@domternal/pm/model';\nimport type { MarkdownWarning, MarkdownWarningCode } from '../types.js';\n\nexport type MarkdownNodeSerializer = (\n state: MarkdownSerializerState,\n node: PMNode,\n parent: PMNode,\n index: number\n) => void;\n\ntype MarkDelimiter =\n | string\n | ((state: MarkdownSerializerState, mark: Mark, parent: PMNode, index: number) => string);\n\nexport interface MarkdownMarkSpec {\n open: MarkDelimiter;\n close: MarkDelimiter;\n /** Marks that can be reordered against other mixable marks to minimize delimiters. */\n mixable?: boolean;\n /** Move leading/trailing whitespace outside the delimiters (`**a ** b` is invalid emphasis). */\n expelEnclosingWhitespace?: boolean;\n /** Set false when the mark content is raw (inline code). */\n escape?: boolean;\n}\n\nexport interface MarkdownSerializerSpecs {\n nodes: Record<string, MarkdownNodeSerializer>;\n marks: Record<string, MarkdownMarkSpec>;\n}\n\nexport interface MarkdownSerializerOptions {\n /**\n * Render lists without blank lines between items.\n * @default true\n */\n tightLists?: boolean;\n}\n\nconst BACKTICKS = /`+/g;\n\n/** Longest backtick run inside inline code decides the fence length around it. */\nexport function backticksFor(node: PMNode, side: -1 | 1): string {\n let len = 0;\n const text = node.isText ? (node.text ?? '') : '';\n for (const match of text.matchAll(BACKTICKS)) {\n len = Math.max(len, match[0].length);\n }\n const result = len > 0 ? '`'.repeat(len + 1) : '`';\n if (side === -1) return result + (text.startsWith('`') ? ' ' : '');\n return (text.endsWith('`') ? ' ' : '') + result;\n}\n\nexport class MarkdownSerializerState {\n readonly nodes: Record<string, MarkdownNodeSerializer>;\n readonly marks: Record<string, MarkdownMarkSpec>;\n readonly warnings: MarkdownWarning[] = [];\n readonly tightLists: boolean;\n\n private delim = '';\n private out = '';\n private closed: PMNode | null = null;\n private inTightList = false;\n // True until the first content of a textblock is written; drives\n // start-of-line escaping (a list item's first line starts after `- `,\n // which the output buffer alone cannot reveal).\n private atBlockStart = false;\n\n constructor(specs: MarkdownSerializerSpecs, options: MarkdownSerializerOptions = {}) {\n this.nodes = specs.nodes;\n this.marks = specs.marks;\n this.tightLists = options.tightLists ?? true;\n }\n\n warn(code: MarkdownWarningCode, message: string, nodeType?: string): void {\n const duplicate = this.warnings.some(\n (w) => w.code === code && w.message === message && w.nodeType === nodeType\n );\n if (duplicate) return;\n this.warnings.push(nodeType === undefined ? { code, message } : { code, message, nodeType });\n }\n\n private flushClose(size = 2): void {\n if (this.closed === null) return;\n if (!this.atBlank()) this.out += '\\n';\n if (size > 1) {\n let delimMin = this.delim;\n // Manual trim: `\\s+$` is quadratic on long whitespace runs (CodeQL).\n let end = delimMin.length;\n while (end > 0 && /\\s/.test(delimMin.charAt(end - 1))) end -= 1;\n delimMin = delimMin.slice(0, end);\n for (let i = 1; i < size; i++) this.out += delimMin + '\\n';\n }\n this.closed = null;\n }\n\n /**\n * Render a block wrapped in a line prefix: `firstDelim` on its first line,\n * `delim` on every following line (blockquote `> `, list item indent).\n */\n wrapBlock(delim: string, firstDelim: string | null, node: PMNode, f: () => void): void {\n const old = this.delim;\n this.write(firstDelim ?? delim);\n this.delim += delim;\n f();\n this.delim = old;\n this.closeBlock(node);\n }\n\n atBlank(): boolean {\n return /(^|\\n)$/.test(this.out);\n }\n\n ensureNewLine(): void {\n if (!this.atBlank()) this.out += '\\n';\n }\n\n write(content?: string): void {\n this.flushClose();\n if (this.delim !== '' && this.atBlank()) this.out += this.delim;\n if (content !== undefined) this.out += content;\n }\n\n /** Close the block: the next write emits the separating blank line. */\n closeBlock(node: PMNode): void {\n this.closed = node;\n }\n\n text(text: string, escape = true): void {\n const lines = text.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n this.write();\n const line = lines[i] ?? '';\n // A `!` before a link open delimiter would turn the link into an image.\n if (!escape && line.startsWith('[') && /(^|[^\\\\])!$/.test(this.out)) {\n this.out = this.out.slice(0, this.out.length - 1) + '\\\\!';\n }\n this.out += escape ? this.esc(line, this.atBlockStart) : line;\n if (i !== lines.length - 1) this.out += '\\n';\n }\n }\n\n render(node: PMNode, parent: PMNode, index: number): void {\n const serializer = this.nodes[node.type.name];\n if (serializer === undefined) {\n this.warn(\n 'unsupported-node',\n node.type.isLeaf\n ? `Node type \"${node.type.name}\" has no Markdown mapping; node omitted`\n : `Node type \"${node.type.name}\" has no Markdown mapping; content flattened`,\n node.type.name\n );\n if (!node.type.isLeaf) {\n if (node.type.inlineContent) {\n this.renderInline(node);\n } else {\n this.renderContent(node);\n }\n }\n if (node.isBlock) this.closeBlock(node);\n return;\n }\n serializer(this, node, parent, index);\n }\n\n renderContent(parent: PMNode): void {\n parent.forEach((node, _offset, index) => {\n this.render(node, parent, index);\n });\n }\n\n renderInline(parent: PMNode, fromBlockStart = true): void {\n this.atBlockStart = fromBlockStart;\n const active: Mark[] = [];\n let trailing = '';\n\n const progress = (node: PMNode | null, index: number): void => {\n let marks: readonly Mark[] = node ? node.marks : [];\n\n // Unknown marks: drop with a warning instead of crashing mid-document.\n marks = marks.filter((mark) => {\n if (this.marks[mark.type.name] !== undefined) return true;\n this.warn(\n 'unsupported-mark',\n `Mark type \"${mark.type.name}\" has no Markdown mapping; formatting dropped`,\n mark.type.name\n );\n return false;\n });\n\n // A mark ending exactly at a hard break would close right after the\n // trailing backslash, where the delimiter cannot close. Keep only\n // marks that continue past the break.\n if (node !== null && node.type.name === 'hardBreak') {\n marks = marks.filter((mark) => {\n if (index + 1 === parent.childCount) return false;\n const next = parent.child(index + 1);\n return mark.isInSet(next.marks) && (!next.isText || /\\S/.test(next.text ?? ''));\n });\n }\n\n let leading = trailing;\n trailing = '';\n\n // Expel enclosing whitespace outside mark delimiters.\n if (\n node?.isText === true &&\n marks.some((mark) => {\n const spec = this.marks[mark.type.name];\n return spec?.expelEnclosingWhitespace === true;\n })\n ) {\n const text = node.text ?? '';\n // Manual split: a `(\\s*)(.*?)(\\s*)` regex is quadratic on long runs (CodeQL).\n let coreStart = 0;\n while (coreStart < text.length && /\\s/.test(text.charAt(coreStart))) coreStart += 1;\n let coreEnd = text.length;\n while (coreEnd > coreStart && /\\s/.test(text.charAt(coreEnd - 1))) coreEnd -= 1;\n const lead = text.slice(0, coreStart);\n const core = text.slice(coreStart, coreEnd);\n const trail = text.slice(coreEnd);\n if (lead !== '' || trail !== '') {\n leading += lead;\n trailing = trail;\n if (core === '') {\n // Whitespace-only node: keep the active marks open across it\n // instead of closing and reopening the delimiters.\n marks = active.slice();\n node = null;\n } else {\n node = (node as PMNode & { withText: (t: string) => PMNode }).withText(core);\n }\n }\n }\n\n const inner = marks.length > 0 ? marks[marks.length - 1] : undefined;\n const noEsc = inner !== undefined && this.marks[inner.type.name]?.escape === false;\n const len = marks.length - (noEsc ? 1 : 0);\n\n // Try to reorder mixable marks so shared marks stay adjacent and reuse\n // one delimiter pair.\n outer: for (let i = 0; i < len; i++) {\n const mark = marks[i];\n if (mark === undefined) break;\n if (this.marks[mark.type.name]?.mixable !== true) break;\n for (let j = 0; j < active.length; j++) {\n const other = active[j];\n if (other === undefined) break;\n if (this.marks[other.type.name]?.mixable !== true) break;\n if (mark.eq(other)) {\n if (i > j) {\n marks = [\n ...marks.slice(0, j),\n mark,\n ...marks.slice(j, i),\n ...marks.slice(i + 1, len),\n ];\n } else if (j > i) {\n marks = [\n ...marks.slice(0, i),\n ...marks.slice(i + 1, j),\n mark,\n ...marks.slice(j, len),\n ];\n }\n continue outer;\n }\n }\n }\n\n // Close marks that are no longer active.\n let keep = 0;\n while (keep < Math.min(active.length, len)) {\n const activeMark = active[keep];\n const nextMark = marks[keep];\n if (activeMark === undefined || nextMark === undefined) break;\n if (!activeMark.eq(nextMark)) break;\n keep += 1;\n }\n while (keep < active.length) {\n const mark = active.pop();\n if (mark === undefined) break;\n this.text(this.markString(mark, false, parent, index), false);\n }\n\n // Emit expelled leading whitespace between close and open.\n if (leading !== '') this.text(leading);\n\n // Open marks that became active.\n if (node !== null) {\n while (active.length < len) {\n const mark = marks[active.length];\n if (mark === undefined) break;\n active.push(mark);\n this.text(this.markString(mark, true, parent, index), false);\n this.atBlockStart = false;\n }\n\n if (inner !== undefined && noEsc && node.isText) {\n this.text(\n this.markString(inner, true, parent, index) +\n (node.text ?? '') +\n this.markString(inner, false, parent, index + 1),\n false\n );\n } else {\n this.render(node, parent, index);\n }\n this.atBlockStart = false;\n }\n };\n\n parent.forEach((node, _offset, index) => {\n progress(node, index);\n });\n progress(null, parent.childCount);\n this.atBlockStart = false;\n }\n\n renderList(node: PMNode, delim: string, firstDelim: (index: number) => string): void {\n if (this.closed !== null && this.closed.type === node.type) {\n this.flushClose(3);\n } else if (this.inTightList) {\n this.flushClose(1);\n }\n\n const isTight = this.tightLists;\n const prevTight = this.inTightList;\n this.inTightList = isTight;\n node.forEach((child, _offset, index) => {\n if (index > 0 && isTight) this.flushClose(1);\n this.wrapBlock(delim, firstDelim(index), node, () => {\n this.render(child, node, index);\n });\n });\n this.inTightList = prevTight;\n }\n\n /**\n * Escape Markdown syntax in plain text. Beyond the CommonMark set this\n * also escapes `|` (table cells), `$` (this package's own math rules), and\n * `<` plus entity-like `&` (raw-HTML/autolink/entity ambiguity on external\n * renderers): all render as the literal character everywhere.\n */\n esc(str: string, startOfLine = false): string {\n // Single pass: each char is escaped exactly once, so a literal `\\`\n // can never neutralize a later escape (CodeQL).\n let escaped = str.replace(/[`*\\\\~[\\]_<$|&]/g, (m, i: number) => {\n if (m === '_') {\n return i > 0 && i + 1 < str.length && /\\w/.test(str[i - 1] ?? '') && /\\w/.test(str[i + 1] ?? '')\n ? m\n : '\\\\' + m;\n }\n // `&` only forms an entity when followed by a letter or `#`.\n if (m === '&') return /[a-z#]/i.test(str[i + 1] ?? '') ? '\\\\&' : m;\n return '\\\\' + m;\n });\n if (startOfLine) {\n escaped = escaped\n .replace(/^([-*>]|\\+ )/, '\\\\$&')\n .replace(/^(\\s*)(#{1,6})(\\s|$)/, '$1\\\\$2$3')\n .replace(/^(\\s*\\d+)\\.(\\s|$)/, '$1\\\\.$2');\n }\n return escaped;\n }\n\n markString(mark: Mark, open: boolean, parent: PMNode, index: number): string {\n const spec = this.marks[mark.type.name];\n if (spec === undefined) return '';\n const value = open ? spec.open : spec.close;\n return typeof value === 'string' ? value : value(this, mark, parent, index);\n }\n\n /** The accumulated output; call once after rendering the document. */\n finish(): string {\n return this.out;\n }\n}\n","/**\n * Default Markdown mappings for the full Domternal schema (GitHub-flavored\n * output). Anything Markdown cannot express degrades to plain content plus a\n * warning instead of raw HTML: the output stays valid everywhere.\n */\nimport type { Mark, Node as PMNode } from '@domternal/pm/model';\nimport {\n backticksFor,\n MarkdownSerializerState,\n type MarkdownMarkSpec,\n type MarkdownNodeSerializer,\n} from './state.js';\n\nfunction attrString(node: PMNode, name: string): string | null {\n const value: unknown = node.attrs[name];\n return typeof value === 'string' && value !== '' ? value : null;\n}\n\nfunction attrNumber(node: PMNode, name: string): number | null {\n const value: unknown = node.attrs[name];\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\n/** Block attrs from TextAlign/LineHeight/BlockColor that Markdown cannot carry. */\nfunction warnLossyBlockAttrs(state: MarkdownSerializerState, node: PMNode): void {\n const textAlign = attrString(node, 'textAlign');\n if (textAlign !== null && textAlign !== 'left') {\n state.warn('lossy-attribute', 'Text alignment is not representable in Markdown', node.type.name);\n }\n if (attrString(node, 'lineHeight') !== null) {\n state.warn('lossy-attribute', 'Line height is not representable in Markdown', node.type.name);\n }\n if (\n attrString(node, 'backgroundColor') !== null ||\n attrString(node, 'backgroundColorToken') !== null\n ) {\n state.warn('lossy-attribute', 'Block background color is not representable in Markdown', node.type.name);\n }\n}\n\nfunction escapeLinkDestination(url: string): string {\n // Backslash included: a literal `\\` must not neutralize the next escape.\n return url.replace(/[\\\\()\"]/g, '\\\\$&');\n}\n\nfunction escapeLinkTitle(title: string): string {\n return title.replace(/[\\\\\"]/g, '\\\\$&');\n}\n\n/** Autolink form is only valid for a bare, title-less URL that is its own text. */\nfunction isPlainUrl(link: Mark, parent: PMNode, index: number): boolean {\n const href: unknown = link.attrs['href'];\n if (typeof href !== 'string' || attrTitle(link) !== null || !/^\\w+:/.test(href)) return false;\n const content = parent.child(index);\n if (\n !content.isText ||\n content.text !== href ||\n content.marks[content.marks.length - 1] !== link\n ) {\n return false;\n }\n return index === parent.childCount - 1 || !link.isInSet(parent.child(index + 1).marks);\n}\n\nfunction attrTitle(mark: Mark): string | null {\n const title: unknown = mark.attrs['title'];\n return typeof title === 'string' && title !== '' ? title : null;\n}\n\nfunction leafText(node: PMNode): string | null {\n const spec = node.type.spec.leafText;\n return typeof spec === 'function' ? spec(node) : null;\n}\n\n/**\n * Flatten a table cell to single-line Markdown. Pipe tables cannot hold\n * block structure, so multi-block cells collapse to space-joined inline text.\n */\nfunction serializeCell(state: MarkdownSerializerState, cell: PMNode): string {\n const sub = new MarkdownSerializerState(\n { nodes: state.nodes, marks: state.marks },\n { tightLists: state.tightLists }\n );\n sub.renderContent(cell);\n for (const warning of sub.warnings) state.warn(warning.code, warning.message, warning.nodeType);\n const raw = sub.finish();\n // Anything that rendered across lines (extra blocks, code fences, lists,\n // hard breaks) collapses to one line inside a pipe table.\n if (cell.childCount > 1 || raw.includes('\\n')) {\n state.warn('lossy-structure', 'Table cell content flattened to one line', cell.type.name);\n }\n return (\n raw\n // Hard breaks serialize as backslash plus newline; drop the marker\n // before newlines collapse, or a literal backslash survives.\n .replace(/\\\\\\n/g, ' ')\n .replace(/\\n+/g, ' ')\n .trim()\n // Pipes inside code spans bypass esc(); unescaped they split the cell.\n .replace(/(?<!\\\\)\\|/g, '\\\\|')\n );\n}\n\nfunction separatorFor(alignment: string | null): string {\n if (alignment === 'center') return ':---:';\n if (alignment === 'right') return '---:';\n return '---';\n}\n\nconst table: MarkdownNodeSerializer = (state, node) => {\n if (node.childCount === 0) return;\n\n const rows: string[][] = [];\n const alignments: (string | null)[] = [];\n\n node.forEach((row, _rowOffset, rowIndex) => {\n const cells: string[] = [];\n row.forEach((cell, _cellOffset, cellIndex) => {\n // warn() dedupes, so flagging per cell emits a single warning each.\n if ((attrNumber(cell, 'colspan') ?? 1) > 1 || (attrNumber(cell, 'rowspan') ?? 1) > 1) {\n state.warn('lossy-structure', 'Merged table cells are not representable in Markdown', node.type.name);\n }\n if (attrString(cell, 'background') !== null) {\n state.warn('lossy-attribute', 'Table cell background is not representable in Markdown', cell.type.name);\n }\n if (attrString(cell, 'verticalAlign') !== null) {\n state.warn('lossy-attribute', 'Table cell vertical alignment is not representable in Markdown', cell.type.name);\n }\n if (rowIndex === 0) {\n alignments.push(attrString(cell, 'textAlign'));\n } else {\n // Column alignment lives in the separator row; a body cell only\n // loses its alignment when it differs from the column's.\n const align = attrString(cell, 'textAlign');\n if (align !== null && align !== (alignments[cellIndex] ?? null)) {\n state.warn('lossy-attribute', 'Cell text alignment differing from its column is not representable in Markdown', cell.type.name);\n }\n }\n cells.push(serializeCell(state, cell));\n });\n rows.push(cells);\n });\n\n const columnCount = Math.max(...rows.map((cells) => cells.length), alignments.length);\n const line = (cells: string[]): string => {\n const padded = Array.from({ length: columnCount }, (_v, i) => cells[i] ?? '');\n return `| ${padded.join(' | ')} |`;\n };\n\n const [headerRow, ...bodyRows] = rows;\n state.write(line(headerRow ?? []));\n state.ensureNewLine();\n state.write(\n `| ${Array.from({ length: columnCount }, (_v, i) => separatorFor(alignments[i] ?? null)).join(' | ')} |`\n );\n for (const cells of bodyRows) {\n state.ensureNewLine();\n state.write(line(cells));\n }\n state.closeBlock(node);\n};\n\nexport const defaultNodeSerializers: Record<string, MarkdownNodeSerializer> = {\n text: (state, node) => {\n state.text(node.text ?? '');\n },\n\n paragraph: (state, node) => {\n warnLossyBlockAttrs(state, node);\n state.renderInline(node);\n state.closeBlock(node);\n },\n\n heading: (state, node) => {\n warnLossyBlockAttrs(state, node);\n const level = attrNumber(node, 'level') ?? 1;\n state.write('#'.repeat(Math.min(Math.max(level, 1), 6)) + ' ');\n state.renderInline(node, false);\n state.closeBlock(node);\n },\n\n blockquote: (state, node) => {\n state.wrapBlock('> ', null, node, () => {\n state.renderContent(node);\n });\n },\n\n codeBlock: (state, node) => {\n const runs = node.textContent.match(/`{3,}/g);\n const fence = '`'.repeat(Math.max(3, ...(runs ?? ['']).map((run) => run.length + 1)));\n // The info string ends at whitespace and must not contain backticks.\n const language = (attrString(node, 'language') ?? '').split(/\\s+/)[0]?.replace(/`/g, '') ?? '';\n state.write(fence + language + '\\n');\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write(fence);\n state.closeBlock(node);\n },\n\n horizontalRule: (state, node) => {\n state.write('---');\n state.closeBlock(node);\n },\n\n hardBreak: (state, node, parent, index) => {\n for (let i = index + 1; i < parent.childCount; i++) {\n if (parent.child(i).type !== node.type) {\n state.write('\\\\\\n');\n return;\n }\n }\n },\n\n bulletList: (state, node) => {\n state.renderList(node, ' ', () => '- ');\n },\n\n orderedList: (state, node) => {\n const start = attrNumber(node, 'start') ?? 1;\n const maxWidth = String(start + node.childCount - 1).length;\n const indent = ' '.repeat(maxWidth + 2);\n state.renderList(node, indent, (index) => {\n const marker = String(start + index);\n return ' '.repeat(maxWidth - marker.length) + marker + '. ';\n });\n },\n\n listItem: (state, node) => {\n state.renderContent(node);\n },\n\n taskList: (state, node) => {\n state.renderList(node, ' ', () => '- ');\n },\n\n taskItem: (state, node) => {\n state.write(`[${node.attrs['checked'] === true ? 'x' : ' '}] `);\n state.renderContent(node);\n },\n\n image: (state, node) => {\n const src = attrString(node, 'src');\n if (src === null) {\n state.warn('unsupported-node', 'Image without src omitted', node.type.name);\n return;\n }\n // Resize writes NUMERIC width/height attrs; check presence, not strings.\n const width: unknown = node.attrs['width'];\n const height: unknown = node.attrs['height'];\n if ((width !== null && width !== undefined) || (height !== null && height !== undefined)) {\n state.warn('lossy-attribute', 'Image dimensions are not representable in Markdown', node.type.name);\n }\n const alt: unknown = node.attrs['alt'];\n const title = attrString(node, 'title');\n state.write(\n `![${state.esc(typeof alt === 'string' ? alt : '')}](${escapeLinkDestination(src)}${\n title !== null ? ` \"${escapeLinkTitle(title)}\"` : ''\n })`\n );\n if (!node.isInline) state.closeBlock(node);\n },\n\n table,\n tableRow: () => {\n // Rows are consumed by the table serializer; reaching one standalone is a no-op.\n },\n\n details: (state, node) => {\n state.warn('lossy-structure', 'Toggle block flattened: summary becomes a bold paragraph', node.type.name);\n state.renderContent(node);\n },\n\n detailsSummary: (state, node) => {\n if (node.content.size === 0) {\n state.closeBlock(node);\n return;\n }\n state.write('**');\n state.renderInline(node, false);\n state.write('**');\n state.closeBlock(node);\n },\n\n detailsContent: (state, node) => {\n state.renderContent(node);\n },\n\n emoji: (state, node) => {\n const name = attrString(node, 'name');\n const glyph = leafText(node);\n state.text(glyph !== null && glyph !== '' ? glyph : name !== null ? `:${name}:` : '');\n },\n\n mention: (state, node) => {\n const label = attrString(node, 'label');\n const text = leafText(node);\n state.text(text !== null && text !== '' ? text : label !== null ? `@${label}` : '');\n state.warn('lossy-structure', 'Mentions serialize as plain text', node.type.name);\n },\n\n mathInline: (state, node) => {\n state.write(`$${attrString(node, 'latex') ?? ''}$`);\n },\n\n mathBlock: (state, node) => {\n state.write('$$\\n');\n state.text(attrString(node, 'latex') ?? '', false);\n state.ensureNewLine();\n state.write('$$');\n state.closeBlock(node);\n },\n\n tableOfContents: (state, node) => {\n state.warn('unsupported-node', 'Table of contents block omitted (generated content)', node.type.name);\n },\n};\n\nexport const defaultMarkSpecs: Record<string, MarkdownMarkSpec> = {\n bold: { open: '**', close: '**', mixable: true, expelEnclosingWhitespace: true },\n italic: { open: '*', close: '*', mixable: true, expelEnclosingWhitespace: true },\n strike: { open: '~~', close: '~~', mixable: true, expelEnclosingWhitespace: true },\n code: {\n open: (_state, _mark, parent, index) => backticksFor(parent.child(index), -1),\n close: (_state, _mark, parent, index) => backticksFor(parent.child(index - 1), 1),\n escape: false,\n },\n link: {\n open: (_state, mark, parent, index) => (isPlainUrl(mark, parent, index) ? '<' : '['),\n close: (_state, mark, parent, index) => {\n if (isPlainUrl(mark, parent, index - 1)) return '>';\n const href: unknown = mark.attrs['href'];\n const title = attrTitle(mark);\n return `](${escapeLinkDestination(typeof href === 'string' ? href : '')}${\n title !== null ? ` \"${escapeLinkTitle(title)}\"` : ''\n })`;\n },\n },\n};\n","import type { Node as PMNode } from '@domternal/pm/model';\nimport type { SerializeMarkdownResult } from '../types.js';\nimport { defaultMarkSpecs, defaultNodeSerializers } from './specs.js';\nimport {\n MarkdownSerializerState,\n type MarkdownMarkSpec,\n type MarkdownNodeSerializer,\n type MarkdownSerializerOptions,\n} from './state.js';\n\nexport interface MarkdownSerializerSpecOverrides {\n /** Extra or replacement node serializers, merged over the defaults. */\n nodes?: Record<string, MarkdownNodeSerializer>;\n /** Extra or replacement mark specs, merged over the defaults. */\n marks?: Record<string, MarkdownMarkSpec>;\n}\n\nexport interface MarkdownSerializer {\n /** Serialize a document (or any block node) to Markdown. */\n serialize(node: PMNode): SerializeMarkdownResult;\n}\n\nexport function createMarkdownSerializer(\n specs: MarkdownSerializerSpecOverrides = {},\n options: MarkdownSerializerOptions = {}\n): MarkdownSerializer {\n const nodes = { ...defaultNodeSerializers, ...specs.nodes };\n const marks = { ...defaultMarkSpecs, ...specs.marks };\n return {\n serialize(node: PMNode): SerializeMarkdownResult {\n const state = new MarkdownSerializerState({ nodes, marks }, options);\n if (node.isTextblock) {\n // A lone textblock serializes as its inline content; there is no\n // real parent to hand to a node serializer.\n state.renderInline(node);\n } else {\n state.renderContent(node);\n }\n return { markdown: state.finish().replace(/\\n+$/, ''), warnings: state.warnings };\n },\n };\n}\n\nexport interface SerializeMarkdownOptions extends MarkdownSerializerOptions {\n specs?: MarkdownSerializerSpecOverrides;\n}\n\n/** One-shot convenience wrapper around {@link createMarkdownSerializer}. */\nexport function serializeMarkdown(\n node: PMNode,\n options: SerializeMarkdownOptions = {}\n): SerializeMarkdownResult {\n const { specs, ...serializerOptions } = options;\n return createMarkdownSerializer(specs, serializerOptions).serialize(node);\n}\n","/**\n * Markdown extension: bidirectional Markdown for the editor. Parsing and\n * serialization are also available headlessly through createMarkdownParser\n * and createMarkdownSerializer; the extension wires them to commands, paste,\n * and a shared storage other packages can reuse.\n */\nimport { Extension } from '@domternal/core';\nimport type { CommandSpec, Editor, JSONContent, SetContentOptions } from '@domternal/core';\nimport type { Schema } from '@domternal/pm/model';\nimport { createMarkdownParser } from './parser/parser.js';\nimport type { MarkdownParser } from './parser/parser.js';\nimport { markdownPastePlugin } from './pastePlugin.js';\nimport { createMarkdownSerializer } from './serializer/serializer.js';\nimport type {\n MarkdownSerializer,\n MarkdownSerializerSpecOverrides,\n} from './serializer/serializer.js';\nimport type { SerializeMarkdownResult } from './types.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n insertMarkdown: CommandSpec<[markdown: string]>;\n setMarkdownContent: CommandSpec<[markdown: string, options?: SetContentOptions]>;\n }\n}\n\nexport interface MarkdownOptions {\n /**\n * Convert Markdown-looking plain-text pastes into rich content. Pastes\n * that carry an HTML flavor, plain prose, and pastes into code blocks are\n * never touched.\n * @default true\n */\n paste: boolean;\n\n /**\n * Serialize lists without blank lines between items.\n * @default true\n */\n tightLists: boolean;\n\n /**\n * Extra or replacement Markdown mappings for custom nodes and marks,\n * merged over the built-in ones.\n * @default null\n */\n specs: MarkdownSerializerSpecOverrides | null;\n}\n\nexport interface MarkdownStorage {\n /** Shared parser instance; built on editor create, reusable by other packages. */\n parser: MarkdownParser | null;\n /** Shared serializer instance; built on editor create, reusable by other packages. */\n serializer: MarkdownSerializer | null;\n}\n\n/** Serialize the editor's current document to Markdown. */\nexport function getMarkdown(editor: Editor): SerializeMarkdownResult {\n const storage = editor.storage['markdown'] as MarkdownStorage | undefined;\n const serializer = storage?.serializer ?? createMarkdownSerializer();\n return serializer.serialize(editor.state.doc);\n}\n\nexport const Markdown = Extension.create<MarkdownOptions, MarkdownStorage>({\n name: 'markdown',\n\n addOptions() {\n return {\n paste: true,\n tightLists: true,\n specs: null,\n };\n },\n\n addStorage(): MarkdownStorage {\n return {\n parser: null,\n serializer: null,\n };\n },\n\n onCreate() {\n const schema = this.editor?.state.schema;\n if (schema !== undefined) this.storage.parser ??= createMarkdownParser(schema);\n this.storage.serializer ??= createMarkdownSerializer(this.options.specs ?? {}, {\n tightLists: this.options.tightLists,\n });\n },\n\n addCommands() {\n const parserFor = (schema: Schema): MarkdownParser => {\n this.storage.parser ??= createMarkdownParser(schema);\n return this.storage.parser;\n };\n\n return {\n insertMarkdown:\n (markdown: string) =>\n ({ state, commands }) => {\n const doc = parserFor(state.schema).parse(markdown);\n const first = doc.content.firstChild;\n // A single paragraph inserts as inline content so it merges into\n // the text at the cursor, matching the paste plugin's behavior.\n const content: unknown =\n doc.content.childCount === 1 && first !== null && first.type.name === 'paragraph'\n ? first.content.toJSON()\n : doc.content.toJSON();\n return commands.insertContent((content ?? []) as JSONContent[]);\n },\n\n setMarkdownContent:\n (markdown: string, options?: SetContentOptions) =>\n ({ state, commands }) => {\n const doc = parserFor(state.schema).parse(markdown);\n return commands.setContent(doc.toJSON() as JSONContent, options);\n },\n };\n },\n\n addProseMirrorPlugins() {\n if (!this.options.paste) return [];\n return [\n markdownPastePlugin(() => {\n const schema = this.editor?.state.schema;\n if (schema !== undefined) this.storage.parser ??= createMarkdownParser(schema);\n const parser = this.storage.parser;\n if (parser === null) throw new Error('Markdown parser is unavailable before editor create');\n return parser;\n }),\n ];\n },\n});\n","import type { Editor } from '@domternal/core';\nimport type { SerializeMarkdownResult } from './types.js';\nimport { getMarkdown } from './Markdown.js';\n\n/**\n * Serialize the document and hand it to the browser as a .md download.\n * Returns the serialization result so callers can surface the warnings.\n */\nexport function downloadMarkdown(\n editor: Editor,\n fileName = 'document.md'\n): SerializeMarkdownResult {\n const result = getMarkdown(editor);\n const blob = new Blob([result.markdown], { type: 'text/markdown;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = fileName;\n anchor.rel = 'noopener';\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n return result;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@domternal/extension-markdown",
3
+ "version": "0.12.0",
4
+ "description": "Bidirectional Markdown for Domternal: parse Markdown into the editor (paste, insert, setContent) and serialize documents back to GitHub-flavored Markdown, covering the full Notion-style schema",
5
+ "author": "https://github.com/ThomasNowHere",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "sideEffects": false,
9
+ "engines": {
10
+ "node": ">=20"
11
+ },
12
+ "main": "./dist/index.cjs",
13
+ "module": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "import": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "require": {
22
+ "types": "./dist/index.d.cts",
23
+ "default": "./dist/index.cjs"
24
+ }
25
+ }
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsup --clean",
32
+ "dev": "tsup --watch",
33
+ "test": "vitest run",
34
+ "test:watch": "vitest",
35
+ "lint": "eslint src",
36
+ "typecheck": "tsc --noEmit",
37
+ "prepublishOnly": "pnpm build && node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));delete p.devDependencies;if(p.dependencies){for(const[k,v]of Object.entries(p.dependencies)){if(v==='workspace:*')p.dependencies[k]='>=0.12.0'}}require('fs').writeFileSync('package.json',JSON.stringify(p,null,2)+'\\n')\"",
38
+ "postpublish": "git checkout package.json"
39
+ },
40
+ "dependencies": {
41
+ "markdown-it": "^14.3.0"
42
+ },
43
+ "peerDependencies": {
44
+ "@domternal/core": ">=0.12.0",
45
+ "@domternal/pm": ">=0.12.0"
46
+ },
47
+ "keywords": [
48
+ "prosemirror",
49
+ "editor",
50
+ "markdown",
51
+ "gfm",
52
+ "import",
53
+ "export",
54
+ "paste",
55
+ "notion",
56
+ "domternal"
57
+ ],
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "git+https://github.com/domternal/domternal.git",
61
+ "directory": "packages/extension-markdown"
62
+ },
63
+ "bugs": {
64
+ "url": "https://github.com/domternal/domternal/issues"
65
+ },
66
+ "homepage": "https://domternal.dev"
67
+ }