@regmisatyam/retex 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/source.ts","../src/types/tokens.ts","../src/types/ast.ts","../src/types/diagnostics.ts","../src/tokenizer/tokenizer.ts","../src/parser/registry.ts","../src/parser/args.ts","../src/security/sanitize.ts","../src/icons/icons.ts","../src/parser/builtins.ts","../src/ast/walk.ts","../src/ast/text.ts","../src/parser/suggest.ts","../src/parser/parser.ts","../src/validator/validator.ts","../src/theme/default.ts","../src/theme/themes.ts","../src/renderers/css.ts","../src/renderers/context.ts","../src/renderers/structure.ts","../src/renderers/html.ts","../src/renderers/json.ts","../src/renderers/pdf.ts","../src/renderers/react.ts","../src/engine.ts","../src/plugin/examples.ts","../src/editor/printer.ts","../src/editor/editor.ts","../src/incremental/incremental.ts"],"names":["TokenType","DiagnosticSeverity","DiagnosticCode","range","ICONS","ZERO_RANGE","args","end","body","tokenSafe","inner","parse","isLetter","ast"],"mappings":";AAyBO,SAAS,GAAA,CAAI,MAAA,EAAgB,IAAA,EAAc,MAAA,EAA0B;AAC1E,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AAChC;AAGO,SAAS,KAAA,CAAM,OAAiB,GAAA,EAA4B;AACjE,EAAA,OAAO,EAAE,OAAO,GAAA,EAAI;AACtB;AAGO,SAAS,WAAA,CAAY,GAAgB,CAAA,EAA6B;AACvE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,KAAA,CAAM,MAAA,IAAU,EAAE,KAAA,CAAM,MAAA,GAAS,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA;AAAA,IACtD,GAAA,EAAK,EAAE,GAAA,CAAI,MAAA,IAAU,EAAE,GAAA,CAAI,MAAA,GAAS,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE;AAAA,GAChD;AACF;AAGO,SAAS,aAAA,CAAc,GAAgB,MAAA,EAAyB;AACrE,EAAA,OAAO,UAAU,CAAA,CAAE,KAAA,CAAM,MAAA,IAAU,MAAA,IAAU,EAAE,GAAA,CAAI,MAAA;AACrD;;;AClCO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AAEL,EAAAA,WAAA,SAAA,CAAA,GAAU,SAAA;AAEV,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AAET,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AAET,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,WAAA,MAAA,CAAA,GAAO,MAAA;AAEP,EAAAA,WAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,WAAA,WAAA,CAAA,GAAY,WAAA;AAEZ,EAAAA,WAAA,SAAA,CAAA,GAAU,SAAA;AAEV,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AAtBI,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AAkCL,IAAM,aAAA,uBAAoB,GAAA,CAAI,CAAC,MAAM,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC;;;ACwSxD,SAAS,SAAS,IAAA,EAAgC;AACvD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAS,IAAA,CAAgC,QAAQ,CAAA;AAChE;AAGO,SAAS,MAAA,CAA2B,MAAY,IAAA,EAA6B;AAClF,EAAA,OAAO,KAAK,IAAA,KAAS,IAAA;AACvB;;;ACzVO,IAAK,kBAAA,qBAAAC,mBAAAA,KAAL;AACL,EAAAA,oBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,oBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AAJG,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AAWL,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AACL,EAAAA,gBAAA,iBAAA,CAAA,GAAkB,SAAA;AAClB,EAAAA,gBAAA,mBAAA,CAAA,GAAoB,SAAA;AACpB,EAAAA,gBAAA,sBAAA,CAAA,GAAuB,SAAA;AACvB,EAAAA,gBAAA,eAAA,CAAA,GAAgB,SAAA;AAChB,EAAAA,gBAAA,iBAAA,CAAA,GAAkB,SAAA;AAElB,EAAAA,gBAAA,gBAAA,CAAA,GAAiB,SAAA;AACjB,EAAAA,gBAAA,oBAAA,CAAA,GAAqB,SAAA;AACrB,EAAAA,gBAAA,yBAAA,CAAA,GAA0B,SAAA;AAC1B,EAAAA,gBAAA,kBAAA,CAAA,GAAmB,SAAA;AACnB,EAAAA,gBAAA,uBAAA,CAAA,GAAwB,SAAA;AACxB,EAAAA,gBAAA,uBAAA,CAAA,GAAwB,SAAA;AAExB,EAAAA,gBAAA,cAAA,CAAA,GAAe,SAAA;AACf,EAAAA,gBAAA,YAAA,CAAA,GAAa,SAAA;AACb,EAAAA,gBAAA,kBAAA,CAAA,GAAmB,SAAA;AACnB,EAAAA,gBAAA,sBAAA,CAAA,GAAuB,SAAA;AACvB,EAAAA,gBAAA,cAAA,CAAA,GAAe,SAAA;AACf,EAAAA,gBAAA,eAAA,CAAA,GAAgB,SAAA;AAEhB,EAAAA,gBAAA,uBAAA,CAAA,GAAwB,SAAA;AACxB,EAAAA,gBAAA,aAAA,CAAA,GAAc,SAAA;AACd,EAAAA,gBAAA,mBAAA,CAAA,GAAoB,SAAA;AAEpB,EAAAA,gBAAA,kBAAA,CAAA,GAAmB,SAAA;AAzBT,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;;;ACZZ,IAAM,QAAA,GAAW,CAAC,CAAA,KAAwB,CAAA,IAAK,OAAO,CAAA,IAAK,GAAA,IAAS,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAA;AAErF,IAAM,gBAAgB,CAAC,CAAA,KAAuB,MAAM,GAAA,IAAO,CAAA,KAAM,OAAQ,CAAA,KAAM,IAAA;AAkBxE,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EAQrB,YAAY,MAAA,EAAgB;AAN5B,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAA;AACjB,IAAA,IAAA,CAAQ,IAAA,GAAO,CAAA;AACf,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAA;AACjB,IAAA,IAAA,CAAiB,SAAkB,EAAC;AACpC,IAAA,IAAA,CAAiB,cAA4B,EAAC;AAI5C,IAAA,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAO,SAAS,MAAA,EAAgC;AAC9C,IAAA,OAAO,IAAI,UAAA,CAAU,MAAM,CAAA,CAAE,GAAA,EAAI;AAAA,EACnC;AAAA,EAEA,GAAA,GAAsB;AACpB,IAAA,OAAO,CAAC,IAAA,CAAK,KAAA,EAAM,EAAG;AACpB,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,IAAA,CAAA,KAAA,YAAoB,EAAA,EAAI,IAAA,CAAK,QAAA,EAAU,CAAA;AAC5C,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,WAAA,EAAa,KAAK,WAAA,EAAY;AAAA,EAC9D;AAAA;AAAA,EAIQ,SAAA,GAAkB;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AAEpB,IAAA,QAAQ,CAAA;AAAG,MACT,KAAK,IAAA;AACH,QAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,QAAA;AAAA,MACF,KAAK,GAAA;AACH,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,IAAA,CAAK,IAAA,CAAA,QAAA,eAAuB,KAAK,KAAK,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,GAAA;AACH,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,IAAA,CAAK,IAAA,CAAA,QAAA,eAAuB,KAAK,KAAK,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,GAAA;AACH,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,IAAA,CAAK,IAAA,CAAA,UAAA,iBAAyB,KAAK,KAAK,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,GAAA;AACH,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,IAAA,CAAK,IAAA,CAAA,UAAA,iBAAyB,KAAK,KAAK,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,GAAA;AACH,QAAA,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACxB,UAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,QAAA;AAAA,MACF;AACE,QAAA,IAAI,aAAA,CAAc,CAAC,CAAA,IAAK,CAAA,KAAM,IAAA,EAAM;AAClC,UAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA;AACvB,EACF;AAAA,EAEQ,cAAc,KAAA,EAAuB;AAC3C,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AAGvB,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,IAAA,CAAK,IAAA,CAAA,WAAA,kBAA0B,QAAQ,KAAK,CAAA;AAC5C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAClB,MAAA,IAAI,IAAA,GAAO,EAAA;AACX,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG,IAAA,IAAQ,KAAK,IAAA,EAAK;AAChD,MAAA,IAAI,KAAK,IAAA,EAAK,KAAM,GAAA,EAAK,IAAA,IAAQ,KAAK,IAAA,EAAK;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAA,SAAA,gBAAwB,MAAM,KAAK,CAAA;AACxC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS,IAAA,EAAM;AAChC,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAK;AACrB,MAAA,IAAA,CAAK,IAAA,CAAA,MAAA,aAAqB,IAAI,KAAK,CAAA;AACnC,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,IAAA,CAAA,MAAA,aAAqB,MAAM,KAAK,CAAA;AAAA,EACvC;AAAA,EAEQ,YAAY,KAAA,EAAuB;AACzC,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,OAAO,CAAC,IAAA,CAAK,KAAA,EAAM,IAAK,IAAA,CAAK,MAAK,KAAM,IAAA,EAAM,KAAA,IAAS,IAAA,CAAK,IAAA,EAAK;AACjE,IAAA,IAAA,CAAK,IAAA,CAAA,SAAA,gBAAwB,OAAO,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEQ,eAAe,KAAA,EAAuB;AAC5C,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,OAAO,CAAC,IAAA,CAAK,KAAA,EAAM,EAAG;AACpB,MAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,QAAA,EAAA;AACA,QAAA,KAAA,IAAS,KAAK,IAAA,EAAK;AAAA,MACrB,CAAA,MAAA,IAAW,aAAA,CAAc,CAAC,CAAA,EAAG;AAC3B,QAAA,KAAA,IAAS,KAAK,IAAA,EAAK;AAAA,MACrB,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,CAAA,GAAA,UAAA,kBAAA,YAAA,mBAA+C,KAAA,EAAO,KAAK,CAAA;AAAA,EACnF;AAAA,EAEQ,SAAS,KAAA,EAAuB;AACtC,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,OAAO,CAAC,IAAA,CAAK,KAAA,EAAM,EAAG;AACpB,MAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,MAAA,IACE,CAAA,KAAM,IAAA,IACN,CAAA,KAAM,GAAA,IACN,MAAM,GAAA,IACN,CAAA,KAAM,GAAA,IACN,CAAA,KAAM,GAAA,IACN,CAAA,KAAM,IAAA,IACN,aAAA,CAAc,CAAC,CAAA,EACf;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAM,GAAA,IAAO,IAAA,CAAK,IAAA,CAAK,CAAC,MAAM,GAAA,EAAK;AACvC,MAAA,KAAA,IAAS,KAAK,IAAA,EAAK;AAAA,IACrB;AAGA,IAAA,IAAI,KAAA,KAAU,EAAA,EAAI,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK;AACpC,IAAA,IAAA,CAAK,IAAA,CAAA,MAAA,aAAqB,OAAO,KAAK,CAAA;AAAA,EACxC;AAAA;AAAA,EAIQ,KAAA,GAAiB;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,GAAA,CAAI,MAAA;AAAA,EACjC;AAAA,EAEQ,IAAA,CAAK,IAAI,CAAA,EAAW;AAC1B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAAA,EACtC;AAAA,EAEQ,IAAA,GAAe;AACrB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,IAAK,EAAA;AACnC,IAAA,IAAA,CAAK,MAAA,EAAA;AACL,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,IAAA,CAAK,IAAA,EAAA;AACL,MAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,EAAA;AAAA,IACP;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,QAAA,GAAqB;AAC3B,IAAA,OAAO,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO;AAAA,EACrE;AAAA,EAEQ,IAAA,CAAK,IAAA,EAAiB,KAAA,EAAe,KAAA,EAAuB;AAClE,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,QAAA,EAAS,IAAK,CAAA;AAAA,EAC1E;AACF;AAGO,SAAS,SAAS,MAAA,EAAgC;AACvD,EAAA,OAAO,SAAA,CAAU,SAAS,MAAM,CAAA;AAClC;;;ACpMO,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAAtB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA+B;AACtD,IAAA,IAAA,CAAQ,YAAA,uBAAmB,GAAA,EAAmC;AAAA,EAAA;AAAA,EAE9D,gBAAgB,GAAA,EAA8B;AAC5C,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,oBAAoB,GAAA,EAAkC;AACpD,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,IAAA,EAA6C;AACtD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,eAAe,IAAA,EAAiD;AAC9D,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,WAAW,IAAA,EAAuB;AAChC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,eAAe,IAAA,EAAuB;AACpC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,YAAA,GAAyB;AACvB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,gBAAA,GAA6B;AAC3B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,WAAA,GAAmC;AACjC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,eAAA,GAA2C;AACzC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,KAAA,GAAyB;AACvB,IAAA,MAAM,IAAA,GAAO,IAAI,gBAAA,EAAgB;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AACrC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACtDO,SAAS,aAAA,CAAc,GAAA,EAAa,GAAA,GAAM,GAAA,EAAe;AAC9D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACnB,CAAA,KAAM,OAAO,CAAA,KAAM,GAAA,UAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA;AAC9D,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,KAAA,KAAU,CAAA,EAAG;AAC5B,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,OAAA,GAAU,EAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,OAAA,IAAW,CAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,aAAa,GAAA,EAAuB;AAClD,EAAA,OAAO,aAAA,CAAc,GAAG,CAAA,CACrB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,EACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC/B;AAUO,SAAS,eAAe,GAAA,EAAuB;AACpD,EAAA,MAAM,QAAA,GAAW,cAAc,GAAG,CAAA;AAClC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3C,MAAA,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,IAAK,GAAA,GAAM,GAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,IAAI,YAAY,EAAA,EAAI;AACpB,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,OAAO,EAAA,EAAI;AAEb,MAAA,MAAA,CAAO,OAAO,CAAA,GAAI,EAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACtC,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AACzC,IAAA,IAAI,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;;;ACzDO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC1B;AAGO,SAAS,gBAAgB,KAAA,EAAuB;AACrD,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;AAGA,IAAM,cAAA,mBAAiB,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,UAAU,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AAOrF,IAAM,SAAA,GAAY,wBAAA;AAIlB,IAAM,gBAAA,GAAmB,kBAAA;AAmBlB,SAAS,YAAY,KAAA,EAAkC;AAC5D,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AAKrC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AAEhD,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpC,EAAA,IAAI,CAAC,KAAA,EAAO;AAEV,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM;AAAA,EACzC;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAG,aAAY,GAAI,GAAA;AACzC,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,OAAO,MAAA,EAAO;AAAA,EACjD;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,MAAM,MAAA,EAAO;AAC5C;AAQO,SAAS,YAAY,KAAA,EAAwB;AAClD,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,uDAAA,CAAwD,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AAC5E,EAAA,IAAI,2CAAA,CAA4C,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AAChE,EAAA,OAAO,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA;AAC7C;AAMO,SAAS,gBAAgB,KAAA,EAAwB;AACtD,EAAA,OAAO,qEAAA,CAAsE,IAAA;AAAA,IAC3E,MAAM,IAAA;AAAK,GACb;AACF;AAMO,SAAS,mBAAmB,KAAA,EAAmC;AACpE,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,UAAU,IAAA,CAAK,CAAC,KAAK,kCAAA,CAAmC,IAAA,CAAK,CAAC,CAAA,EAAG;AACnE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA;AACT;AAGO,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EACtC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC,CAAA;;;ACpJD,IAAM,KAAA,GAAwC;AAAA,EAC5C,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,4JAAA;AAAA,IACN,OAAA,EAAS,CAAC,MAAA,EAAQ,UAAU;AAAA,GAC9B;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,+NAAA;AAAA,IACN,OAAA,EAAS,CAAC,KAAA,EAAO,WAAW;AAAA,GAC9B;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,qHAAA;AAAA,IACN,OAAA,EAAS,CAAC,KAAA,EAAO,KAAA,EAAO,UAAU,KAAK;AAAA,GACzC;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,8gBAAA;AAAA,IACN,OAAA,EAAS,CAAC,OAAA,EAAS,KAAA,EAAO,QAAQ,KAAK;AAAA,GACzC;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,2SAAA;AAAA,IACN,OAAA,EAAS,CAAC,GAAG;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,6MAAA;AAAA,IACN,OAAA,EAAS,CAAC,gBAAA,EAAkB,IAAI;AAAA,GAClC;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,sGAAA;AAAA,IACN,OAAA,EAAS,CAAC,gBAAA,EAAkB,UAAU;AAAA,GACxC;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,sHAAA;AAAA,IACN,OAAA,EAAS,CAAC,MAAM;AAAA,GAClB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,uIAAA;AAAA,IACN,OAAA,EAAS,CAAC,MAAA,EAAQ,KAAK;AAAA;AAE3B,CAAA;AAGA,IAAM,UAAkC,EAAC;AACzC,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,EAAA,KAAA,MAAW,SAAS,GAAA,CAAI,OAAA,IAAW,EAAC,EAAG,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAC1D;AAGO,SAAS,gBAAgB,IAAA,EAAkC;AAChE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY;AACpC,EAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,GAAA;AACvB,EAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,QAAQ,GAAG,CAAA;AACpC,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,QAAQ,IAAA,EAAuB;AAC7C,EAAA,OAAO,eAAA,CAAgB,IAAI,CAAA,KAAM,MAAA;AACnC;AAEO,SAAS,QAAQ,IAAA,EAA0C;AAChE,EAAA,MAAM,GAAA,GAAM,gBAAgB,IAAI,CAAA;AAChC,EAAA,OAAO,GAAA,GAAM,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA;AAC5B;AAGO,SAAS,YAAA,CAAa,MAAc,GAAA,EAA2B;AACpE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY;AACpC,EAAA,KAAA,CAAM,GAAG,CAAA,GAAI,GAAA;AACb,EAAA,KAAA,MAAW,SAAS,GAAA,CAAI,OAAA,IAAW,EAAC,EAAG,OAAA,CAAQ,KAAK,CAAA,GAAI,GAAA;AAC1D;AAGO,SAAS,SAAA,GAAsB;AACpC,EAAA,OAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AAC1B;AAMO,SAAS,SAAA,CACd,IAAA,EACA,IAAA,GAAuD,EAAC,EACzC;AACf,EAAA,MAAM,GAAA,GAAM,QAAQ,IAAI,CAAA;AACxB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,KAAA;AAC1B,EAAA,MAAM,MAAM,OAAO,IAAA,KAAS,QAAA,GAAW,CAAA,EAAG,IAAI,CAAA,CAAA,GAAK,IAAA;AACnD,EAAA,MAAM,MAAM,IAAA,CAAK,SAAA,GAAY,CAAA,QAAA,EAAW,IAAA,CAAK,SAAS,CAAA,CAAA,CAAA,GAAM,EAAA;AAC5D,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,OAAA,GACrB,mGAAA,GACA,qBAAA;AACJ,EAAA,OACE,CAAA,IAAA,EAAO,GAAG,CAAA,QAAA,EAAW,GAAG,CAAA,UAAA,EAAa,GAAG,CAAA,sBAAA,EACrC,YAAY,CAAA,iDAAA,EACZ,GAAA,CAAI,IAAI,CAAA,MAAA,CAAA;AAEf;;;ACzGA,IAAM,IAAA,GAAO,CACX,IAAA,EACA,IAAA,EACA,OAAA,MACuB;AAAA,EACvB,IAAA;AAAA,EACA,QAAA,EAAU,QAAA;AAAA,EACV,MAAM,CAAC,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,WAAW,CAAA;AAAA,EAC3C,OAAA;AAAA,EACA,OAAA,EAAS,KAAK,IAAI,CAAA,KAAA,CAAA;AAAA,EAClB,KAAA,EAAO,CAAC,EAAE,IAAA,EAAK,MAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,EAAG,QAAA,IAAY,EAAC,EAAE;AAClE,CAAA,CAAA;AAEA,IAAM,WAAA,GAAc,CAClB,IAAA,EACA,KAAA,MACuB;AAAA,EACvB,IAAA;AAAA,EACA,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,yBAAyB,IAAI,CAAA,4BAAA,CAAA;AAAA,EACtC,OAAA,EAAS,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,EACnB,KAAA,EAAO,CAAC,EAAE,KAAA,EAAM,MAAO,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM;AACrE,CAAA,CAAA;AAEA,IAAM,UAAA,GAAkC;AAAA,EACtC,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAA;AAAA,EACnC,IAAA,CAAK,QAAA,EAAU,QAAA,EAAU,cAAc,CAAA;AAAA,EACvC,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,2BAA2B,CAAA;AAAA,EAClD,IAAA,CAAK,WAAA,EAAa,WAAA,EAAa,kBAAkB,CAAA;AAAA,EACjD,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,sBAAsB,CAAA;AAAA,EAE7C;AAAA,IACE,IAAA,EAAM,WAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,QAAQ,OAAA,EAAQ;AAAA,MACjD,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA;AAAU,KACrC;AAAA,IACA,OAAA,EAAS,oCAAA;AAAA,IACT,OAAA,EAAS,8BAAA;AAAA,IACT,OAAO,CAAC,EAAE,IAAA,EAAM,KAAA,EAAO,QAAO,KAAM;AAClC,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,IAAA,EAAK;AACzC,MAAA,IAAI,KAAA,IAAS,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AAChC,QAAA,MAAA,CAAO;AAAA,UACL,QAAA,EAAA,SAAA;AAAA,UACA,IAAA,EAAA,SAAA;AAAA,UACA,OAAA,EAAS,IAAI,KAAK,CAAA,gDAAA,CAAA;AAAA,UAClB,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS;AAAA,SAC1B,CAAA;AAAA,MACH;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,WAAA,CAAY,KAAK,CAAA,GAAI,KAAA,GAAQ,EAAA;AAAA,QACpC,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,EAAG,YAAY;AAAC,OAClC;AAAA,IACF;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,QAAQ,WAAA,EAAY;AAAA,MACpD,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA;AAAU,KACrC;AAAA,IACA,OAAA,EAAS,oDAAA;AAAA,IACT,OAAA,EAAS,+BAAA;AAAA,IACT,OAAO,CAAC,EAAE,IAAA,EAAM,KAAA,EAAO,QAAO,KAAM;AAClC,MAAA,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,IAAA,EAAK;AACxC,MAAA,IAAI,IAAA,IAAQ,CAAC,eAAA,CAAgB,IAAI,CAAA,EAAG;AAClC,QAAA,MAAA,CAAO;AAAA,UACL,QAAA,EAAA,SAAA;AAAA,UACA,IAAA,EAAA,SAAA;AAAA,UACA,OAAA,EAAS,IAAI,IAAI,CAAA,2BAAA,CAAA;AAAA,UACjB,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS;AAAA,SAC1B,CAAA;AAAA,MACH;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,eAAA,CAAgB,IAAI,CAAA,GAAI,IAAA,GAAO,KAAA;AAAA,QACrC,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,EAAG,YAAY;AAAC,OAClC;AAAA,IACF;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS;AAAA,MACjC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA;AAAU,KACrC;AAAA,IACA,OAAA,EAAS,8CAAA;AAAA,IACT,OAAA,EAAS,mCAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAM,MAAO;AAAA,MAC3B,IAAA,EAAM,YAAA;AAAA,MACN,MAAA,EAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,MAAK,IAAK,SAAA;AAAA,MACxC,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,EAAG,YAAY;AAAC,KAClC;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAQ;AAAA,MAChC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA;AAAU,KACrC;AAAA,IACA,OAAA,EAAS,iDAAA;AAAA,IACT,OAAA,EAAS,oCAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAM,MAAO;AAAA,MAC3B,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,MAAK,IAAK,SAAA;AAAA,MACvC,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,EAAG,YAAY;AAAC,KAClC;AAAA,GACF;AAAA,EAEA,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,EAC5B,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,EAC5B,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,EAC5B,WAAA,CAAY,QAAQ,MAAM,CAAA;AAAA,EAC1B;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,gDAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,KAAA,EAAM,MAAO,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,KAAA,EAAM;AAAA,GAC/E;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,2CAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,KAAA,QAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAM;AAAA,GACzD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,6CAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,KAAA,QAAa,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,KAAA,EAAM;AAAA,GAC3D;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,uDAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,KAAA,EAAM,MAAO;AAAA,MACrB,IAAA,EAAM,YAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA;AAEJ,CAAA;AAIA,IAAM,KAAA,GAA6B;AAAA,EACjC;AAAA,IACE,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,QAAQ,KAAA,EAAM;AAAA,MAC7C,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,OAAA;AAAQ,KACnC;AAAA,IACA,OAAA,EAAS,qCAAA;AAAA,IACT,OAAA,EAAS,wCAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAM,KAAM;AAC1B,MAAA,MAAM,MAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,IAAA,EAAK;AACvC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,QACvB,OAAA,EAAS,GAAA;AAAA,QACT,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,EAAG,YAAY;AAAC,OAClC;AAAA,IACF;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,IAAA,EAAM,CAAC,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,IACrD,OAAA,EAAS,wCAAA;AAAA,IACT,OAAA,EAAS,oCAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAM,KAAM;AAC1B,MAAA,MAAM,MAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,IAAA,EAAK;AACvC,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,MAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAA,EAAS,GAAA,EAAI;AAAA,IAC/D;AAAA;AAEJ,CAAA;AAIA,IAAM,QAAA,GAAgC;AAAA,EACpC;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,MAAM,CAAC,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA;AAAA,IACxC,OAAA,EAAS,6BAAA;AAAA,IACT,OAAA,EAAS,uBAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAM,MAAO;AAAA,MAC3B,IAAA,EAAM,SAAA;AAAA,MACN,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,IAAA,EAAK;AAAA,MAClC,KAAA,EAAO;AAAA,KACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,MAAM,CAAC,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA;AAAA,IACxC,OAAA,EAAS,iCAAA;AAAA,IACT,OAAA,EAAS,2BAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAM,MAAO;AAAA,MAC3B,IAAA,EAAM,SAAA;AAAA,MACN,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,IAAA,EAAK;AAAA,MAClC,KAAA,EAAO;AAAA,KACT;AAAA;AAEJ,CAAA;AAIA,IAAM,cAAA,GAA+E;AAAA,EACnF,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,SAAS,mCAAA,EAAoC;AAAA,EAC3E,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,SAAS,+BAAA,EAAgC;AAAA,EACzE,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,SAAS,4CAAA,EAA6C;AAAA,EACtF,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,SAAS,uBAAA,EAAwB;AAAA,EACjE,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,SAAS,kBAAA,EAAmB;AAAA,EAClE,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,SAAS,wCAAA;AAC/C,CAAA;AAEA,IAAM,OAAA,GAA+B,eAAe,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,KAAA,EAAO,SAAQ,MAAO;AAAA,EACpF,IAAA,EAAM,GAAA;AAAA,EACN,QAAA,EAAU,MAAA;AAAA,EACV,MAAM,CAAC,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,KAAK,CAAA;AAAA,EACpC,OAAA;AAAA,EACA,OAAA,EAAS,KAAK,GAAG,CAAA,KAAA,CAAA;AAAA,EACjB,OAAO,CAAC,EAAE,MAAM,KAAA,EAAM,MACnB,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,MAAK,EAAE;AACnE,CAAA,CAAE,CAAA;AAIF,IAAM,OAAiB,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAE;AACvD,IAAM,UAAA,GAA0B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAK,IAAA,EAAK;AAIzD,IAAM,aAAA,GAAgB,CACpB,MAAA,EACA,MAAA,EACA,UACAC,MAAAA,KACS;AACT,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,EAAG;AAChB,MAAA,MAAA,CAAO;AAAA,QACL,QAAA,EAAA,SAAA;AAAA,QACA,IAAA,EAAA,SAAA;AAAA,QACA,OAAA,EAAS,8BAA8B,GAAG,CAAA,EAAA,CAAA;AAAA,QAC1C,KAAA,EAAAA;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;AAEA,IAAM,OAAA,GAA+B;AAAA,EACnC;AAAA,IACE,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS;AAAA,MACjC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA;AAAK,KAClD;AAAA,IACA,OAAA,EAAS,0BAAA;AAAA,IACT,OAAA,EACE,yFAAA;AAAA,IACF,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,QAAO,KAAM;AAC3B,MAAA,MAAM,SAAS,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,EAAE,CAAA;AAChD,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS,UAAA;AAC5B,MAAA,aAAA,CAAc,QAAQ,MAAA,EAAQ,CAAC,OAAA,EAAS,SAAS,GAAG,CAAC,CAAA;AACrD,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAC,CAAA,EAAG,QAAA,IAAY,EAAC,EAAE;AAAA,IAClE;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,WAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS;AAAA,MACjC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA;AAAK,KAClD;AAAA,IACA,OAAA,EAAS,qBAAA;AAAA,IACT,OAAA,EAAS,2EAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,QAAO,KAAM;AAC3B,MAAA,MAAM,SAAS,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,EAAE,CAAA;AAChD,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS,UAAA;AAC5B,MAAA,aAAA,CAAc,QAAQ,MAAA,EAAQ,CAAC,QAAA,EAAU,QAAQ,GAAG,CAAC,CAAA;AACrD,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAC,CAAA,EAAG,QAAA,IAAY,EAAC,EAAE;AAAA,IACxE;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM;AAAA,MACJ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS;AAAA,MACjC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA;AAAK,KAClD;AAAA,IACA,OAAA,EAAS,kBAAA;AAAA,IACT,OAAA,EAAS,0EAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,QAAO,KAAM;AAC3B,MAAA,MAAM,SAAS,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,EAAE,CAAA;AAChD,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS,UAAA;AAC5B,MAAA,aAAA,CAAc,MAAA,EAAQ,MAAA,EAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;AACzC,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAC,CAAA,EAAG,QAAA,IAAY,EAAC,EAAE;AAAA,IACtE;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,MAAM,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,UAAU,CAAA;AAAA,IACvC,OAAA,EAAS,mCAAA;AAAA,IACT,OAAA,EAAS,uDAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,QAAY,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,aAAa,IAAA,CAAK,CAAC,CAAA,EAAG,GAAA,IAAO,EAAE,CAAA,EAAE;AAAA;AAEpF,CAAA;AAIA,IAAMC,MAAAA,GAA6B;AAAA,EACjC;AAAA,IACE,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAM,CAAC,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,CAAA;AAAA,IACvC,OAAA,EAAS,2DAAA;AAAA,IACT,OAAA,EAAS,gBAAA;AAAA,IACT,OAAO,CAAC,EAAE,IAAA,EAAM,KAAA,EAAO,QAAO,KAAM;AAClC,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AACtD,MAAA,IAAI,IAAA,IAAQ,CAAC,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC1B,QAAA,MAAA,CAAO;AAAA,UACL,QAAA,EAAA,MAAA;AAAA,UACA,IAAA,EAAA,SAAA;AAAA,UACA,OAAA,EAAS,iBAAiB,IAAI,CAAA,EAAA,CAAA;AAAA,UAC9B,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS;AAAA,SAC1B,CAAA;AAAA,MACH;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAAA,IAC9B;AAAA;AAEJ,CAAA;AAIA,IAAM,UAAA,GAAkC;AAAA,EACtC;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,OAAA,EAAS,yBAAA;AAAA,IACT,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,WAAA,EAAY;AAAA,GACpC;AAAA,EACA;AAAA,IACE,IAAA,EAAM,WAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,OAAA,EAAS,yBAAA;AAAA,IACT,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,WAAA,EAAY;AAAA,GACpC;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,OAAA,EAAS,8BAAA;AAAA,IACT,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,GAC/B;AAAA,EACA;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,OAAA,EAAS,8BAAA;AAAA,IACT,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,GAC/B;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM,CAAC,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,CAAA;AAAA,IAC5D,OAAA,EAAS,iBAAA;AAAA,IACT,OAAA,EAAS,eAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAM,MAAO;AAAA,MAC3B,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,MAAK,IAAK;AAAA,KACxC;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,IAAA,EAAM,CAAC,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,CAAA;AAAA,IAC5D,OAAA,EAAS,mBAAA;AAAA,IACT,OAAA,EAAS,eAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAM,MAAO;AAAA,MAC3B,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,MAAK,IAAK;AAAA,KACxC;AAAA,GACF;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,IACE,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,OAAA,EAAS,yCAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM,CAAC,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAa,CAAA;AAAA,IAC7D,OAAA,EAAS,4CAAA;AAAA,IACT,OAAA,EAAS;AAAA;AAEb,CAAA;AAIA,IAAM,YAAA,GAAwC;AAAA,EAC5C;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,MAAA;AAAA,IACb,eAAA,EAAiB,CAAC,MAAM,CAAA;AAAA,IACxB,OAAA,EAAS,kBAAA;AAAA,IACT,OAAA,EAAS,gDAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,OAAA,EAAQ,MAAO;AAAA,MACvB,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA;AAAA,QACrB,CAAC,CAAA,MAAqB,EAAE,MAAM,MAAA,EAAQ,QAAA,EAAU,EAAE,OAAA,EAAQ;AAAA;AAC5D,KACF;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,MAAA;AAAA,IACb,eAAA,EAAiB,CAAC,MAAM,CAAA;AAAA,IACxB,OAAA,EAAS,kBAAA;AAAA,IACT,OAAA,EAAS,oDAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,OAAA,EAAQ,MAAO;AAAA,MACvB,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,GAAA;AAAA,QACrB,CAAC,CAAA,MAAqB,EAAE,MAAM,MAAA,EAAQ,QAAA,EAAU,EAAE,OAAA,EAAQ;AAAA;AAC5D,KACF;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,QAAA;AAAA,IACb,eAAA,EAAiB,CAAC,QAAQ,CAAA;AAAA,IAC1B,OAAA,EAAS,wBAAA;AAAA,IACT,OAAA,EACE,+EAAA;AAAA,IACF,KAAA,EAAO,CAAC,EAAE,OAAA,EAAS,OAAM,MAAO;AAAA,MAC9B,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAkB;AAC9C,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CAAE,IAAA,EAAK,IAAK,MAAA;AACvD,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,EAAE,OAAA,EAAQ;AAAA,MACtD,CAAC;AAAA,KACH;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,2CAAA;AAAA,IACT,OAAA,EAAS,mCAAA;AAAA,IACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAK,MAAO;AAAA,MACpB,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,MAAM,CAAC,EAAE,MAAM,UAAA,EAAY,QAAA,EAAU,MAAM;AAAA,KAC7C;AAAA;AAEJ,CAAA;AAOO,SAAS,qBAAA,GAAyC;AACvD,EAAA,MAAM,QAAA,GAAW,IAAI,eAAA,EAAgB;AACrC,EAAA,KAAA,MAAW,GAAA,IAAO;AAAA,IAChB,GAAG,UAAA;AAAA,IACH,GAAG,KAAA;AAAA,IACH,GAAG,QAAA;AAAA,IACH,GAAG,OAAA;AAAA,IACH,GAAG,OAAA;AAAA,IACH,GAAGA,MAAAA;AAAA,IACH,GAAG;AAAA,GACL,EAAG;AACD,IAAA,QAAA,CAAS,gBAAgB,GAAG,CAAA;AAAA,EAC9B;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,YAAA,EAAc,QAAA,CAAS,mBAAA,CAAoB,GAAG,CAAA;AAChE,EAAA,OAAO,QAAA;AACT;;;ACzfO,SAAS,WAAW,IAAA,EAAoB;AAC7C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ,OAAQ,IAAA,CAAkB,KAAA;AACpD,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW,OAAQ,IAAA,CAAqB,OAAA;AAC1D,EAAA,IAAI,QAAA,CAAS,IAAI,CAAA,EAAG,OAAQ,IAAA,CAAoB,QAAA;AAChD,EAAA,OAAO,EAAC;AACV;AAUO,SAAS,IAAA,CAAK,MAAY,IAAA,EAA0B;AACzD,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAY,MAAA,KAA8B;AACvD,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA,GAAI,MAAA;AACxD,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,KAAA,MAAW,SAAS,UAAA,CAAW,IAAI,CAAA,EAAG,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,MAAM,MAAM,CAAA;AAAA,EAC1B,CAAA;AACA,EAAA,KAAA,CAAM,MAAM,IAAI,CAAA;AAClB;AAGO,SAAS,OAAA,CAAQ,MAAY,IAAA,EAAoC;AACtE,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,IAAA,CAAK,IAAA,EAAM;AAAA,IACT,MAAM,CAAA,EAAG;AACP,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACzB;AAAA,GACD,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,UAAA,CAAW,MAAY,MAAA,EAAwB;AAC7D,EAAA,MAAM,OAAe,EAAC;AACtB,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAwB;AACrC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA;AACf,IAAA,IAAI,CAAA,KAAM,SAAS,CAAA,CAAE,KAAA,CAAM,UAAU,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,MAAA,CAAA,EAAS,OAAO,KAAA;AACpE,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,IAAA,KAAA,MAAW,KAAA,IAAS,UAAA,CAAW,IAAI,CAAA,EAAG;AACpC,MAAA,IAAI,KAAA,CAAM,KAAK,CAAA,EAAG;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACA,EAAA,KAAA,CAAM,IAAI,CAAA;AACV,EAAA,OAAO,IAAA;AACT;;;ACpDO,SAAS,YAAY,KAAA,EAA8B;AACxD,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACnD,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,MAAA;AACH,QAAA,GAAA,IAAO,IAAA,CAAK,KAAA;AACZ,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,GAAA,IAAO,GAAA;AACP,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,GAAA,IAAO,MAAA;AACP,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,GAAA,IAAO,IAAA,CAAK,IAAA;AACZ,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,GAAA,IAAO,EAAA;AACP,QAAA;AAAA,MACF;AACE,QAAA,GAAA,IAAO,WAAA,CAAY,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA;AACvC,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,oBAAoB,CAAA,EAAmB;AACrD,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACrC;;;ACrCO,SAAS,WAAA,CAAY,GAAW,CAAA,EAAmB;AACxD,EAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,EAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,IAAI,IAAA,GAAO,IAAI,KAAA,CAAc,CAAA,GAAI,CAAC,CAAA;AAClC,EAAA,IAAI,IAAA,GAAO,IAAI,KAAA,CAAc,CAAA,GAAI,CAAC,CAAA;AAClC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,IAAA,GAAO,EAAE,CAAA,GAAI,CAAC,MAAM,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AACzC,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,GAAK,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAK,CAAA,EAAG,KAAK,CAAA,GAAI,CAAC,IAAK,IAAI,CAAA;AAAA,IACxE;AACA,IAAA,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,CAAC,MAAM,IAAI,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,KAAK,CAAC,CAAA;AACf;AAGO,SAAS,YAAA,CACd,MACA,UAAA,EACoB;AACpB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAA,GAAW,QAAA;AACf,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,CAAC,CAAA;AAC7D,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,IAAI,WAAA,CAAY,IAAA,CAAK,aAAY,EAAG,CAAA,CAAE,aAAa,CAAA;AACzD,IAAA,IAAI,IAAI,QAAA,EAAU;AAChB,MAAA,QAAA,GAAW,CAAA;AACX,MAAA,IAAA,GAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA,KAAS,MAAA,IAAa,QAAA,IAAY,SAAA,GAAY,IAAA,GAAO,MAAA;AAC9D;;;ACGA,IAAM,OAAiB,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAE;AACvD,IAAMC,WAAAA,GAA0B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAK,IAAA,EAAK;AAQlD,IAAM,MAAA,GAAN,MAAM,OAAA,CAAO;AAAA,EAYlB,WAAA,CAAY,MAAA,EAAiB,OAAA,GAAyB,EAAC,EAAG;AAT1D,IAAA,IAAA,CAAiB,cAA4B,EAAC;AAE9C,IAAA,IAAA,CAAQ,GAAA,GAAM,CAAA;AACd,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAA;AAEhB,IAAA,IAAA,CAAQ,gBAAA,GAAmB,KAAA;AAE3B;AAAA,IAAA,IAAA,CAAQ,YAAA,GAA4BA,WAAAA;AAGlC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,qBAAA,EAAsB;AAC1D,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACpC,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,MAAA,EAAQ,CAAC,GAAA,KAAQ;AACf,QAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,QAAA,IAAI,GAAA,CAAI,GAAA,KAAQ,MAAA,EAAW,OAAO,GAAA,CAAI,GAAA;AACtC,QAAA,OAAO,WAAA,CAAY,IAAI,QAAQ,CAAA;AAAA,MACjC,CAAA;AAAA,MACA,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,QAAA,MAAM,GAAA,GAAM,YAAY,GAAG,CAAA;AAC3B,QAAA,IAAI,IAAI,OAAA,EAAS;AACf,UAAA,IAAA,CAAK,MAAA,CAAO;AAAA,YACV,QAAA,EAAA,SAAA;AAAA,YACA,IAAA,EAAA,SAAA;AAAA,YACA,OAAA,EAAS,CAAA,yBAAA,EAA4B,GAAA,CAAI,MAAA,IAAU,SAAS,CAAA,SAAA,CAAA;AAAA,YAC5D,OAAO,IAAA,CAAK;AAAA,WACb,CAAA;AAAA,QACH;AACA,QAAA,OAAO,GAAA,CAAI,IAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAO,KAAA,CAAM,MAAA,EAAiB,OAAA,EAAsC;AAClE,IAAA,OAAO,IAAI,OAAA,CAAO,MAAA,EAAQ,OAAO,EAAE,KAAA,EAAM;AAAA,EAC3C;AAAA,EAEA,KAAA,GAAqB;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,KAAA;AAChC,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA,CAAa,MAAM,IAAA,CAAK,mBAAiB,CAAA;AAC/D,IAAA,MAAM,GAAA,GAAoB;AAAA,MACxB,IAAA,EAAM,UAAA;AAAA,MACN,QAAA;AAAA,MACA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,aAAY;AAAE,KAC1C;AACA,IAAA,OAAO,EAAE,GAAA,EAAK,WAAA,EAAa,IAAA,CAAK,WAAA,EAAY;AAAA,EAC9C;AAAA;AAAA,EAIQ,aAAa,IAAA,EAA6B;AAChD,IAAA,IAAI,EAAE,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,QAAA,EAAU;AAChC,MAAA,IAAA,CAAK,KAAA,EAAA;AACL,MAAA,OAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAAA,IACpC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,KAAA,EAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,kBAAkB,IAAA,EAA6B;AACrD,IAAA,MAAM,QAAgB,EAAC;AACvB,IAAA,OAAO,CAAC,IAAA,CAAK,EAAA,CAAA,KAAA,WAAgB,IAAK,CAAC,MAAK,EAAG;AACzC,MAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,MAAA,IAAI,IAAI,IAAA,KAAA,SAAA,gBAA4B;AAClC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,KAAK,CAAA;AAC9C,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,IAAI,CAAA;AAC9C,UAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,KAAA,CAAM,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,eACxC,KAAA,CAAM,KAAK,KAAK,CAAA;AACrB,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,KAAK,SAAA,EAAU;AAC5B,MAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,GAAG,KAAA,CAAM,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,WAAA,IAClC,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,SAAA,GAAkC;AACxC,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAA,SAAA;AACE,QAAA,OAAO,KAAK,uBAAA,EAAwB;AAAA,MACtC,KAAA,QAAA;AACE,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA,MACzB,KAAA,QAAA;AACE,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,IAAA,CAAK,MAAA,CAAO;AAAA,UACV,QAAA,EAAA,SAAA;AAAA,UACA,IAAA,EAAA,SAAA;AAAA,UACA,OAAA,EAAS,sCAAA;AAAA,UACT,OAAO,GAAA,CAAI;AAAA,SACZ,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT,KAAA,MAAA;AACE,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,OAAO,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,IAAI,KAAA,EAAO,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,MAC5D,KAAA,YAAA;AACE,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,GAAA,EAAK,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,MACtD,KAAA,UAAA;AACE,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,MAC9C,KAAA,WAAA;AACE,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,MAC/C,KAAA,UAAA;AACE,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,GAAA,EAAK,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,MACtD,KAAA,UAAA;AACE,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,GAAA,EAAK,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,MACtD,KAAA,SAAA;AAAA,MACA;AACE,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA,EAEQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA,CAAa,MAAM,IAAA,CAAK,yBAAoB,CAAA;AAClE,IAAA,MAAM,MAAM,IAAA,CAAK,YAAA;AAAA,MAAA,QAAA;AAAA,MAEf,IAAA;AAAA,MAAA,SAAA;AAAA,KAEF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAA,EAAI,EAAE;AAAA,EAC5E;AAAA;AAAA,EAIQ,iBAAA,CAAkB,KAAwB,IAAA,EAAoC;AACpF,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,EAAQ;AAC3B,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,IAAQ,EAAE,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACpC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,IAAA,EAAM,OAAO,KAAK,CAAA;AAAA,EAClD;AAAA,EAEQ,uBAAA,GAAgD;AACtD,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,EAAQ;AAC3B,IAAA,MAAM,OAAO,KAAA,CAAM,KAAA;AAEnB,IAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,IAAA,CAAK,iBAAiB,KAAK,CAAA;AACxD,IAAA,IAAI,SAAS,KAAA,EAAO;AAElB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,MAAM,GAAA,GAAM,KAAK,eAAA,EAAgB;AACjC,MAAA,IAAA,CAAK,MAAA,CAAO;AAAA,QACV,QAAA,EAAA,OAAA;AAAA,QACA,IAAA,EAAA,SAAA;AAAA,QACA,SAAS,GAAA,GACL,CAAA,MAAA,EAAS,GAAG,CAAA,0BAAA,EAA6B,GAAG,CAAA,EAAA,CAAA,GAC5C,gCAAA;AAAA,QACJ,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAM,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY;AAAE,OAC5D,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AACzC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAMC,KAAAA,GAAO,KAAK,eAAA,EAAgB;AAClC,MAAA,MAAMH,MAAAA,GAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,MAAM,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY,EAAE;AAClE,MAAA,MAAM,aAAa,YAAA,CAAa,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA;AAClE,MAAA,IAAA,CAAK,MAAA,CAAO;AAAA,QACV,QAAA,EAAA,SAAA;AAAA,QACA,IAAA,EAAA,SAAA;AAAA,QACA,OAAA,EAAS,aACL,CAAA,mBAAA,EAAsB,IAAI,sBAAsB,UAAU,CAAA,EAAA,CAAA,GAC1D,sBAAsB,IAAI,CAAA,EAAA,CAAA;AAAA,QAC9B,KAAA,EAAAA,MAAAA;AAAA,QACA,GAAI,UAAA,GACA;AAAA,UACE,KAAA,EAAO;AAAA,YACL;AAAA,cACE,KAAA,EAAO,kBAAkB,UAAU,CAAA,CAAA;AAAA,cACnC,WAAA,EAAa,KAAK,UAAU,CAAA,CAAA;AAAA,cAC5B,OAAO,KAAA,CAAM;AAAA;AACf;AACF,YAEF;AAAC,OACN,CAAA;AACD,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,MAAM,IAAA,EAAAG,KAAAA,EAAM,OAAAH,MAAAA,EAAM;AAAA,IAC9C;AAEA,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,IAAQ,EAAE,CAAA;AAC1C,IAAA,OAAO,KAAK,YAAA,CAAa,GAAA,EAAK,IAAA,EAAM,IAAI,KAAK,CAAA;AAAA,EAC/C;AAAA,EAEQ,YAAA,CACN,GAAA,EACA,IAAA,EACA,KAAA,EACA,KAAA,EACe;AACf,IAAA,MAAMA,MAAAA,GAAqB,EAAE,KAAA,EAAO,KAAA,CAAM,MAAM,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY,EAAE;AAC/E,IAAA,IAAA,CAAK,YAAA,GAAeA,MAAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,GACd,GAAA,CAAI,KAAA,CAAM;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,CAAC,CAAA,KAAM,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,MAC5B,OAAO,IAAA,CAAK;AAAA,KACb,CAAA,GACD,IAAA;AAEJ,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAO,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,IAAI,IAAA,EAAM,IAAA,EAAM,OAAAA,MAAAA,EAAM;AAAA,IACxD;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO,IAAI,CAAC,CAAA,CAAE,KAAA,IAAS,KAAA,GAAQA,MAAAA;AAC/C,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQA,MAAAA;AAChC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAIQ,UAAU,KAAA,EAAkC;AAClD,IAAA,MAAM,OAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAC9B,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,MACf,CAAA,MAAA,IAAW,CAAC,IAAA,CAAK,QAAA,EAAU;AACzB,QAAA,IAAA,CAAK,MAAA,CAAO;AAAA,UACV,QAAA,EAAA,OAAA;AAAA,UACA,IAAA,EAAA,SAAA;AAAA,UACA,OAAA,EAAS,4BAA4B,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,IAAI,MAAM,EAAE,CAAA,CAAA,CAAA;AAAA,UACvE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,aAAY,EAAG,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY;AAAE,SAC7D,CAAA;AACD,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,EAAC,EAAG,GAAA,EAAK,EAAA,EAAI,KAAA,EAAOE,WAAAA,EAAY,CAAA;AAAA,MAC1E;AAAA,IAEF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,SAAS,IAAA,EAAoC;AACnD,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,KAAc,SAAA;AACnC,IAAA,MAAM,IAAA,GAAO,OAAA,GAAA,UAAA,kBAAA,QAAA;AACb,IAAA,MAAM,KAAA,GAAQ,OAAA,GAAA,UAAA,kBAAA,QAAA;AACd,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,CAAG,IAAI,GAAG,OAAO,IAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,EAAQ;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,GAAW,UAAA,GAAa,UAAA;AAE1C,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,MAAA,MAAM,WAAW,IAAA,CAAK,YAAA,CAAa,MAAM,IAAA,CAAK,EAAA,CAAG,KAAK,CAAC,CAAA;AACvD,MAAA,MAAME,IAAAA,GAAM,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,OAAA,EAAA,SAAA,4BAA4C;AACjF,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,GAAA,EAAAA,IAAAA,EAAI,EAAE;AAAA,IACtE;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACnC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,OAAA,EAAA,SAAA,4BAA4C;AACjF,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,GAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,KAAI,EAAE;AAAA,EAC/E;AAAA,EAEQ,eAAA,GAAkC;AACxC,IAAA,MAAM,OAAuB,EAAC;AAC9B,IAAA,WAAS;AACP,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,IAAI,CAAC,IAAA,CAAK,EAAA,CAAA,QAAA,cAAmB,EAAG;AAChC,MAAA,MAAM,OAAA,GAAU,KAAK,OAAA,EAAQ;AAC7B,MAAA,MAAM,WAAW,IAAA,CAAK,YAAA,CAAa,MAAM,IAAA,CAAK,yBAAoB,CAAA;AAClE,MAAA,MAAM,MAAM,IAAA,CAAK,YAAA;AAAA,QAAA,QAAA;AAAA,QAEf,OAAA;AAAA,QAAA,SAAA;AAAA,OAEF;AACA,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,IAAA,EAAM,UAAA;AAAA,QACN,QAAA;AAAA,QACA,OAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,GAAA;AAAI,OAC1C,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,aAAa,KAAA,EAA0B;AAC7C,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,OAAO,CAAC,IAAA,CAAK,EAAA,CAAA,KAAA,WAAgB,EAAG;AAC9B,MAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,MAAA,IAAI,KAAA,KAAU,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,KAAA,EAAO;AACrC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAA,QAAA,iBAA6B,CAAA,CAAE,IAAA,KAAA,UAAA,iBAA6B;AAChE,QAAA,KAAA,EAAA;AAAA,MACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAA,QAAA,iBAA6B,CAAA,CAAE,IAAA,KAAA,UAAA,iBAA6B;AACvE,QAAA,IAAI,UAAU,CAAA,EAAG;AACjB,QAAA,KAAA,EAAA;AAAA,MACF;AACA,MAAA,GAAA,IAAO,EAAE,IAAA,KAAA,SAAA,iBAA6B,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,KAAK,CAAA,CAAE,KAAA;AACzD,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAIQ,iBAAiB,QAAA,EAAgC;AACvD,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAc;AAChC,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,IAAI,GAAA;AACJ,IAAA,OACG,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,CAAA,EAC7E;AACA,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IAClB;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,IAAI,CAAA;AAC7C,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAMC,KAAAA,GAAO,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACnC,MAAA,MAAML,MAAAA,GAAQ,EAAE,KAAA,EAAO,QAAA,CAAS,MAAM,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY,EAAE;AACrE,MAAA,MAAM,aAAa,YAAA,CAAa,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,kBAAkB,CAAA;AACtE,MAAA,IAAA,CAAK,MAAA,CAAO;AAAA,QACV,QAAA,EAAA,SAAA;AAAA,QACA,IAAA,EAAA,SAAA;AAAA,QACA,OAAA,EAAS,aACL,CAAA,qBAAA,EAAwB,IAAI,oBAAoB,UAAU,CAAA,EAAA,CAAA,GAC1D,wBAAwB,IAAI,CAAA,EAAA,CAAA;AAAA,QAChC,KAAA,EAAAA;AAAA,OACD,CAAA;AACD,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAUK,KAAAA,EAAM,OAAAL,MAAAA,EAAM;AAAA,IAChD;AAEA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,IAAI,WAAA,EAAa;AACnB,MAAA,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,GAAA,CAAI,WAAW,CAAA;AACpD,MAAA,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAMA,MAAAA,GAAqB,EAAE,KAAA,EAAO,QAAA,CAAS,MAAM,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY,EAAE;AAClF,IAAA,IAAA,CAAK,YAAA,GAAeA,MAAAA;AACpB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,GACb,GAAA,CAAI,KAAA,CAAM;AAAA,MACR,IAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA,EAAQ,CAAC,CAAA,KAAM,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,MAC5B,OAAO,IAAA,CAAK;AAAA,KACb,CAAA,GACD,IAAA;AAEJ,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,OAAAA,MAAAA,EAAM;AAAA,IAChD;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM,IAAI,CAAC,CAAA,CAAE,KAAA,IAAS,KAAA,GAAQA,MAAAA;AAC9C,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQA,MAAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAa,IAAA,EAAsB;AACzC,IAAA,MAAM,OAAO,IAAA,CAAK,YAAA,CAAa,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC1D,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CAAgB,MAAc,WAAA,EAAiC;AACrE,IAAA,MAAM,UAAsB,EAAC;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,IAAK,IAAA,CAAK,UAAU,KAAK,CAAA;AAGtE,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAI,CAAC,IAAA,EAAK,IAAK,CAAC,IAAA,CAAK,mBAAgB,EAAG;AACtC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACpC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,KAAA,CAAM,IAAA,EAAK,KAAM,EAAE,CAAA,EAAG;AACjE,QAAA,IAAA,CAAK,MAAA,CAAO;AAAA,UACV,QAAA,EAAA,SAAA;AAAA,UACA,IAAA,EAAA,SAAA;AAAA,UACA,OAAA,EAAS,CAAA,2BAAA,EAA8B,WAAW,CAAA,KAAA,EAAQ,IAAI,CAAA,cAAA,CAAA;AAAA,UAC9D,KAAA,EAAO,KAAA,CAAM,CAAC,CAAA,EAAG,SAAS,IAAA,CAAK;AAAA,SAChC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,EAAG;AAClC,MAAA,MAAM,SAAA,GAAY,KAAK,OAAA,EAAQ;AAC/B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA;AAChD,MAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,IAAA,IAAQ,EAAE,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAsB;AAAA,QAC1B,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,CAAU,MAAM,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY;AAAE,OACjE;AACA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACtC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AACpB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,WAAW,IAAA,EAAoB;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO;AAAA,QACV,QAAA,EAAA,OAAA;AAAA,QACA,IAAA,EAAA,SAAA;AAAA,QACA,OAAA,EAAS,iBAAiB,IAAI,CAAA,EAAA,CAAA;AAAA,QAC9B,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,aAAY,EAAG,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY;AAAE,OAC7D,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,EAAQ;AAC5B,IAAA,MAAM,GAAA,GAAM,KAAK,aAAA,EAAc;AAC/B,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO;AAAA,QACV,QAAA,EAAA,OAAA;AAAA,QACA,IAAA,EAAA,SAAA;AAAA,QACA,OAAA,EAAS,CAAA,eAAA,EAAkB,IAAI,CAAA,kBAAA,EAAqB,GAAG,CAAA,EAAA,CAAA;AAAA,QACvD,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,MAAM,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY;AAAE,OAC7D,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGQ,aAAA,GAAwB;AAC9B,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,CAAA,QAAA,cAAmB,EAAG;AAC9B,MAAA,IAAA,CAAK,MAAA,CAAO;AAAA,QACV,QAAA,EAAA,OAAA;AAAA,QACA,IAAA,EAAA,SAAA;AAAA,QACA,OAAA,EAAS,oBAAA;AAAA,QACT,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,aAAY,EAAG,GAAA,EAAK,IAAA,CAAK,WAAA,EAAY;AAAE,OAC7D,CAAA;AACD,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAK,YAAA,CAAA,QAAA,cAA6B;AAC9C,IAAA,IAAA,CAAK,oCAA+B,IAAA,EAAA,SAAA,4BAAyC;AAC7E,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA,EAGQ,eAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,CAAA,QAAA,cAAmB,EAAG,OAAO,EAAA;AACvC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAK,YAAA,CAAA,QAAA,cAA6B;AAC9C,IAAA,IAAA,CAAK,oCAA+B,IAAA,EAAA,SAAA,4BAAyC;AAC7E,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,SAAS,IAAA,EAA6B;AAC5C,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,MAAA,IAAA,CAAK,MAAA,CAAO;AAAA,QACV,QAAA,EAAA,SAAA;AAAA,QACA,IAAA,EAAA,SAAA;AAAA,QACA,OAAA,EAAS,CAAA,uBAAA,EAA0B,IAAA,CAAK,QAAQ,CAAA,8CAAA,CAAA;AAAA,QAChD,KAAA,EAAO,IAAA,CAAK,IAAA,EAAK,CAAE;AAAA,OACpB,CAAA;AAAA,IACH;AACA,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,OAAO,CAAC,IAAA,CAAK,EAAA,CAAA,KAAA,WAAgB,EAAG;AAC9B,MAAA,IAAI,MAAA,KAAW,CAAA,IAAK,IAAA,EAAK,EAAG;AAC5B,MAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,MAAA,IAAI,CAAA,CAAE,IAAA,KAAA,QAAA,iBAA6B,CAAA,CAAE,IAAA,KAAA,UAAA,iBAA6B,MAAA,EAAA;AAAA,WAAA,IACzD,CAAA,CAAE,IAAA,KAAA,QAAA,iBAA6B,CAAA,CAAE,IAAA,KAAA,UAAA,iBAA6B;AACrE,QAAA,IAAI,WAAW,CAAA,EAAG;AAClB,QAAA,MAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA,EAIQ,YAAA,CAAa,KAAA,EAAkB,IAAA,EAAa,IAAA,EAAgC;AAClF,IAAA,IAAI,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,EAAG;AAClB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,GAAA;AAC9B,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,MAAA,CAAO;AAAA,MACV,QAAA,EAAA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,EAAS,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAK,CAAA,mCAAA,CAAA;AAAA,MACpC,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,OAAO,KAAK,WAAA,EAAY;AAAA,EAC1B;AAAA,EAEQ,GAAG,IAAA,EAA0B;AACnC,IAAA,OAAO,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,IAAA;AAAA,EAC9B;AAAA,EAEQ,UAAU,IAAA,EAAuB;AACvC,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,IAAA,OAAO,CAAA,CAAE,IAAA,KAAA,SAAA,kBAA8B,CAAA,CAAE,KAAA,KAAU,IAAA;AAAA,EACrD;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,OAAO,IAAA,CAAK,EAAA,CAAA,YAAA,kBAAuB,IAAK,IAAA,CAAK,2BAAoB,EAAG;AAClE,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,OACE,IAAA,CAAK,iCAAuB,IAC5B,IAAA,CAAK,2BAAoB,IACzB,IAAA,CAAK,6BAAqB,EAC1B;AACA,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,IAAA,CAAK,IAAI,CAAA,EAAU;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAAA,EACxE;AAAA,EAEQ,OAAA,GAAiB;AACvB,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,IAAA,IAAI,KAAK,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,GAAG,IAAA,CAAK,GAAA,EAAA;AAC5C,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,WAAA,GAAwB;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,EAAG,KAAA,CAAM,GAAA,IAAO,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,KAAA;AAAA,EACnE;AAAA,EAEQ,OAAO,CAAA,EAAqC;AAClD,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,UAAU,CAAA;AAAA,EAClD;AACF;AAGO,SAAS,KAAA,CAAM,QAAiB,OAAA,EAAsC;AAC3E,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA;AACrC;;;AC5kBA,IAAME,WAAAA,GAAa;AAAA,EACjB,OAAO,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,EACvC,KAAK,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA;AACrC,CAAA;AAMO,SAAS,QAAA,CAAS,GAAA,EAAmB,OAAA,GAA2B,EAAC,EAAiB;AACvF,EAAA,MAAM,cAA4B,EAAC;AACnC,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAwC;AACtD,IAAA,WAAA,CAAY,KAAK,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,aAAa,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,IAAA,CAAK,GAAA,EAAK;AAAA,IACR,MAAM,IAAA,EAAM;AACV,MAAA,QAAQ,KAAK,IAAA;AAAM,QACjB,KAAK,SAAA;AACH,UAAA,iBAAA,CAAkB,MAAM,MAAM,CAAA;AAC9B,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,EAAI;AAC5B,YAAA,MAAA,CAAO;AAAA,cACL,QAAA,EAAA,SAAA;AAAA,cACA,IAAA,EAAA,SAAA;AAAA,cACA,OAAA,EAAS,2BAAA;AAAA,cACT,KAAA,EAAO,KAAK,KAAA,IAASA;AAAA,aACtB,CAAA;AAAA,UACH;AACA,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,EAAI;AAC5B,YAAA,MAAA,CAAO;AAAA,cACL,QAAA,EAAA,SAAA;AAAA,cACA,IAAA,EAAA,SAAA;AAAA,cACA,OAAA,EAAS,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,UAAA,CAAA;AAAA,cACxB,KAAA,EAAO,KAAK,KAAA,IAASA;AAAA,aACtB,CAAA;AAAA,UACH;AACA,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,IAAI,QAAQ,KAAA,IAAS,EAAE,KAAK,KAAA,IAAS,OAAA,CAAQ,MAAM,MAAA,CAAA,EAAS;AAC1D,YAAA,MAAA,CAAO;AAAA,cACL,QAAA,EAAA,SAAA;AAAA,cACA,IAAA,EAAA,SAAA;AAAA,cACA,SAAS,CAAA,aAAA,EAAgB,IAAA,CAAK,KAAK,CAAA,2BAAA,EAA8B,OAAA,CAAQ,MAAM,IAAI,CAAA,EAAA,CAAA;AAAA,cACnF,KAAA,EAAO,KAAK,KAAA,IAASA;AAAA,aACtB,CAAA;AAAA,UACH;AACA,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC3B,YAAA,MAAA,CAAO;AAAA,cACL,QAAA,EAAA,MAAA;AAAA,cACA,IAAA,EAAA,SAAA;AAAA,cACA,OAAA,EAAS,0BAAA;AAAA,cACT,KAAA,EAAO,KAAK,KAAA,IAASA;AAAA,aACtB,CAAA;AAAA,UACH;AACA,UAAA;AAAA;AACJ,IACF;AAAA,GACD,CAAA;AAED,EAAA,OAAO,WAAA;AACT;AAOA,SAAS,iBAAA,CACP,MACA,MAAA,EACM;AACN,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAA,CAAO;AAAA,MACL,QAAA,EAAA,OAAA;AAAA,MACA,IAAA,EAAA,SAAA;AAAA,MACA,OAAA,EAAS,gEAAA;AAAA,MACT,KAAA,EAAO,KAAK,KAAA,IAASA;AAAA,KACtB,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,IAAA,MAAA,CAAO;AAAA,MACL,QAAA,EAAA,OAAA;AAAA,MACA,IAAA,EAAA,SAAA;AAAA,MACA,OAAA,EAAS,oDAAA;AAAA,MACT,KAAA,EAAO,KAAK,KAAA,IAASA;AAAA,KACtB,CAAA;AAAA,EACH;AACF;;;ACrGO,IAAM,YAAA,GAAsB;AAAA,EACjC,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,yDAAA;AAAA,IACT,IAAA,EAAM,yDAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,QAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,YAAA,EAAc;AAChB;;;ACxCO,SAAS,YAAA,CAAa,OAAA,EAAwB,IAAA,GAAc,YAAA,EAAqB;AACtF,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,IAAA,CAAK,IAAA;AAAA,IAC3B,QAAQ,EAAE,GAAG,KAAK,MAAA,EAAQ,GAAG,QAAQ,MAAA,EAAO;AAAA,IAC5C,OAAO,EAAE,GAAG,KAAK,KAAA,EAAO,GAAG,QAAQ,KAAA,EAAM;AAAA,IACzC,WAAW,EAAE,GAAG,KAAK,SAAA,EAAW,GAAG,QAAQ,SAAA,EAAU;AAAA,IACrD,SAAS,EAAE,GAAG,KAAK,OAAA,EAAS,GAAG,QAAQ,OAAA,EAAQ;AAAA,IAC/C,MAAM,EAAE,GAAG,KAAK,IAAA,EAAM,GAAG,QAAQ,IAAA,EAAK;AAAA,IACtC,YAAA,EAAc,OAAA,CAAQ,YAAA,IAAgB,IAAA,CAAK;AAAA,GAC7C;AACF;AAGO,IAAM,cAAqB,YAAA,CAAa;AAAA,EAC7C,IAAA,EAAM,QAAA;AAAA,EACN,QAAQ,EAAE,OAAA,EAAS,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,EACjE,YAAA,EAAc;AAChB,CAAC;AAGM,IAAM,eAAsB,YAAA,CAAa;AAAA,EAC9C,IAAA,EAAM,SAAA;AAAA,EACN,QAAQ,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,EACtE,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,mCAAA;AAAA,IACT,IAAA,EAAM,mCAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,YAAA,EAAc;AAChB,CAAC;AAGM,IAAM,eAAsB,YAAA,CAAa;AAAA,EAC9C,IAAA,EAAM,SAAA;AAAA,EACN,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC1E,YAAA,EAAc;AAChB,CAAC;AAGM,IAAM,MAAA,GAAgC;AAAA,EAC3C,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS;AACX;AAGO,SAAS,SAAS,IAAA,EAAqB;AAC5C,EAAA,OAAO,MAAA,CAAO,IAAI,CAAA,IAAK,YAAA;AACzB;;;AC7DA,IAAM,YAAY,CAAC,CAAA,KAAsB,CAAA,CAAE,OAAA,CAAQ,mBAAmB,EAAE,CAAA;AAQjE,SAAS,UAAA,CAAW,KAAA,EAAc,MAAA,GAAS,OAAA,EAAiB;AACjE,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,MAAM,SAAA,GAAY,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,CAC1C,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAA,MAAA,EAAS,CAAC,CAAA,OAAA,EAAU,SAAA,CAAU,CAAC,CAAC,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CACzD,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,OAAO,IAAI,CAAC,CAAA;AAAA,EACZ,SAAS;AAAA,MAAA,EACH,CAAC,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AAAA,MAAA,EAClC,CAAC,CAAA,OAAA,EAAU,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,MAAA,EAC5B,CAAC,CAAA,QAAA,EAAW,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,MAAA,EAC9B,CAAC,CAAA,SAAA,EAAY,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,MAAA,EAChC,CAAC,CAAA,KAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA;AAAA,MAAA,EAChC,CAAC,CAAA,eAAA,EAAkB,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA;AAAA,MAAA,EACtC,CAAC,CAAA,YAAA,EAAe,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,MAAA,EAChC,CAAC,CAAA,YAAA,EAAe,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,MAAA,EAChC,CAAC,CAAA,UAAA,EAAa,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,MAAA,EAClC,CAAC,CAAA,WAAA,EAAc,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AAAA,MAAA,EACpC,CAAC,CAAA,WAAA,EAAc,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AAAA,MAAA,EACpC,CAAC,CAAA,WAAA,EAAc,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AAAA,MAAA,EACpC,CAAC,CAAA,UAAA,EAAa,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,MAAA,EAClC,CAAC,CAAA,UAAA,EAAa,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,MAAA,EAClC,CAAC,CAAA,aAAA,EAAgB,KAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AAAA,MAAA,EACxC,CAAC,CAAA,aAAA,EAAgB,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAAA,MAAA,EACtC,CAAC,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;;AAAA;AAAA,eAAA,EAGvB,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA;AAAA,aAAA,EAErB,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,sBAAA,EACT,CAAC,CAAA;AAAA,iBAAA,EACN,CAAC,CAAA;AAAA,uBAAA,EACK,CAAC,CAAA;AAAA,qBAAA,EACH,CAAC,CAAA;AAAA;AAAA;AAAA,CAAA,EAGrB,CAAC,CAAA,YAAA,EAAe,CAAC,CAAA,oBAAA,EAAuB,CAAC,CAAA;;AAAA,CAAA,EAEzC,CAAC,kCAAkC,CAAC,CAAA;AAAA,CAAA,EACpC,CAAC,CAAA;AAAA,uBAAA,EACqB,CAAC,CAAA;AAAA,qBAAA,EACH,CAAC,CAAA;AAAA;AAAA;AAAA,iBAAA,EAGL,CAAC,CAAA;AAAA;AAAA;AAAA,CAAA,EAGjB,CAAC,CAAA;AAAA,qBAAA,EACmB,CAAC,CAAA;AAAA,iBAAA,EACL,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA,EAIjB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAImB,CAAC,CAAA;AAAA,iBAAA,EACL,CAAC,CAAA;AAAA;AAAA,CAAA,EAEjB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,EAOD,CAAC,CAAA;;AAAA,CAAA,EAED,CAAC,mCAAmC,CAAC,CAAA;AAAA,CAAA,EACrC,CAAC,CAAA;AAAA,uBAAA,EACqB,CAAC,CAAA;AAAA,qBAAA,EACH,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAIL,CAAC,CAAA;AAAA;AAAA;AAAA,CAAA,EAGjB,CAAC,CAAA,gBAAA,EAAmB,CAAC,CAAA,gDAAA,EAAmD,CAAC,CAAA;AAAA,CAAA,EACzE,CAAC,wBAAwB,CAAC,CAAA;AAAA,CAAA,EAC1B,CAAC,kBAAkB,CAAC,CAAA;AAAA,iCAAA,EACY,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA,EAIjC,CAAC,CAAA;AAAA,uBAAA,EACqB,CAAC,CAAA;AAAA,qBAAA,EACH,CAAC,CAAA;AAAA;AAAA;AAAA;;AAAA,CAAA,EAKrB,CAAC,CAAA;AAAA,CAAA,EACD,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,EAMD,CAAC,CAAA;AAAA,CAAA,EACD,CAAC,kCAAkC,CAAC,CAAA;AAAA,CAAA,EACpC,CAAC,kBAAkB,CAAC,CAAA;AAAA,iBAAA,EACJ,CAAC,CAAA;AAAA,qBAAA,EACG,CAAC,CAAA;AAAA;AAAA;AAAA,CAAA,EAGrB,CAAC,CAAA;AAAA,CAAA,EACD,CAAC,CAAA;;AAAA,CAAA,EAED,CAAC,CAAA;AAAA,CAAA,EACD,CAAC,mCAAmC,CAAC,CAAA;;AAAA,CAAA,EAErC,CAAC,CAAA;AAAA,CAAA,EACD,CAAC,CAAA;;AAAA,CAAA,EAED,CAAC,CAAA;AAAA,CAAA,EACD,CAAC,CAAA;AAAA,yCAAA,EACuC,CAAC,CAAA;AAAA,iBAAA,EACzB,CAAC,CAAA;AAAA;AAAA;AAAA,qBAAA,EAGG,CAAC,CAAA;AAAA;AAAA;AAAA;;AAAA,CAAA,EAKrB,CAAC,wBAAwB,CAAC,CAAA;AAAA,CAAA,EAC1B,CAAC,CAAA;AAAA,CAAA,EACD,CAAC,CAAA;AAAA,CAAA,EACD,CAAC,qDAAqD,CAAC,CAAA;AAAA,CAAA,EACvD,CAAC,CAAA;AAAA,CAAA,EACD,CAAC,mCAAmC,CAAC,CAAA;AAAA,CAAA,EACrC,CAAC,mCAAmC,CAAC,CAAA;AAAA,CAAA,EACrC,CAAC,mCAAmC,CAAC,CAAA;AAAA,CAAA,EACrC,CAAC,kCAAkC,CAAC,CAAA;AAAA,EAAA,EACnC,CAAC,CAAA;AAAA,EAAA,EACD,CAAC,CAAA;;AAAA;AAAA,KAAA,EAGE,CAAC,CAAA;AAAA,KAAA,EACD,CAAC,cAAc,CAAC,CAAA;AAAA;AAAA,CAAA,CAAA;AAGvB;;;ACvJO,IAAM,WAAA,uBAAkB,GAAA,CAAY;AAAA,EACzC,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,YAAY,IAAA,EAAqB;AAC/C,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AACvC,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS,OAAO,KAAK,IAAA,KAAS,UAAA;AAChD,EAAA,IAAI,KAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,IAAA,KAAS,UAAU,OAAO,IAAA;AAC9D,EAAA,OAAO,KAAA;AACT;;;ACVO,SAAS,UAAU,QAAA,EAA4B;AACpD,EAAA,MAAM,UAAoB,CAAC,EAAE,KAAA,EAAO,IAAI,CAAA;AACxC,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,UAAU,CAAA,EAAG;AAC/C,MAAA,OAAA,CAAQ,KAAK,EAAE,OAAA,EAAS,MAAM,KAAA,EAAO,IAAI,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,QAAQ,MAAA,GAAS,CAAC,CAAA,CAAG,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IAC9C;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEO,IAAM,UAAA,uBAAiB,GAAA,CAAI,CAAC,WAAW,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAC,CAAA;AAU7D,SAAS,cAAc,KAAA,EAA8B;AAC1D,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAAA,IACjB,CAAC,CAAA,KAAwB,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,EAAE,KAAA,KAAU;AAAA,GAC/D;AACA,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA;AAAA,IAClB,CAAC,CAAA,KAAwB,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,EAAE,KAAA,KAAU;AAAA,GAC/D;AACA,EAAA,MAAM,WAAW,KAAA,CAAM,MAAA;AAAA,IACrB,CAAC,MAAM,UAAA,CAAW,GAAA,CAAI,EAAE,IAAI,CAAA,IAAK,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM;AAAA,GACvD;AACA,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAAA,IAClB,CAAC,CAAA,KACC,CAAC,WAAW,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IACtB,CAAA,CAAE,IAAA,KAAS,UAAA,IACX,EAAE,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CAAE,KAAA,CAAM,MAAK,KAAM,EAAA;AAAA,GAC9C;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM;AACxC;AAWO,SAAS,UAAA,CAAW,QAAkB,IAAA,EAA0B;AACrE,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,SAAS,WAAA,EAAa;AAExB,IAAA,KAAA,GAAQ,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,IAAU,EAAA;AAC1C,IAAA,QAAA,GAAW,MAAA,CAAO,MAAA,GAAU,MAAA,CAAO,MAAA,IAAU,EAAA,GAAM,EAAA;AAAA,EACrD,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,KAAA,GAAQ,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,KAAA,IAAS,EAAA;AACvC,IAAA,QAAA,GAAW,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,IAAA,IAAQ,EAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,IAAA,IAAQ,OAAO,IAAA,IAAQ,EAAA;AACtD,IAAA,QAAA,GAAW,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,YAAA,IAAgB,EAAA;AAAA,EACtD;AACA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAO,SAAA,CAAU,MAAA,CAAO,OAAO,MAAA,CAAO,GAAA,EAAK,OAAO,IAAI,CAAA;AAAA,IACtD,QAAA,EAAU,OAAO,QAAA,IAAY,EAAA;AAAA,IAC7B,GAAA,EAAK,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,IAAA,IAAQ;AAAA,GACpC;AACF;AAEO,SAAS,SAAA,CAAU,KAAA,EAAgB,GAAA,EAAc,IAAA,EAAuB;AAC7E,EAAA,IAAI,MAAM,OAAO,IAAA;AACjB,EAAA,IAAI,SAAS,GAAA,EAAK,OAAO,CAAA,EAAG,KAAK,WAAM,GAAG,CAAA,CAAA;AAC1C,EAAA,OAAO,SAAS,GAAA,IAAO,EAAA;AACzB;;;ACtDA,IAAMI,aAAY,CAAC,CAAA,KAAsB,CAAA,CAAE,OAAA,CAAQ,mBAAmB,EAAE,CAAA;AAOjE,IAAM,eAAN,MAAmB;AAAA,EAOxB,WAAA,CAAY,OAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,YAAA,EAAa;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,WAAA,IAAe,OAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,SAAA,oBAAa,IAAI,GAAA,EAAI;AAC9C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,MAAA,IAAU,IAAA;AACnC,IAAA,IAAA,CAAK,GAAA,GAAM;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAA,EAAa,CAAC,KAAA,KAAU,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,MAC7C,GAAA,EAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,IAAI;AAAA,KAC9B;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,GAAA,EAA2B;AAChC,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,MAAM,WAAW,OAAA,CAAQ,CAAC,GAAG,OAAA,GAAU,MAAA,GAAY,QAAQ,KAAA,EAAM;AACjE,IAAA,IAAI,UAAU,KAAA,CAAM,IAAA,CAAK,KAAK,cAAA,CAAe,QAAA,CAAS,KAAK,CAAC,CAAA;AAE5D,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,cAAc,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,iBACpE,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,CAAA,YAAA,EAAe,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,EAAO,MAAM,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA,MAAA,CAAA;AAAA,EACjF;AAAA;AAAA,EAGA,cAAA,CAAe,GAAA,EAAmB,KAAA,GAAQ,QAAA,EAAkB;AAC1D,IAAA,OAAO;AAAA,MACL,iBAAA;AAAA,MACA,kBAAA;AAAA,MACA,QAAA;AAAA,MACA,wBAAA;AAAA,MACA,sEAAA;AAAA,MACA,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,MAC3B,CAAA;AAAA,EAAY,IAAA,CAAK,QAAQ;AAAA,QAAA,CAAA;AAAA,MACzB,SAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,MACf,SAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI,CAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAA,GAAiB;AACf,IAAA,OAAO,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA,EAIQ,aAAA,CAAc,SAAsB,IAAA,EAAsB;AAChE,IAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,CAAA;AACpE,IAAA,OACE,CAAA,gBAAA,EAAmB,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG,QAAQ,CAAA,aAAA,EACnC,IAAA,CAAK,GAAA,CAAI,eAAe,CAAC,CAAA,EAAA,EAAK,WAAW,OAAA,CAAQ,KAAK,CAAC,CAAA,iBAAA,EACtD,IAAA,CAAK,GAAA,CAAI,cAAc,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA,gBAAA,CAAA;AAAA,EAGrE;AAAA,EAEQ,eAAe,KAAA,EAAuB;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AAEjD,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA,EAAM,GAAI,cAAc,KAAK,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,IAAA,IAAQ,KAAA,IAAS,QAAA,CAAS,MAAA,GAAS,CAAA;AACrD,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,IAAQ,CAAA,eAAA,EAAkB,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAC,CAAA,EAAA,CAAA;AAC5C,MAAA,IAAI,IAAA,EAAM,IAAA,IAAQ,CAAA,WAAA,EAAc,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,KAAA,CAAA;AAC3E,MAAA,IAAI,KAAA,EAAO,IAAA,IAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,KAAA,CAAM,KAAK,CAAC,CAAA,IAAA,CAAA;AAC7E,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,IAAQ,eAAe,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,KAAK,QAAA,CAC5C,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,iBAAA,CAAkB,CAAC,CAAC,CAAA,CACpC,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA;AAAA,MACb;AACA,MAAA,IAAA,IAAQ,CAAA,SAAA,CAAA;AAAA,IACV;AACA,IAAA,IAAI,MAAM,MAAA,GAAS,CAAA,EAAG,IAAA,IAAQ,IAAA,CAAK,WAAW,KAAK,CAAA;AACnD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,IAAA,EAAoB;AAC5C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,cAAc,CAAA;AACpC,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,MAAA,QAAQ,KAAK,KAAA;AAAO,QAClB,KAAK,OAAA;AACH,UAAA,OAAO,IAAA,CAAK,YAAY,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAAA,QAC3E,KAAK,OAAA;AACH,UAAA,OAAO,IAAA,CAAK,WAAA;AAAA,YACV,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAC,CAAA,CAAA;AAAA,YACxC,OAAA;AAAA,YACA,IAAA,CAAK,KAAA;AAAA,YACL;AAAA,WACF;AAAA,QACF,KAAK,SAAA;AACH,UAAA,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,OAAO,SAAA,EAAW,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,QACjE,KAAK,UAAA;AACH,UAAA,OAAO,CAAA,aAAA,EAAgB,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,CAAK,UAAU,CAAC,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA,CAAA;AAAA,QAChF;AACE,UAAA,OAAO,gBAAgB,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA,CAAA;AAAA;AAC1D,IACF;AACA,IAAA,IAAI,KAAK,IAAA,KAAS,MAAA;AAChB,MAAA,OAAO,gBAAgB,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA,CAAA;AACvD,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,KAAA,EAAO;AAC/C,MAAA,OAAO,gBAAgB,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEQ,WAAA,CAAY,GAAA,EAAa,IAAA,EAAc,KAAA,EAAe,GAAA,EAAqB;AACjF,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,CAAY,GAAG,CAAA;AAChC,IAAA,OACE,CAAA,UAAA,EAAa,GAAG,CAAA,QAAA,EAAW,eAAA,CAAgB,IAAI,CAAC,CAAA,EAAA,EAC7C,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,UAAA,CAAW,KAAK,CAAC,CAAA,IAAA,CAAA;AAAA,EAE1C;AAAA;AAAA;AAAA,EAKQ,WAAW,KAAA,EAAuB;AACxC,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,IAAI,SAAiB,EAAC;AACtB,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,EAAE,IAAA,EAAK;AAC5C,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,MAAM,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,IAAA,CAAM,CAAA;AAC/D,MAAA,MAAA,GAAS,EAAC;AAAA,IACZ,CAAA;AACA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,QAAA,KAAA,EAAM;AAAA,MACR,CAAA,MAAA,IAAW,WAAA,CAAY,IAAI,CAAA,EAAG;AAC5B,QAAA,KAAA,EAAM;AACN,QAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,KAAA,EAAM;AACN,IAAA,OAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACtB;AAAA,EAEQ,aAAa,KAAA,EAAuB;AAC1C,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,WAAW,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,EACrD;AAAA;AAAA,EAIQ,WAAW,IAAA,EAAoB;AACrC,IAAA,MAAM,WACJ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,KAC3B,IAAA,CAAK,IAAA,KAAS,SAAA,GAAY,KAAK,SAAA,CAAU,GAAA,CAAI,WAAW,IAAA,CAAK,IAAI,EAAE,CAAA,GAAI,MAAA,CAAA;AAC1E,IAAA,IAAI,QAAA,EAAU,OAAO,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAC,EAAA,KAAO,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAEzE,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,MAAA;AACH,QAAA,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,MAC9B,KAAK,UAAA;AACH,QAAA,OAAO,EAAA;AAAA,MACT,KAAK,WAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,CAAA,WAAA,EAAc,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,EAAA,CAAA;AAAA,MACvC,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,IAAA,KAAS,UAAA,GACjB,CAAA,mBAAA,EAAsB,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,aACzC,CAAA,wCAAA,EAA2C,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,SAAA,CAAA;AAAA,MACpE,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAAA,MACxC,KAAK,MAAA;AACH,QAAA,OAAO,CAAA,QAAA,EAAW,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA,SAAA,CAAA;AAAA,MACpD,KAAK,QAAA;AACH,QAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAA,CAAA;AAAA,MAChD,KAAK,WAAA;AACH,QAAA,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA,IAAA,CAAA;AAAA,MAC/C,KAAK,QAAA;AACH,QAAA,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA,IAAA,CAAA;AAAA,MAC/C,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAC7C,QAAA,IAAI,CAAC,KAAK,KAAA,IAAS,CAAC,YAAY,IAAA,CAAK,KAAK,GAAG,OAAO,KAAA;AACpD,QAAA,OAAO,CAAA,mBAAA,EAAsB,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,OAAA,CAAA;AAAA,MACnD;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAC7C,QAAA,MAAM,GAAA,GAAMA,UAAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAChC,QAAA,OAAO,4BAA4B,IAAA,CAAK,MAAM,CAAA,OAAA,EAAU,GAAG,oBAAoB,KAAK,CAAA,OAAA,CAAA;AAAA,MACtF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAC7C,QAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,IAAI,GAAG,OAAO,KAAA;AACxC,QAAA,OAAO,CAAA,uBAAA,EAA0B,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,OAAA,CAAA;AAAA,MACtD;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAC7C,QAAA,MAAM,MAAA,GACJ,IAAA,CAAK,MAAA,KAAW,WAAA,GACZ,CAAA,MAAA,EAAS,KAAK,MAAM,CAAA,WAAA,CAAA,GACpB,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA;AACpC,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,QAAA,OAAO,CAAA,yBAAA,EAA4B,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,OAAA,CAAA;AAAA,MACrD;AAAA,MACA,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAC7C,QAAA,IAAI,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU,OAAO,SAAS,KAAK,CAAA,OAAA,CAAA;AAClD,QAAA,OAAO,CAAA,aAAA,EAAgB,KAAK,GAAA,CAAI,CAAA,MAAA,EAAS,KAAK,KAAK,CAAA,CAAE,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,OAAA,CAAA;AAAA,MAClE;AAAA,MACA,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAW,IAAA,CAAK,IAAA,EAAM,KAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MACpE,KAAK,KAAA;AACH,QAAA,OAAO,KAAK,UAAA,CAAW,IAAA,CAAK,MAAM,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,MAC5D,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAAA,MAC5B,KAAK,SAAA;AAEH,QAAA,OAAO,KAAK,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,QAAA,EAAW,KAAK,GAAA,CAAI,kBAAkB,CAAC,CAAA,EAAA,EAAK,WAAW,IAAA,CAAK,KAAK,CAAC,CAAA,GAAA,EAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,MAClH,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MAC7B,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MAChC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAAA,MACrC,KAAK,KAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,MAC3D,KAAK,WAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,MACjE,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,MAC/D,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAAA,MACpC,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MAChC,KAAK,OAAA;AACH,QAAA,OAAO,EAAA;AAAA,MACT;AACE,QAAA,OAAO,EAAA;AAAA;AACX,EACF;AAAA,EAEQ,UAAA,CAAW,MAAc,KAAA,EAAuB;AACtD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,CAAY,IAAI,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,WAAW,4CAAA,GAA+C,EAAA;AACtE,IAAA,OAAO,CAAA,UAAA,EAAa,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,QAAA,EAAW,eAAA,CAAgB,IAAI,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,IAAA,CAAA;AAAA,EACtF;AAAA,EAEQ,WAAW,IAAA,EAA+C;AAChE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,KAAS,WAAA,GAAc,IAAA,GAAO,IAAA;AAC/C,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAChB,GAAA,CAAI,CAAC,SAAS,CAAA,IAAA,EAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,EAAM,CAAA,KAAA,CAAO,CAAA,CACnE,KAAK,EAAE,CAAA;AACV,IAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,EAC7D;AAAA,EAEQ,cAAc,IAAA,EAAkD;AACtE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CACf,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,QAAQ,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,GAAI,IAAI,KAAA,GAAQ,MAAA;AACvD,MAAA,MAAM,IAAA,GAAO,KAAA,KAAU,MAAA,GAAS,YAAA,GAAe,YAAY,KAAK,CAAA,CAAA;AAChE,MAAA,OAAO,CAAA,YAAA,EAAe,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAC,CAAA,MAAA,CAAA;AAAA,IAC5F,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,IAAA,OAAO,eAAe,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,KAAK,IAAI,CAAA,MAAA,CAAA;AAAA,EACpD;AAAA,EAEQ,aAAa,KAAA,EAAyB;AAC5C,IAAA,MAAM,MAAM,KAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,cAAc,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,KAAK,UAAA,CAAW,CAAC,CAAC,CAAA,KAAA,CAAO,CAAA,CACnE,KAAK,EAAE,CAAA;AACV,IAAA,OAAO,cAAc,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAC,KAAK,GAAG,CAAA,KAAA,CAAA;AAAA,EACjD;AAAA,EAEQ,WAAA,CAAY,MAAA,EAAkB,IAAA,EAAc,IAAA,EAAsB;AACxE,IAAA,MAAM,EAAE,OAAO,QAAA,EAAU,KAAA,EAAO,UAAU,GAAA,EAAI,GAAI,UAAA,CAAW,MAAA,EAAQ,IAAI,CAAA;AAEzE,IAAA,MAAM,SAAA,GAAY,GAAA,GACd,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,GAAG,CAAA,CAAE,IAAA,EAAM,UAAA,CAAW,KAAK,CAAC,CAAA,GACxD,WAAW,KAAK,CAAA;AAEpB,IAAA,IAAI,IAAA,GAAO,CAAA,YAAA,EAAe,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAA,EAAA,CAAA;AAC7D,IAAA,IAAA,IAAQ,CAAA,YAAA,EAAe,IAAA,CAAK,GAAA,CAAI,WAAW,CAAC,CAAA,EAAA,CAAA;AAC5C,IAAA,IAAA,IAAQ,gBAAgB,IAAA,CAAK,GAAA,CAAI,aAAa,CAAC,KAAK,SAAS,CAAA,OAAA,CAAA;AAC7D,IAAA,IAAI,KAAA;AACF,MAAA,IAAA,IAAQ,CAAA,aAAA,EAAgB,KAAK,GAAA,CAAI,aAAa,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA,CAAA;AACvE,IAAA,IAAA,IAAQ,CAAA,MAAA,CAAA;AACR,IAAA,IAAI,YAAY,QAAA,EAAU;AACxB,MAAA,IAAA,IAAQ,CAAA,YAAA,EAAe,IAAA,CAAK,GAAA,CAAI,WAAW,CAAC,CAAA,EAAA,CAAA;AAC5C,MAAA,IAAA,IAAQ,CAAA,aAAA,EAAgB,KAAK,GAAA,CAAI,gBAAgB,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,OAAA,CAAA;AAC3E,MAAA,IAAI,QAAA;AACF,QAAA,IAAA,IAAQ,CAAA,aAAA,EAAgB,KAAK,GAAA,CAAI,gBAAgB,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,OAAA,CAAA;AAC7E,MAAA,IAAA,IAAQ,CAAA,MAAA,CAAA;AAAA,IACV;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,IAAA,IAAQ,CAAA,YAAA,EAAe,KAAK,GAAA,CAAI,YAAY,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA,MAAA,CAAA;AAAA,IACzE;AACA,IAAA,IAAA,IAAQ,CAAA,MAAA,CAAA;AACR,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,cAAc,IAAA,EAAkD;AACtE,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,MAAMC,SAAQ,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AACjD,MAAA,OAAO,CAAA,YAAA,EAAe,KAAK,GAAA,CAAI,QAAQ,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,UAAA,CAAWA,MAAK,CAAC,CAAA,MAAA,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AACjD,IAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,GAAI,EAAA;AAAA,EACvD;AAAA;AAAA,EAIQ,KAAK,IAAA,EAAsB;AACjC,IAAA,MAAM,GAAA,GAAM,UAAU,IAAA,EAAM,EAAE,WAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG,CAAA;AAC3D,IAAA,IAAI,KAAK,OAAO,GAAA;AAChB,IAAA,OAAO,CAAA,aAAA,EAAgB,KAAK,GAAA,CAAI,MAAM,CAAC,CAAA,SAAA,EAAY,eAAA,CAAgB,IAAI,CAAC,CAAA,SAAA,CAAA;AAAA,EAC1E;AAAA,EAEQ,IAAI,KAAA,EAAuB;AACjC,IAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,GAAI,KAAA,GAAQ,GAAA;AAAA,EAC1C;AAAA,EAEQ,IAAI,IAAA,EAAsB;AAChC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,EAC/B;AACF;AAGO,SAAS,UAAA,CAAW,KAAmB,OAAA,EAAqC;AACjF,EAAA,OAAO,IAAI,YAAA,CAAa,OAAO,CAAA,CAAE,OAAO,GAAG,CAAA;AAC7C;AAGO,SAAS,kBAAA,CACd,KACA,OAAA,EACQ;AACR,EAAA,OAAO,IAAI,YAAA,CAAa,OAAO,EAAE,cAAA,CAAe,GAAA,EAAK,SAAS,KAAK,CAAA;AACrE;;;AC1XO,SAAS,UAAA,CAAW,GAAA,EAAW,IAAA,GAA0B,EAAC,EAAY;AAC3E,EAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,IAAa,KAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAA4B;AACzC,IAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,KAAK,CAAA;AAChD,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,QAAA,IAAI,KAAA,KAAU,CAAA,KAAM,OAAA,IAAW,CAAA,KAAM,MAAA,CAAA,EAAS;AAC9C,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA;AAAA,MAClB;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAMO,SAAS,UAAA,CAAW,GAAA,EAAmB,IAAA,GAA0B,EAAC,EAAW;AAClF,EAAA,OAAO,IAAA,CAAK,UAAU,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,MAAA,IAAU,CAAC,CAAA;AACrE;;;ACrBO,SAAS,QAAQ,KAAA,EAAsB;AAC5C,EAAA,OAAO,iBAAiB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,UAAA,EAAa,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA;AAAA,uHAAA,CAAA;AAGvE;AASO,SAAS,eAAA,CAAgB,GAAA,EAAmB,OAAA,GAAwB,EAAC,EAAW;AACrF,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,YAAA,EAAa;AAC5C,EAAA,MAAM,WAAW,IAAI,YAAA,CAAa,EAAE,GAAG,OAAA,EAAS,OAAO,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,QAAA;AAC/B,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,kBAAA;AAAA,IACA,QAAA;AAAA,IACA,wBAAA;AAAA,IACA,sEAAA;AAAA,IACA,CAAA,OAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAC,CAAA,QAAA,CAAA;AAAA,IACrC,CAAA;AAAA,EAAY,QAAA,CAAS,QAAQ;AAAA,EAAK,OAAA,CAAQ,KAAK,CAAC;AAAA,QAAA,CAAA;AAAA,IAChD,SAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AA+BA,eAAsB,SAAA,CACpB,GAAA,EACA,OAAA,GAAsB,EAAC,EACF;AACrB,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,YAAA,EAAa;AAE5C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAW,MAAM,eAAA,EAAgB;AACxD,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,EAAO;AAC7B,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,OAAA,EAAQ;AACnC,IAAA,MAAM,KAAK,UAAA,CAAW,IAAA,EAAM,EAAE,SAAA,EAAW,gBAAgB,CAAA;AACzD,IAAA,OAAO,MAAM,KAAK,GAAA,CAAI;AAAA,MACpB,eAAA,EAAiB,QAAQ,eAAA,IAAmB,IAAA;AAAA,MAC5C,iBAAA,EAAmB,IAAA;AAAA,MACnB,MAAA,EAAQ,MAAM,IAAA,CAAK,IAAA;AAAA,MACnB,MAAA,EAAQ;AAAA,QACN,GAAA,EAAK,MAAM,IAAA,CAAK,MAAA;AAAA,QAChB,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,QACnB,IAAA,EAAM,MAAM,IAAA,CAAK,MAAA;AAAA,QACjB,KAAA,EAAO,MAAM,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAAA,EACH,CAAA,SAAE;AACA,IAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,EACtB;AACF;AAEA,eAAe,eAAA,GAA2D;AACxE,EAAA,IAAI;AAEF,IAAA,MAAM,MAAO,MAAM;AAAA;AAAA,MAA0B;AAAA,KAAqB;AAGlE,IAAA,OAAO,MAAM,GAAA,CAAI,MAAA,CAAO,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AACF;;;AC1DA,IAAMD,aAAY,CAAC,CAAA,KAAsB,CAAA,CAAE,OAAA,CAAQ,mBAAmB,EAAE,CAAA;AAMjE,IAAM,gBAAN,MAAoB;AAAA,EASzB,YAAY,OAAA,EAA6B;AAFzC,IAAA,IAAA,CAAQ,GAAA,GAAM,CAAA;AAGZ,IAAA,IAAI,OAAO,OAAA,CAAQ,aAAA,KAAkB,UAAA,EAAY;AAC/C,MAAA,MAAM,IAAI,SAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,YAAA,EAAa;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,WAAA,IAAe,OAAA;AACrC,IAAA,IAAA,CAAK,IAAI,OAAA,CAAQ,aAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,KAAA;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,SAAA,oBAAa,IAAI,GAAA,EAAI;AAC9C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,MAAA,IAAU,IAAA;AAAA,EACrC;AAAA;AAAA,EAGA,MAAA,GAAiB;AACf,IAAA,OAAO,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA,EAGA,OAAO,GAAA,EAA4B;AACjC,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,MAAM,QAAmB,EAAC;AAC1B,IAAA,MAAM,WAAW,OAAA,CAAQ,CAAC,GAAG,OAAA,GAAU,MAAA,GAAY,QAAQ,KAAA,EAAM;AACjE,IAAA,IAAI,QAAA,QAAgB,IAAA,CAAK,GAAG,KAAK,cAAA,CAAe,QAAA,CAAS,KAAK,CAAC,CAAA;AAC/D,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,cAAc,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,iBACpE,IAAA,CAAK,GAAG,KAAK,UAAA,CAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,EAAE,SAAA,EAAW,KAAK,GAAA,CAAI,QAAQ,CAAA,EAAE,EAAG,KAAK,CAAA;AAAA,EAChE;AAAA,EAEQ,GAAA,GAA0B;AAChC,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAA,EAAa,CAAC,KAAA,KAAU,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,MAC7C,GAAA,EAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,IAAI;AAAA,KAC9B;AAAA,EACF;AAAA;AAAA,EAIQ,aAAA,CAAc,SAAsB,IAAA,EAAuB;AACjE,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,MACV,SAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,OACtF;AAAA,MACA;AAAA,QACE,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA,EAAE,EAAG,CAAC,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QACvE,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,cAAc,CAAA,EAAE,EAAG,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC;AAAA;AAC/E,KACF;AAAA,EACF;AAAA,EAEQ,eAAe,KAAA,EAA0B;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AACjD,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA,EAAM,GAAI,cAAc,KAAK,CAAA;AAC5D,IAAA,MAAM,MAAiB,EAAC;AACxB,IAAA,IAAI,IAAA,IAAQ,KAAA,IAAS,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACxC,MAAA,MAAM,OAAkB,EAAC;AACzB,MAAA,IAAI,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,MAAM,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAE,EAAG,CAAC,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAChF,MAAA,IAAI,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,KAAK,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAE,EAAG,CAAC,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AAClF,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,IAAA;AAAA,UACH,IAAA,CAAK,EAAA;AAAA,YACH,KAAA;AAAA,YACA,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAE;AAAA,YACjC,SAAS,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC;AAAA;AACxC,SACF;AAAA,MACF;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,QAAA,EAAU,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAE,EAAG,IAAI,CAAC,CAAA;AAAA,IACrE;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG,GAAA,CAAI,KAAK,GAAG,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AACxD,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAIQ,WAAW,KAAA,EAA0B;AAC3C,IAAA,MAAM,MAAiB,EAAC;AACxB,IAAA,IAAI,SAAiB,EAAC;AACtB,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,KAAA,CAAM,IAAA,EAAK,KAAM,EAAE,CAAA;AAChF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,GAAA,CAAI,IAAA;AAAA,UACF,IAAA,CAAK,EAAA,CAAG,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAE,EAAG,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC;AAAA,SACzE;AAAA,MACF;AACA,MAAA,MAAA,GAAS,EAAC;AAAA,IACZ,CAAA;AACA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY,KAAA,EAAM;AAAA,WAAA,IAC3B,WAAA,CAAY,IAAI,CAAA,EAAG;AAC1B,QAAA,KAAA,EAAM;AACN,QAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,MAChC,CAAA,MAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,KAAA,EAAM;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,aAAa,KAAA,EAA0B;AAC7C,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,EAC5C;AAAA;AAAA,EAIQ,WAAW,IAAA,EAAqB;AACtC,IAAA,MAAM,WACJ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,KAC3B,IAAA,CAAK,IAAA,KAAS,SAAA,GAAY,KAAK,SAAA,CAAU,GAAA,CAAI,WAAW,IAAA,CAAK,IAAI,EAAE,CAAA,GAAI,MAAA,CAAA;AAC1E,IAAA,IAAI,QAAA,EAAU,OAAO,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,GAAA,EAAI,EAAG,CAAC,EAAA,KAAO,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAE3E,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MACd,KAAK,UAAA;AACH,QAAA,OAAO,IAAA;AAAA,MACT,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAAA,MAC/B,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAE,EAAG,EAAE,CAAA;AAAA,MAC1D,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,SAAS,UAAA,GACjB,IAAA,CAAK,GAAG,KAAA,EAAO,EAAE,OAAO,EAAE,MAAA,EAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAE,IAAK,EAAE,IAC7D,IAAA,CAAK,EAAA;AAAA,UACH,MAAA;AAAA,UACA,EAAE,KAAA,EAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAE,EAAE;AAAA,UACjE;AAAC,SACH;AAAA,MACN,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MACnD,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,GAAG,QAAA,EAAU,IAAA,EAAM,KAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MACjE,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,GAAG,IAAA,EAAM,IAAA,EAAM,KAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MAC7D,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,GAAG,GAAA,EAAK,IAAA,EAAM,KAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MAC5D,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,GAAG,GAAA,EAAK,IAAA,EAAM,KAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MAC5D,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAC7C,QAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AACnE,QAAA,OAAO,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM,EAAE,EAAG,KAAK,CAAA;AAAA,MAChE;AAAA,MACA,KAAK,YAAA;AACH,QAAA,OAAO,IAAA,CAAK,EAAA;AAAA,UACV,MAAA;AAAA,UACA;AAAA,YACE,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,SAAS,IAAA,CAAK,MAAM,UAAUA,UAAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA,eAAA;AAAA;AAC5D,WACF;AAAA,UACA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ;AAAA,SACjC;AAAA,MACF,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAC7C,QAAA,IAAI,CAAC,gBAAgB,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AACvD,QAAA,OAAO,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,CAAK,IAAA,EAAK,EAAE,EAAG,KAAK,CAAA;AAAA,MAClE;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAC7C,QAAA,MAAM,MAAA,GACJ,IAAA,CAAK,MAAA,KAAW,WAAA,GACZ,CAAA,MAAA,EAAS,KAAK,MAAM,CAAA,WAAA,CAAA,GACpB,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA;AACpC,QAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AACnC,QAAA,OAAO,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAO,EAAE,EAAG,KAAK,CAAA;AAAA,MACjE;AAAA,MACA,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAClB,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA,GAC1C,IAAA,CAAK,EAAA;AAAA,UACH,MAAA;AAAA,UACA,EAAE,WAAW,IAAA,CAAK,GAAA,CAAI,SAAS,IAAA,CAAK,KAAK,EAAE,CAAA,EAAE;AAAA,UAC7C,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ;AAAA,SACjC;AAAA,MACN,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAW,IAAA,CAAK,IAAA,EAAM,KAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MACpE,KAAK,KAAA;AACH,QAAA,OAAO,KAAK,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,MAClD,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,MAClC,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,EAAA;AAAA,UACV,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,UAClB,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,kBAAkB,CAAA,EAAE;AAAA,UAC1C,CAAC,KAAK,KAAK;AAAA,SACb;AAAA,MACF,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MAC7B,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MAChC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,EAAA;AAAA,UACV,IAAA;AAAA,UACA,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAE;AAAA,UAChC,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,GAAG,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,IAAI,OAAO,CAAA,IAAK,CAAC,CAAC,CAAC,CAAC;AAAA,SAC5E;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AAAA,MACrC,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAAA,MAC3C,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,SAAS,CAAA;AAAA,MACzC,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MAChC,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MAChC;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA,EAEQ,cAAc,IAAA,EAAmD;AACvE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,cAAc,CAAA;AACpC,IAAA,QAAQ,KAAK,KAAA;AAAO,MAClB,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAY,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAAA,MAC3E,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAA;AAAA,UACV,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAC,CAAA,CAAA;AAAA,UACxC,OAAA;AAAA,UACA,IAAA,CAAK,KAAA;AAAA,UACL;AAAA,SACF;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,OAAO,SAAA,EAAW,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,MACjE,KAAK,UAAA;AACH,QAAA,OAAO,KAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAK,EAAG;AAAA,UAC1C,IAAA,CAAK,WAAW,UAAU,CAAA;AAAA,UAC1B,IAAA,CAAK;AAAA,SACN,CAAA;AAAA,MACH;AACE,QAAA,OAAO,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAK,EAAG,CAAC,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA;AAC5D,EACF;AAAA,EAEQ,WAAA,CAAY,GAAA,EAAa,IAAA,EAAc,KAAA,EAAe,GAAA,EAAsB;AAClF,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,CAAY,GAAG,CAAA;AAChC,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,GAAA,EAAK,EAAE,WAAW,GAAA,EAAK,IAAA,EAAM,IAAA,EAAK,EAAG,CAAC,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EACpF;AAAA,EAEQ,UAAA,CAAW,MAAc,KAAA,EAA2B;AAC1D,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,CAAY,IAAI,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,MAAM,KAAA,GAAiC,EAAE,SAAA,EAAW,IAAA,CAAK,IAAI,MAAM,CAAA,EAAG,MAAM,IAAA,EAAK;AACjF,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,MAAA,KAAA,CAAM,GAAA,GAAM,qBAAA;AAAA,IACd;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EAClC;AAAA,EAEQ,WAAW,IAAA,EAAyB;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,KAAS,WAAA,GAAc,IAAA,GAAO,IAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,MACV,GAAA;AAAA,MACA,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAE;AAAA,MAC9B,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAC,CAAC;AAAA,KAChF;AAAA,EACF;AAAA,EAEQ,cAAc,IAAA,EAA4B;AAChD,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,MACV,KAAA;AAAA,MACA,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAE;AAAA,MACjC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACxB,QAAA,MAAM,QAAQ,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,GAAI,IAAI,KAAA,GAAQ,MAAA;AACvD,QAAA,MAAM,KAAA,GAAQ,KAAA,KAAU,MAAA,GAAS,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,EAAE,IAAA,EAAM,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAG;AAC5E,QAAA,OAAO,IAAA,CAAK,EAAA;AAAA,UACV,KAAA;AAAA,UACA,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAG,KAAA,EAAM;AAAA,UACvC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ;AAAA,SAC9B;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,WAAA,CACN,MACA,IAAA,EACS;AACT,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,KAAI,GAAI,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAC9E,IAAA,MAAM,OAAkB,EAAC;AACzB,IAAA,MAAM,OAAA,GAAU,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,GAAG,CAAA,CAAE,IAAA,EAAM,CAAC,KAAK,CAAC,CAAA,GAAI,KAAA;AACxE,IAAA,IAAA,CAAK,IAAA;AAAA,MACH,IAAA,CAAK,GAAG,KAAA,EAAO,EAAE,WAAW,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAE,EAAG;AAAA,QACnD,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,EAAE,EAAG,CAAC,OAAO,CAAC,CAAA;AAAA,QACjE,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,EAAE,EAAG,CAAC,KAAK,CAAC,CAAA,GAAI;AAAA,OAC5E;AAAA,KACH;AACA,IAAA,IAAI,YAAY,QAAA,EAAU;AACxB,MAAA,IAAA,CAAK,IAAA;AAAA,QACH,IAAA,CAAK,GAAG,KAAA,EAAO,EAAE,WAAW,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAE,EAAG;AAAA,UACnD,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA,EAAE,EAAG,CAAC,QAAQ,CAAC,CAAA;AAAA,UACrE,QAAA,GACI,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA,EAAE,EAAG,CAAC,QAAQ,CAAC,CAAA,GACrE;AAAA,SACL;AAAA,OACH;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,IAAA;AAAA,QACH,IAAA,CAAK,EAAA;AAAA,UACH,KAAA;AAAA,UACA,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,EAAE;AAAA,UACpC,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,QAAQ;AAAA;AAC/B,OACF;AAAA,IACF;AACA,IAAA,OAAO,KAAK,EAAA,CAAG,KAAA,EAAO,EAAE,SAAA,EAAW,GAAG,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,IAAM,IAAI,CAAA;AAAA,EACrF;AAAA,EAEQ,cAAc,IAAA,EAA4B;AAChD,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AACjD,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAE,EAAG,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IACjF;AACA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EAC3C;AAAA,EAEQ,WAAW,IAAA,EAAuB;AACxC,IAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,IAAA,CAAK,EAAA,CAAG,QAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK,EAAG,EAAE,CAAA;AAEjF,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,MACV,MAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAAA,QAC1B,uBAAA,EAAyB,EAAE,MAAA,EAAQ,GAAA;AAAI,OACzC;AAAA,MACA;AAAC,KACH;AAAA,EACF;AAAA;AAAA,EAIQ,EAAA,CACN,IAAA,EACA,KAAA,EACA,QAAA,EACS;AACT,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,EAAE,CAAA;AACjF,IAAA,MAAM,UAAA,GAAa,EAAE,GAAI,KAAA,IAAS,EAAC,EAAI,GAAA,EAAK,KAAK,GAAA,EAAA,EAAM;AACvD,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,IAAA,EAAM,UAAA,EAAY,GAAG,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEQ,KAAK,QAAA,EAA8B;AACzC,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,QAAA,EAAU,MAAM,QAAQ,CAAA;AAAA,EAC9C;AAAA,EAEQ,IAAI,KAAA,EAAuB;AACjC,IAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,GAAI,KAAA,GAAQ,GAAA;AAAA,EAC1C;AAAA,EAEQ,IAAI,IAAA,EAAsB;AAChC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,EAC/B;AACF;AAGO,SAAS,WAAA,CAAY,KAAmB,OAAA,EAAsC;AACnF,EAAA,OAAO,IAAI,aAAA,CAAc,OAAO,CAAA,CAAE,OAAO,GAAG,CAAA;AAC9C;;;ACzYA,IAAM,OAAA,GAAU,CAAC,CAAA,KACf,CAAC,CAAC,CAAA,IAAK,QAAA,IAAY,CAAA,IAAK,OAAA,IAAW,CAAA,IAAK,WAAA,IAAe,CAAA,IAAK,MAAA,IAAU,CAAA;AAajE,IAAM,cAAN,MAAwC;AAAA,EAU7C,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AANzC,IAAA,IAAA,CAAiB,aAAA,uBAAoB,GAAA,EAA0B;AAC/D,IAAA,IAAA,CAAiB,cAAA,uBAAqB,GAAA,EAA2B;AACjE,IAAA,IAAA,CAAiB,KAAA,uBAAY,GAAA,EAA2B;AAExD,IAAA,IAAA,CAAQ,UAAA,GAAa,CAAA;AAGnB,IAAA,IAAA,CAAK,WAAW,qBAAA,EAAsB;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,OAAA,CAAQ,KAAK,IAAI,OAAA,CAAQ,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAChF,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,WAAA,IAAe,OAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,EAAA;AACtC,IAAA,KAAA,MAAW,UAAU,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,EAC7D;AAAA;AAAA,EAIA,IAAI,MAAA,EAA2B;AAC7B,IAAA,KAAA,MAAW,OAAO,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG,IAAA,CAAK,gBAAgB,GAAG,CAAA;AACjE,IAAA,KAAA,MAAW,OAAO,MAAA,CAAO,YAAA,IAAgB,EAAC,EAAG,IAAA,CAAK,oBAAoB,GAAG,CAAA;AACzE,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,MAAA,CAAO,QAAQ,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAG;AAC5D,MAAA,IAAA,CAAK,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA,IAC7B;AACA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,CAAA,IAAK,MAAA,CAAO,QAAQ,MAAA,CAAO,aAAA,IAAiB,EAAE,CAAA,EAAG;AAClE,MAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,EAAE,CAAA;AAAA,IACnC;AACA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,CAAA,IAAK,MAAA,CAAO,QAAQ,MAAA,CAAO,cAAA,IAAkB,EAAE,CAAA,EAAG;AACnE,MAAA,IAAA,CAAK,qBAAA,CAAsB,KAAK,EAAE,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,OAAO,KAAK,CAAA;AAC5C,IAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AACnB,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,gBAAgB,GAAA,EAA0B;AACxC,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAK,GAAI,GAAA;AAC5B,IAAA,IAAA,CAAK,QAAA,CAAS,gBAAgB,IAAI,CAAA;AAClC,IAAA,IAAI,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,WAAW,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA;AAC3E,IAAA,IAAI,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,WAAW,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA;AAC9E,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,oBAAoB,GAAA,EAAkC;AACpD,IAAA,IAAA,CAAK,QAAA,CAAS,oBAAoB,GAAG,CAAA;AACrC,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,oBAAA,CAAqB,KAAa,EAAA,EAAwB;AACxD,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,qBAAA,CAAsB,KAAa,EAAA,EAAyB;AAC1D,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAc,GAAA,EAA2B;AACpD,IAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,SAAS,KAAA,EAAmC;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAK,CAAA,GAAI,QAAQ,YAAA,CAAa,KAAA,EAAO,KAAK,KAAK,CAAA;AACpE,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,WAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAIA,SAAS,MAAA,EAAgC;AACvC,IAAA,OAAO,SAAS,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA,EAGA,OAAA,CAAQ,MAAA,EAAgB,OAAA,GAA0B,EAAC,EAAkB;AACnE,IAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,IAAY,IAAA;AACxC,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,UAAU,IAAI,WAAA,GAAc,GAAA,GAAM,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACnE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACjC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAS,GAAI,SAAS,MAAM,CAAA;AACzD,IAAA,MAAM,EAAE,GAAA,EAAK,WAAA,EAAa,YAAW,GAAI,IAAI,OAAO,MAAA,EAAQ;AAAA,MAC1D,UAAU,IAAA,CAAK;AAAA,KAChB,EAAE,KAAA,EAAM;AACT,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,QAAA,EAAU,GAAG,UAAU,CAAA;AAC/C,IAAA,IAAI,WAAA,EAAa,WAAA,CAAY,IAAA,CAAK,GAAG,QAAA,CAAS,GAAA,EAAK,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA;AAEzE,IAAA,MAAM,MAAA,GAAwB,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAK,WAAA,EAAY;AACjE,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,MAAM,CAAA;AACzB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,EAA8B;AAClC,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,GAAA;AAAA,EACnD;AAAA,EAEA,SAAS,KAAA,EAA4C;AACnD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,SAAiB,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAE,WAAA;AAC1D,IAAA,OAAO,SAAS,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,EAC9C;AAAA;AAAA,EAIA,MAAA,CAAO,KAAA,EAA8B,OAAA,GAA6B,EAAC,EAAW;AAC5E,IAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA,CAAE,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEA,cAAA,CACE,KAAA,EACA,OAAA,GAAkD,EAAC,EAC3C;AACR,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,CAAE,cAAA,CAAe,KAAK,KAAA,CAAM,KAAK,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,EACnF;AAAA,EAEA,OAAA,CACE,OACA,OAAA,EACS;AACT,IAAA,OAAO,IAAI,aAAA,CAAc;AAAA,MACvB,GAAG,OAAA;AAAA,MACH,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAA,CAAO,OAA8B,OAAA,EAAqC;AACxE,IAAA,OAAO,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAK,GAAG,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,WAAA,CAAY,KAAA,EAA8B,OAAA,GAAwB,EAAC,EAAW;AAC5E,IAAA,OAAO,eAAA,CAAgB,KAAK,KAAA,CAAM,KAAK,GAAG,IAAA,CAAK,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,EACtE;AAAA,EAEA,KAAA,CAAM,KAAA,EAA8B,OAAA,GAAsB,EAAC,EAAwB;AACjF,IAAA,OAAO,SAAA,CAAU,KAAK,KAAA,CAAM,KAAK,GAAG,IAAA,CAAK,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,EAChE;AAAA;AAAA,EAGA,MAAA,GAAiB;AACf,IAAA,OAAO,IAAA,CAAK,YAAA,EAAa,CAAE,MAAA,EAAO;AAAA,EACpC;AAAA;AAAA,EAIQ,MAAM,KAAA,EAA4C;AACxD,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GACpB,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,GAAA,GACzC,KAAA;AAAA,EACN;AAAA,EAEQ,YAAA,CAAa,OAAA,GAA6B,EAAC,EAAiB;AAClE,IAAA,OAAO,IAAI,YAAA,CAAa;AAAA,MACtB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,WAAW,IAAA,CAAK,aAAA;AAAA,MAChB,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEQ,aAAqC,OAAA,EAAe;AAC1D,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,WAAW,IAAA,CAAK,aAAA;AAAA,MAChB,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAA,CAAK,UAAA,EAAA;AACL,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA,EAEQ,QAAA,CAAS,KAAa,MAAA,EAA6B;AACzD,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACxC,MAAA,IAAI,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,IACpD;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAAA,EAC5B;AACF;AAGO,SAAS,aAAa,OAAA,EAAsC;AACjE,EAAA,OAAO,IAAI,YAAY,OAAO,CAAA;AAChC;;;ACvQO,IAAM,WAAA,GAA2B;AAAA,EACtC,IAAA,EAAM,OAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,MAAM,CAAC,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,SAAS,CAAA;AAAA,MACzC,OAAA,EAAS,8BAAA;AAAA,MACT,OAAA,EAAS,cAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,CAAC,IAAA,EAAM,GAAA,EAAK,cAAA,KAAmB;AACnC,UAAA,MAAM,CAAA,GAAI,IAAA;AACV,UAAA,MAAM,KAAA,GAAQ,eAAe,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,QAAA,IAAY,EAAE,CAAA;AACtD,UAAA,OACE,CAAA,aAAA,EAAgB,IAAI,GAAA,CAAI,OAAO,CAAC,CAAA,yGAAA,EAEZ,GAAA,CAAI,WAAW,CAAA,4CAAA,EACT,KAAK,CAAA,OAAA,CAAA;AAAA,QAEnC,CAAA;AAAA,QACA,KAAA,EAAO,CAAC,IAAA,EAAM,GAAA,EAAK,cAAA,KAAmB;AACpC,UAAA,MAAM,CAAA,GAAI,IAAA;AACV,UAAA,OAAO,GAAA,CAAI,CAAA;AAAA,YACT,MAAA;AAAA,YACA;AAAA,cACE,SAAA,EAAW,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA;AAAA,cAC1B,KAAA,EAAO;AAAA,gBACL,OAAA,EAAS,cAAA;AAAA,gBACT,OAAA,EAAS,eAAA;AAAA,gBACT,YAAA,EAAc,OAAA;AAAA,gBACd,QAAA,EAAU,OAAA;AAAA,gBACV,UAAA,EAAY,CAAA,MAAA,EAAS,GAAA,CAAI,WAAW,CAAA,SAAA,CAAA;AAAA,gBACpC,KAAA,EAAO,MAAA;AAAA,gBACP,aAAA,EAAe;AAAA;AACjB,aACF;AAAA,YACA,GAAG,eAAe,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,QAAA,IAAY,EAAE;AAAA,WAC7C;AAAA,QACF;AAAA;AACF;AACF;AAEJ;AAMO,IAAM,YAAA,GAA4B;AAAA,EACvC,IAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,MAAM,CAAC,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA;AAAA,MACxC,OAAA,EAAS,iDAAA;AAAA,MACT,OAAA,EAAS,aAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,CAAC,IAAA,EAAM,GAAA,KAAQ;AACnB,UAAA,MAAM,CAAA,GAAI,IAAA;AACV,UAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,GAAA,IAAO,GAAG,CAAC,CAAA;AACrD,UAAA,IAAI,IAAA,GAAO,EAAA;AACX,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,YAAA,IAAA,IAAQ,CAAA,mBAAA,EACN,CAAA,IAAK,KAAA,GACD,CAAA,MAAA,EAAS,GAAA,CAAI,WAAW,CAAA,SAAA,CAAA,GACxB,CAAA,MAAA,EAAS,GAAA,CAAI,WAAW,CAAA,QAAA,CAC9B,CAAA,eAAA,CAAA;AAAA,UACF;AACA,UAAA,OAAO,CAAA,aAAA,EAAgB,IAAI,GAAA,CAAI,QAAQ,CAAC,CAAA,cAAA,EAAiB,KAAK,cAAc,IAAI,CAAA,OAAA,CAAA;AAAA,QAClF;AAAA;AACF;AACF;AAEJ;AAEA,SAAS,MAAM,CAAA,EAAmB;AAChC,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAC5B,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAC/C;;;AClFA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAa,MAAM,CAAA;AAC1C;AAEA,SAAS,eAAe,MAAA,EAA0B;AAChD,EAAA,OAAO,MAAA,CAAO,QAAQ,MAAM,CAAA,CACzB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAO,MAAM,EAAA,GAAK,CAAA,GAAI,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAG,CAAA,CAC5C,KAAK,IAAI,CAAA;AACd;AAOO,SAAS,cAAc,GAAA,EAA2B;AACvD,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,CAAE,SAAQ,GAAI,IAAA;AAC/C;AAGA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,SAAiB,EAAC;AACtB,EAAA,MAAM,QAAQ,MAAY;AACxB,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,MAAM,CAAA,CAAE,IAAA,EAAK;AACnC,IAAA,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACjB,IAAA,MAAA,GAAS,EAAC;AAAA,EACZ,CAAA;AACA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,MAAA,KAAA,EAAM;AAAA,IACR,CAAA,MAAA,IACE,WAAA,CAAY,IAAI,CAAA,IAChB,IAAA,CAAK,IAAA,KAAS,SAAA,IACd,IAAA,CAAK,IAAA,KAAS,MAAA,IACd,IAAA,CAAK,IAAA,KAAS,SAAA,EACd;AACA,MAAA,KAAA,EAAM;AACN,MAAA,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAAA,EACF;AACA,EAAA,KAAA,EAAM;AACN,EAAA,OAAO,GAAA,CAAI,KAAK,MAAM,CAAA;AACxB;AAEA,SAAS,UAAA,CAAW,IAAA,EAAY,MAAA,GAAS,EAAA,EAAY;AACnD,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,KAAU,IAAI,YAAA,GAAe,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAChF,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,MAAM,IAAA,CAAK,IAAA;AACjB,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAChB,IAAI,CAAC,EAAA,KAAO,GAAG,MAAM,CAAA,SAAA,EAAY,WAAA,CAAY,EAAA,CAAG,QAAQ,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,CAAA,CAClE,KAAK,IAAI,CAAA;AACZ,MAAA,OAAO,CAAA,EAAG,MAAM,CAAA,QAAA,EAAW,GAAG,CAAA;AAAA,EAAM,KAAK;AAAA,EAAK,MAAM,SAAS,GAAG,CAAA,CAAA,CAAA;AAAA,IAClE;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,IAAA,GAAO,KAAK,OAAA,CACf,GAAA;AAAA,QACC,CAAC,CAAA,KACC,CAAA,EAAG,MAAM,CAAA,WAAA,EAAc,EAAE,KAAK,CAAA;AAAA,EAAM,YAAY,WAAA,CAAY,CAAA,CAAE,QAAQ,CAAA,EAAG,MAAA,GAAS,IAAI,CAAC,CAAA;AAAA,OAC3F,CACC,KAAK,IAAI,CAAA;AACZ,MAAA,OAAO,GAAG,MAAM,CAAA;AAAA,EAAqB,IAAI;AAAA,EAAK,MAAM,CAAA,cAAA,CAAA;AAAA,IACtD;AAAA,IACA,KAAK,KAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,cAAA,CAAe,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CAAA;AACnE,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACvC,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,WAAA,CAAY,KAAK,QAAQ,CAAA,CAAE,MAAM,CAAA,CAAA,CAAA;AAAA,IACrD;AAAA,IACA,KAAK,QAAA;AACH,MAAA,OAAO,GAAG,MAAM,CAAA,SAAA,EAAY,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACnD,KAAK,MAAA;AACH,MAAA,OAAO,GAAG,MAAM,CAAA,OAAA,CAAA;AAAA,IAClB,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,KAAS,aAAa,QAAA,GAAW,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA;AAAA,IAClF,KAAK,SAAA;AACH,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,QAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AACjD,QAAA,OAAO,GAAG,MAAM,CAAA;AAAA,EAAoB,YAAY,WAAA,CAAY,KAAK,CAAA,EAAG,MAAA,GAAS,IAAI,CAAC;AAAA,EAAK,MAAM,CAAA,aAAA,CAAA;AAAA,MAC/F;AACA,MAAA,OAAO,MAAA,GAAS,WAAA,CAAY,CAAC,IAAI,CAAC,CAAA;AAAA,IACpC;AACE,MAAA,OAAO,MAAA,GAAS,WAAA,CAAY,CAAC,IAAI,CAAC,CAAA;AAAA;AAExC;AAGA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,CAAE,KAAK,EAAE,CAAA;AACrC;AAEA,SAAS,UAAU,IAAA,EAAoB;AACrC,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,IAC9B,KAAK,UAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IACvC,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/C,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/C,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,YAAA,EAAe,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IAClD,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,OAAA,EAAU,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IAC7C,KAAK,OAAA;AACH,MAAA,OAAO,eAAe,IAAA,CAAK,KAAK,KAAK,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IACjE,KAAK,YAAA;AACH,MAAA,OAAO,gBAAgB,IAAA,CAAK,KAAK,KAAK,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IAClE,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,IAAA,CAAK,IAAI,KAAK,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/D,KAAK,YAAA;AACH,MAAA,OAAO,gBAAgB,IAAA,CAAK,MAAM,KAAK,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IACnE,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,YAAA,GAAe,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IAChG,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,IAAA,CAAK,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IAC9D,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,KAAK,OAAO,CAAA,CAAA,CAAA;AAAA,IAC9B,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,OAAA,EAAU,KAAK,IAAI,CAAA,CAAA,CAAA;AAAA,IAC5B,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IACtC,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,KAAK,IAAA,KAAS,UAAA,GAAa,WAAW,QAAQ,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA,CAAA;AAAA,IACzE,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,QAAQ,MAAA,GAAY,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,CAAA,CAAA,GAAM,IAAI,WAAA,CAAY,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA,CAAI,CAAA,CAChF,IAAA,CAAK,EAAE,CAAA;AACV,MAAA,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,IAC9B;AAAA;AAAA,IAEA;AACE,MAAA,OAAO,WAAW,IAAI,CAAA;AAAA;AAE5B;AAEA,SAAS,WAAA,CAAY,MAAc,MAAA,EAAwB;AACzD,EAAA,OAAO,IAAA,CACJ,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,GAAO,MAAA,GAAS,IAAA,GAAO,IAAK,CAAA,CAC3C,KAAK,IAAI,CAAA;AACd;;;ACxFO,IAAM,gBAAN,MAAoB;AAAA,EAIzB,WAAA,CAAY,OAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,qBAAA,EAAsB;AAC1D,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,EACvB;AAAA;AAAA,EAIA,eAAe,MAAA,EAA8B;AAC3C,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,GAAA,EAAI,GAAI,SAAS,MAAM,CAAA;AACpD,IAAA,MAAM,EAAE,GAAA,EAAK,WAAA,EAAaE,QAAM,GAAI,IAAI,OAAO,MAAA,EAAQ;AAAA,MACrD,UAAU,IAAA,CAAK;AAAA,KAChB,EAAE,KAAA,EAAM;AACT,IAAA,OAAO,CAAC,GAAG,GAAA,EAAK,GAAGA,MAAAA,EAAO,GAAG,QAAA,CAAS,GAAA,EAAK,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAA,CAAK,OAAM,GAAI,EAAE,CAAC,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAA,EAA8B;AACpC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,QAAA,CAAS,MAAM,CAAA;AAClC,IAAA,OAAO,IAAI,MAAA,CAAO,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAK,QAAA,EAAU,CAAA,CAAE,KAAA,EAAM,CAAE,GAAA;AAAA,EACjE;AAAA;AAAA,EAIA,OAAO,MAAA,EAAwB;AAC7B,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,EAC3C;AAAA;AAAA,EAIA,cAAA,CAAe,QAAgB,MAAA,EAAkC;AAC/D,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA;AAErC,IAAA,MAAM,QAAA,GAAW,8BAAA,CAA+B,IAAA,CAAK,MAAM,CAAA;AAC3D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,MAAA;AAC9B,MAAA,OAAO,IAAA,CAAK,QAAA,CACT,eAAA,EAAgB,CAChB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,EACvC,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,qBAAA,CAAsB,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAC,CAAC,CAAA;AAAA,IAClF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC1C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAC7B,KAAA,EAAO,GAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ,aAAA;AAAA,QACR,UAAA,EAAY,GAAG,GAAG,CAAA,CAAA;AAAA,OACpB,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA;AAC9C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,CAAA;AACvC,MAAA,OAAO,KAAK,QAAA,CACT,WAAA,EAAY,CACZ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,CACvC,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI,CAAC,CAAA,CAC3C,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,iBAAA,CAAkB,CAAA,EAAG,KAAK,OAAA,CAAQ,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAC,CAAC,CAAA;AAAA,IAC9E;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEQ,iBAAA,CAAkB,KAAwBR,MAAAA,EAAoC;AACpF,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,IAAQ,EAAC;AAC1B,IAAA,MAAM,cAAc,IAAA,CACjB,GAAA;AAAA,MAAI,CAAC,CAAA,EAAG,CAAA,KACP,EAAE,QAAA,GACE,CAAA,IAAA,EAAO,IAAI,CAAC,CAAA,CAAA,EAAI,EAAE,IAAA,IAAQ,KAAK,OAC/B,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,KAAK,CAAA,EAAA;AAAA,KACrC,CACC,KAAK,EAAE,CAAA;AACV,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,QAAA,GAAW,IAAA,GAAO,IAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACrE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,MACpB,IAAA,EAAM,SAAA;AAAA,MACN,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,aAAA,EAAe,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AAAA,MAClC,UAAA,EAAY,CAAA,EAAG,GAAA,CAAI,IAAI,GAAG,SAAS,CAAA,CAAA;AAAA,MACnC,OAAA,EAAS,CAAA,EAAG,GAAA,CAAI,IAAI,GAAG,WAAW,CAAA,CAAA;AAAA,MAClC,KAAA,EAAAA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,qBAAA,CACN,KACAA,MAAAA,EACgB;AAChB,IAAA,OAAO;AAAA,MACL,OAAO,GAAA,CAAI,IAAA;AAAA,MACX,IAAA,EAAM,aAAA;AAAA,MACN,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,OAAA;AAAA,MACxC,UAAA,EAAY,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,CAAA;AAAA,MACvB,OAAA,EAAS,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA;AAAA;AAAA,MAAA,EAAkB,IAAI,IAAI,CAAA,CAAA,CAAA;AAAA,MAC9C,KAAA,EAAAA;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGQ,aAAa,MAAA,EAAiC;AACpD,IAAA,MAAM,CAAA,GAAI,sCAAA,CAAuC,IAAA,CAAK,MAAM,CAAA;AAC5D,IAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,IAAA,QAAQ,CAAA,CAAE,CAAC,CAAA;AAAG,MACZ,KAAK,KAAA;AACH,QAAA,OAAO,CAAC,OAAA,EAAS,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,OAAO,KAAK,CAAA;AAAA,MAC/D,KAAK,WAAA;AACH,QAAA,OAAO,CAAC,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAO,KAAK,CAAA;AAAA,MAC/D,KAAK,SAAA;AACH,QAAA,OAAO,CAAC,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,OAAO,MAAM,CAAA;AAAA,MAC/C;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA;AAAA,EAIA,QAAA,CAAS,QAAgB,MAAA,EAAkC;AACzD,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,QAAA,CAAS,MAAM,CAAA;AAClC,IAAA,MAAM,MAAM,MAAA,CAAO,SAAA;AAAA,MACjB,CAAC,CAAA,KACC,CAAA,CAAE,IAAA,KAAA,SAAA,kBACF,MAAA,IAAU,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,MAAA,IACxB,MAAA,IAAU,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI;AAAA,KAC1B;AACA,IAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,IAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AAExB,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,OAAA,IAAW,KAAA,CAAM,UAAU,KAAA,EAAO;AACpD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,GAAG,CAAA;AAC3C,MAAA,MAAM,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,IAAI,CAAA,GAAI,MAAA;AACxD,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA;AAAA,UACjC,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,MAAM,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,CAAA,oBAAA,EAAuB,KAAA,CAAM,KAAK,CAAA,EAAA,CAAA;AAAA,QAC5C,OAAO,KAAA,CAAM;AAAA,OACf;AAAA,IACF;AACA,IAAA,OAAO,EAAE,UAAU,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,EAC9D;AAAA,EAEQ,WAAW,GAAA,EAAgC;AACjD,IAAA,MAAM,GAAA,GACJ,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAA,CAAA,GAAA,CACZ,GAAA,CAAI,IAAA,IAAQ,EAAC,EACX,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,WAAW,CAAA,CAAA,EAAI,CAAA,CAAE,IAAA,IAAQ,KAAK,CAAA,CAAA,CAAA,GAAM,CAAA,CAAA,EAAI,CAAA,CAAE,IAAA,IAAQ,KAAK,CAAA,CAAA,CAAI,CAAA,CACzE,IAAA,CAAK,EAAE,CAAA;AACZ,IAAA,MAAM,QAAQ,CAAC,CAAA;AAAA,EAAc,GAAG;AAAA,MAAA,CAAU,CAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,OAAO,CAAA;AACvC,IAAA,IAAI,GAAA,CAAI,aAAA,EAAe,KAAA,CAAM,IAAA,CAAK,IAAI,aAAa,CAAA;AACnD,IAAA,IAAI,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA;AAAA,EAA4B,IAAI,OAAO;AAAA,MAAA,CAAU,CAAA;AAC7E,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA,EAEQ,eAAe,GAAA,EAAoC;AACzD,IAAA,MAAM,QAAQ,CAAC,CAAA;AAAA,QAAA,EAAsB,GAAA,CAAI,IAAI,CAAA,eAAA,EAAa,GAAA,CAAI,IAAI,CAAA;AAAA,MAAA,CAAW,CAAA;AAC7E,IAAA,IAAI,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,OAAO,CAAA;AACvC,IAAA,IAAI,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA;AAAA,EAA4B,IAAI,OAAO;AAAA,MAAA,CAAU,CAAA;AAC7E,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA;AAAA,EAIA,kBAAkB,MAAA,EAAiC;AACjD,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,QAAA,CAAS,MAAM,CAAA;AAClC,IAAA,MAAM,MAAuB,EAAC;AAC9B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,QAAQ,EAAE,IAAA;AAAM,QACd,KAAA,SAAA,gBAAwB;AACtB,UAAA,IAAI,CAAA,CAAE,KAAA,KAAU,OAAA,IAAW,CAAA,CAAE,UAAU,KAAA,EAAO;AAC5C,YAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAM,aAAA,EAAe,SAAA,EAAW,EAAC,EAAG,CAAA;AAC/D,YAAA;AAAA,UACF;AACA,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,EAAE,KAAK,CAAA;AAC5C,UAAA,GAAA,CAAI,IAAA,CAAK;AAAA,YACP,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,IAAA,EAAM,MAAM,SAAA,GAAY,iBAAA;AAAA,YACxB,WAAW,GAAA,EAAK,QAAA,GAAW,CAAC,GAAA,CAAI,QAAQ,IAAI;AAAC,WAC9C,CAAA;AACD,UAAA;AAAA,QACF;AAAA,QACA,KAAA,QAAA;AAAA,QACA,KAAA,QAAA;AACE,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAM,OAAA,EAAS,SAAA,EAAW,EAAC,EAAG,CAAA;AACzD,UAAA;AAAA,QACF,KAAA,UAAA;AAAA,QACA,KAAA,UAAA;AACE,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAM,SAAA,EAAW,SAAA,EAAW,EAAC,EAAG,CAAA;AAC3D,UAAA;AAAA,QACF,KAAA,SAAA;AACE,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAM,SAAA,EAAW,SAAA,EAAW,EAAC,EAAG,CAAA;AAC3D,UAAA;AAAA,QACF,KAAA,WAAA;AACE,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAM,WAAA,EAAa,SAAA,EAAW,EAAC,EAAG,CAAA;AAC7D,UAAA;AAAA,QACF,KAAA,MAAA;AACE,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAM,MAAA,EAAQ,SAAA,EAAW,EAAC,EAAG,CAAA;AACxD,UAAA;AAEA;AACJ,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAIQ,aAAA,CAAc,QAAiB,GAAA,EAAiC;AAEtE,IAAA,IAAI,IAAI,GAAA,GAAM,CAAA;AACd,IAAA,OAAO,OAAO,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,EAAG,IAAA,KAAA,YAAA,mBAA+B,CAAA,EAAA;AAC9D,IAAA,IAAI,CAAC,OAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,CAAG,gCAA2B,OAAO,MAAA;AAC/D,IAAA,CAAA,EAAA;AACA,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,OAAO,OAAO,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,EAAG,IAAA,KAAA,QAAA,eAA2B;AACxD,MAAA,IAAA,IAAQ,MAAA,CAAO,CAAC,CAAA,CAAG,KAAA;AACnB,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,OAAO,KAAK,IAAA,EAAK;AAAA,EACnB;AAAA,EAEQ,OAAA,CAAQ,MAAA,EAAgB,KAAA,EAAe,GAAA,EAA0B;AACvE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA;AAAA,MACpC,GAAA,EAAK,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,GAAG;AAAA,KAClC;AAAA,EACF;AAAA,EAEQ,UAAA,CACN,QACA,MAAA,EAKA;AACA,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAU,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACpD,MAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,EAAM;AACtB,QAAA,IAAA,EAAA;AACA,QAAA,MAAA,GAAS,CAAA;AAAA,MACX,CAAA,MAAO;AACL,QAAA,MAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AAAA,EAChC;AACF;;;AC5SA,IAAMS,SAAAA,GAAW,CAAC,CAAA,KAAwB,CAAA,IAAK,OAAO,CAAA,IAAK,GAAA,IAAS,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAA;AAY9E,IAAM,sBAAN,MAA0B;AAAA,EAS/B,WAAA,CAAY,OAAA,GAA0C,EAAC,EAAG;AAN1D;AAAA,IAAA,IAAA,CAAiB,UAAA,uBAAiB,GAAA,EAAwB;AAE1D;AAAA,IAAA,IAAA,CAAQ,UAAA,uBAAiB,GAAA,EAAwB;AACjD,IAAA,IAAA,CAAQ,IAAA,GAAO,CAAA;AACf,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAA;AAGf,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,qBAAA,EAAsB;AAAA,EAC5D;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AAAA,EAEA,QAAQ,MAAA,EAAmC;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,MAAM,QAAA,GAAW,sBAAsB,MAAM,CAAA;AAC7C,IAAA,MAAM,WAAmB,EAAC;AAC1B,IAAA,MAAM,cAA4B,EAAC;AACnC,IAAA,IAAI,KAAA,GAAQ,IAAA;AAGZ,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAwB;AAEnD,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,IAAI,GAAG,CAAA;AAC5C,MAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,EAAI;AAExB,MAAA,MAAM,MAAA,GAAS,GAAG,GAAA,CAAI,KAAK,IAAI,GAAA,CAAI,SAAS,IAAI,IAAI,CAAA,CAAA;AACpD,MAAA,IAAI,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AAEzC,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,IAAA,CAAK,IAAA,EAAA;AAAA,MACP,CAAA,MAAO;AAEL,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AACrC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,IAAA,EAAA;AAAA,QACP,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAA,EAAA;AACL,UAAA,MAAM,EAAE,MAAA,EAAO,GAAI,QAAA,CAAS,IAAI,CAAA;AAChC,UAAA,MAAM,EAAE,KAAAC,IAAAA,EAAK,WAAA,EAAa,GAAE,GAAI,IAAI,OAAO,MAAA,EAAQ;AAAA,YACjD,UAAU,IAAA,CAAK;AAAA,WAChB,EAAE,KAAA,EAAM;AACT,UAAA,MAAA,GAAS,EAAE,QAAA,EAAUA,IAAAA,CAAI,QAAA,EAAU,aAAa,CAAA,EAAE;AAClD,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAAA,QAClC;AACA,QAAA,MAAM,UAAU,GAAA,CAAI,KAAA;AACpB,QAAA,MAAM,KAAA,GAAQ,IAAI,SAAA,GAAY,CAAA;AAC9B,QAAA,QAAA,GAAW;AAAA,UACT,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,UAClE,WAAA,EAAa,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,OAAA,EAAS,KAAK,CAAC;AAAA,SAC1E;AAAA,MACF;AAEA,MAAA,cAAA,CAAe,GAAA,CAAI,QAAQ,QAAQ,CAAA;AACnC,MAAA,IAAI,CAAC,KAAA,EAAO,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,YAAY,CAAA;AAC9C,MAAA,KAAA,GAAQ,KAAA;AACR,MAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,QAAA,EAAU,QAAA,CAAS,KAAK,IAAI,CAAA;AACxD,MAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,WAAA,EAAa,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,IAChE;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,cAAA;AAClB,IAAA,MAAM,GAAA,GAAoB;AAAA,MACxB,IAAA,EAAM,UAAA;AAAA,MACN,QAAA;AAAA,MACA,KAAA,EAAO,EAAE,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE,EAAG,GAAA,EAAK,WAAA,CAAY,MAAM,CAAA;AAAE,KAC9E;AACA,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,UAAU,QAAA,CAAS,MAAA;AAAA,QACnB,WAAW,IAAA,CAAK,IAAA;AAAA,QAChB,aAAa,IAAA,CAAK;AAAA;AACpB,KACF;AAAA,EACF;AACF;AAKO,SAAS,sBAAsB,MAAA,EAA2B;AAC/D,EAAA,MAAM,MAA6C,EAAC;AACpD,EAAA,MAAM,EAAA,GAAK,gBAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,CAAA;AACJ,EAAA,OAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,MAAM,CAAA,EAAI;AAC5B,IAAA,GAAA,CAAI,KAAK,EAAE,KAAA,EAAO,MAAM,GAAA,EAAK,CAAA,CAAE,OAAO,CAAA;AACtC,IAAA,IAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAAA,EACxB;AACA,EAAA,GAAA,CAAI,KAAK,EAAE,KAAA,EAAO,MAAM,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAE5C,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,IAAI,MAAA,GAAgD,IAAA;AACpD,EAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,IAAA,IAAI,MAAA,KAAW,MAAM,MAAA,GAAS,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAI;AAAA,SAC5D,MAAA,CAAO,MAAM,IAAA,CAAK,GAAA;AACvB,IAAA,IAAI,UAAA,CAAW,OAAO,KAAA,CAAM,MAAA,CAAO,OAAO,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG;AACtD,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,OAAO,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AACpE,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,OAAO,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,WAAW,IAAA,EAAuB;AAChD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,CAAA,EAAA;AACA,MAAA,IAAID,SAAAA,CAAS,IAAA,CAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AAC3B,QAAA,IAAI,IAAA,GAAO,EAAA;AACX,QAAA,OAAOA,SAAAA,CAAS,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,IAAA,IAAQ,KAAK,CAAA,EAAG,CAAA;AAChD,QAAA,IAAI,SAAS,OAAA,EAAS,GAAA,EAAA;AAAA,aAAA,IACb,SAAS,KAAA,EAAO,GAAA,EAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACnB,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AACjC,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,KAAA,KAAU,KAAK,GAAA,KAAQ,CAAA;AAChC;AAKA,SAAS,UAAA,CAAc,KAAA,EAAU,OAAA,EAAiB,KAAA,EAAkB;AAClE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,WAAW,CAAA,EAAG,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,QAAA,IAAY,GAAA,IAAO,MAAA,IAAU,GAAA,IAAO,YAAY,GAAA,EAAK;AACvD,MAAA,OAAO;AAAA,QACL,MAAA,EAAS,IAAI,MAAA,GAAoB,OAAA;AAAA,QACjC,IAAA,EAAO,IAAI,IAAA,GAAkB,KAAA;AAAA,QAC7B,QAAQ,GAAA,CAAI;AAAA,OACd;AAAA,IACF;AACA,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAG,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAI,UAAA,CAAW,CAAA,EAAG,SAAS,KAAK,CAAA;AAC/E,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,MAAA,CAAO,QAAgB,MAAA,EAAwB;AACtD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAU,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACpD,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,EAAM,IAAA,EAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAY,MAAA,EAA0B;AAC7C,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,EAAM;AACtB,MAAA,IAAA,EAAA;AACA,MAAA,MAAA,GAAS,CAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,MAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,MAAM,MAAA,EAAO;AAC/C","file":"index.js","sourcesContent":["/**\n * Source-location primitives shared by every stage of the compiler.\n *\n * Every token and AST node carries a {@link SourceRange} so that diagnostics,\n * editor tooling (hover, completion, error underlines) and incremental\n * re-parsing can map results back to the exact bytes in the original source.\n */\n\n/** A single position in the source text. */\nexport interface Position {\n /** Zero-based UTF-16 code-unit offset from the start of the document. */\n offset: number;\n /** One-based line number. */\n line: number;\n /** One-based column number. */\n column: number;\n}\n\n/** A half-open `[start, end)` range in the source text. */\nexport interface SourceRange {\n start: Position;\n end: Position;\n}\n\n/** Convenience constructor for a {@link Position}. */\nexport function pos(offset: number, line: number, column: number): Position {\n return { offset, line, column };\n}\n\n/** Convenience constructor for a {@link SourceRange}. */\nexport function range(start: Position, end: Position): SourceRange {\n return { start, end };\n}\n\n/** Merge two ranges into the smallest range that contains both. */\nexport function mergeRanges(a: SourceRange, b: SourceRange): SourceRange {\n return {\n start: a.start.offset <= b.start.offset ? a.start : b.start,\n end: a.end.offset >= b.end.offset ? a.end : b.end,\n };\n}\n\n/** Test whether an offset falls within a range (start inclusive, end inclusive). */\nexport function rangeContains(r: SourceRange, offset: number): boolean {\n return offset >= r.start.offset && offset <= r.end.offset;\n}\n","import type { SourceRange } from \"./source.js\";\n\n/**\n * Token kinds produced by the {@link Tokenizer}.\n *\n * ReTeX intentionally diverges from TeX in a few places that matter for\n * resumes:\n * - `%` is a *literal* percent sign (so `Reduced latency by 40%` and\n * `\\column{40%}` work as written) rather than a comment marker.\n * - Comments use `%%` to end-of-line, which never collides with percentages.\n */\nexport enum TokenType {\n /** A command such as `\\section`, `\\textbf`, `\\item`. The lexeme excludes the backslash. */\n Command = \"Command\",\n /** `{` — begin group / argument. */\n LBrace = \"LBrace\",\n /** `}` — end group / argument. */\n RBrace = \"RBrace\",\n /** `[` — begin optional argument. */\n LBracket = \"LBracket\",\n /** `]` — end optional argument. */\n RBracket = \"RBracket\",\n /** Run of literal text. */\n Text = \"Text\",\n /** Run of inline whitespace (spaces/tabs, single newline). */\n Whitespace = \"Whitespace\",\n /** A blank line — paragraph break. */\n ParBreak = \"ParBreak\",\n /** `\\\\` — explicit line break. */\n LineBreak = \"LineBreak\",\n /** `%% ...` comment (stripped from output, surfaced to editor tooling). */\n Comment = \"Comment\",\n /** End of input. */\n EOF = \"EOF\",\n}\n\n/** A lexical token with full source provenance. */\nexport interface Token {\n type: TokenType;\n /** The exact source text of the token (backslash stripped for commands). */\n value: string;\n range: SourceRange;\n}\n\n/** Reserved single characters that the tokenizer treats specially. */\nexport const SPECIAL_CHARS = new Set([\"\\\\\", \"{\", \"}\", \"[\", \"]\"]);\n","import type { SourceRange } from \"./source.js\";\n\n/**\n * The ReTeX Abstract Syntax Tree.\n *\n * Every node is a member of the {@link Node} discriminated union keyed on\n * `type`. Nodes fall into three broad families:\n *\n * - **Structural** — {@link DocumentNode}, {@link GroupNode}, {@link ParBreakNode}.\n * - **Inline / typography** — text, marks (bold/italic/…), links, icons.\n * - **Resume semantics** — sections, jobs, education, skills, contact fields.\n *\n * Unknown or plugin-provided commands are preserved as {@link CommandNode} so\n * the tree is always a faithful, loss-less representation of the source and can\n * be re-rendered by custom renderers.\n */\n\nexport interface NodeBase {\n type: string;\n /** Source span this node was produced from. Synthetic nodes may omit it. */\n range?: SourceRange;\n /**\n * Stable structural hash used by the incremental compiler / render cache.\n * Populated lazily; never authored by hand.\n */\n hash?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Structural nodes */\n/* ------------------------------------------------------------------ */\n\nexport interface DocumentNode extends NodeBase {\n type: \"document\";\n children: Node[];\n}\n\n/** A literal run of text. */\nexport interface TextNode extends NodeBase {\n type: \"text\";\n value: string;\n}\n\n/** A paragraph break (one or more blank lines). */\nexport interface ParBreakNode extends NodeBase {\n type: \"parbreak\";\n}\n\n/** An explicit line break (`\\\\` or `\\newline`). */\nexport interface LineBreakNode extends NodeBase {\n type: \"linebreak\";\n}\n\n/** A horizontal rule (`\\hrule` / `\\divider`). */\nexport interface RuleNode extends NodeBase {\n type: \"rule\";\n}\n\n/** Spacing primitive (`\\vspace{1em}` / `\\hspace{...}`). */\nexport interface SpaceNode extends NodeBase {\n type: \"space\";\n axis: \"horizontal\" | \"vertical\";\n size: string;\n}\n\n/** A bare `{ ... }` group. Mostly used to scope font switches. */\nexport interface GroupNode extends NodeBase {\n type: \"group\";\n children: Node[];\n}\n\n/* ------------------------------------------------------------------ */\n/* Typography / inline marks */\n/* ------------------------------------------------------------------ */\n\nexport type MarkType = \"bold\" | \"italic\" | \"underline\" | \"strike\";\n\n/** Simple wrapping mark such as `\\textbf{...}`. */\nexport interface MarkNode extends NodeBase {\n type: MarkType;\n children: Node[];\n}\n\n/** `\\textcolor{#hex|name}{...}` */\nexport interface ColorNode extends NodeBase {\n type: \"color\";\n color: string;\n children: Node[];\n}\n\n/** `\\themecolor{primary}{...}` — color resolved from the active theme. */\nexport interface ThemeColorNode extends NodeBase {\n type: \"themecolor\";\n token: string;\n children: Node[];\n}\n\n/** `\\fontsize{14pt}{...}` */\nexport interface FontSizeNode extends NodeBase {\n type: \"fontsize\";\n size: string;\n children: Node[];\n}\n\n/** `\\fontfamily{Inter}{...}` */\nexport interface FontFamilyNode extends NodeBase {\n type: \"fontfamily\";\n family: string;\n children: Node[];\n}\n\n/** Relative size switch: `\\small`, `\\large`, `\\Large`, `\\Huge`. */\nexport type FontScale = \"small\" | \"normal\" | \"large\" | \"Large\" | \"Huge\";\nexport interface FontScaleNode extends NodeBase {\n type: \"fontscale\";\n scale: FontScale;\n /** Content the switch applies to (rest of the enclosing group). */\n children: Node[];\n}\n\n/* ------------------------------------------------------------------ */\n/* Hyperlinks & icons */\n/* ------------------------------------------------------------------ */\n\n/** `\\href{url}{label}` */\nexport interface LinkNode extends NodeBase {\n type: \"link\";\n /** Sanitized, render-safe URL. */\n href: string;\n /** Original, unsanitized URL (kept for diagnostics / round-tripping). */\n rawHref: string;\n children: Node[];\n}\n\n/** `\\url{url}` — renders the URL as its own label. */\nexport interface UrlNode extends NodeBase {\n type: \"url\";\n href: string;\n rawHref: string;\n}\n\n/** `\\icon{github}` */\nexport interface IconNode extends NodeBase {\n type: \"icon\";\n name: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Sections & lists */\n/* ------------------------------------------------------------------ */\n\nexport interface SectionNode extends NodeBase {\n type: \"section\";\n title: string;\n /** 1 = `\\section`, 2 = `\\subsection`. */\n level: number;\n}\n\nexport type ListKind = \"itemize\" | \"enumerate\";\n\nexport interface ListNode extends NodeBase {\n type: \"list\";\n kind: ListKind;\n items: ListItemNode[];\n}\n\nexport interface ListItemNode extends NodeBase {\n type: \"item\";\n children: Node[];\n}\n\n/* ------------------------------------------------------------------ */\n/* Layout */\n/* ------------------------------------------------------------------ */\n\nexport interface ColumnsNode extends NodeBase {\n type: \"columns\";\n columns: ColumnNode[];\n /** Gap between columns, e.g. `\"1.5rem\"`. */\n gap?: string;\n}\n\nexport interface ColumnNode extends NodeBase {\n type: \"column\";\n /** Width as authored (`\"40%\"`, `\"200px\"`, `\"2fr\"`). */\n width: string;\n children: Node[];\n}\n\n/* ------------------------------------------------------------------ */\n/* Resume / CV semantics */\n/* ------------------------------------------------------------------ */\n\nexport type ContactField = \"name\" | \"title\" | \"email\" | \"phone\" | \"location\" | \"website\";\n\n/** One of the single-value header commands (`\\name`, `\\email`, …). */\nexport interface ContactNode extends NodeBase {\n type: \"contact\";\n field: ContactField;\n value: string;\n}\n\n/** Parsed `key=value` map preserving per-field source ranges. */\nexport interface FieldMap {\n [key: string]: string;\n}\n\n/** `\\job{title=…, company=…, …}{ body }` */\nexport interface JobNode extends NodeBase {\n type: \"job\";\n fields: FieldMap;\n children: Node[];\n}\n\n/** `\\education{school=…, degree=…, …}{ body? }` */\nexport interface EducationNode extends NodeBase {\n type: \"education\";\n fields: FieldMap;\n children: Node[];\n}\n\n/** `\\project{name=…, …}{ body? }` */\nexport interface ProjectNode extends NodeBase {\n type: \"project\";\n fields: FieldMap;\n children: Node[];\n}\n\n/** `\\skills{a, b, c}` */\nexport interface SkillsNode extends NodeBase {\n type: \"skills\";\n items: string[];\n}\n\n/* ------------------------------------------------------------------ */\n/* Generic / extensibility / recovery */\n/* ------------------------------------------------------------------ */\n\n/** A parsed argument attached to a generic {@link CommandNode}. */\nexport interface ArgumentNode {\n kind: \"required\" | \"optional\";\n /** Parsed children for `content` arguments. */\n children: Node[];\n /** Raw text for `string`/verbatim arguments. */\n raw?: string;\n range?: SourceRange;\n}\n\n/**\n * A command the core does not model natively — including every\n * plugin-registered command and any unknown command encountered during\n * lenient parsing. Keeps the tree loss-less.\n */\nexport interface CommandNode extends NodeBase {\n type: \"command\";\n name: string;\n args: ArgumentNode[];\n}\n\n/** A placeholder emitted during error recovery so rendering can continue. */\nexport interface ErrorNode extends NodeBase {\n type: \"error\";\n message: string;\n /** The raw source that could not be parsed. */\n raw: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Union & helpers */\n/* ------------------------------------------------------------------ */\n\nexport type Node =\n | DocumentNode\n | TextNode\n | ParBreakNode\n | LineBreakNode\n | RuleNode\n | SpaceNode\n | GroupNode\n | MarkNode\n | ColorNode\n | ThemeColorNode\n | FontSizeNode\n | FontFamilyNode\n | FontScaleNode\n | LinkNode\n | UrlNode\n | IconNode\n | SectionNode\n | ListNode\n | ListItemNode\n | ColumnsNode\n | ColumnNode\n | ContactNode\n | JobNode\n | EducationNode\n | ProjectNode\n | SkillsNode\n | CommandNode\n | ErrorNode;\n\nexport type NodeType = Node[\"type\"];\n\n/** Map from node `type` to its concrete interface, for typed visitors. */\nexport interface NodeMap {\n document: DocumentNode;\n text: TextNode;\n parbreak: ParBreakNode;\n linebreak: LineBreakNode;\n rule: RuleNode;\n space: SpaceNode;\n group: GroupNode;\n bold: MarkNode;\n italic: MarkNode;\n underline: MarkNode;\n strike: MarkNode;\n color: ColorNode;\n themecolor: ThemeColorNode;\n fontsize: FontSizeNode;\n fontfamily: FontFamilyNode;\n fontscale: FontScaleNode;\n link: LinkNode;\n url: UrlNode;\n icon: IconNode;\n section: SectionNode;\n list: ListNode;\n item: ListItemNode;\n columns: ColumnsNode;\n column: ColumnNode;\n contact: ContactNode;\n job: JobNode;\n education: EducationNode;\n project: ProjectNode;\n skills: SkillsNode;\n command: CommandNode;\n error: ErrorNode;\n}\n\n/** Nodes that carry a `children: Node[]` array. */\nexport type ParentNode = Extract<Node, { children: Node[] }>;\n\nexport function isParent(node: Node): node is ParentNode {\n return Array.isArray((node as { children?: unknown }).children);\n}\n\n/** Type guard generator for a given node type. */\nexport function isNode<T extends NodeType>(node: Node, type: T): node is NodeMap[T] {\n return node.type === type;\n}\n","import type { SourceRange } from \"./source.js\";\n\n/** Severity levels, ordered the same way LSP orders them. */\nexport enum DiagnosticSeverity {\n Error = \"error\",\n Warning = \"warning\",\n Info = \"info\",\n Hint = \"hint\",\n}\n\n/**\n * Stable, machine-readable diagnostic codes. Editors can key quick-fixes and\n * documentation links off these rather than the (localizable) message text.\n */\nexport enum DiagnosticCode {\n UnexpectedToken = \"RTX1001\",\n UnterminatedGroup = \"RTX1002\",\n UnterminatedArgument = \"RTX1003\",\n UnexpectedEOF = \"RTX1004\",\n MismatchedBrace = \"RTX1005\",\n\n UnknownCommand = \"RTX2001\",\n UnknownEnvironment = \"RTX2002\",\n MissingRequiredArgument = \"RTX2003\",\n TooManyArguments = \"RTX2004\",\n MissingEnvironmentEnd = \"RTX2005\",\n MismatchedEnvironment = \"RTX2006\",\n\n InvalidColor = \"RTX3001\",\n InvalidUrl = \"RTX3002\",\n InvalidDimension = \"RTX3003\",\n MissingRequiredField = \"RTX3004\",\n UnknownField = \"RTX3005\",\n EmptyArgument = \"RTX3006\",\n\n CommandOutsideContext = \"RTX4001\",\n UnknownIcon = \"RTX4002\",\n UnknownThemeColor = \"RTX4003\",\n\n UnsafeUrlBlocked = \"RTX5001\",\n}\n\n/** Optional quick-fix an editor can apply. */\nexport interface QuickFix {\n title: string;\n /** Replacement text for {@link Diagnostic.range}. */\n replacement: string;\n range?: SourceRange;\n}\n\n/** A single diagnostic emitted by any stage of the pipeline. */\nexport interface Diagnostic {\n severity: DiagnosticSeverity;\n code: DiagnosticCode;\n message: string;\n range: SourceRange;\n /** Stage that produced the diagnostic, for filtering. */\n source: \"tokenizer\" | \"parser\" | \"validator\" | \"security\";\n /** Optional editor quick-fixes. */\n fixes?: QuickFix[];\n}\n","import { TokenType, type Token, type Position, type Diagnostic } from \"../types/index.js\";\n\nconst isLetter = (c: string): boolean => (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n\nconst isInlineSpace = (c: string): boolean => c === \" \" || c === \"\\t\" || c === \"\\r\";\n\nexport interface TokenizeResult {\n tokens: Token[];\n diagnostics: Diagnostic[];\n}\n\n/**\n * Stage 1 of the pipeline. Converts raw ReTeX source into a flat token stream\n * with exact source ranges. The tokenizer is deliberately permissive — it\n * never throws — so the parser can perform error recovery downstream.\n *\n * Design notes specific to resumes:\n * - `%` is a literal percent sign. Comments are `%%` to end-of-line.\n * - Escapes (`\\%`, `\\&`, `\\{`, `\\_`, `\\$`, `\\#`, `\\ `) become literal text.\n * - `\\\\` is an explicit line break.\n * - A whitespace run containing a blank line becomes a single `ParBreak`.\n */\nexport class Tokenizer {\n private readonly src: string;\n private offset = 0;\n private line = 1;\n private column = 1;\n private readonly tokens: Token[] = [];\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(source: string) {\n // Normalize newlines so position math is consistent across platforms.\n this.src = source.replace(/\\r\\n?/g, \"\\n\");\n }\n\n static tokenize(source: string): TokenizeResult {\n return new Tokenizer(source).run();\n }\n\n run(): TokenizeResult {\n while (!this.atEnd()) {\n this.scanToken();\n }\n this.push(TokenType.EOF, \"\", this.position());\n return { tokens: this.tokens, diagnostics: this.diagnostics };\n }\n\n /* --------------------------- scanners --------------------------- */\n\n private scanToken(): void {\n const start = this.position();\n const c = this.peek();\n\n switch (c) {\n case \"\\\\\":\n this.scanBackslash(start);\n return;\n case \"{\":\n this.read();\n this.push(TokenType.LBrace, \"{\", start);\n return;\n case \"}\":\n this.read();\n this.push(TokenType.RBrace, \"}\", start);\n return;\n case \"[\":\n this.read();\n this.push(TokenType.LBracket, \"[\", start);\n return;\n case \"]\":\n this.read();\n this.push(TokenType.RBracket, \"]\", start);\n return;\n case \"%\":\n if (this.peek(1) === \"%\") {\n this.scanComment(start);\n return;\n }\n // Lone `%` is a literal percent sign in ReTeX.\n this.scanText(start);\n return;\n default:\n if (isInlineSpace(c) || c === \"\\n\") {\n this.scanWhitespace(start);\n return;\n }\n this.scanText(start);\n }\n }\n\n private scanBackslash(start: Position): void {\n this.read(); // consume '\\'\n const next = this.peek();\n\n // Explicit line break: `\\\\`\n if (next === \"\\\\\") {\n this.read();\n this.push(TokenType.LineBreak, \"\\\\\\\\\", start);\n return;\n }\n\n // Control word: `\\` + letters (+ optional trailing `*`).\n if (isLetter(next)) {\n let name = \"\";\n while (isLetter(this.peek())) name += this.read();\n if (this.peek() === \"*\") name += this.read();\n this.push(TokenType.Command, name, start);\n return;\n }\n\n // Escaped literal: `\\%`, `\\{`, `\\_`, `\\ `, … → that single character.\n if (next !== \"\" && next !== \"\\n\") {\n const ch = this.read();\n this.push(TokenType.Text, ch, start);\n return;\n }\n\n // Trailing backslash (EOF or before newline): emit as literal text.\n this.push(TokenType.Text, \"\\\\\", start);\n }\n\n private scanComment(start: Position): void {\n let value = \"\";\n while (!this.atEnd() && this.peek() !== \"\\n\") value += this.read();\n this.push(TokenType.Comment, value, start);\n }\n\n private scanWhitespace(start: Position): void {\n let value = \"\";\n let newlines = 0;\n while (!this.atEnd()) {\n const c = this.peek();\n if (c === \"\\n\") {\n newlines++;\n value += this.read();\n } else if (isInlineSpace(c)) {\n value += this.read();\n } else {\n break;\n }\n }\n this.push(newlines >= 2 ? TokenType.ParBreak : TokenType.Whitespace, value, start);\n }\n\n private scanText(start: Position): void {\n let value = \"\";\n while (!this.atEnd()) {\n const c = this.peek();\n if (\n c === \"\\\\\" ||\n c === \"{\" ||\n c === \"}\" ||\n c === \"[\" ||\n c === \"]\" ||\n c === \"\\n\" ||\n isInlineSpace(c)\n ) {\n break;\n }\n // `%%` starts a comment; a lone `%` is literal and continues the run.\n if (c === \"%\" && this.peek(1) === \"%\") break;\n value += this.read();\n }\n // A run that began on a lone `%` will have consumed it above; guard the\n // pathological empty case so we always make progress.\n if (value === \"\") value = this.read();\n this.push(TokenType.Text, value, start);\n }\n\n /* --------------------------- cursor ----------------------------- */\n\n private atEnd(): boolean {\n return this.offset >= this.src.length;\n }\n\n private peek(k = 0): string {\n return this.src[this.offset + k] ?? \"\";\n }\n\n private read(): string {\n const c = this.src[this.offset] ?? \"\";\n this.offset++;\n if (c === \"\\n\") {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n return c;\n }\n\n private position(): Position {\n return { offset: this.offset, line: this.line, column: this.column };\n }\n\n private push(type: TokenType, value: string, start: Position): void {\n this.tokens.push({ type, value, range: { start, end: this.position() } });\n }\n}\n\n/** Convenience wrapper. */\nexport function tokenize(source: string): TokenizeResult {\n return Tokenizer.tokenize(source);\n}\n","import type { CommandDefinition, EnvironmentDefinition } from \"../types/index.js\";\n\n/**\n * The command/environment registry. The parser consults it for argument\n * signatures and node builders; the plugin system mutates it. A registry can\n * be cloned cheaply so an engine instance never mutates shared global state.\n */\nexport class CommandRegistry {\n private commands = new Map<string, CommandDefinition>();\n private environments = new Map<string, EnvironmentDefinition>();\n\n registerCommand(def: CommandDefinition): this {\n this.commands.set(def.name, def);\n return this;\n }\n\n registerEnvironment(def: EnvironmentDefinition): this {\n this.environments.set(def.name, def);\n return this;\n }\n\n getCommand(name: string): CommandDefinition | undefined {\n return this.commands.get(name);\n }\n\n getEnvironment(name: string): EnvironmentDefinition | undefined {\n return this.environments.get(name);\n }\n\n hasCommand(name: string): boolean {\n return this.commands.has(name);\n }\n\n hasEnvironment(name: string): boolean {\n return this.environments.has(name);\n }\n\n commandNames(): string[] {\n return [...this.commands.keys()];\n }\n\n environmentNames(): string[] {\n return [...this.environments.keys()];\n }\n\n allCommands(): CommandDefinition[] {\n return [...this.commands.values()];\n }\n\n allEnvironments(): EnvironmentDefinition[] {\n return [...this.environments.values()];\n }\n\n /** Shallow-clone the registry (definitions are shared, maps are copied). */\n clone(): CommandRegistry {\n const next = new CommandRegistry();\n next.commands = new Map(this.commands);\n next.environments = new Map(this.environments);\n return next;\n }\n}\n","import type { FieldMap } from \"../types/ast.js\";\n\n/**\n * Split a comma-separated list, respecting `{...}` and `[...]` nesting so that\n * a brace-protected comma (`{a, b}`) is not treated as a separator.\n */\nexport function splitTopLevel(raw: string, sep = \",\"): string[] {\n const parts: string[] = [];\n let depth = 0;\n let current = \"\";\n for (let i = 0; i < raw.length; i++) {\n const c = raw[i]!;\n if (c === \"{\" || c === \"[\") depth++;\n else if (c === \"}\" || c === \"]\") depth = Math.max(0, depth - 1);\n if (c === sep && depth === 0) {\n parts.push(current);\n current = \"\";\n } else {\n current += c;\n }\n }\n parts.push(current);\n return parts;\n}\n\n/** Parse a comma-separated list argument into trimmed, non-empty entries. */\nexport function parseListArg(raw: string): string[] {\n return splitTopLevel(raw)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\n/**\n * Parse a `key=value, key=value` argument into a {@link FieldMap}.\n *\n * To keep unquoted values like `location=New York, NY` working, any comma\n * segment that contains no `=` is merged back into the previous value (the\n * comma is treated as literal). The first `=` in a segment separates key from\n * value; later `=` characters are preserved in the value.\n */\nexport function parseKeyValArg(raw: string): FieldMap {\n const segments = splitTopLevel(raw);\n const merged: string[] = [];\n for (const seg of segments) {\n if (!seg.includes(\"=\") && merged.length > 0) {\n merged[merged.length - 1] += \",\" + seg;\n } else {\n merged.push(seg);\n }\n }\n\n const fields: FieldMap = {};\n for (const seg of merged) {\n const trimmed = seg.trim();\n if (trimmed === \"\") continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) {\n // A bare flag without a value → empty string value.\n fields[trimmed] = \"\";\n continue;\n }\n const key = trimmed.slice(0, eq).trim();\n const value = trimmed.slice(eq + 1).trim();\n if (key) fields[key] = value;\n }\n return fields;\n}\n","/**\n * Security utilities. ReTeX renders untrusted markup to HTML, so every text\n * node and attribute value must be escaped, and every URL must be vetted\n * before it reaches an `href`/`src`. The engine never evaluates source as\n * code — there is no `eval`, `Function`, or template-string interpolation of\n * user input into executable contexts.\n */\n\n/** HTML text-content escaping. Order matters: ampersand first. */\nexport function escapeHtml(input: string): string {\n return input\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\n/** Escaping for values placed inside double-quoted HTML attributes. */\nexport function escapeAttribute(input: string): string {\n return escapeHtml(input);\n}\n\n/** Protocols we consider safe for links. */\nconst SAFE_PROTOCOLS = new Set([\"http:\", \"https:\", \"mailto:\", \"tel:\", \"ftp:\", \"sms:\"]);\n\n/**\n * Matches the leading `scheme:` of a URL. We strip ASCII control characters\n * and whitespace first because browsers ignore them inside the scheme\n * (`java\\tscript:` is a classic bypass).\n */\nconst SCHEME_RE = /^([a-z][a-z0-9+.-]*):/i;\n\n/** Matches ASCII control characters (0x00–0x1F and 0x7F). */\n// eslint-disable-next-line no-control-regex\nconst CONTROL_CHARS_RE = /[\\x00-\\x1f\\x7f]/g;\n\nexport interface UrlSanitizeResult {\n /** Safe URL, or `\"#\"` when the input was rejected. */\n safe: string;\n /** True when the original URL was blocked. */\n blocked: boolean;\n /** The detected scheme, when present. */\n scheme?: string;\n}\n\n/**\n * Sanitize a URL for use in an `href`.\n *\n * - Relative URLs and fragments are allowed as-is.\n * - Absolute URLs are allowed only for an allow-listed protocol.\n * - `javascript:`, `data:`, `vbscript:`, `file:` and friends are blocked.\n * - Control characters used to obfuscate the scheme are removed first.\n */\nexport function sanitizeUrl(input: string): UrlSanitizeResult {\n const raw = String(input ?? \"\").trim();\n\n // Strip ASCII control characters (incl. tabs/newlines) that browsers ignore\n // and that are commonly used to hide a `javascript:` scheme, e.g.\n // `java\\tscript:alert(1)`. They are removed from the emitted value too.\n const cleaned = raw.replace(CONTROL_CHARS_RE, \"\");\n\n const match = SCHEME_RE.exec(cleaned);\n if (!match) {\n // No scheme → relative URL, fragment, query, or protocol-relative.\n return { safe: cleaned, blocked: false };\n }\n\n const scheme = match[1]!.toLowerCase() + \":\";\n if (SAFE_PROTOCOLS.has(scheme)) {\n return { safe: cleaned, blocked: false, scheme };\n }\n\n return { safe: \"#\", blocked: true, scheme };\n}\n\n/**\n * Validate a CSS color token. Accepts `#rgb`, `#rrggbb`, `#rrggbbaa`,\n * `rgb()/rgba()/hsl()/hsla()` functional notation, and a curated set of\n * CSS named colors. Anything else is rejected so it can't smuggle\n * `url(javascript:…)` or `expression(...)` into a `style` attribute.\n */\nexport function isSafeColor(value: string): boolean {\n const v = value.trim();\n if (/^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(v)) return true;\n if (/^(rgb|rgba|hsl|hsla)\\(\\s*[0-9.,%\\s/]+\\)$/i.test(v)) return true;\n return CSS_NAMED_COLORS.has(v.toLowerCase());\n}\n\n/**\n * Validate a CSS length/dimension such as `14pt`, `1.5rem`, `40%`, `200px`.\n * Used for `\\fontsize`, `\\column` widths and spacing commands.\n */\nexport function isSafeDimension(value: string): boolean {\n return /^-?\\d*\\.?\\d+(px|pt|em|rem|ex|ch|vw|vh|vmin|vmax|cm|mm|in|pc|%|fr)?$/.test(\n value.trim(),\n );\n}\n\n/**\n * Sanitize a value destined for a CSS property. Returns `undefined` when the\n * value is unsafe so callers can omit the declaration entirely.\n */\nexport function sanitizeStyleValue(value: string): string | undefined {\n const v = value.trim();\n if (/[<>;{}]/.test(v) || /expression|url\\s*\\(|javascript:/i.test(v)) {\n return undefined;\n }\n return v;\n}\n\n/** A pragmatic subset of CSS named colors. */\nexport const CSS_NAMED_COLORS = new Set([\n \"black\",\n \"silver\",\n \"gray\",\n \"grey\",\n \"white\",\n \"maroon\",\n \"red\",\n \"purple\",\n \"fuchsia\",\n \"green\",\n \"lime\",\n \"olive\",\n \"yellow\",\n \"navy\",\n \"blue\",\n \"teal\",\n \"aqua\",\n \"cyan\",\n \"magenta\",\n \"orange\",\n \"pink\",\n \"brown\",\n \"gold\",\n \"indigo\",\n \"violet\",\n \"tan\",\n \"beige\",\n \"ivory\",\n \"coral\",\n \"salmon\",\n \"khaki\",\n \"crimson\",\n \"turquoise\",\n \"lavender\",\n \"plum\",\n \"orchid\",\n \"slateblue\",\n \"slategray\",\n \"steelblue\",\n \"skyblue\",\n \"royalblue\",\n \"midnightblue\",\n \"darkblue\",\n \"darkgreen\",\n \"darkred\",\n \"darkgray\",\n \"darkgrey\",\n \"lightgray\",\n \"lightgrey\",\n \"lightblue\",\n \"transparent\",\n \"currentcolor\",\n \"inherit\",\n]);\n","/**\n * Icon registry. Icons are stored as the inner markup of a `0 0 24 24` SVG and\n * use `currentColor` so they inherit surrounding text color. The set is\n * intentionally small and extensible via {@link registerIcon} / plugins.\n *\n * Glyphs are simplified, original representations (not vendor logo artwork) so\n * the package carries no third-party asset licensing.\n */\n\nexport interface IconDefinition {\n /** Inner SVG markup (paths/shapes) with a `0 0 24 24` viewBox. */\n body: string;\n /** Whether shapes are stroked (true) or filled (false). */\n stroked?: boolean;\n /** Aliases that resolve to this icon. */\n aliases?: string[];\n}\n\nconst ICONS: Record<string, IconDefinition> = {\n github: {\n body: '<path d=\"M12 1.5A10.5 10.5 0 0 0 8.7 22c.5.1.7-.2.7-.5v-2c-2.9.6-3.5-1.3-3.5-1.3-.5-1.2-1.2-1.5-1.2-1.5-.9-.6.1-.6.1-.6 1 .1 1.6 1 1.6 1 .9 1.6 2.4 1.1 3 .9.1-.7.4-1.1.7-1.4-2.3-.3-4.8-1.2-4.8-5.2 0-1.2.4-2.1 1-2.9-.1-.3-.5-1.3.1-2.7 0 0 .9-.3 2.8 1.1a9.6 9.6 0 0 1 5 0c1.9-1.4 2.8-1.1 2.8-1.1.6 1.4.2 2.4.1 2.7.7.8 1 1.7 1 2.9 0 4-2.5 4.9-4.8 5.2.4.3.7 1 .7 2v3c0 .3.2.6.7.5A10.5 10.5 0 0 0 12 1.5Z\"/>',\n },\n linkedin: {\n body: '<path d=\"M20.5 2h-17A1.5 1.5 0 0 0 2 3.5v17A1.5 1.5 0 0 0 3.5 22h17a1.5 1.5 0 0 0 1.5-1.5v-17A1.5 1.5 0 0 0 20.5 2ZM8 19H5v-9h3v9ZM6.5 8.7A1.7 1.7 0 1 1 6.5 5.3a1.7 1.7 0 0 1 0 3.4ZM19 19h-3v-4.7c0-1.1 0-2.6-1.6-2.6s-1.8 1.2-1.8 2.5V19h-3v-9h2.9v1.2h.04a3.2 3.2 0 0 1 2.9-1.6c3.1 0 3.7 2 3.7 4.7V19Z\"/>',\n },\n email: {\n body: '<path d=\"M3 5h18a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1Zm.4 2 8.6 6 8.6-6H3.4ZM20 8.2l-7.4 5.2a1 1 0 0 1-1.2 0L4 8.2V17h16V8.2Z\"/>',\n aliases: [\"mail\", \"envelope\"],\n },\n phone: {\n body: '<path d=\"M6.6 10.8a15.5 15.5 0 0 0 6.6 6.6l2.2-2.2a1 1 0 0 1 1-.25 11.4 11.4 0 0 0 3.6.58 1 1 0 0 1 1 1V20a1 1 0 0 1-1 1A17 17 0 0 1 3 4a1 1 0 0 1 1-1h3.5a1 1 0 0 1 1 1 11.4 11.4 0 0 0 .57 3.6 1 1 0 0 1-.25 1l-2.2 2.2Z\"/>',\n aliases: [\"tel\", \"telephone\"],\n },\n location: {\n body: '<path d=\"M12 2a7 7 0 0 0-7 7c0 5 7 13 7 13s7-8 7-13a7 7 0 0 0-7-7Zm0 9.5A2.5 2.5 0 1 1 12 6.5a2.5 2.5 0 0 1 0 5Z\"/>',\n aliases: [\"map\", \"pin\", \"marker\", \"geo\"],\n },\n website: {\n body: '<path d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm6.9 6h-2.9a15.7 15.7 0 0 0-1.3-3.4A8 8 0 0 1 18.9 8ZM12 4c.8 1.1 1.5 2.5 1.9 4h-3.8c.4-1.5 1.1-2.9 1.9-4ZM4.3 14a8 8 0 0 1 0-4h3.3a17.6 17.6 0 0 0 0 4H4.3Zm.8 2h2.9a15.7 15.7 0 0 0 1.3 3.4A8 8 0 0 1 5.1 16Zm2.9-8H5.1a8 8 0 0 1 4.2-3.4A15.7 15.7 0 0 0 8 8Zm4 12c-.8-1.1-1.5-2.5-1.9-4h3.8c-.4 1.5-1.1 2.9-1.9 4Zm2.3-6h-4.6a15.3 15.3 0 0 1 0-4h4.6a15.3 15.3 0 0 1 0 4Zm.4 5.4a15.7 15.7 0 0 0 1.3-3.4h2.9a8 8 0 0 1-4.2 3.4ZM16.4 14a17.6 17.6 0 0 0 0-4h3.3a8 8 0 0 1 0 4h-3.3Z\"/>',\n aliases: [\"globe\", \"web\", \"link\", \"url\"],\n },\n twitter: {\n body: '<path d=\"M22 5.9c-.7.3-1.5.6-2.3.7a4 4 0 0 0 1.8-2.2c-.8.5-1.7.8-2.6 1a4 4 0 0 0-6.8 3.6A11.3 11.3 0 0 1 3.9 4.8a4 4 0 0 0 1.2 5.3c-.6 0-1.2-.2-1.8-.5a4 4 0 0 0 3.2 3.9c-.6.1-1.2.2-1.8.1a4 4 0 0 0 3.7 2.8A8 8 0 0 1 2 18.1 11.3 11.3 0 0 0 8.1 20c7.4 0 11.5-6.2 11.5-11.5v-.5c.8-.6 1.5-1.3 2-2.1Z\"/>',\n aliases: [\"x\"],\n },\n gitlab: {\n body: '<path d=\"m21.9 13.1-1.1-3.4-2.2-6.8a.6.6 0 0 0-1.1 0l-2.2 6.8H8.7L6.5 2.9a.6.6 0 0 0-1.1 0L3.2 9.7l-1.1 3.4a1.2 1.2 0 0 0 .4 1.3l9.5 6.9 9.5-6.9a1.2 1.2 0 0 0 .4-1.3Z\"/>',\n },\n stackoverflow: {\n body: '<path d=\"M17 21v-6h2v8H4v-8h2v6h11ZM7 17h9v-2H7v2Zm.3-4.2 8.8 1.8.4-2-8.8-1.8-.4 2Zm1.2-4.4 8.1 3.8.8-1.8-8.1-3.8-.8 1.8Zm2.5-4 6.9 5.7 1.3-1.5-6.9-5.7-1.3 1.5ZM15.6 1l-1.6 1.2 5.3 7.2 1.6-1.2L15.6 1Z\"/>',\n aliases: [\"stack-overflow\", \"so\"],\n },\n scholar: {\n body: '<path d=\"M12 2 1 9l11 7 9-5.7V17h2V9L12 2ZM5 14.2V18c0 1.7 3.1 3 7 3s7-1.3 7-3v-3.8l-7 4.4-7-4.4Z\"/>',\n aliases: [\"google-scholar\", \"academic\"],\n },\n orcid: {\n body: '<path d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20ZM8.5 7.6a1.1 1.1 0 1 1 0 2.2 1.1 1.1 0 0 1 0-2.2ZM9.5 17h-2v-6.2h2V17Zm2-6.2h3.3c2.2 0 3.6 1.5 3.6 3.1 0 1.8-1.4 3.1-3.6 3.1H11.5v-6.2Zm2 1.7v2.8h1.1c1.2 0 1.8-.6 1.8-1.4s-.6-1.4-1.8-1.4h-1.1Z\"/>',\n },\n calendar: {\n body: '<path d=\"M7 2v2H5a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2h-2V2h-2v2H9V2H7ZM5 9h14v10H5V9Z\"/>',\n aliases: [\"date\"],\n },\n briefcase: {\n body: '<path d=\"M9 3a2 2 0 0 0-2 2v1H4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-3V5a2 2 0 0 0-2-2H9Zm0 3V5h6v1H9Z\"/>',\n aliases: [\"work\", \"job\"],\n },\n};\n\n// Build the alias lookup once.\nconst ALIASES: Record<string, string> = {};\nfor (const [name, def] of Object.entries(ICONS)) {\n for (const alias of def.aliases ?? []) ALIASES[alias] = name;\n}\n\n/** Resolve a (possibly aliased) icon name to its canonical key. */\nexport function resolveIconName(name: string): string | undefined {\n const key = name.trim().toLowerCase();\n if (ICONS[key]) return key;\n if (ALIASES[key]) return ALIASES[key];\n return undefined;\n}\n\nexport function hasIcon(name: string): boolean {\n return resolveIconName(name) !== undefined;\n}\n\nexport function getIcon(name: string): IconDefinition | undefined {\n const key = resolveIconName(name);\n return key ? ICONS[key] : undefined;\n}\n\n/** Register (or override) an icon at runtime. Used by plugins. */\nexport function registerIcon(name: string, def: IconDefinition): void {\n const key = name.trim().toLowerCase();\n ICONS[key] = def;\n for (const alias of def.aliases ?? []) ALIASES[alias] = key;\n}\n\n/** All canonical icon names, for completion / docs. */\nexport function iconNames(): string[] {\n return Object.keys(ICONS);\n}\n\n/**\n * Render an icon to an inline SVG string. Returns `null` for unknown icons so\n * callers can emit a diagnostic and a graceful fallback.\n */\nexport function iconToSvg(\n name: string,\n opts: { size?: number | string; className?: string } = {},\n): string | null {\n const def = getIcon(name);\n if (!def) return null;\n const size = opts.size ?? \"1em\";\n const dim = typeof size === \"number\" ? `${size}` : size;\n const cls = opts.className ? ` class=\"${opts.className}\"` : \"\";\n const fillOrStroke = def.stroked\n ? 'fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"'\n : 'fill=\"currentColor\"';\n return (\n `<svg${cls} width=\"${dim}\" height=\"${dim}\" viewBox=\"0 0 24 24\" ` +\n `${fillOrStroke} role=\"img\" aria-hidden=\"true\" focusable=\"false\">` +\n `${def.body}</svg>`\n );\n}\n","import type {\n CommandDefinition,\n EnvironmentDefinition,\n ContactField,\n Node,\n ColumnNode,\n ListItemNode,\n Position,\n SourceRange,\n FieldMap,\n Diagnostic,\n} from \"../types/index.js\";\nimport { DiagnosticSeverity, DiagnosticCode } from \"../types/diagnostics.js\";\nimport { CommandRegistry } from \"./registry.js\";\nimport { parseKeyValArg, parseListArg } from \"./args.js\";\nimport { isSafeColor, isSafeDimension } from \"../security/sanitize.js\";\nimport { hasIcon } from \"../icons/icons.js\";\n\n/* ----------------------------- typography ----------------------------- */\n\nconst mark = (\n name: string,\n type: \"bold\" | \"italic\" | \"underline\" | \"strike\",\n summary: string,\n): CommandDefinition => ({\n name,\n category: \"inline\",\n args: [{ kind: \"content\", name: \"content\" }],\n summary,\n example: `\\\\${name}{...}`,\n build: ({ args }) => ({ type, children: args[0]?.children ?? [] }) as Node,\n});\n\nconst scaleSwitch = (\n name: string,\n scale: \"small\" | \"large\" | \"Large\" | \"Huge\",\n): CommandDefinition => ({\n name,\n category: \"switch\",\n scoped: true,\n summary: `Set the font size to \"${name}\" for the rest of the group.`,\n example: `{\\\\${name} ...}`,\n build: ({ scope }) => ({ type: \"fontscale\", scale, children: scope }),\n});\n\nconst TYPOGRAPHY: CommandDefinition[] = [\n mark(\"textbf\", \"bold\", \"Bold text.\"),\n mark(\"textit\", \"italic\", \"Italic text.\"),\n mark(\"emph\", \"italic\", \"Emphasized (italic) text.\"),\n mark(\"underline\", \"underline\", \"Underlined text.\"),\n mark(\"sout\", \"strike\", \"Struck-through text.\"),\n\n {\n name: \"textcolor\",\n category: \"inline\",\n args: [\n { kind: \"string\", name: \"color\", format: \"color\" },\n { kind: \"content\", name: \"content\" },\n ],\n summary: \"Color text with a hex/named color.\",\n example: \"\\\\textcolor{#2563eb}{OpenAI}\",\n build: ({ args, utils, report }) => {\n const color = utils.textOf(args[0]).trim();\n if (color && !isSafeColor(color)) {\n report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.InvalidColor,\n message: `\"${color}\" is not a recognized color; it will be ignored.`,\n range: args[0]?.range ?? ZERO_RANGE,\n });\n }\n return {\n type: \"color\",\n color: isSafeColor(color) ? color : \"\",\n children: args[1]?.children ?? [],\n };\n },\n },\n {\n name: \"fontsize\",\n category: \"inline\",\n args: [\n { kind: \"string\", name: \"size\", format: \"dimension\" },\n { kind: \"content\", name: \"content\" },\n ],\n summary: \"Set an explicit font size for the wrapped content.\",\n example: \"\\\\fontsize{14pt}{Custom Size}\",\n build: ({ args, utils, report }) => {\n const size = utils.textOf(args[0]).trim();\n if (size && !isSafeDimension(size)) {\n report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.InvalidDimension,\n message: `\"${size}\" is not a valid dimension.`,\n range: args[0]?.range ?? ZERO_RANGE,\n });\n }\n return {\n type: \"fontsize\",\n size: isSafeDimension(size) ? size : \"1em\",\n children: args[1]?.children ?? [],\n };\n },\n },\n {\n name: \"fontfamily\",\n category: \"inline\",\n args: [\n { kind: \"string\", name: \"family\" },\n { kind: \"content\", name: \"content\" },\n ],\n summary: \"Set the font family for the wrapped content.\",\n example: \"\\\\fontfamily{Georgia}{Serif text}\",\n build: ({ args, utils }) => ({\n type: \"fontfamily\",\n family: utils.textOf(args[0]).trim() || \"inherit\",\n children: args[1]?.children ?? [],\n }),\n },\n {\n name: \"themecolor\",\n category: \"inline\",\n args: [\n { kind: \"string\", name: \"token\" },\n { kind: \"content\", name: \"content\" },\n ],\n summary: \"Color text using a token from the active theme.\",\n example: \"\\\\themecolor{primary}{Highlighted}\",\n build: ({ args, utils }) => ({\n type: \"themecolor\",\n token: utils.textOf(args[0]).trim() || \"primary\",\n children: args[1]?.children ?? [],\n }),\n },\n\n scaleSwitch(\"small\", \"small\"),\n scaleSwitch(\"large\", \"large\"),\n scaleSwitch(\"Large\", \"Large\"),\n scaleSwitch(\"Huge\", \"Huge\"),\n {\n name: \"normalsize\",\n category: \"switch\",\n scoped: true,\n summary: \"Reset the font size to the document base size.\",\n build: ({ scope }) => ({ type: \"fontscale\", scale: \"normal\", children: scope }),\n },\n {\n name: \"bfseries\",\n category: \"switch\",\n scoped: true,\n summary: \"Switch to bold for the rest of the group.\",\n build: ({ scope }) => ({ type: \"bold\", children: scope }),\n },\n {\n name: \"itshape\",\n category: \"switch\",\n scoped: true,\n summary: \"Switch to italic for the rest of the group.\",\n build: ({ scope }) => ({ type: \"italic\", children: scope }),\n },\n {\n name: \"ttfamily\",\n category: \"switch\",\n scoped: true,\n summary: \"Switch to a monospace font for the rest of the group.\",\n build: ({ scope }) => ({\n type: \"fontfamily\",\n family: \"monospace\",\n children: scope,\n }),\n },\n];\n\n/* ------------------------------ hyperlinks ---------------------------- */\n\nconst LINKS: CommandDefinition[] = [\n {\n name: \"href\",\n category: \"inline\",\n args: [\n { kind: \"string\", name: \"url\", format: \"url\" },\n { kind: \"content\", name: \"label\" },\n ],\n summary: \"A hyperlink with custom label text.\",\n example: \"\\\\href{https://github.com/you}{GitHub}\",\n build: ({ args, utils }) => {\n const raw = utils.textOf(args[0]).trim();\n return {\n type: \"link\",\n href: utils.safeUrl(raw),\n rawHref: raw,\n children: args[1]?.children ?? [],\n };\n },\n },\n {\n name: \"url\",\n category: \"inline\",\n args: [{ kind: \"string\", name: \"url\", format: \"url\" }],\n summary: \"A hyperlink that displays its own URL.\",\n example: \"\\\\url{https://linkedin.com/in/you}\",\n build: ({ args, utils }) => {\n const raw = utils.textOf(args[0]).trim();\n return { type: \"url\", href: utils.safeUrl(raw), rawHref: raw };\n },\n },\n];\n\n/* ------------------------------- sections ----------------------------- */\n\nconst SECTIONS: CommandDefinition[] = [\n {\n name: \"section\",\n category: \"block\",\n args: [{ kind: \"string\", name: \"title\" }],\n summary: \"A top-level resume section.\",\n example: \"\\\\section{Experience}\",\n build: ({ args, utils }) => ({\n type: \"section\",\n title: utils.textOf(args[0]).trim(),\n level: 1,\n }),\n },\n {\n name: \"subsection\",\n category: \"block\",\n args: [{ kind: \"string\", name: \"title\" }],\n summary: \"A second-level section heading.\",\n example: \"\\\\subsection{Open Source}\",\n build: ({ args, utils }) => ({\n type: \"section\",\n title: utils.textOf(args[0]).trim(),\n level: 2,\n }),\n },\n];\n\n/* --------------------------- contact / header ------------------------- */\n\nconst CONTACT_FIELDS: Array<{ cmd: string; field: ContactField; summary: string }> = [\n { cmd: \"name\", field: \"name\", summary: \"Your full name (document header).\" },\n { cmd: \"title\", field: \"title\", summary: \"Professional headline / role.\" },\n { cmd: \"email\", field: \"email\", summary: \"Contact email (rendered as a mailto link).\" },\n { cmd: \"phone\", field: \"phone\", summary: \"Contact phone number.\" },\n { cmd: \"location\", field: \"location\", summary: \"City / location.\" },\n { cmd: \"website\", field: \"website\", summary: \"Personal website (rendered as a link).\" },\n];\n\nconst CONTACT: CommandDefinition[] = CONTACT_FIELDS.map(({ cmd, field, summary }) => ({\n name: cmd,\n category: \"meta\",\n args: [{ kind: \"string\", name: cmd }],\n summary,\n example: `\\\\${cmd}{...}`,\n build: ({ args, utils }) =>\n ({ type: \"contact\", field, value: utils.textOf(args[0]).trim() }) as Node,\n}));\n\n/* --------------------------- resume entries --------------------------- */\n\nconst zero: Position = { offset: 0, line: 1, column: 1 };\nconst ZERO_RANGE: SourceRange = { start: zero, end: zero };\n\ntype Report = (d: Omit<Diagnostic, \"source\">) => void;\n\nconst requireFields = (\n report: Report,\n fields: FieldMap,\n required: string[],\n range: SourceRange,\n): void => {\n for (const key of required) {\n if (!fields[key]) {\n report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.MissingRequiredField,\n message: `Missing recommended field \"${key}\".`,\n range,\n });\n }\n }\n};\n\nconst ENTRIES: CommandDefinition[] = [\n {\n name: \"job\",\n category: \"block\",\n args: [\n { kind: \"keyval\", name: \"fields\" },\n { kind: \"content\", name: \"body\", optional: true },\n ],\n summary: \"A work-experience entry.\",\n example:\n \"\\\\job{title=Senior Engineer, company=OpenAI, start=2023, end=Present}{Built AI systems}\",\n build: ({ args, report }) => {\n const fields = parseKeyValArg(args[0]?.raw ?? \"\");\n const r = args[0]?.range ?? ZERO_RANGE;\n requireFields(report, fields, [\"title\", \"company\"], r);\n return { type: \"job\", fields, children: args[1]?.children ?? [] };\n },\n },\n {\n name: \"education\",\n category: \"block\",\n args: [\n { kind: \"keyval\", name: \"fields\" },\n { kind: \"content\", name: \"body\", optional: true },\n ],\n summary: \"An education entry.\",\n example: \"\\\\education{school=MIT, degree=BS Computer Science, start=2018, end=2022}\",\n build: ({ args, report }) => {\n const fields = parseKeyValArg(args[0]?.raw ?? \"\");\n const r = args[0]?.range ?? ZERO_RANGE;\n requireFields(report, fields, [\"school\", \"degree\"], r);\n return { type: \"education\", fields, children: args[1]?.children ?? [] };\n },\n },\n {\n name: \"project\",\n category: \"block\",\n args: [\n { kind: \"keyval\", name: \"fields\" },\n { kind: \"content\", name: \"body\", optional: true },\n ],\n summary: \"A project entry.\",\n example: \"\\\\project{name=ReTeX, url=https://github.com/you/retex}{A resume engine}\",\n build: ({ args, report }) => {\n const fields = parseKeyValArg(args[0]?.raw ?? \"\");\n const r = args[0]?.range ?? ZERO_RANGE;\n requireFields(report, fields, [\"name\"], r);\n return { type: \"project\", fields, children: args[1]?.children ?? [] };\n },\n },\n {\n name: \"skills\",\n category: \"block\",\n args: [{ kind: \"list\", name: \"skills\" }],\n summary: \"A comma-separated list of skills.\",\n example: \"\\\\skills{JavaScript, TypeScript, React, Node.js, AWS}\",\n build: ({ args }) => ({ type: \"skills\", items: parseListArg(args[0]?.raw ?? \"\") }),\n },\n];\n\n/* -------------------------------- icons ------------------------------- */\n\nconst ICONS: CommandDefinition[] = [\n {\n name: \"icon\",\n category: \"inline\",\n args: [{ kind: \"string\", name: \"name\" }],\n summary: \"Inline SVG icon (github, linkedin, email, phone, …).\",\n example: \"\\\\icon{github}\",\n build: ({ args, utils, report }) => {\n const name = utils.textOf(args[0]).trim().toLowerCase();\n if (name && !hasIcon(name)) {\n report({\n severity: DiagnosticSeverity.Info,\n code: DiagnosticCode.UnknownIcon,\n message: `Unknown icon \"${name}\".`,\n range: args[0]?.range ?? ZERO_RANGE,\n });\n }\n return { type: \"icon\", name };\n },\n },\n];\n\n/* ------------------------------ primitives ---------------------------- */\n\nconst PRIMITIVES: CommandDefinition[] = [\n {\n name: \"newline\",\n category: \"inline\",\n summary: \"An explicit line break.\",\n build: () => ({ type: \"linebreak\" }),\n },\n {\n name: \"linebreak\",\n category: \"inline\",\n summary: \"An explicit line break.\",\n build: () => ({ type: \"linebreak\" }),\n },\n {\n name: \"hrule\",\n category: \"block\",\n summary: \"A horizontal rule / divider.\",\n build: () => ({ type: \"rule\" }),\n },\n {\n name: \"divider\",\n category: \"block\",\n summary: \"A horizontal rule / divider.\",\n build: () => ({ type: \"rule\" }),\n },\n {\n name: \"vspace\",\n category: \"block\",\n args: [{ kind: \"string\", name: \"size\", format: \"dimension\" }],\n summary: \"Vertical space.\",\n example: \"\\\\vspace{1em}\",\n build: ({ args, utils }) => ({\n type: \"space\",\n axis: \"vertical\",\n size: utils.textOf(args[0]).trim() || \"1em\",\n }),\n },\n {\n name: \"hspace\",\n category: \"inline\",\n args: [{ kind: \"string\", name: \"size\", format: \"dimension\" }],\n summary: \"Horizontal space.\",\n example: \"\\\\hspace{1em}\",\n build: ({ args, utils }) => ({\n type: \"space\",\n axis: \"horizontal\",\n size: utils.textOf(args[0]).trim() || \"1em\",\n }),\n },\n // `\\item` and `\\column` are consumed by their environments; they are\n // registered so they are recognized (and so the validator can flag misuse\n // outside the right environment) but have no standalone builder.\n {\n name: \"item\",\n category: \"block\",\n summary: \"A list item (inside itemize/enumerate).\",\n example: \"\\\\item Built distributed systems\",\n },\n {\n name: \"column\",\n category: \"block\",\n args: [{ kind: \"string\", name: \"width\", format: \"dimension\" }],\n summary: \"A column (inside the columns environment).\",\n example: \"\\\\column{40%}\",\n },\n];\n\n/* ----------------------------- environments --------------------------- */\n\nconst ENVIRONMENTS: EnvironmentDefinition[] = [\n {\n name: \"itemize\",\n itemCommand: \"item\",\n allowedChildren: [\"item\"],\n summary: \"A bulleted list.\",\n example: \"\\\\begin{itemize}\\n \\\\item ...\\n\\\\end{itemize}\",\n build: ({ entries }) => ({\n type: \"list\",\n kind: \"itemize\",\n items: (entries ?? []).map(\n (e): ListItemNode => ({ type: \"item\", children: e.content }),\n ),\n }),\n },\n {\n name: \"enumerate\",\n itemCommand: \"item\",\n allowedChildren: [\"item\"],\n summary: \"A numbered list.\",\n example: \"\\\\begin{enumerate}\\n \\\\item ...\\n\\\\end{enumerate}\",\n build: ({ entries }) => ({\n type: \"list\",\n kind: \"enumerate\",\n items: (entries ?? []).map(\n (e): ListItemNode => ({ type: \"item\", children: e.content }),\n ),\n }),\n },\n {\n name: \"columns\",\n itemCommand: \"column\",\n allowedChildren: [\"column\"],\n summary: \"A multi-column layout.\",\n example:\n \"\\\\begin{columns}\\n \\\\column{40%} Left\\n \\\\column{60%} Right\\n\\\\end{columns}\",\n build: ({ entries, utils }) => ({\n type: \"columns\",\n columns: (entries ?? []).map((e): ColumnNode => {\n const width = utils.textOf(e.marker.args[0]).trim() || \"auto\";\n return { type: \"column\", width, children: e.content };\n }),\n }),\n },\n {\n name: \"center\",\n summary: \"Center-align the contained block content.\",\n example: \"\\\\begin{center} ... \\\\end{center}\",\n build: ({ body }) => ({\n type: \"command\",\n name: \"center\",\n args: [{ kind: \"required\", children: body }],\n }),\n },\n];\n\n/**\n * Register every built-in command and environment into a fresh registry.\n * The engine calls this once per instance so plugins can extend a private\n * copy without touching global state.\n */\nexport function createDefaultRegistry(): CommandRegistry {\n const registry = new CommandRegistry();\n for (const def of [\n ...TYPOGRAPHY,\n ...LINKS,\n ...SECTIONS,\n ...CONTACT,\n ...ENTRIES,\n ...ICONS,\n ...PRIMITIVES,\n ]) {\n registry.registerCommand(def);\n }\n for (const env of ENVIRONMENTS) registry.registerEnvironment(env);\n return registry;\n}\n","import {\n isParent,\n type Node,\n type ParentNode,\n type ListNode,\n type ColumnsNode,\n} from \"../types/ast.js\";\n\n/** Return the child nodes of any node, regardless of where they're stored. */\nexport function childrenOf(node: Node): Node[] {\n if (node.type === \"list\") return (node as ListNode).items;\n if (node.type === \"columns\") return (node as ColumnsNode).columns;\n if (isParent(node)) return (node as ParentNode).children;\n return [];\n}\n\nexport interface VisitOptions {\n /** Called before visiting children. Return `false` to skip the subtree. */\n enter?: (node: Node, parent: Node | null) => boolean | void;\n /** Called after visiting children. */\n exit?: (node: Node, parent: Node | null) => void;\n}\n\n/** Depth-first traversal of the tree. */\nexport function walk(root: Node, opts: VisitOptions): void {\n const visit = (node: Node, parent: Node | null): void => {\n const descend = opts.enter ? opts.enter(node, parent) : undefined;\n if (descend !== false) {\n for (const child of childrenOf(node)) visit(child, node);\n }\n opts.exit?.(node, parent);\n };\n visit(root, null);\n}\n\n/** Collect every node matching a predicate. */\nexport function collect(root: Node, pred: (n: Node) => boolean): Node[] {\n const out: Node[] = [];\n walk(root, {\n enter(n) {\n if (pred(n)) out.push(n);\n },\n });\n return out;\n}\n\n/** Find the innermost node whose range contains `offset`, plus its ancestors. */\nexport function nodePathAt(root: Node, offset: number): Node[] {\n const path: Node[] = [];\n const visit = (node: Node): boolean => {\n const r = node.range;\n if (r && (offset < r.start.offset || offset > r.end.offset)) return false;\n path.push(node);\n for (const child of childrenOf(node)) {\n if (visit(child)) break;\n }\n return true;\n };\n visit(root);\n return path;\n}\n","import type { Node } from \"../types/ast.js\";\nimport { childrenOf } from \"./walk.js\";\n\n/**\n * Best-effort extraction of the plain-text content of a node or node list.\n * Used to derive section titles, contact values, and accessible labels, and\n * by `keyval`/`list` argument parsing.\n */\nexport function flattenText(input: Node | Node[]): string {\n const nodes = Array.isArray(input) ? input : [input];\n let out = \"\";\n for (const node of nodes) {\n switch (node.type) {\n case \"text\":\n out += node.value;\n break;\n case \"linebreak\":\n out += \" \";\n break;\n case \"parbreak\":\n out += \"\\n\\n\";\n break;\n case \"url\":\n out += node.href;\n break;\n case \"icon\":\n out += \"\";\n break;\n default:\n out += flattenText(childrenOf(node));\n }\n }\n return out;\n}\n\n/** Collapse internal runs of whitespace and trim — useful for titles/labels. */\nexport function normalizeWhitespace(s: string): string {\n return s.replace(/\\s+/g, \" \").trim();\n}\n","/** Damerau-ish Levenshtein distance (no transpositions) for \"did you mean?\". */\nexport function levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (m === 0) return n;\n if (n === 0) return m;\n let prev = new Array<number>(n + 1);\n let curr = new Array<number>(n + 1);\n for (let j = 0; j <= n; j++) prev[j] = j;\n for (let i = 1; i <= m; i++) {\n curr[0] = i;\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(prev[j]! + 1, curr[j - 1]! + 1, prev[j - 1]! + cost);\n }\n [prev, curr] = [curr, prev];\n }\n return prev[n]!;\n}\n\n/** Return the closest candidate to `name` within a small edit distance. */\nexport function closestMatch(\n name: string,\n candidates: Iterable<string>,\n): string | undefined {\n let best: string | undefined;\n let bestDist = Infinity;\n const threshold = Math.max(2, Math.floor(name.length / 3) + 1);\n for (const c of candidates) {\n const d = levenshtein(name.toLowerCase(), c.toLowerCase());\n if (d < bestDist) {\n bestDist = d;\n best = c;\n }\n }\n return best !== undefined && bestDist <= threshold ? best : undefined;\n}\n","import {\n TokenType,\n DiagnosticSeverity,\n DiagnosticCode,\n type Token,\n type Position,\n type SourceRange,\n type Diagnostic,\n type Node,\n type DocumentNode,\n type GroupNode,\n type ArgumentNode,\n type CommandNode,\n type ArgSpec,\n type CommandDefinition,\n type EnvEntry,\n type BuilderUtils,\n} from \"../types/index.js\";\nimport { CommandRegistry } from \"./registry.js\";\nimport { createDefaultRegistry } from \"./builtins.js\";\nimport { flattenText } from \"../ast/text.js\";\nimport { sanitizeUrl } from \"../security/sanitize.js\";\nimport { closestMatch } from \"./suggest.js\";\n\nexport interface ParseResult {\n ast: DocumentNode;\n diagnostics: Diagnostic[];\n}\n\nexport interface ParserOptions {\n registry?: CommandRegistry;\n /**\n * Maximum structural nesting depth before the parser stops recursing and\n * degrades gracefully (emitting a diagnostic). Guards against stack overflow\n * on adversarial input such as thousands of unclosed braces. Default 300.\n */\n maxDepth?: number;\n}\n\nconst ZERO: Position = { offset: 0, line: 1, column: 1 };\nconst ZERO_RANGE: SourceRange = { start: ZERO, end: ZERO };\n\n/**\n * Stage 2 of the pipeline. A recursive-descent parser that turns the token\n * stream into a {@link DocumentNode}. It is fully error-recovering: it never\n * throws, always returns a tree, and records every problem as a\n * {@link Diagnostic} so editors and the validator can surface them.\n */\nexport class Parser {\n private readonly tokens: Token[];\n private readonly registry: CommandRegistry;\n private readonly diagnostics: Diagnostic[] = [];\n private readonly utils: BuilderUtils;\n private pos = 0;\n private depth = 0;\n private readonly maxDepth: number;\n private reportedMaxDepth = false;\n /** Range of the command currently being built, for builder diagnostics. */\n private currentRange: SourceRange = ZERO_RANGE;\n\n constructor(tokens: Token[], options: ParserOptions = {}) {\n this.tokens = tokens;\n this.registry = options.registry ?? createDefaultRegistry();\n this.maxDepth = options.maxDepth ?? 300;\n this.utils = {\n textOf: (arg) => {\n if (!arg) return \"\";\n if (arg.raw !== undefined) return arg.raw;\n return flattenText(arg.children);\n },\n safeUrl: (url) => {\n const res = sanitizeUrl(url);\n if (res.blocked) {\n this.report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.UnsafeUrlBlocked,\n message: `Blocked unsafe URL with \"${res.scheme ?? \"unknown\"}\" scheme.`,\n range: this.currentRange,\n });\n }\n return res.safe;\n },\n };\n }\n\n static parse(tokens: Token[], options?: ParserOptions): ParseResult {\n return new Parser(tokens, options).parse();\n }\n\n parse(): ParseResult {\n const start = this.peek().range.start;\n const children = this.parseContent(() => this.at(TokenType.EOF));\n const ast: DocumentNode = {\n type: \"document\",\n children,\n range: { start, end: this.previousEnd() },\n };\n return { ast, diagnostics: this.diagnostics };\n }\n\n /* --------------------------- content loop --------------------------- */\n\n private parseContent(stop: () => boolean): Node[] {\n if (++this.depth > this.maxDepth) {\n this.depth--;\n return this.skipFlat(stop);\n }\n try {\n return this.parseContentInner(stop);\n } finally {\n this.depth--;\n }\n }\n\n private parseContentInner(stop: () => boolean): Node[] {\n const nodes: Node[] = [];\n while (!this.at(TokenType.EOF) && !stop()) {\n const tok = this.peek();\n if (tok.type === TokenType.Command) {\n const def = this.registry.getCommand(tok.value);\n if (def?.scoped) {\n const built = this.parseScopedSwitch(def, stop);\n if (Array.isArray(built)) nodes.push(...built);\n else nodes.push(built);\n break; // the switch consumed the remainder of this scope\n }\n }\n const node = this.parseNode();\n if (Array.isArray(node)) nodes.push(...node);\n else if (node) nodes.push(node);\n }\n return nodes;\n }\n\n private parseNode(): Node | Node[] | null {\n const tok = this.peek();\n switch (tok.type) {\n case TokenType.Command:\n return this.parseCommandApplication();\n case TokenType.LBrace:\n return this.parseGroup();\n case TokenType.RBrace:\n this.advance();\n this.report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.MismatchedBrace,\n message: \"Unexpected '}' with no matching '{'.\",\n range: tok.range,\n });\n return null;\n case TokenType.Text:\n this.advance();\n return { type: \"text\", value: tok.value, range: tok.range };\n case TokenType.Whitespace:\n this.advance();\n return { type: \"text\", value: \" \", range: tok.range };\n case TokenType.ParBreak:\n this.advance();\n return { type: \"parbreak\", range: tok.range };\n case TokenType.LineBreak:\n this.advance();\n return { type: \"linebreak\", range: tok.range };\n case TokenType.LBracket:\n this.advance();\n return { type: \"text\", value: \"[\", range: tok.range };\n case TokenType.RBracket:\n this.advance();\n return { type: \"text\", value: \"]\", range: tok.range };\n case TokenType.Comment:\n default:\n this.advance();\n return null;\n }\n }\n\n private parseGroup(): GroupNode {\n const open = this.advance(); // {\n const children = this.parseContent(() => this.at(TokenType.RBrace));\n const end = this.consumeClose(\n TokenType.RBrace,\n open,\n DiagnosticCode.UnterminatedGroup,\n );\n return { type: \"group\", children, range: { start: open.range.start, end } };\n }\n\n /* --------------------------- commands ------------------------------- */\n\n private parseScopedSwitch(def: CommandDefinition, stop: () => boolean): Node | Node[] {\n const start = this.advance(); // switch command\n const args = this.parseArgs(def.args ?? []);\n const scope = this.parseContent(stop);\n return this.buildCommand(def, args, scope, start);\n }\n\n private parseCommandApplication(): Node | Node[] | null {\n const start = this.advance();\n const name = start.value;\n\n if (name === \"begin\") return this.parseEnvironment(start);\n if (name === \"end\") {\n // A stray `\\end` with no open environment.\n this.skipInlineTrivia();\n const got = this.tryReadGroupRaw();\n this.report({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.MismatchedEnvironment,\n message: got\n ? `\\\\end{${got}} has no matching \\\\begin{${got}}.`\n : \"\\\\end has no matching \\\\begin.\",\n range: { start: start.range.start, end: this.previousEnd() },\n });\n return null;\n }\n\n const def = this.registry.getCommand(name);\n if (!def) {\n const args = this.parseGreedyArgs();\n const range = { start: start.range.start, end: this.previousEnd() };\n const suggestion = closestMatch(name, this.registry.commandNames());\n this.report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.UnknownCommand,\n message: suggestion\n ? `Unknown command \"\\\\${name}\". Did you mean \"\\\\${suggestion}\"?`\n : `Unknown command \"\\\\${name}\".`,\n range,\n ...(suggestion\n ? {\n fixes: [\n {\n title: `Replace with \\\\${suggestion}`,\n replacement: `\\\\${suggestion}`,\n range: start.range,\n },\n ],\n }\n : {}),\n });\n return { type: \"command\", name, args, range };\n }\n\n const args = this.parseArgs(def.args ?? []);\n return this.buildCommand(def, args, [], start);\n }\n\n private buildCommand(\n def: CommandDefinition,\n args: ArgumentNode[],\n scope: Node[],\n start: Token,\n ): Node | Node[] {\n const range: SourceRange = { start: start.range.start, end: this.previousEnd() };\n this.currentRange = range;\n const built = def.build\n ? def.build({\n name: def.name,\n args,\n scope,\n report: (d) => this.report(d),\n utils: this.utils,\n })\n : null;\n\n if (built == null) {\n return { type: \"command\", name: def.name, args, range };\n }\n if (Array.isArray(built)) {\n for (const n of built) if (!n.range) n.range = range;\n return built;\n }\n if (!built.range) built.range = range;\n return built;\n }\n\n /* --------------------------- arguments ------------------------------ */\n\n private parseArgs(specs: ArgSpec[]): ArgumentNode[] {\n const args: ArgumentNode[] = [];\n for (const spec of specs) {\n const arg = this.parseArg(spec);\n if (arg) {\n args.push(arg);\n } else if (!spec.optional) {\n this.report({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.MissingRequiredArgument,\n message: `Missing required argument${spec.name ? ` \"${spec.name}\"` : \"\"}.`,\n range: { start: this.previousEnd(), end: this.previousEnd() },\n });\n args.push({ kind: \"required\", children: [], raw: \"\", range: ZERO_RANGE });\n }\n // Absent optional arguments contribute nothing (they are always last).\n }\n return args;\n }\n\n private parseArg(spec: ArgSpec): ArgumentNode | null {\n this.skipInlineTrivia();\n const bracket = spec.delimiter === \"bracket\";\n const open = bracket ? TokenType.LBracket : TokenType.LBrace;\n const close = bracket ? TokenType.RBracket : TokenType.RBrace;\n if (!this.at(open)) return null;\n const openTok = this.advance();\n const kind = spec.optional ? \"optional\" : \"required\";\n\n if (spec.kind === \"content\") {\n const children = this.parseContent(() => this.at(close));\n const end = this.consumeClose(close, openTok, DiagnosticCode.UnterminatedArgument);\n return { kind, children, range: { start: openTok.range.start, end } };\n }\n\n const raw = this.readRawUntil(close);\n const end = this.consumeClose(close, openTok, DiagnosticCode.UnterminatedArgument);\n return { kind, children: [], raw, range: { start: openTok.range.start, end } };\n }\n\n private parseGreedyArgs(): ArgumentNode[] {\n const args: ArgumentNode[] = [];\n for (;;) {\n this.skipInlineTrivia();\n if (!this.at(TokenType.LBrace)) break;\n const openTok = this.advance();\n const children = this.parseContent(() => this.at(TokenType.RBrace));\n const end = this.consumeClose(\n TokenType.RBrace,\n openTok,\n DiagnosticCode.UnterminatedArgument,\n );\n args.push({\n kind: \"required\",\n children,\n range: { start: openTok.range.start, end },\n });\n }\n return args;\n }\n\n /** Concatenate the raw source of tokens until the matching close at depth 0. */\n private readRawUntil(close: TokenType): string {\n let raw = \"\";\n let depth = 0;\n while (!this.at(TokenType.EOF)) {\n const t = this.peek();\n if (depth === 0 && t.type === close) break;\n if (t.type === TokenType.LBrace || t.type === TokenType.LBracket) {\n depth++;\n } else if (t.type === TokenType.RBrace || t.type === TokenType.RBracket) {\n if (depth === 0) break; // unbalanced close of the other kind ends the run\n depth--;\n }\n raw += t.type === TokenType.Command ? `\\\\${t.value}` : t.value;\n this.advance();\n }\n return raw;\n }\n\n /* -------------------------- environments ---------------------------- */\n\n private parseEnvironment(beginTok: Token): Node | Node[] {\n const name = this.readGroupName();\n const options: ArgumentNode[] = [];\n let opt: ArgumentNode | null;\n while (\n (opt = this.parseArg({ kind: \"string\", optional: true, delimiter: \"bracket\" }))\n ) {\n options.push(opt);\n }\n\n const def = this.registry.getEnvironment(name);\n if (!def) {\n const body = this.parseEnvBody(name);\n const range = { start: beginTok.range.start, end: this.previousEnd() };\n const suggestion = closestMatch(name, this.registry.environmentNames());\n this.report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.UnknownEnvironment,\n message: suggestion\n ? `Unknown environment \"${name}\". Did you mean \"${suggestion}\"?`\n : `Unknown environment \"${name}\".`,\n range,\n });\n return { type: \"group\", children: body, range };\n }\n\n let body: Node[];\n let entries: EnvEntry[] | undefined;\n if (def.itemCommand) {\n entries = this.parseEnvEntries(name, def.itemCommand);\n body = entries.flatMap((e) => e.content);\n } else {\n body = this.parseEnvBody(name);\n }\n\n const range: SourceRange = { start: beginTok.range.start, end: this.previousEnd() };\n this.currentRange = range;\n const node = def.build\n ? def.build({\n name,\n body,\n entries,\n options,\n report: (d) => this.report(d),\n utils: this.utils,\n })\n : null;\n\n if (node == null) {\n return { type: \"group\", children: body, range };\n }\n if (Array.isArray(node)) {\n for (const n of node) if (!n.range) n.range = range;\n return node;\n }\n if (!node.range) node.range = range;\n return node;\n }\n\n private parseEnvBody(name: string): Node[] {\n const body = this.parseContent(() => this.atCommand(\"end\"));\n this.consumeEnd(name);\n return body;\n }\n\n private parseEnvEntries(name: string, itemCommand: string): EnvEntry[] {\n const entries: EnvEntry[] = [];\n const stop = () => this.atCommand(itemCommand) || this.atCommand(\"end\");\n\n // Tolerate (and warn about) content before the first marker.\n this.skipTrivia();\n if (!stop() && !this.at(TokenType.EOF)) {\n const stray = this.parseContent(stop);\n if (stray.some((n) => n.type !== \"text\" || n.value.trim() !== \"\")) {\n this.report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.CommandOutsideContext,\n message: `Content before the first \\\\${itemCommand} in \"${name}\" was ignored.`,\n range: stray[0]?.range ?? this.currentRange,\n });\n }\n }\n\n while (this.atCommand(itemCommand)) {\n const markerTok = this.advance();\n const def = this.registry.getCommand(itemCommand);\n const margs = this.parseArgs(def?.args ?? []);\n const marker: CommandNode = {\n type: \"command\",\n name: itemCommand,\n args: margs,\n range: { start: markerTok.range.start, end: this.previousEnd() },\n };\n const content = this.parseContent(stop);\n entries.push({ marker, content });\n }\n\n this.consumeEnd(name);\n return entries;\n }\n\n private consumeEnd(name: string): void {\n if (!this.atCommand(\"end\")) {\n this.report({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.MissingEnvironmentEnd,\n message: `Missing \\\\end{${name}}.`,\n range: { start: this.previousEnd(), end: this.previousEnd() },\n });\n return;\n }\n const endTok = this.advance(); // \\end\n const got = this.readGroupName();\n if (got !== name) {\n this.report({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.MismatchedEnvironment,\n message: `Expected \\\\end{${name}} but found \\\\end{${got}}.`,\n range: { start: endTok.range.start, end: this.previousEnd() },\n });\n }\n }\n\n /** Read a `{name}` group's raw contents, reporting if it is missing. */\n private readGroupName(): string {\n this.skipInlineTrivia();\n if (!this.at(TokenType.LBrace)) {\n this.report({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.MissingRequiredArgument,\n message: \"Expected '{name}'.\",\n range: { start: this.previousEnd(), end: this.previousEnd() },\n });\n return \"\";\n }\n const open = this.advance();\n const raw = this.readRawUntil(TokenType.RBrace);\n this.consumeClose(TokenType.RBrace, open, DiagnosticCode.UnterminatedArgument);\n return raw.trim();\n }\n\n /** Like {@link readGroupName} but returns \"\" silently when absent. */\n private tryReadGroupRaw(): string {\n this.skipInlineTrivia();\n if (!this.at(TokenType.LBrace)) return \"\";\n const open = this.advance();\n const raw = this.readRawUntil(TokenType.RBrace);\n this.consumeClose(TokenType.RBrace, open, DiagnosticCode.UnterminatedArgument);\n return raw.trim();\n }\n\n /**\n * Recursion-limit fallback: consume the current scope's tokens flatly\n * (tracking nested braces) without descending, so adversarial deep nesting\n * cannot overflow the stack. Emits one diagnostic per parse.\n */\n private skipFlat(stop: () => boolean): Node[] {\n if (!this.reportedMaxDepth) {\n this.reportedMaxDepth = true;\n this.report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.UnexpectedToken,\n message: `Maximum nesting depth (${this.maxDepth}) exceeded; deeply nested content was skipped.`,\n range: this.peek().range,\n });\n }\n let bdepth = 0;\n while (!this.at(TokenType.EOF)) {\n if (bdepth === 0 && stop()) break;\n const t = this.peek();\n if (t.type === TokenType.LBrace || t.type === TokenType.LBracket) bdepth++;\n else if (t.type === TokenType.RBrace || t.type === TokenType.RBracket) {\n if (bdepth === 0) break;\n bdepth--;\n }\n this.advance();\n }\n return [];\n }\n\n /* ----------------------------- cursor ------------------------------- */\n\n private consumeClose(close: TokenType, open: Token, code: DiagnosticCode): Position {\n if (this.at(close)) {\n const end = this.peek().range.end;\n this.advance();\n return end;\n }\n this.report({\n severity: DiagnosticSeverity.Error,\n code,\n message: `Unterminated \"${open.value}\" — expected a matching close.`,\n range: open.range,\n });\n return this.previousEnd();\n }\n\n private at(type: TokenType): boolean {\n return this.peek().type === type;\n }\n\n private atCommand(name: string): boolean {\n const t = this.peek();\n return t.type === TokenType.Command && t.value === name;\n }\n\n private skipInlineTrivia(): void {\n while (this.at(TokenType.Whitespace) || this.at(TokenType.Comment)) {\n this.advance();\n }\n }\n\n private skipTrivia(): void {\n while (\n this.at(TokenType.Whitespace) ||\n this.at(TokenType.Comment) ||\n this.at(TokenType.ParBreak)\n ) {\n this.advance();\n }\n }\n\n private peek(k = 0): Token {\n return this.tokens[this.pos + k] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private advance(): Token {\n const t = this.peek();\n if (this.pos < this.tokens.length - 1) this.pos++;\n return t;\n }\n\n private previousEnd(): Position {\n return this.tokens[this.pos - 1]?.range.end ?? this.peek().range.start;\n }\n\n private report(d: Omit<Diagnostic, \"source\">): void {\n this.diagnostics.push({ ...d, source: \"parser\" });\n }\n}\n\n/** Convenience wrapper. */\nexport function parse(tokens: Token[], options?: ParserOptions): ParseResult {\n return Parser.parse(tokens, options);\n}\n","import {\n DiagnosticSeverity,\n DiagnosticCode,\n type Diagnostic,\n type Node,\n type DocumentNode,\n type Theme,\n} from \"../types/index.js\";\nimport { walk } from \"../ast/walk.js\";\n\nexport interface ValidateOptions {\n /** When provided, `\\themecolor{token}` tokens are checked against it. */\n theme?: Theme;\n}\n\nconst ZERO_RANGE = {\n start: { offset: 0, line: 1, column: 1 },\n end: { offset: 0, line: 1, column: 1 },\n};\n\n/**\n * Stage 3 of the pipeline. Semantic validation over the AST, complementing the\n * syntactic diagnostics produced by the parser. Pure and side-effect free.\n */\nexport function validate(ast: DocumentNode, options: ValidateOptions = {}): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const report = (d: Omit<Diagnostic, \"source\">): void => {\n diagnostics.push({ ...d, source: \"validator\" });\n };\n\n walk(ast, {\n enter(node) {\n switch (node.type) {\n case \"command\":\n checkStrayCommand(node, report);\n break;\n case \"section\":\n if (node.title.trim() === \"\") {\n report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.EmptyArgument,\n message: \"Section heading is empty.\",\n range: node.range ?? ZERO_RANGE,\n });\n }\n break;\n case \"contact\":\n if (node.value.trim() === \"\") {\n report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.EmptyArgument,\n message: `\\\\${node.field} is empty.`,\n range: node.range ?? ZERO_RANGE,\n });\n }\n break;\n case \"themecolor\":\n if (options.theme && !(node.token in options.theme.colors)) {\n report({\n severity: DiagnosticSeverity.Warning,\n code: DiagnosticCode.UnknownThemeColor,\n message: `Theme color \"${node.token}\" is not defined in theme \"${options.theme.name}\".`,\n range: node.range ?? ZERO_RANGE,\n });\n }\n break;\n case \"skills\":\n if (node.items.length === 0) {\n report({\n severity: DiagnosticSeverity.Info,\n code: DiagnosticCode.EmptyArgument,\n message: \"\\\\skills has no entries.\",\n range: node.range ?? ZERO_RANGE,\n });\n }\n break;\n }\n },\n });\n\n return diagnostics;\n}\n\n/**\n * `\\item` and `\\column` only become typed list/column nodes when they appear\n * inside their environment. Any that survive as raw command nodes are\n * therefore out of context.\n */\nfunction checkStrayCommand(\n node: Extract<Node, { type: \"command\" }>,\n report: (d: Omit<Diagnostic, \"source\">) => void,\n): void {\n if (node.name === \"item\") {\n report({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.CommandOutsideContext,\n message: \"\\\\item must appear inside an itemize or enumerate environment.\",\n range: node.range ?? ZERO_RANGE,\n });\n } else if (node.name === \"column\") {\n report({\n severity: DiagnosticSeverity.Error,\n code: DiagnosticCode.CommandOutsideContext,\n message: \"\\\\column must appear inside a columns environment.\",\n range: node.range ?? ZERO_RANGE,\n });\n }\n}\n","import type { Theme } from \"../types/theme.js\";\n\n/**\n * The default ReTeX theme — a clean, ATS-friendly look that reads well both on\n * screen and in print. All other themes are partial overrides of this one.\n */\nexport const defaultTheme: Theme = {\n name: \"default\",\n colors: {\n primary: \"#2563eb\",\n secondary: \"#64748b\",\n text: \"#1e293b\",\n muted: \"#64748b\",\n background: \"#ffffff\",\n border: \"#e2e8f0\",\n accent: \"#2563eb\",\n success: \"#16a34a\",\n },\n fonts: {\n heading: '\"Inter\", \"Helvetica Neue\", Helvetica, Arial, sans-serif',\n body: '\"Inter\", \"Helvetica Neue\", Helvetica, Arial, sans-serif',\n mono: '\"JetBrains Mono\", \"SF Mono\", \"Fira Code\", Consolas, monospace',\n },\n fontSizes: {\n base: \"10.5pt\",\n small: \"9pt\",\n large: \"12pt\",\n Large: \"15pt\",\n Huge: \"22pt\",\n name: \"26pt\",\n section: \"13pt\",\n },\n spacing: {\n unit: \"4px\",\n section: \"1.1rem\",\n item: \"0.28rem\",\n page: \"0.55in\",\n },\n page: {\n size: \"Letter\",\n margin: \"0.55in\",\n maxWidth: \"8.5in\",\n },\n sectionStyle: \"rule\",\n};\n","import type { PartialTheme, Theme, ThemeColors } from \"../types/theme.js\";\nimport { defaultTheme } from \"./default.js\";\n\n/** Deep-merge a partial theme over a base theme (sub-objects merged shallowly). */\nexport function resolveTheme(partial?: PartialTheme, base: Theme = defaultTheme): Theme {\n if (!partial) return base;\n return {\n name: partial.name ?? base.name,\n colors: { ...base.colors, ...partial.colors } as ThemeColors,\n fonts: { ...base.fonts, ...partial.fonts },\n fontSizes: { ...base.fontSizes, ...partial.fontSizes },\n spacing: { ...base.spacing, ...partial.spacing },\n page: { ...base.page, ...partial.page },\n sectionStyle: partial.sectionStyle ?? base.sectionStyle,\n };\n}\n\n/** A modern, accent-forward theme with underlined section headings. */\nexport const modernTheme: Theme = resolveTheme({\n name: \"modern\",\n colors: { primary: \"#7c3aed\", accent: \"#7c3aed\", text: \"#111827\" },\n sectionStyle: \"underline\",\n});\n\n/** A restrained, classic serif theme suited to academic CVs. */\nexport const classicTheme: Theme = resolveTheme({\n name: \"classic\",\n colors: { primary: \"#111827\", secondary: \"#4b5563\", accent: \"#111827\" },\n fonts: {\n heading: 'Georgia, \"Times New Roman\", serif',\n body: 'Georgia, \"Times New Roman\", serif',\n mono: 'Consolas, \"Courier New\", monospace',\n },\n sectionStyle: \"rule\",\n});\n\n/** A compact, single-accent theme that maximizes content density. */\nexport const compactTheme: Theme = resolveTheme({\n name: \"compact\",\n fontSizes: {\n base: \"9.5pt\",\n small: \"8pt\",\n large: \"11pt\",\n Large: \"13pt\",\n Huge: \"18pt\",\n name: \"20pt\",\n section: \"11pt\",\n },\n spacing: { unit: \"3px\", section: \"0.7rem\", item: \"0.18rem\", page: \"0.4in\" },\n sectionStyle: \"bar\",\n});\n\n/** Built-in theme presets keyed by name. */\nexport const themes: Record<string, Theme> = {\n default: defaultTheme,\n modern: modernTheme,\n classic: classicTheme,\n compact: compactTheme,\n};\n\n/** Look up a preset theme by name, falling back to the default. */\nexport function getTheme(name: string): Theme {\n return themes[name] ?? defaultTheme;\n}\n","import type { Theme } from \"../types/index.js\";\n\nconst tokenSafe = (s: string): string => s.replace(/[^a-zA-Z0-9_-]/g, \"\");\n\n/**\n * Generate the stylesheet for a rendered resume from a {@link Theme}. Theme\n * values become CSS custom properties so they can be overridden at runtime,\n * and every theme color is exposed as `--retex-color-<token>` for use by\n * `\\themecolor`.\n */\nexport function themeToCss(theme: Theme, prefix = \"retex\"): string {\n const p = prefix;\n const colorVars = Object.entries(theme.colors)\n .map(([k, v]) => ` --${p}-color-${tokenSafe(k)}: ${v};`)\n .join(\"\\n\");\n\n return `.${p}-resume {\n${colorVars}\n --${p}-primary: ${theme.colors.primary};\n --${p}-text: ${theme.colors.text};\n --${p}-muted: ${theme.colors.muted};\n --${p}-border: ${theme.colors.border};\n --${p}-bg: ${theme.colors.background};\n --${p}-font-heading: ${theme.fonts.heading};\n --${p}-font-body: ${theme.fonts.body};\n --${p}-font-mono: ${theme.fonts.mono};\n --${p}-fs-base: ${theme.fontSizes.base};\n --${p}-fs-small: ${theme.fontSizes.small};\n --${p}-fs-large: ${theme.fontSizes.large};\n --${p}-fs-Large: ${theme.fontSizes.Large};\n --${p}-fs-Huge: ${theme.fontSizes.Huge};\n --${p}-fs-name: ${theme.fontSizes.name};\n --${p}-fs-section: ${theme.fontSizes.section};\n --${p}-sp-section: ${theme.spacing.section};\n --${p}-sp-item: ${theme.spacing.item};\n\n box-sizing: border-box;\n max-width: ${theme.page.maxWidth};\n margin: 0 auto;\n padding: ${theme.spacing.page};\n background: var(--${p}-bg);\n color: var(--${p}-text);\n font-family: var(--${p}-font-body);\n font-size: var(--${p}-fs-base);\n line-height: 1.45;\n}\n.${p}-resume *, .${p}-resume *::before, .${p}-resume *::after { box-sizing: border-box; }\n\n.${p}-header { margin-bottom: var(--${p}-sp-section); }\n.${p}-name {\n font-family: var(--${p}-font-heading);\n font-size: var(--${p}-fs-name);\n font-weight: 700;\n margin: 0 0 0.1em;\n color: var(--${p}-text);\n letter-spacing: -0.01em;\n}\n.${p}-title {\n font-size: var(--${p}-fs-large);\n color: var(--${p}-primary);\n margin: 0 0 0.45em;\n font-weight: 500;\n}\n.${p}-contact {\n display: flex;\n flex-wrap: wrap;\n gap: 0.35rem 1rem;\n font-size: var(--${p}-fs-small);\n color: var(--${p}-muted);\n}\n.${p}-contact-item {\n display: inline-flex;\n align-items: center;\n gap: 0.3em;\n color: inherit;\n text-decoration: none;\n}\n.${p}-contact-item svg { opacity: 0.8; }\n\n.${p}-section { margin-bottom: var(--${p}-sp-section); break-inside: avoid; }\n.${p}-section-title {\n font-family: var(--${p}-font-heading);\n font-size: var(--${p}-fs-section);\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--${p}-primary);\n margin: 0 0 0.5em;\n}\n.${p}-section--rule .${p}-section-title { border-bottom: 2px solid var(--${p}-border); padding-bottom: 0.2em; }\n.${p}-section--underline .${p}-section-title { text-decoration: underline; text-underline-offset: 3px; }\n.${p}-section--bar .${p}-section-title {\n border-left: 3px solid var(--${p}-primary);\n padding-left: 0.5em;\n border-bottom: none;\n}\n.${p}-subsection-title {\n font-family: var(--${p}-font-heading);\n font-size: var(--${p}-fs-large);\n font-weight: 600;\n margin: 0.6em 0 0.3em;\n}\n\n.${p}-entry { margin-bottom: 0.6rem; break-inside: avoid; }\n.${p}-entry-row {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 1rem;\n}\n.${p}-entry-title { font-weight: 700; }\n.${p}-entry-subtitle { color: var(--${p}-primary); font-weight: 500; }\n.${p}-entry-dates, .${p}-entry-location {\n color: var(--${p}-muted);\n font-size: var(--${p}-fs-small);\n white-space: nowrap;\n}\n.${p}-entry-body { margin-top: 0.15rem; }\n.${p}-entry-body p { margin: 0.2em 0; }\n\n.${p}-list { margin: 0.2rem 0 0.2rem 1.1rem; padding: 0; }\n.${p}-list li { margin-bottom: var(--${p}-sp-item); padding-left: 0.15rem; }\n\n.${p}-columns { display: flex; gap: 1.5rem; align-items: flex-start; }\n.${p}-column { min-width: 0; }\n\n.${p}-skills { display: flex; flex-wrap: wrap; gap: 0.4rem; list-style: none; margin: 0.2rem 0; padding: 0; }\n.${p}-skill {\n background: color-mix(in srgb, var(--${p}-primary) 12%, transparent);\n color: var(--${p}-primary);\n border-radius: 4px;\n padding: 0.12rem 0.5rem;\n font-size: var(--${p}-fs-small);\n font-weight: 500;\n white-space: nowrap;\n}\n\n.${p}-link { color: var(--${p}-primary); text-decoration: none; }\n.${p}-link:hover { text-decoration: underline; }\n.${p}-icon { display: inline-flex; vertical-align: -0.125em; }\n.${p}-rule { border: none; border-top: 1px solid var(--${p}-border); margin: 0.6rem 0; }\n.${p}-center { text-align: center; }\n.${p}-scale-small { font-size: var(--${p}-fs-small); }\n.${p}-scale-large { font-size: var(--${p}-fs-large); }\n.${p}-scale-Large { font-size: var(--${p}-fs-Large); }\n.${p}-scale-Huge { font-size: var(--${p}-fs-Huge); }\np.${p}-para { margin: 0 0 0.45em; }\np.${p}-para:last-child { margin-bottom: 0; }\n\n@media print {\n .${p}-resume { max-width: none; margin: 0; padding: 0; }\n .${p}-section, .${p}-entry { break-inside: avoid; }\n a { color: inherit; }\n}`;\n}\n","import type { Node, Theme } from \"../types/index.js\";\n\n/** Node types that participate in block (vertical) flow. */\nexport const BLOCK_TYPES = new Set<string>([\n \"section\",\n \"job\",\n \"education\",\n \"project\",\n \"skills\",\n \"list\",\n \"columns\",\n \"rule\",\n]);\n\nexport function isBlockNode(node: Node): boolean {\n if (BLOCK_TYPES.has(node.type)) return true;\n if (node.type === \"space\") return node.axis === \"vertical\";\n if (node.type === \"command\" && node.name === \"center\") return true;\n return false;\n}\n\n/**\n * Plugin HTML renderer. Receives the node, the active context, and a callback\n * to recursively render child nodes to HTML.\n */\nexport type HtmlRenderFn = (\n node: Node,\n ctx: HtmlRenderContext,\n renderChildren: (nodes: Node[]) => string,\n) => string;\n\nexport interface HtmlRenderContext {\n theme: Theme;\n classPrefix: string;\n /** Override renderers keyed by node `type` or `command:<name>`. */\n overrides: Map<string, HtmlRenderFn>;\n /** Render arbitrary inline/block nodes to an HTML string. */\n renderNodes: (nodes: Node[]) => string;\n cls: (name: string) => string;\n}\n\n/** A target-agnostic, serializable element used by the React renderer. */\nexport interface ReactElementSpec {\n type: string;\n props: Record<string, unknown>;\n children: Array<ReactElementSpec | string>;\n}\n","import type { Node, SectionNode, ContactNode, FieldMap } from \"../types/index.js\";\n\n/** A document region: an optional leading section heading plus its body. */\nexport interface Region {\n section?: SectionNode;\n nodes: Node[];\n}\n\n/** Split a document's children into regions delimited by level-1 sections. */\nexport function toRegions(children: Node[]): Region[] {\n const regions: Region[] = [{ nodes: [] }];\n for (const node of children) {\n if (node.type === \"section\" && node.level === 1) {\n regions.push({ section: node, nodes: [] });\n } else {\n regions[regions.length - 1]!.nodes.push(node);\n }\n }\n return regions;\n}\n\nexport const CONTACTISH = new Set([\"contact\", \"icon\", \"link\", \"url\"]);\n\nexport interface PreambleParts {\n name?: ContactNode;\n title?: ContactNode;\n contacts: Node[];\n other: Node[];\n}\n\n/** Separate a preamble into header pieces (name/title/contacts) and the rest. */\nexport function splitPreamble(nodes: Node[]): PreambleParts {\n const name = nodes.find(\n (n): n is ContactNode => n.type === \"contact\" && n.field === \"name\",\n );\n const title = nodes.find(\n (n): n is ContactNode => n.type === \"contact\" && n.field === \"title\",\n );\n const contacts = nodes.filter(\n (n) => CONTACTISH.has(n.type) && n !== name && n !== title,\n );\n const other = nodes.filter(\n (n) =>\n !CONTACTISH.has(n.type) &&\n n.type !== \"parbreak\" &&\n !(n.type === \"text\" && n.value.trim() === \"\"),\n );\n return { name, title, contacts, other };\n}\n\nexport interface EntryParts {\n title: string;\n subtitle: string;\n dates: string;\n location: string;\n url: string;\n}\n\n/** Normalize a job/education/project field map into renderable entry parts. */\nexport function entryParts(fields: FieldMap, kind: string): EntryParts {\n let title: string;\n let subtitle: string;\n if (kind === \"education\") {\n // School is the prominent line; the degree is the subtitle.\n title = fields.school ?? fields.degree ?? \"\";\n subtitle = fields.school ? (fields.degree ?? \"\") : \"\";\n } else if (kind === \"project\") {\n title = fields.name ?? fields.title ?? \"\";\n subtitle = fields.organization ?? fields.tech ?? \"\";\n } else {\n title = fields.title ?? fields.role ?? fields.name ?? \"\";\n subtitle = fields.company ?? fields.organization ?? \"\";\n }\n return {\n title,\n subtitle,\n dates: dateRange(fields.start, fields.end, fields.date),\n location: fields.location ?? \"\",\n url: fields.url ?? fields.link ?? \"\",\n };\n}\n\nexport function dateRange(start?: string, end?: string, date?: string): string {\n if (date) return date;\n if (start && end) return `${start} – ${end}`;\n return start ?? end ?? \"\";\n}\n","import {\n type Node,\n type DocumentNode,\n type SectionNode,\n type ContactNode,\n type Theme,\n type FieldMap,\n} from \"../types/index.js\";\nimport { resolveTheme } from \"../theme/themes.js\";\nimport {\n escapeHtml,\n escapeAttribute,\n sanitizeUrl,\n isSafeColor,\n isSafeDimension,\n sanitizeStyleValue,\n} from \"../security/sanitize.js\";\nimport { iconToSvg } from \"../icons/icons.js\";\nimport { themeToCss } from \"./css.js\";\nimport { isBlockNode, type HtmlRenderFn, type HtmlRenderContext } from \"./context.js\";\nimport { toRegions, splitPreamble, entryParts } from \"./structure.js\";\n\nexport interface HtmlRenderOptions {\n theme?: Theme;\n /** CSS class prefix. Default `\"retex\"`. */\n classPrefix?: string;\n /** Plugin render overrides keyed by node `type` or `command:<name>`. */\n overrides?: Map<string, HtmlRenderFn>;\n /** Group leading contact commands into a `<header>`. Default `true`. */\n header?: boolean;\n}\n\nconst tokenSafe = (s: string): string => s.replace(/[^a-zA-Z0-9_-]/g, \"\");\n\n/**\n * The HTML renderer. Produces clean, semantic, fully-escaped HTML. Every text\n * node and attribute is escaped; every URL is re-sanitized at render time as a\n * defense-in-depth measure even though the parser already vetted it.\n */\nexport class HtmlRenderer {\n private readonly theme: Theme;\n private readonly prefix: string;\n private readonly overrides: Map<string, HtmlRenderFn>;\n private readonly useHeader: boolean;\n private readonly ctx: HtmlRenderContext;\n\n constructor(options: HtmlRenderOptions = {}) {\n this.theme = options.theme ?? resolveTheme();\n this.prefix = options.classPrefix ?? \"retex\";\n this.overrides = options.overrides ?? new Map();\n this.useHeader = options.header ?? true;\n this.ctx = {\n theme: this.theme,\n classPrefix: this.prefix,\n overrides: this.overrides,\n renderNodes: (nodes) => this.renderFlow(nodes),\n cls: (name) => this.cls(name),\n };\n }\n\n /** Render the resume body as an HTML fragment (no `<html>`/`<style>`). */\n render(ast: DocumentNode): string {\n const regions = toRegions(ast.children);\n const parts: string[] = [];\n\n const preamble = regions[0]?.section ? undefined : regions.shift();\n if (preamble) parts.push(this.renderPreamble(preamble.nodes));\n\n for (const region of regions) {\n if (region.section) parts.push(this.renderSection(region.section, region.nodes));\n else parts.push(this.renderFlow(region.nodes));\n }\n\n return `<div class=\"${this.cls(\"resume\")}\">\\n${parts.filter(Boolean).join(\"\\n\")}\\n</div>`;\n }\n\n /** Render a complete, standalone HTML document including the stylesheet. */\n renderDocument(ast: DocumentNode, title = \"Resume\"): string {\n return [\n \"<!DOCTYPE html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\">',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n `<title>${escapeHtml(title)}</title>`,\n `<style>\\n${this.styles()}\\n</style>`,\n \"</head>\",\n \"<body>\",\n this.render(ast),\n \"</body>\",\n \"</html>\",\n ].join(\"\\n\");\n }\n\n /** The stylesheet for the active theme (without `<style>` tags). */\n styles(): string {\n return themeToCss(this.theme, this.prefix);\n }\n\n /* --------------------------- structuring ---------------------------- */\n\n private renderSection(section: SectionNode, body: Node[]): string {\n const styleMod = ` ${this.cls(\"section\")}--${this.theme.sectionStyle}`;\n return (\n `<section class=\"${this.cls(\"section\")}${styleMod}\">` +\n `<h2 class=\"${this.cls(\"section-title\")}\">${escapeHtml(section.title)}</h2>` +\n `<div class=\"${this.cls(\"section-body\")}\">${this.renderFlow(body)}</div>` +\n `</section>`\n );\n }\n\n private renderPreamble(nodes: Node[]): string {\n if (!this.useHeader) return this.renderFlow(nodes);\n\n const { name, title, contacts, other } = splitPreamble(nodes);\n const hasHeader = name || title || contacts.length > 0;\n let html = \"\";\n if (hasHeader) {\n html += `<header class=\"${this.cls(\"header\")}\">`;\n if (name) html += `<h1 class=\"${this.cls(\"name\")}\">${escapeHtml(name.value)}</h1>`;\n if (title) html += `<p class=\"${this.cls(\"title\")}\">${escapeHtml(title.value)}</p>`;\n if (contacts.length > 0) {\n html += `<div class=\"${this.cls(\"contact\")}\">${contacts\n .map((c) => this.renderContactItem(c))\n .join(\"\")}</div>`;\n }\n html += `</header>`;\n }\n if (other.length > 0) html += this.renderFlow(other);\n return html;\n }\n\n private renderContactItem(node: Node): string {\n const item = this.cls(\"contact-item\");\n if (node.type === \"contact\") {\n switch (node.field) {\n case \"email\":\n return this.contactLink(`mailto:${node.value}`, \"email\", node.value, item);\n case \"phone\":\n return this.contactLink(\n `tel:${node.value.replace(/[^\\d+]/g, \"\")}`,\n \"phone\",\n node.value,\n item,\n );\n case \"website\":\n return this.contactLink(node.value, \"website\", node.value, item);\n case \"location\":\n return `<span class=\"${item}\">${this.icon(\"location\")}${escapeHtml(node.value)}</span>`;\n default:\n return `<span class=\"${item}\">${escapeHtml(node.value)}</span>`;\n }\n }\n if (node.type === \"icon\")\n return `<span class=\"${item}\">${this.renderNode(node)}</span>`;\n if (node.type === \"link\" || node.type === \"url\") {\n return `<span class=\"${item}\">${this.renderNode(node)}</span>`;\n }\n return this.renderNode(node);\n }\n\n private contactLink(url: string, icon: string, label: string, cls: string): string {\n const { safe } = sanitizeUrl(url);\n return (\n `<a class=\"${cls}\" href=\"${escapeAttribute(safe)}\">` +\n `${this.icon(icon)}${escapeHtml(label)}</a>`\n );\n }\n\n /* ----------------------------- flow / inline ------------------------ */\n\n /** Block-aware rendering: groups inline runs into `<p>`, renders blocks as-is. */\n private renderFlow(nodes: Node[]): string {\n const out: string[] = [];\n let inline: Node[] = [];\n const flush = (): void => {\n const html = this.renderInline(inline).trim();\n if (html) out.push(`<p class=\"${this.cls(\"para\")}\">${html}</p>`);\n inline = [];\n };\n for (const node of nodes) {\n if (node.type === \"parbreak\") {\n flush();\n } else if (isBlockNode(node)) {\n flush();\n out.push(this.renderNode(node));\n } else {\n inline.push(node);\n }\n }\n flush();\n return out.join(\"\\n\");\n }\n\n private renderInline(nodes: Node[]): string {\n return nodes.map((n) => this.renderNode(n)).join(\"\");\n }\n\n /* ------------------------------ per node ---------------------------- */\n\n private renderNode(node: Node): string {\n const override =\n this.overrides.get(node.type) ??\n (node.type === \"command\" ? this.overrides.get(`command:${node.name}`) : undefined);\n if (override) return override(node, this.ctx, (ns) => this.renderFlow(ns));\n\n switch (node.type) {\n case \"text\":\n return escapeHtml(node.value);\n case \"parbreak\":\n return \"\";\n case \"linebreak\":\n return \"<br>\";\n case \"rule\":\n return `<hr class=\"${this.cls(\"rule\")}\">`;\n case \"space\":\n return node.axis === \"vertical\"\n ? `<div style=\"height:${this.dim(node.size)}\"></div>`\n : `<span style=\"display:inline-block;width:${this.dim(node.size)}\"></span>`;\n case \"group\":\n return this.renderInline(node.children);\n case \"bold\":\n return `<strong>${this.renderInline(node.children)}</strong>`;\n case \"italic\":\n return `<em>${this.renderInline(node.children)}</em>`;\n case \"underline\":\n return `<u>${this.renderInline(node.children)}</u>`;\n case \"strike\":\n return `<s>${this.renderInline(node.children)}</s>`;\n case \"color\": {\n const inner = this.renderInline(node.children);\n if (!node.color || !isSafeColor(node.color)) return inner;\n return `<span style=\"color:${node.color}\">${inner}</span>`;\n }\n case \"themecolor\": {\n const inner = this.renderInline(node.children);\n const tok = tokenSafe(node.token);\n return `<span style=\"color:var(--${this.prefix}-color-${tok}, currentColor)\">${inner}</span>`;\n }\n case \"fontsize\": {\n const inner = this.renderInline(node.children);\n if (!isSafeDimension(node.size)) return inner;\n return `<span style=\"font-size:${node.size}\">${inner}</span>`;\n }\n case \"fontfamily\": {\n const inner = this.renderInline(node.children);\n const family =\n node.family === \"monospace\"\n ? `var(--${this.prefix}-font-mono)`\n : sanitizeStyleValue(node.family);\n if (!family) return inner;\n return `<span style=\"font-family:${family}\">${inner}</span>`;\n }\n case \"fontscale\": {\n const inner = this.renderInline(node.children);\n if (node.scale === \"normal\") return `<span>${inner}</span>`;\n return `<span class=\"${this.cls(`scale-${node.scale}`)}\">${inner}</span>`;\n }\n case \"link\":\n return this.renderLink(node.href, this.renderInline(node.children));\n case \"url\":\n return this.renderLink(node.href, escapeHtml(node.rawHref));\n case \"icon\":\n return this.icon(node.name);\n case \"section\":\n // A section nested in flow (e.g. subsection) renders as a heading.\n return `<h${node.level + 1} class=\"${this.cls(\"subsection-title\")}\">${escapeHtml(node.title)}</h${node.level + 1}>`;\n case \"list\":\n return this.renderList(node);\n case \"columns\":\n return this.renderColumns(node);\n case \"skills\":\n return this.renderSkills(node.items);\n case \"job\":\n return this.renderEntry(node.fields, node.children, \"job\");\n case \"education\":\n return this.renderEntry(node.fields, node.children, \"education\");\n case \"project\":\n return this.renderEntry(node.fields, node.children, \"project\");\n case \"contact\":\n return this.renderContactItem(node);\n case \"command\":\n return this.renderCommand(node);\n case \"error\":\n return \"\";\n default:\n return \"\";\n }\n }\n\n private renderLink(href: string, label: string): string {\n const { safe } = sanitizeUrl(href);\n const external = /^https?:/i.test(safe);\n const rel = external ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : \"\";\n return `<a class=\"${this.cls(\"link\")}\" href=\"${escapeAttribute(safe)}\"${rel}>${label}</a>`;\n }\n\n private renderList(node: Extract<Node, { type: \"list\" }>): string {\n const tag = node.kind === \"enumerate\" ? \"ol\" : \"ul\";\n const items = node.items\n .map((item) => `<li>${this.renderInline(item.children).trim()}</li>`)\n .join(\"\");\n return `<${tag} class=\"${this.cls(\"list\")}\">${items}</${tag}>`;\n }\n\n private renderColumns(node: Extract<Node, { type: \"columns\" }>): string {\n const cols = node.columns\n .map((col) => {\n const basis = isSafeDimension(col.width) ? col.width : \"auto\";\n const flex = basis === \"auto\" ? \"flex:1 1 0\" : `flex:0 0 ${basis}`;\n return `<div class=\"${this.cls(\"column\")}\" style=\"${flex}\">${this.renderFlow(col.children)}</div>`;\n })\n .join(\"\");\n return `<div class=\"${this.cls(\"columns\")}\">${cols}</div>`;\n }\n\n private renderSkills(items: string[]): string {\n const lis = items\n .map((s) => `<li class=\"${this.cls(\"skill\")}\">${escapeHtml(s)}</li>`)\n .join(\"\");\n return `<ul class=\"${this.cls(\"skills\")}\">${lis}</ul>`;\n }\n\n private renderEntry(fields: FieldMap, body: Node[], kind: string): string {\n const { title, subtitle, dates, location, url } = entryParts(fields, kind);\n\n const titleHtml = url\n ? this.renderLink(sanitizeUrl(url).safe, escapeHtml(title))\n : escapeHtml(title);\n\n let html = `<div class=\"${this.cls(\"entry\")} ${this.cls(kind)}\">`;\n html += `<div class=\"${this.cls(\"entry-row\")}\">`;\n html += `<span class=\"${this.cls(\"entry-title\")}\">${titleHtml}</span>`;\n if (dates)\n html += `<span class=\"${this.cls(\"entry-dates\")}\">${escapeHtml(dates)}</span>`;\n html += `</div>`;\n if (subtitle || location) {\n html += `<div class=\"${this.cls(\"entry-row\")}\">`;\n html += `<span class=\"${this.cls(\"entry-subtitle\")}\">${escapeHtml(subtitle)}</span>`;\n if (location)\n html += `<span class=\"${this.cls(\"entry-location\")}\">${escapeHtml(location)}</span>`;\n html += `</div>`;\n }\n if (body.length > 0) {\n html += `<div class=\"${this.cls(\"entry-body\")}\">${this.renderFlow(body)}</div>`;\n }\n html += `</div>`;\n return html;\n }\n\n private renderCommand(node: Extract<Node, { type: \"command\" }>): string {\n if (node.name === \"center\") {\n const inner = node.args.flatMap((a) => a.children);\n return `<div class=\"${this.cls(\"center\")}\">${this.renderFlow(inner)}</div>`;\n }\n // Unknown / unhandled command: render its argument content so nothing is lost.\n const inner = node.args.flatMap((a) => a.children);\n return inner.length > 0 ? this.renderInline(inner) : \"\";\n }\n\n /* ------------------------------ helpers ----------------------------- */\n\n private icon(name: string): string {\n const svg = iconToSvg(name, { className: this.cls(\"icon\") });\n if (svg) return svg;\n return `<span class=\"${this.cls(\"icon\")}\" title=\"${escapeAttribute(name)}\"></span>`;\n }\n\n private dim(value: string): string {\n return isSafeDimension(value) ? value : \"0\";\n }\n\n private cls(name: string): string {\n return `${this.prefix}-${name}`;\n }\n}\n\n/** Render a document AST to an HTML fragment. */\nexport function renderHtml(ast: DocumentNode, options?: HtmlRenderOptions): string {\n return new HtmlRenderer(options).render(ast);\n}\n\n/** Render a document AST to a complete standalone HTML page. */\nexport function renderHtmlDocument(\n ast: DocumentNode,\n options?: HtmlRenderOptions & { title?: string },\n): string {\n return new HtmlRenderer(options).renderDocument(ast, options?.title);\n}\n\nexport { themeToCss };\n","import type { DocumentNode, Node } from \"../types/index.js\";\n\nexport interface JsonRenderOptions {\n /** Strip `range`/`hash` metadata for a compact, stable payload. */\n stripMeta?: boolean;\n /** `JSON.stringify` indentation (number of spaces). Default 2. */\n indent?: number;\n}\n\n/** Deep-clone an AST, optionally removing source metadata. */\nexport function toJsonTree(ast: Node, opts: JsonRenderOptions = {}): unknown {\n const strip = opts.stripMeta ?? false;\n const clone = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(clone);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n if (strip && (k === \"range\" || k === \"hash\")) continue;\n out[k] = clone(v);\n }\n return out;\n }\n return value;\n };\n return clone(ast);\n}\n\n/**\n * The JSON renderer. Produces a structured, machine-readable representation of\n * the document AST — handy for editor tooling, diffing, and storage.\n */\nexport function renderJson(ast: DocumentNode, opts: JsonRenderOptions = {}): string {\n return JSON.stringify(toJsonTree(ast, opts), null, opts.indent ?? 2);\n}\n","import type { DocumentNode, Theme } from \"../types/index.js\";\nimport { resolveTheme } from \"../theme/themes.js\";\nimport { HtmlRenderer, type HtmlRenderOptions } from \"./html.js\";\n\nexport interface PrintOptions extends HtmlRenderOptions {\n title?: string;\n}\n\n/**\n * Build the `@page` CSS for the theme's page geometry. This is what turns a\n * web page into a paginated, print-ready document.\n */\nexport function pageCss(theme: Theme): string {\n return `@page { size: ${theme.page.size}; margin: ${theme.page.margin}; }\nhtml, body { margin: 0; padding: 0; background: #fff; }\n@media screen { body { background: #f1f5f9; padding: 24px; } .retex-resume { box-shadow: 0 1px 8px rgba(0,0,0,.12); } }`;\n}\n\n/**\n * Render a print-optimized, standalone HTML document. This is the portable\n * core of the PDF strategy: the same HTML can be\n * - printed to PDF in the browser via `window.print()`,\n * - converted headlessly with Puppeteer/Playwright ({@link renderPdf}), or\n * - handed to any HTML-to-PDF service.\n */\nexport function renderPrintHtml(ast: DocumentNode, options: PrintOptions = {}): string {\n const theme = options.theme ?? resolveTheme();\n const renderer = new HtmlRenderer({ ...options, theme });\n const body = renderer.render(ast);\n const title = options.title ?? \"Resume\";\n return [\n \"<!DOCTYPE html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\">',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n `<title>${title.replace(/[<>&]/g, \"\")}</title>`,\n `<style>\\n${renderer.styles()}\\n${pageCss(theme)}\\n</style>`,\n \"</head>\",\n \"<body>\",\n body,\n \"</body>\",\n \"</html>\",\n ].join(\"\\n\");\n}\n\nexport interface PdfOptions extends PrintOptions {\n /**\n * Optional injected headless-browser launcher. When omitted, `renderPdf`\n * dynamically imports `puppeteer` if it is installed.\n */\n launch?: () => Promise<HeadlessBrowser>;\n /** Print background colors/images. Default `true`. */\n printBackground?: boolean;\n}\n\n/** Minimal structural types for the puppeteer/playwright adapter. */\nexport interface HeadlessPage {\n setContent(html: string, opts?: { waitUntil?: string }): Promise<void>;\n pdf(opts: Record<string, unknown>): Promise<Uint8Array>;\n}\nexport interface HeadlessBrowser {\n newPage(): Promise<HeadlessPage>;\n close(): Promise<void>;\n}\n\n/**\n * Render a document to a PDF byte buffer using a headless browser.\n *\n * The default path lazily imports `puppeteer` (an *optional* dependency) so the\n * core library stays dependency-free. Supply `options.launch` to plug in\n * Playwright, a pooled browser, or a remote Chromium instead.\n *\n * @throws if no launcher is available, with guidance on how to enable PDF export.\n */\nexport async function renderPdf(\n ast: DocumentNode,\n options: PdfOptions = {},\n): Promise<Uint8Array> {\n const html = renderPrintHtml(ast, options);\n const theme = options.theme ?? resolveTheme();\n\n const launch = options.launch ?? (await defaultLauncher());\n const browser = await launch();\n try {\n const page = await browser.newPage();\n await page.setContent(html, { waitUntil: \"networkidle0\" });\n return await page.pdf({\n printBackground: options.printBackground ?? true,\n preferCSSPageSize: true,\n format: theme.page.size,\n margin: {\n top: theme.page.margin,\n bottom: theme.page.margin,\n left: theme.page.margin,\n right: theme.page.margin,\n },\n });\n } finally {\n await browser.close();\n }\n}\n\nasync function defaultLauncher(): Promise<() => Promise<HeadlessBrowser>> {\n try {\n // Indirected so bundlers don't try to resolve the optional dependency.\n const mod = (await import(/* @vite-ignore */ \"puppeteer\" as string)) as {\n launch: (opts?: Record<string, unknown>) => Promise<HeadlessBrowser>;\n };\n return () => mod.launch({ headless: true });\n } catch {\n throw new Error(\n \"PDF export requires a headless browser. Either install `puppeteer` \" +\n \"(`npm i -D puppeteer`) or pass `options.launch` with your own \" +\n \"Playwright/Chromium launcher. Alternatively, use `renderPrintHtml()` \" +\n \"and print to PDF in the browser via `window.print()`.\",\n );\n }\n}\n","import {\n type Node,\n type DocumentNode,\n type SectionNode,\n type Theme,\n type ListNode,\n type ColumnsNode,\n type CommandNode,\n} from \"../types/index.js\";\nimport { resolveTheme } from \"../theme/themes.js\";\nimport {\n sanitizeUrl,\n isSafeColor,\n isSafeDimension,\n sanitizeStyleValue,\n} from \"../security/sanitize.js\";\nimport { iconToSvg } from \"../icons/icons.js\";\nimport { themeToCss } from \"./css.js\";\nimport { isBlockNode } from \"./context.js\";\nimport { toRegions, splitPreamble, entryParts } from \"./structure.js\";\n\n/**\n * Minimal structural type for a JSX factory (React.createElement, Preact's `h`,\n * etc.). Declaring it locally means the package has **no** hard React\n * dependency — callers pass whichever factory they use.\n */\nexport type JsxFactory = (\n type: unknown,\n props: Record<string, unknown> | null,\n ...children: unknown[]\n) => unknown;\n\n/** A React render override keyed by node `type` or `command:<name>`. */\nexport type ReactRenderFn = (\n node: Node,\n ctx: ReactRenderContext,\n renderChildren: (nodes: Node[]) => unknown[],\n) => unknown;\n\nexport interface ReactRenderContext {\n theme: Theme;\n classPrefix: string;\n h: JsxFactory;\n Fragment: unknown;\n overrides: Map<string, ReactRenderFn>;\n renderNodes: (nodes: Node[]) => unknown[];\n cls: (name: string) => string;\n}\n\nexport interface ReactRenderOptions {\n /** JSX factory. Required. Pass `React.createElement`. */\n createElement: JsxFactory;\n /** Fragment component. Pass `React.Fragment`. Falls back to a `<div>`. */\n Fragment?: unknown;\n theme?: Theme;\n classPrefix?: string;\n overrides?: Map<string, ReactRenderFn>;\n header?: boolean;\n}\n\nconst tokenSafe = (s: string): string => s.replace(/[^a-zA-Z0-9_-]/g, \"\");\n\n/**\n * The React renderer. Produces a React element tree mirroring the HTML\n * renderer's structure and class names, so the same theme stylesheet applies.\n */\nexport class ReactRenderer {\n private readonly theme: Theme;\n private readonly prefix: string;\n private readonly h: JsxFactory;\n private readonly Fragment: unknown;\n private readonly overrides: Map<string, ReactRenderFn>;\n private readonly useHeader: boolean;\n private key = 0;\n\n constructor(options: ReactRenderOptions) {\n if (typeof options.createElement !== \"function\") {\n throw new TypeError(\n \"ReactRenderer requires a `createElement` factory (e.g. React.createElement).\",\n );\n }\n this.theme = options.theme ?? resolveTheme();\n this.prefix = options.classPrefix ?? \"retex\";\n this.h = options.createElement;\n this.Fragment = options.Fragment ?? \"div\";\n this.overrides = options.overrides ?? new Map();\n this.useHeader = options.header ?? true;\n }\n\n /** The stylesheet for the active theme. Render it in a `<style>` yourself. */\n styles(): string {\n return themeToCss(this.theme, this.prefix);\n }\n\n /** Render the document AST to a React element. */\n render(ast: DocumentNode): unknown {\n const regions = toRegions(ast.children);\n const parts: unknown[] = [];\n const preamble = regions[0]?.section ? undefined : regions.shift();\n if (preamble) parts.push(...this.renderPreamble(preamble.nodes));\n for (const region of regions) {\n if (region.section) parts.push(this.renderSection(region.section, region.nodes));\n else parts.push(...this.renderFlow(region.nodes));\n }\n return this.el(\"div\", { className: this.cls(\"resume\") }, parts);\n }\n\n private ctx(): ReactRenderContext {\n return {\n theme: this.theme,\n classPrefix: this.prefix,\n h: this.h,\n Fragment: this.Fragment,\n overrides: this.overrides,\n renderNodes: (nodes) => this.renderFlow(nodes),\n cls: (name) => this.cls(name),\n };\n }\n\n /* --------------------------- structuring ---------------------------- */\n\n private renderSection(section: SectionNode, body: Node[]): unknown {\n return this.el(\n \"section\",\n {\n className: `${this.cls(\"section\")} ${this.cls(\"section\")}--${this.theme.sectionStyle}`,\n },\n [\n this.el(\"h2\", { className: this.cls(\"section-title\") }, [section.title]),\n this.el(\"div\", { className: this.cls(\"section-body\") }, this.renderFlow(body)),\n ],\n );\n }\n\n private renderPreamble(nodes: Node[]): unknown[] {\n if (!this.useHeader) return this.renderFlow(nodes);\n const { name, title, contacts, other } = splitPreamble(nodes);\n const out: unknown[] = [];\n if (name || title || contacts.length > 0) {\n const head: unknown[] = [];\n if (name) head.push(this.el(\"h1\", { className: this.cls(\"name\") }, [name.value]));\n if (title) head.push(this.el(\"p\", { className: this.cls(\"title\") }, [title.value]));\n if (contacts.length > 0) {\n head.push(\n this.el(\n \"div\",\n { className: this.cls(\"contact\") },\n contacts.map((c) => this.renderNode(c)),\n ),\n );\n }\n out.push(this.el(\"header\", { className: this.cls(\"header\") }, head));\n }\n if (other.length > 0) out.push(...this.renderFlow(other));\n return out;\n }\n\n /* ----------------------------- flow / inline ------------------------ */\n\n private renderFlow(nodes: Node[]): unknown[] {\n const out: unknown[] = [];\n let inline: Node[] = [];\n const flush = (): void => {\n if (inline.length === 0) return;\n const meaningful = inline.some((n) => n.type !== \"text\" || n.value.trim() !== \"\");\n if (meaningful) {\n out.push(\n this.el(\"p\", { className: this.cls(\"para\") }, this.renderInline(inline)),\n );\n }\n inline = [];\n };\n for (const node of nodes) {\n if (node.type === \"parbreak\") flush();\n else if (isBlockNode(node)) {\n flush();\n out.push(this.renderNode(node));\n } else inline.push(node);\n }\n flush();\n return out;\n }\n\n private renderInline(nodes: Node[]): unknown[] {\n return nodes.map((n) => this.renderNode(n));\n }\n\n /* ------------------------------ per node ---------------------------- */\n\n private renderNode(node: Node): unknown {\n const override =\n this.overrides.get(node.type) ??\n (node.type === \"command\" ? this.overrides.get(`command:${node.name}`) : undefined);\n if (override) return override(node, this.ctx(), (ns) => this.renderFlow(ns));\n\n switch (node.type) {\n case \"text\":\n return node.value;\n case \"parbreak\":\n return null;\n case \"linebreak\":\n return this.el(\"br\", null, []);\n case \"rule\":\n return this.el(\"hr\", { className: this.cls(\"rule\") }, []);\n case \"space\":\n return node.axis === \"vertical\"\n ? this.el(\"div\", { style: { height: this.dim(node.size) } }, [])\n : this.el(\n \"span\",\n { style: { display: \"inline-block\", width: this.dim(node.size) } },\n [],\n );\n case \"group\":\n return this.frag(this.renderInline(node.children));\n case \"bold\":\n return this.el(\"strong\", null, this.renderInline(node.children));\n case \"italic\":\n return this.el(\"em\", null, this.renderInline(node.children));\n case \"underline\":\n return this.el(\"u\", null, this.renderInline(node.children));\n case \"strike\":\n return this.el(\"s\", null, this.renderInline(node.children));\n case \"color\": {\n const inner = this.renderInline(node.children);\n if (!node.color || !isSafeColor(node.color)) return this.frag(inner);\n return this.el(\"span\", { style: { color: node.color } }, inner);\n }\n case \"themecolor\":\n return this.el(\n \"span\",\n {\n style: {\n color: `var(--${this.prefix}-color-${tokenSafe(node.token)}, currentColor)`,\n },\n },\n this.renderInline(node.children),\n );\n case \"fontsize\": {\n const inner = this.renderInline(node.children);\n if (!isSafeDimension(node.size)) return this.frag(inner);\n return this.el(\"span\", { style: { fontSize: node.size } }, inner);\n }\n case \"fontfamily\": {\n const inner = this.renderInline(node.children);\n const family =\n node.family === \"monospace\"\n ? `var(--${this.prefix}-font-mono)`\n : sanitizeStyleValue(node.family);\n if (!family) return this.frag(inner);\n return this.el(\"span\", { style: { fontFamily: family } }, inner);\n }\n case \"fontscale\":\n return node.scale === \"normal\"\n ? this.frag(this.renderInline(node.children))\n : this.el(\n \"span\",\n { className: this.cls(`scale-${node.scale}`) },\n this.renderInline(node.children),\n );\n case \"link\":\n return this.renderLink(node.href, this.renderInline(node.children));\n case \"url\":\n return this.renderLink(node.href, [node.rawHref]);\n case \"icon\":\n return this.renderIcon(node.name);\n case \"section\":\n return this.el(\n `h${node.level + 1}`,\n { className: this.cls(\"subsection-title\") },\n [node.title],\n );\n case \"list\":\n return this.renderList(node);\n case \"columns\":\n return this.renderColumns(node);\n case \"skills\":\n return this.el(\n \"ul\",\n { className: this.cls(\"skills\") },\n node.items.map((s) => this.el(\"li\", { className: this.cls(\"skill\") }, [s])),\n );\n case \"job\":\n return this.renderEntry(node, \"job\");\n case \"education\":\n return this.renderEntry(node, \"education\");\n case \"project\":\n return this.renderEntry(node, \"project\");\n case \"contact\":\n return this.renderContact(node);\n case \"command\":\n return this.renderCommand(node);\n default:\n return null;\n }\n }\n\n private renderContact(node: Extract<Node, { type: \"contact\" }>): unknown {\n const item = this.cls(\"contact-item\");\n switch (node.field) {\n case \"email\":\n return this.contactLink(`mailto:${node.value}`, \"email\", node.value, item);\n case \"phone\":\n return this.contactLink(\n `tel:${node.value.replace(/[^\\d+]/g, \"\")}`,\n \"phone\",\n node.value,\n item,\n );\n case \"website\":\n return this.contactLink(node.value, \"website\", node.value, item);\n case \"location\":\n return this.el(\"span\", { className: item }, [\n this.renderIcon(\"location\"),\n node.value,\n ]);\n default:\n return this.el(\"span\", { className: item }, [node.value]);\n }\n }\n\n private contactLink(url: string, icon: string, label: string, cls: string): unknown {\n const { safe } = sanitizeUrl(url);\n return this.el(\"a\", { className: cls, href: safe }, [this.renderIcon(icon), label]);\n }\n\n private renderLink(href: string, label: unknown[]): unknown {\n const { safe } = sanitizeUrl(href);\n const external = /^https?:/i.test(safe);\n const props: Record<string, unknown> = { className: this.cls(\"link\"), href: safe };\n if (external) {\n props.target = \"_blank\";\n props.rel = \"noopener noreferrer\";\n }\n return this.el(\"a\", props, label);\n }\n\n private renderList(node: ListNode): unknown {\n const tag = node.kind === \"enumerate\" ? \"ol\" : \"ul\";\n return this.el(\n tag,\n { className: this.cls(\"list\") },\n node.items.map((item) => this.el(\"li\", null, this.renderInline(item.children))),\n );\n }\n\n private renderColumns(node: ColumnsNode): unknown {\n return this.el(\n \"div\",\n { className: this.cls(\"columns\") },\n node.columns.map((col) => {\n const basis = isSafeDimension(col.width) ? col.width : \"auto\";\n const style = basis === \"auto\" ? { flex: \"1 1 0\" } : { flex: `0 0 ${basis}` };\n return this.el(\n \"div\",\n { className: this.cls(\"column\"), style },\n this.renderFlow(col.children),\n );\n }),\n );\n }\n\n private renderEntry(\n node: Extract<Node, { type: \"job\" | \"education\" | \"project\" }>,\n kind: string,\n ): unknown {\n const { title, subtitle, dates, location, url } = entryParts(node.fields, kind);\n const rows: unknown[] = [];\n const titleEl = url ? this.renderLink(sanitizeUrl(url).safe, [title]) : title;\n rows.push(\n this.el(\"div\", { className: this.cls(\"entry-row\") }, [\n this.el(\"span\", { className: this.cls(\"entry-title\") }, [titleEl]),\n dates ? this.el(\"span\", { className: this.cls(\"entry-dates\") }, [dates]) : null,\n ]),\n );\n if (subtitle || location) {\n rows.push(\n this.el(\"div\", { className: this.cls(\"entry-row\") }, [\n this.el(\"span\", { className: this.cls(\"entry-subtitle\") }, [subtitle]),\n location\n ? this.el(\"span\", { className: this.cls(\"entry-location\") }, [location])\n : null,\n ]),\n );\n }\n if (node.children.length > 0) {\n rows.push(\n this.el(\n \"div\",\n { className: this.cls(\"entry-body\") },\n this.renderFlow(node.children),\n ),\n );\n }\n return this.el(\"div\", { className: `${this.cls(\"entry\")} ${this.cls(kind)}` }, rows);\n }\n\n private renderCommand(node: CommandNode): unknown {\n const inner = node.args.flatMap((a) => a.children);\n if (node.name === \"center\") {\n return this.el(\"div\", { className: this.cls(\"center\") }, this.renderFlow(inner));\n }\n return this.frag(this.renderInline(inner));\n }\n\n private renderIcon(name: string): unknown {\n const svg = iconToSvg(name);\n if (!svg) return this.el(\"span\", { className: this.cls(\"icon\"), title: name }, []);\n // Inline SVG via dangerouslySetInnerHTML, matching React's escape hatch.\n return this.el(\n \"span\",\n {\n className: this.cls(\"icon\"),\n dangerouslySetInnerHTML: { __html: svg },\n },\n [],\n );\n }\n\n /* ------------------------------ helpers ----------------------------- */\n\n private el(\n type: unknown,\n props: Record<string, unknown> | null,\n children: unknown[],\n ): unknown {\n const filtered = children.filter((c) => c !== null && c !== undefined && c !== \"\");\n const finalProps = { ...(props ?? {}), key: this.key++ };\n return this.h(type, finalProps, ...filtered);\n }\n\n private frag(children: unknown[]): unknown {\n return this.el(this.Fragment, null, children);\n }\n\n private dim(value: string): string {\n return isSafeDimension(value) ? value : \"0\";\n }\n\n private cls(name: string): string {\n return `${this.prefix}-${name}`;\n }\n}\n\n/** Render a document AST to a React element tree. */\nexport function renderReact(ast: DocumentNode, options: ReactRenderOptions): unknown {\n return new ReactRenderer(options).render(ast);\n}\n","import {\n type DocumentNode,\n type Diagnostic,\n type Token,\n type Theme,\n type PartialTheme,\n type EnvironmentDefinition,\n} from \"./types/index.js\";\nimport { tokenize, type TokenizeResult } from \"./tokenizer/index.js\";\nimport { Parser } from \"./parser/parser.js\";\nimport { CommandRegistry } from \"./parser/registry.js\";\nimport { createDefaultRegistry } from \"./parser/builtins.js\";\nimport { validate } from \"./validator/index.js\";\nimport { resolveTheme } from \"./theme/themes.js\";\nimport { registerIcon, type IconDefinition } from \"./icons/icons.js\";\nimport {\n HtmlRenderer,\n renderJson,\n renderPrintHtml,\n renderPdf,\n type HtmlRenderOptions,\n type JsonRenderOptions,\n type PrintOptions,\n type PdfOptions,\n} from \"./renderers/index.js\";\nimport type { HtmlRenderFn } from \"./renderers/context.js\";\nimport {\n ReactRenderer,\n type ReactRenderFn,\n type ReactRenderOptions,\n} from \"./renderers/react.js\";\nimport type { EngineCommand, ReTeXPlugin, PluginHost } from \"./plugin/types.js\";\n\nexport interface EngineOptions {\n theme?: Theme | PartialTheme;\n plugins?: ReTeXPlugin[];\n classPrefix?: string;\n /** Max number of compiled documents to cache. Default 64. */\n cacheSize?: number;\n}\n\nexport interface CompileResult {\n source: string;\n tokens: Token[];\n ast: DocumentNode;\n diagnostics: Diagnostic[];\n}\n\nexport interface CompileOptions {\n /** Run semantic validation in addition to parsing. Default `true`. */\n validate?: boolean;\n}\n\nconst isTheme = (t: Theme | PartialTheme | undefined): t is Theme =>\n !!t && \"colors\" in t && \"fonts\" in t && \"fontSizes\" in t && \"page\" in t;\n\n/**\n * The ReTeX engine: the single entry point that wires the tokenizer, parser,\n * validator, renderers, theming, plugins, and caching together.\n *\n * ```ts\n * const engine = new ReTeXEngine({ theme: { colors: { primary: \"#7c3aed\" } } });\n * engine.registerCommand({ name: \"badge\", args: [{ kind: \"content\" }],\n * render: { html: (n, ctx, kids) => `<span class=\"badge\">${kids((n as any).args[0].children)}</span>` } });\n * const html = engine.toHtml(source);\n * ```\n */\nexport class ReTeXEngine implements PluginHost {\n private registry: CommandRegistry;\n private theme: Theme;\n private readonly prefix: string;\n private readonly htmlOverrides = new Map<string, HtmlRenderFn>();\n private readonly reactOverrides = new Map<string, ReactRenderFn>();\n private readonly cache = new Map<string, CompileResult>();\n private readonly cacheSize: number;\n private generation = 0;\n\n constructor(options: EngineOptions = {}) {\n this.registry = createDefaultRegistry();\n this.theme = isTheme(options.theme) ? options.theme : resolveTheme(options.theme);\n this.prefix = options.classPrefix ?? \"retex\";\n this.cacheSize = options.cacheSize ?? 64;\n for (const plugin of options.plugins ?? []) this.use(plugin);\n }\n\n /* ----------------------------- plugins ------------------------------ */\n\n use(plugin: ReTeXPlugin): this {\n for (const cmd of plugin.commands ?? []) this.registerCommand(cmd);\n for (const env of plugin.environments ?? []) this.registerEnvironment(env);\n for (const [name, def] of Object.entries(plugin.icons ?? {})) {\n this.registerIcon(name, def);\n }\n for (const [key, fn] of Object.entries(plugin.htmlRenderers ?? {})) {\n this.registerHtmlRenderer(key, fn);\n }\n for (const [key, fn] of Object.entries(plugin.reactRenderers ?? {})) {\n this.registerReactRenderer(key, fn);\n }\n if (plugin.theme) this.setTheme(plugin.theme);\n plugin.setup?.(this);\n this.invalidate();\n return this;\n }\n\n registerCommand(def: EngineCommand): this {\n const { render, ...spec } = def;\n this.registry.registerCommand(spec);\n if (render?.html) this.htmlOverrides.set(`command:${def.name}`, render.html);\n if (render?.react) this.reactOverrides.set(`command:${def.name}`, render.react);\n this.invalidate();\n return this;\n }\n\n registerEnvironment(def: EnvironmentDefinition): this {\n this.registry.registerEnvironment(def);\n this.invalidate();\n return this;\n }\n\n registerHtmlRenderer(key: string, fn: HtmlRenderFn): this {\n this.htmlOverrides.set(key, fn);\n return this;\n }\n\n registerReactRenderer(key: string, fn: ReactRenderFn): this {\n this.reactOverrides.set(key, fn);\n return this;\n }\n\n registerIcon(name: string, def: IconDefinition): this {\n registerIcon(name, def);\n return this;\n }\n\n /* ----------------------------- theming ------------------------------ */\n\n setTheme(theme: Theme | PartialTheme): this {\n this.theme = isTheme(theme) ? theme : resolveTheme(theme, this.theme);\n this.invalidate();\n return this;\n }\n\n getTheme(): Theme {\n return this.theme;\n }\n\n getRegistry(): CommandRegistry {\n return this.registry;\n }\n\n /* --------------------------- compilation ---------------------------- */\n\n tokenize(source: string): TokenizeResult {\n return tokenize(source);\n }\n\n /** Tokenize, parse, and (by default) validate a source string. Cached. */\n compile(source: string, options: CompileOptions = {}): CompileResult {\n const runValidate = options.validate ?? true;\n const key = `${this.generation}:${runValidate ? \"v\" : \"p\"}:${source}`;\n const cached = this.cache.get(key);\n if (cached) return cached;\n\n const { tokens, diagnostics: lexDiags } = tokenize(source);\n const { ast, diagnostics: parseDiags } = new Parser(tokens, {\n registry: this.registry,\n }).parse();\n const diagnostics = [...lexDiags, ...parseDiags];\n if (runValidate) diagnostics.push(...validate(ast, { theme: this.theme }));\n\n const result: CompileResult = { source, tokens, ast, diagnostics };\n this.remember(key, result);\n return result;\n }\n\n parse(source: string): DocumentNode {\n return this.compile(source, { validate: false }).ast;\n }\n\n validate(input: string | DocumentNode): Diagnostic[] {\n if (typeof input === \"string\") return this.compile(input).diagnostics;\n return validate(input, { theme: this.theme });\n }\n\n /* ----------------------------- renderers ---------------------------- */\n\n toHtml(input: string | DocumentNode, options: HtmlRenderOptions = {}): string {\n return this.htmlRenderer(options).render(this.astOf(input));\n }\n\n toHtmlDocument(\n input: string | DocumentNode,\n options: HtmlRenderOptions & { title?: string } = {},\n ): string {\n return this.htmlRenderer(options).renderDocument(this.astOf(input), options.title);\n }\n\n toReact(\n input: string | DocumentNode,\n options: Omit<ReactRenderOptions, \"theme\" | \"classPrefix\" | \"overrides\">,\n ): unknown {\n return new ReactRenderer({\n ...options,\n theme: this.theme,\n classPrefix: this.prefix,\n overrides: this.reactOverrides,\n }).render(this.astOf(input));\n }\n\n toJson(input: string | DocumentNode, options?: JsonRenderOptions): string {\n return renderJson(this.astOf(input), options);\n }\n\n toPrintHtml(input: string | DocumentNode, options: PrintOptions = {}): string {\n return renderPrintHtml(this.astOf(input), this.printOptions(options));\n }\n\n toPdf(input: string | DocumentNode, options: PdfOptions = {}): Promise<Uint8Array> {\n return renderPdf(this.astOf(input), this.printOptions(options));\n }\n\n /** The CSS stylesheet for the active theme. */\n styles(): string {\n return this.htmlRenderer().styles();\n }\n\n /* ------------------------------ internals --------------------------- */\n\n private astOf(input: string | DocumentNode): DocumentNode {\n return typeof input === \"string\"\n ? this.compile(input, { validate: false }).ast\n : input;\n }\n\n private htmlRenderer(options: HtmlRenderOptions = {}): HtmlRenderer {\n return new HtmlRenderer({\n theme: this.theme,\n classPrefix: this.prefix,\n overrides: this.htmlOverrides,\n ...options,\n });\n }\n\n private printOptions<T extends PrintOptions>(options: T): T {\n return {\n theme: this.theme,\n classPrefix: this.prefix,\n overrides: this.htmlOverrides,\n ...options,\n };\n }\n\n private invalidate(): void {\n this.generation++;\n this.cache.clear();\n }\n\n private remember(key: string, result: CompileResult): void {\n if (this.cache.size >= this.cacheSize) {\n const oldest = this.cache.keys().next().value;\n if (oldest !== undefined) this.cache.delete(oldest);\n }\n this.cache.set(key, result);\n }\n}\n\n/** Create an engine with the default configuration. */\nexport function createEngine(options?: EngineOptions): ReTeXEngine {\n return new ReTeXEngine(options);\n}\n","import type { CommandNode } from \"../types/index.js\";\nimport type { ReTeXPlugin } from \"./types.js\";\n\n/**\n * Example plugin: `\\badge{New}` renders a small pill. Demonstrates a custom\n * inline command with both HTML and React renderers and no custom AST node.\n */\nexport const badgePlugin: ReTeXPlugin = {\n name: \"badge\",\n commands: [\n {\n name: \"badge\",\n category: \"inline\",\n args: [{ kind: \"content\", name: \"label\" }],\n summary: \"A small inline badge / pill.\",\n example: \"\\\\badge{New}\",\n render: {\n html: (node, ctx, renderChildren) => {\n const n = node as CommandNode;\n const inner = renderChildren(n.args[0]?.children ?? []);\n return (\n `<span class=\"${ctx.cls(\"badge\")}\" style=\"display:inline-block;` +\n `padding:0.05em 0.45em;border-radius:999px;font-size:0.8em;` +\n `background:var(--${ctx.classPrefix}-primary);color:#fff;` +\n `vertical-align:middle\">${inner}</span>`\n );\n },\n react: (node, ctx, renderChildren) => {\n const n = node as CommandNode;\n return ctx.h(\n \"span\",\n {\n className: ctx.cls(\"badge\"),\n style: {\n display: \"inline-block\",\n padding: \"0.05em 0.45em\",\n borderRadius: \"999px\",\n fontSize: \"0.8em\",\n background: `var(--${ctx.classPrefix}-primary)`,\n color: \"#fff\",\n verticalAlign: \"middle\",\n },\n },\n ...renderChildren(n.args[0]?.children ?? []),\n );\n },\n },\n },\n ],\n};\n\n/**\n * Example plugin: `\\rating{4}` (out of 5) renders filled/empty dots.\n * Demonstrates a `string` argument and an HTML override.\n */\nexport const ratingPlugin: ReTeXPlugin = {\n name: \"rating\",\n commands: [\n {\n name: \"rating\",\n category: \"inline\",\n args: [{ kind: \"string\", name: \"score\" }],\n summary: \"A 0–5 proficiency rating rendered as dots.\",\n example: \"\\\\rating{4}\",\n render: {\n html: (node, ctx) => {\n const n = node as CommandNode;\n const score = clamp(parseFloat(n.args[0]?.raw ?? \"0\"));\n let dots = \"\";\n for (let i = 1; i <= 5; i++) {\n dots += `<span style=\"color:${\n i <= score\n ? `var(--${ctx.classPrefix}-primary)`\n : `var(--${ctx.classPrefix}-border)`\n }\">●</span>`;\n }\n return `<span class=\"${ctx.cls(\"rating\")}\" aria-label=\"${score} out of 5\">${dots}</span>`;\n },\n },\n },\n ],\n};\n\nfunction clamp(n: number): number {\n if (Number.isNaN(n)) return 0;\n return Math.max(0, Math.min(5, Math.round(n)));\n}\n","import type { Node, DocumentNode, FieldMap } from \"../types/index.js\";\nimport { isBlockNode } from \"../renderers/context.js\";\n\n/** Escape characters that are structurally significant in ReTeX text. */\nfunction escapeText(value: string): string {\n return value.replace(/([{}\\\\])/g, \"\\\\$1\");\n}\n\nfunction fieldsToString(fields: FieldMap): string {\n return Object.entries(fields)\n .map(([k, v]) => (v === \"\" ? k : `${k}=${v}`))\n .join(\", \");\n}\n\n/**\n * Serialize an AST back into canonical ReTeX source. Used by the formatter and\n * for round-trip testing. Inline content is printed compactly; block content is\n * separated by blank lines and environments are indented.\n */\nexport function printDocument(ast: DocumentNode): string {\n return printBlocks(ast.children).trimEnd() + \"\\n\";\n}\n\n/** Print a list of nodes as block flow (blank-line separated where needed). */\nfunction printBlocks(nodes: Node[]): string {\n const out: string[] = [];\n let inline: Node[] = [];\n const flush = (): void => {\n const s = printInline(inline).trim();\n if (s) out.push(s);\n inline = [];\n };\n for (const node of nodes) {\n if (node.type === \"parbreak\") {\n flush();\n } else if (\n isBlockNode(node) ||\n node.type === \"section\" ||\n node.type === \"list\" ||\n node.type === \"columns\"\n ) {\n flush();\n out.push(printBlock(node));\n } else {\n inline.push(node);\n }\n }\n flush();\n return out.join(\"\\n\\n\");\n}\n\nfunction printBlock(node: Node, indent = \"\"): string {\n switch (node.type) {\n case \"section\":\n return `${indent}\\\\${node.level === 2 ? \"subsection\" : \"section\"}{${node.title}}`;\n case \"list\": {\n const env = node.kind;\n const items = node.items\n .map((it) => `${indent} \\\\item ${printInline(it.children).trim()}`)\n .join(\"\\n\");\n return `${indent}\\\\begin{${env}}\\n${items}\\n${indent}\\\\end{${env}}`;\n }\n case \"columns\": {\n const cols = node.columns\n .map(\n (c) =>\n `${indent} \\\\column{${c.width}}\\n${indentLines(printBlocks(c.children), indent + \" \")}`,\n )\n .join(\"\\n\");\n return `${indent}\\\\begin{columns}\\n${cols}\\n${indent}\\\\end{columns}`;\n }\n case \"job\":\n case \"education\":\n case \"project\": {\n const head = `${indent}\\\\${node.type}{${fieldsToString(node.fields)}}`;\n if (node.children.length === 0) return head;\n return `${head}{${printInline(node.children).trim()}}`;\n }\n case \"skills\":\n return `${indent}\\\\skills{${node.items.join(\", \")}}`;\n case \"rule\":\n return `${indent}\\\\hrule`;\n case \"space\":\n return `${indent}\\\\${node.axis === \"vertical\" ? \"vspace\" : \"hspace\"}{${node.size}}`;\n case \"command\":\n if (node.name === \"center\") {\n const inner = node.args.flatMap((a) => a.children);\n return `${indent}\\\\begin{center}\\n${indentLines(printBlocks(inner), indent + \" \")}\\n${indent}\\\\end{center}`;\n }\n return indent + printInline([node]);\n default:\n return indent + printInline([node]);\n }\n}\n\n/** Print nodes as inline content. */\nfunction printInline(nodes: Node[]): string {\n return nodes.map(printNode).join(\"\");\n}\n\nfunction printNode(node: Node): string {\n switch (node.type) {\n case \"text\":\n return escapeText(node.value);\n case \"parbreak\":\n return \"\\n\\n\";\n case \"linebreak\":\n return \"\\\\\\\\\";\n case \"group\":\n return `{${printInline(node.children)}}`;\n case \"bold\":\n return `\\\\textbf{${printInline(node.children)}}`;\n case \"italic\":\n return `\\\\textit{${printInline(node.children)}}`;\n case \"underline\":\n return `\\\\underline{${printInline(node.children)}}`;\n case \"strike\":\n return `\\\\sout{${printInline(node.children)}}`;\n case \"color\":\n return `\\\\textcolor{${node.color}}{${printInline(node.children)}}`;\n case \"themecolor\":\n return `\\\\themecolor{${node.token}}{${printInline(node.children)}}`;\n case \"fontsize\":\n return `\\\\fontsize{${node.size}}{${printInline(node.children)}}`;\n case \"fontfamily\":\n return `\\\\fontfamily{${node.family}}{${printInline(node.children)}}`;\n case \"fontscale\":\n return `{\\\\${node.scale === \"normal\" ? \"normalsize\" : node.scale} ${printInline(node.children)}}`;\n case \"link\":\n return `\\\\href{${node.rawHref}}{${printInline(node.children)}}`;\n case \"url\":\n return `\\\\url{${node.rawHref}}`;\n case \"icon\":\n return `\\\\icon{${node.name}}`;\n case \"contact\":\n return `\\\\${node.field}{${node.value}}`;\n case \"space\":\n return `\\\\${node.axis === \"vertical\" ? \"vspace\" : \"hspace\"}{${node.size}}`;\n case \"command\": {\n const args = node.args\n .map((a) => (a.raw !== undefined ? `{${a.raw}}` : `{${printInline(a.children)}}`))\n .join(\"\");\n return `\\\\${node.name}${args}`;\n }\n // Block nodes appearing in inline context fall back to block printing.\n default:\n return printBlock(node);\n }\n}\n\nfunction indentLines(text: string, indent: string): string {\n return text\n .split(\"\\n\")\n .map((line) => (line ? indent + line : line))\n .join(\"\\n\");\n}\n","import {\n TokenType,\n type Token,\n type SourceRange,\n type Diagnostic,\n type DocumentNode,\n type Theme,\n type CommandDefinition,\n type EnvironmentDefinition,\n} from \"../types/index.js\";\nimport { tokenize } from \"../tokenizer/index.js\";\nimport { Parser } from \"../parser/parser.js\";\nimport { CommandRegistry } from \"../parser/registry.js\";\nimport { createDefaultRegistry } from \"../parser/builtins.js\";\nimport { validate } from \"../validator/index.js\";\nimport { printDocument } from \"./printer.js\";\n\nexport type CompletionKind = \"command\" | \"environment\" | \"field\" | \"snippet\";\n\nexport interface CompletionItem {\n label: string;\n kind: CompletionKind;\n detail?: string;\n documentation?: string;\n /** Plain text to insert. */\n insertText: string;\n /** LSP-style snippet with `${n:placeholder}` tab stops. */\n snippet?: string;\n /** Range the completion replaces (the partial token being typed). */\n range?: SourceRange;\n}\n\nexport interface HoverInfo {\n /** Markdown documentation. */\n contents: string;\n range: SourceRange;\n}\n\nexport type SemanticTokenType =\n | \"command\"\n | \"command-unknown\"\n | \"environment\"\n | \"brace\"\n | \"bracket\"\n | \"text\"\n | \"comment\"\n | \"linebreak\"\n | \"argument\";\n\nexport interface SemanticToken {\n range: SourceRange;\n type: SemanticTokenType;\n /** e.g. `[\"section\"]`, `[\"typography\"]`, derived from the command category. */\n modifiers: string[];\n}\n\nexport interface EditorServiceOptions {\n registry?: CommandRegistry;\n theme?: Theme;\n}\n\n/**\n * Editor integration surface: everything a code editor (Monaco, CodeMirror, an\n * LSP server) needs to provide a great ReTeX authoring experience —\n * completion, hover docs, semantic highlighting, diagnostics, formatting, and\n * AST inspection. All methods are pure and synchronous.\n */\nexport class EditorService {\n private readonly registry: CommandRegistry;\n private readonly theme?: Theme;\n\n constructor(options: EditorServiceOptions = {}) {\n this.registry = options.registry ?? createDefaultRegistry();\n this.theme = options.theme;\n }\n\n /* ----------------------------- diagnostics -------------------------- */\n\n getDiagnostics(source: string): Diagnostic[] {\n const { tokens, diagnostics: lex } = tokenize(source);\n const { ast, diagnostics: parse } = new Parser(tokens, {\n registry: this.registry,\n }).parse();\n return [...lex, ...parse, ...validate(ast, this.theme ? { theme: this.theme } : {})];\n }\n\n /* ------------------------------ inspect ----------------------------- */\n\n /** Parse and return the AST for inspection / debugging. */\n inspect(source: string): DocumentNode {\n const { tokens } = tokenize(source);\n return new Parser(tokens, { registry: this.registry }).parse().ast;\n }\n\n /* ------------------------------ format ------------------------------ */\n\n format(source: string): string {\n return printDocument(this.inspect(source));\n }\n\n /* --------------------------- completion ----------------------------- */\n\n getCompletions(source: string, offset: number): CompletionItem[] {\n const before = source.slice(0, offset);\n\n const envMatch = /\\\\(begin|end)\\{([a-zA-Z*]*)$/.exec(before);\n if (envMatch) {\n const prefix = envMatch[2]!;\n const start = offset - prefix.length;\n return this.registry\n .allEnvironments()\n .filter((e) => e.name.startsWith(prefix))\n .map((e) => this.environmentCompletion(e, this.rangeAt(source, start, offset)));\n }\n\n const fieldKeys = this.fieldContext(before);\n if (fieldKeys) {\n return fieldKeys.map((key) => ({\n label: key,\n kind: \"field\" as const,\n detail: \"entry field\",\n insertText: `${key}=`,\n }));\n }\n\n const cmdMatch = /\\\\([a-zA-Z*]*)$/.exec(before);\n if (cmdMatch) {\n const prefix = cmdMatch[1]!;\n const start = offset - prefix.length - 1; // include the backslash\n return this.registry\n .allCommands()\n .filter((c) => c.name.startsWith(prefix))\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((c) => this.commandCompletion(c, this.rangeAt(source, start, offset)));\n }\n\n return [];\n }\n\n private commandCompletion(def: CommandDefinition, range: SourceRange): CompletionItem {\n const args = def.args ?? [];\n const snippetArgs = args\n .map((a, i) =>\n a.optional\n ? `[\\${${i + 1}:${a.name ?? \"opt\"}}]`\n : `{\\${${i + 1}:${a.name ?? \"arg\"}}}`,\n )\n .join(\"\");\n const plainArgs = args.map((a) => (a.optional ? \"[]\" : \"{}\")).join(\"\");\n return {\n label: `\\\\${def.name}`,\n kind: \"command\",\n detail: def.summary,\n documentation: this.commandDoc(def),\n insertText: `${def.name}${plainArgs}`,\n snippet: `${def.name}${snippetArgs}`,\n range,\n };\n }\n\n private environmentCompletion(\n def: EnvironmentDefinition,\n range: SourceRange,\n ): CompletionItem {\n return {\n label: def.name,\n kind: \"environment\",\n detail: def.summary,\n documentation: def.documentation ?? def.example,\n insertText: `${def.name}}`,\n snippet: `${def.name}}\\n\\t$0\\n\\\\end{${def.name}}`,\n range,\n };\n }\n\n /** Suggest field keys when the cursor is inside a `\\job/\\education/\\project{…}`. */\n private fieldContext(before: string): string[] | null {\n const m = /\\\\(job|education|project)\\{([^{}]*)$/.exec(before);\n if (!m) return null;\n switch (m[1]) {\n case \"job\":\n return [\"title\", \"company\", \"location\", \"start\", \"end\", \"url\"];\n case \"education\":\n return [\"school\", \"degree\", \"location\", \"start\", \"end\", \"gpa\"];\n case \"project\":\n return [\"name\", \"url\", \"start\", \"end\", \"tech\"];\n default:\n return null;\n }\n }\n\n /* ------------------------------ hover ------------------------------- */\n\n getHover(source: string, offset: number): HoverInfo | null {\n const { tokens } = tokenize(source);\n const idx = tokens.findIndex(\n (t) =>\n t.type === TokenType.Command &&\n offset >= t.range.start.offset &&\n offset <= t.range.end.offset,\n );\n if (idx === -1) return null;\n const token = tokens[idx]!;\n\n if (token.value === \"begin\" || token.value === \"end\") {\n const name = this.readNameAfter(tokens, idx);\n const env = name ? this.registry.getEnvironment(name) : undefined;\n if (env) {\n return {\n contents: this.environmentDoc(env),\n range: token.range,\n };\n }\n return null;\n }\n\n const def = this.registry.getCommand(token.value);\n if (!def) {\n return {\n contents: `Unknown command \\`\\\\${token.value}\\``,\n range: token.range,\n };\n }\n return { contents: this.commandDoc(def), range: token.range };\n }\n\n private commandDoc(def: CommandDefinition): string {\n const sig =\n `\\\\${def.name}` +\n (def.args ?? [])\n .map((a) => (a.optional ? `[${a.name ?? \"opt\"}]` : `{${a.name ?? \"arg\"}}`))\n .join(\"\");\n const lines = [`\\`\\`\\`tex\\n${sig}\\n\\`\\`\\``];\n if (def.summary) lines.push(def.summary);\n if (def.documentation) lines.push(def.documentation);\n if (def.example) lines.push(`**Example:**\\n\\`\\`\\`tex\\n${def.example}\\n\\`\\`\\``);\n return lines.join(\"\\n\\n\");\n }\n\n private environmentDoc(def: EnvironmentDefinition): string {\n const lines = [`\\`\\`\\`tex\\n\\\\begin{${def.name}} … \\\\end{${def.name}}\\n\\`\\`\\``];\n if (def.summary) lines.push(def.summary);\n if (def.example) lines.push(`**Example:**\\n\\`\\`\\`tex\\n${def.example}\\n\\`\\`\\``);\n return lines.join(\"\\n\\n\");\n }\n\n /* ------------------------ semantic highlighting --------------------- */\n\n getSemanticTokens(source: string): SemanticToken[] {\n const { tokens } = tokenize(source);\n const out: SemanticToken[] = [];\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i]!;\n switch (t.type) {\n case TokenType.Command: {\n if (t.value === \"begin\" || t.value === \"end\") {\n out.push({ range: t.range, type: \"environment\", modifiers: [] });\n break;\n }\n const def = this.registry.getCommand(t.value);\n out.push({\n range: t.range,\n type: def ? \"command\" : \"command-unknown\",\n modifiers: def?.category ? [def.category] : [],\n });\n break;\n }\n case TokenType.LBrace:\n case TokenType.RBrace:\n out.push({ range: t.range, type: \"brace\", modifiers: [] });\n break;\n case TokenType.LBracket:\n case TokenType.RBracket:\n out.push({ range: t.range, type: \"bracket\", modifiers: [] });\n break;\n case TokenType.Comment:\n out.push({ range: t.range, type: \"comment\", modifiers: [] });\n break;\n case TokenType.LineBreak:\n out.push({ range: t.range, type: \"linebreak\", modifiers: [] });\n break;\n case TokenType.Text:\n out.push({ range: t.range, type: \"text\", modifiers: [] });\n break;\n default:\n break;\n }\n }\n return out;\n }\n\n /* ------------------------------ helpers ----------------------------- */\n\n private readNameAfter(tokens: Token[], idx: number): string | undefined {\n // Expect: Command(begin/end) [Whitespace] LBrace Text RBrace\n let j = idx + 1;\n while (tokens[j] && tokens[j]!.type === TokenType.Whitespace) j++;\n if (!tokens[j] || tokens[j]!.type !== TokenType.LBrace) return undefined;\n j++;\n let name = \"\";\n while (tokens[j] && tokens[j]!.type !== TokenType.RBrace) {\n name += tokens[j]!.value;\n j++;\n }\n return name.trim();\n }\n\n private rangeAt(source: string, start: number, end: number): SourceRange {\n return {\n start: this.positionAt(source, start),\n end: this.positionAt(source, end),\n };\n }\n\n private positionAt(\n source: string,\n offset: number,\n ): {\n offset: number;\n line: number;\n column: number;\n } {\n let line = 1;\n let column = 1;\n for (let i = 0; i < offset && i < source.length; i++) {\n if (source[i] === \"\\n\") {\n line++;\n column = 1;\n } else {\n column++;\n }\n }\n return { offset, line, column };\n }\n}\n","import {\n type Node,\n type DocumentNode,\n type Diagnostic,\n type Position,\n} from \"../types/index.js\";\nimport { tokenize } from \"../tokenizer/index.js\";\nimport { Parser } from \"../parser/parser.js\";\nimport { CommandRegistry } from \"../parser/registry.js\";\nimport { createDefaultRegistry } from \"../parser/builtins.js\";\n\ninterface Segment {\n start: number;\n end: number;\n startLine: number;\n}\n\ninterface CacheEntry {\n children: Node[];\n diagnostics: Diagnostic[];\n}\n\nexport interface IncrementalStats {\n segments: number;\n cacheHits: number;\n cacheMisses: number;\n}\n\nexport interface IncrementalResult {\n ast: DocumentNode;\n diagnostics: Diagnostic[];\n stats: IncrementalStats;\n}\n\nconst isLetter = (c: string): boolean => (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n\n/**\n * Incremental, block-level compiler optimized for editors. The document is\n * split into balanced blocks at blank-line boundaries; each block's parse is\n * cached by its exact text. When the user edits one block, only that block is\n * re-tokenized and re-parsed — every other block is served from cache and\n * re-positioned with a cheap range shift.\n *\n * The produced AST is equivalent to a full parse (top-level blocks separated by\n * paragraph breaks), making this a drop-in fast path for live preview.\n */\nexport class IncrementalCompiler {\n private readonly registry: CommandRegistry;\n /** Position-independent parse cache, keyed by exact block text. */\n private readonly parseCache = new Map<string, CacheEntry>();\n /** Position-resolved cache, keyed by `offset:line:text` (already shifted). */\n private positioned = new Map<string, CacheEntry>();\n private hits = 0;\n private misses = 0;\n\n constructor(options: { registry?: CommandRegistry } = {}) {\n this.registry = options.registry ?? createDefaultRegistry();\n }\n\n /** Clear all caches (e.g. after registering new commands). */\n reset(): void {\n this.parseCache.clear();\n this.positioned.clear();\n }\n\n compile(source: string): IncrementalResult {\n this.hits = 0;\n this.misses = 0;\n const segments = splitBalancedSegments(source);\n const children: Node[] = [];\n const diagnostics: Diagnostic[] = [];\n let first = true;\n\n // Rebuild the positioned cache each pass so stale positions are dropped.\n const nextPositioned = new Map<string, CacheEntry>();\n\n for (const seg of segments) {\n const text = source.slice(seg.start, seg.end);\n if (text.trim() === \"\") continue;\n\n const posKey = `${seg.start}:${seg.startLine}:${text}`;\n let resolved = this.positioned.get(posKey);\n\n if (resolved) {\n // Same text at the same position — reuse the shifted nodes verbatim.\n this.hits++;\n } else {\n // Parse the block (or reuse a position-independent parse), then shift.\n let parsed = this.parseCache.get(text);\n if (parsed) {\n this.hits++;\n } else {\n this.misses++;\n const { tokens } = tokenize(text);\n const { ast, diagnostics: d } = new Parser(tokens, {\n registry: this.registry,\n }).parse();\n parsed = { children: ast.children, diagnostics: d };\n this.parseCache.set(text, parsed);\n }\n const dOffset = seg.start;\n const dLine = seg.startLine - 1;\n resolved = {\n children: parsed.children.map((n) => shiftClone(n, dOffset, dLine)),\n diagnostics: parsed.diagnostics.map((d) => shiftClone(d, dOffset, dLine)),\n };\n }\n\n nextPositioned.set(posKey, resolved);\n if (!first) children.push({ type: \"parbreak\" });\n first = false;\n for (const node of resolved.children) children.push(node);\n for (const diag of resolved.diagnostics) diagnostics.push(diag);\n }\n\n this.positioned = nextPositioned;\n const ast: DocumentNode = {\n type: \"document\",\n children,\n range: { start: { offset: 0, line: 1, column: 1 }, end: endPosition(source) },\n };\n return {\n ast,\n diagnostics,\n stats: {\n segments: segments.length,\n cacheHits: this.hits,\n cacheMisses: this.misses,\n },\n };\n }\n}\n\n/* --------------------------- segmentation --------------------------- */\n\n/** Split source at blank lines, merging neighbours until each block is balanced. */\nexport function splitBalancedSegments(source: string): Segment[] {\n const raw: Array<{ start: number; end: number }> = [];\n const re = /\\n([ \\t]*\\n)+/g;\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(source))) {\n raw.push({ start: last, end: m.index });\n last = m.index + m[0].length;\n }\n raw.push({ start: last, end: source.length });\n\n const segments: Segment[] = [];\n let buffer: { start: number; end: number } | null = null;\n for (const part of raw) {\n if (buffer === null) buffer = { start: part.start, end: part.end };\n else buffer.end = part.end;\n if (isBalanced(source.slice(buffer.start, buffer.end))) {\n segments.push({ ...buffer, startLine: lineAt(source, buffer.start) });\n buffer = null;\n }\n }\n if (buffer !== null) {\n segments.push({ ...buffer, startLine: lineAt(source, buffer.start) });\n }\n return segments;\n}\n\n/** Are braces and `\\begin`/`\\end` balanced in `text`? (Escapes are skipped.) */\nexport function isBalanced(text: string): boolean {\n let depth = 0;\n let env = 0;\n let i = 0;\n while (i < text.length) {\n const c = text[i]!;\n if (c === \"\\\\\") {\n i++;\n if (isLetter(text[i] ?? \"\")) {\n let name = \"\";\n while (isLetter(text[i] ?? \"\")) name += text[i++];\n if (name === \"begin\") env++;\n else if (name === \"end\") env--;\n } else {\n i++; // escaped character\n }\n continue;\n }\n if (c === \"{\" || c === \"[\") depth++;\n else if (c === \"}\" || c === \"]\") depth--;\n i++;\n }\n return depth === 0 && env === 0;\n}\n\n/* ----------------------------- shifting ----------------------------- */\n\n/** Deep-clone a value, shifting every embedded {@link Position} by the deltas. */\nfunction shiftClone<T>(value: T, dOffset: number, dLine: number): T {\n if (Array.isArray(value)) {\n return value.map((v) => shiftClone(v, dOffset, dLine)) as unknown as T;\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (\"offset\" in obj && \"line\" in obj && \"column\" in obj) {\n return {\n offset: (obj.offset as number) + dOffset,\n line: (obj.line as number) + dLine,\n column: obj.column,\n } as unknown as T;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) out[k] = shiftClone(v, dOffset, dLine);\n return out as T;\n }\n return value;\n}\n\n/* ----------------------------- helpers ------------------------------ */\n\nfunction lineAt(source: string, offset: number): number {\n let line = 1;\n for (let i = 0; i < offset && i < source.length; i++) {\n if (source[i] === \"\\n\") line++;\n }\n return line;\n}\n\nfunction endPosition(source: string): Position {\n let line = 1;\n let column = 1;\n for (let i = 0; i < source.length; i++) {\n if (source[i] === \"\\n\") {\n line++;\n column = 1;\n } else {\n column++;\n }\n }\n return { offset: source.length, line, column };\n}\n"]}