{"version":3,"sources":["../src/config.ts","../src/parser/errors.ts","../src/parser/lexer.ts","../src/parser/parser.ts","../src/parser/serializer.ts","../src/renderer/themes.ts","../src/renderer/layout.ts","../src/renderer/icons.ts","../src/renderer/svg.ts","../src/renderer/index.ts","../src/index.ts"],"names":["laidRoot","gaps","titleWidth","innerX","innerWidth","children","getAttrString","getAttrIdent","getAttrNumber","getAttr","parse","serialize"],"mappings":";;;;;AAQA,IAAM,cAAA,GAA2C,OAAO,MAAA,CAAO;AAAA,EAC7D,KAAA,EAAO,SAAA;AAAA,EACP,aAAA,EAAe;AACjB,CAAC,CAAA;AAED,IAAI,aAAA,GAAgC,EAAE,GAAG,cAAA,EAAe;AAEjD,SAAS,YAAY,OAAA,EAAwC;AAClE,EAAA,aAAA,GAAgB,EAAE,GAAG,aAAA,EAAe,GAAG,OAAA,EAAQ;AACjD;AAEO,SAAS,SAAA,GAA4B;AAC1C,EAAA,OAAO,EAAE,GAAG,aAAA,EAAc;AAC5B;;;ACfO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAc,MAAA,EAAgB;AACzD,IAAA,KAAA,CAAM,QAAQ,IAAI,CAAA,MAAA,EAAS,MAAM,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;;;AC2BA,IAAM,oBAAA,GAAuB,CAAC,CAAA,EAAG,CAAC,CAAA;AAE3B,SAAS,SAAS,MAAA,EAAyB;AAChD,EAAA,MAAM,SAAkB,EAAC;AAEzB,EAAA,MAAM,GAAA,GAAM,OAAO,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,IAAI,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAwB,CAAC,CAAC,CAAA;AAGhC,EAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,KAAA,CAAM,QAAQ,OAAA,EAAA,EAAW;AACvD,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAO,CAAA,IAAK,EAAA;AAClC,IAAA,MAAM,SAAS,OAAA,GAAU,CAAA;AAGzB,IAAA,MAAM,oBAAoB,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AAC1D,IAAA,IAAI,iBAAA,CAAkB,QAAA,CAAS,GAAI,CAAA,EAAG;AACpC,MAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,OAAA,CAAQ,GAAI,CAAA,GAAI,CAAA;AACpD,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,kDAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAIA,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,IAAA,IAAI,OAAA,KAAY,EAAA,IAAM,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,iBAAA,CAAkB,MAAA;AAGvC,IAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,YAAA,GAAe,CAAA,EAAG;AAC3C,MAAA,IAAI,CAAC,oBAAA,CAAqB,QAAA,CAAS,YAAqB,CAAA,EAAG;AACzD,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,4BAA4B,YAAY,CAAA,oFAAA,CAAA;AAAA,UACxC,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,UAAA,GAAa,YAAA;AAAA,IACf;AAEA,IAAA,MAAM,OAAO,UAAA,IAAc,CAAA;AAE3B,IAAA,IAAI,YAAA,GAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,eAAA,EAAkB,YAAY,CAAA,6BAAA,EAAgC,IAAI,oBAAoB,IAAI,CAAA,mBAAA,CAAA;AAAA,QAC1F,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA;AAE5D,IAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,MAAA,IAAI,YAAA,GAAe,iBAAiB,IAAA,EAAM;AACxC,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,mBAAA,EAAsB,YAAA,GAAe,YAAY,CAAA,2BAAA,EAA8B,IAAI,CAAA,sBAAA,CAAA;AAAA,UACnF,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,WAAA,CAAY,KAAK,YAAY,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAAA,QACpB,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,eAAe,YAAA,EAAc;AACtC,MAAA,OAAA,CAAQ,YAAY,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,IAAK,KAAK,YAAA,EAAc;AAChE,QAAA,WAAA,CAAY,GAAA,EAAI;AAChB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,GAAA,EAAK,EAAA;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AACA,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA;AACtD,MAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,qDAAqD,YAAY,CAAA,eAAA,EAAkB,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,UACzG,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,mBAAA,CAAoB,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ,MAAM,CAAA;AACzD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,GAAA,EAAK,IAAA;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,QAAQ,MAAA,GAAS;AAAA,KAC1B,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,WAAA,CAAY,SAAS,CAAA,EAAG;AAC7B,IAAA,WAAA,CAAY,GAAA,EAAI;AAChB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,GAAA,EAAK,EAAA;AAAA,MACL,IAAA,EAAM,MAAM,MAAA,GAAS,CAAA;AAAA,MACrB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK;AAAA,IACV,IAAA,EAAM,KAAA;AAAA,IACN,GAAA,EAAK,EAAA;AAAA,IACL,IAAA,EAAM,MAAM,MAAA,GAAS,CAAA;AAAA,IACrB,MAAA,EAAQ;AAAA,GACT,CAAA;AACD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAA,CACP,OAAA,EACA,YAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,GAAA,GAAM,YAAA;AACV,EAAA,MAAM,MAAM,OAAA,CAAQ,MAAA;AAEpB,EAAA,OAAO,MAAM,GAAA,EAAK;AAChB,IAAA,MAAM,EAAA,GAAK,QAAQ,GAAG,CAAA;AAGtB,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,GAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAM,KAAA,GAAQ,GAAA;AACd,MAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,MAAA,GAAA,EAAA;AACA,MAAA,OAAO,MAAM,GAAA,EAAK;AAChB,QAAA,MAAM,CAAA,GAAI,QAAQ,GAAG,CAAA;AACrB,QAAA,IAAI,MAAM,GAAA,EAAK;AACb,UAAA,GAAA,EAAA;AACA,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,GAAA,EAAK,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAAA,YAC7B,WAAA,EAAa,KAAA;AAAA,YACb,IAAA,EAAM,MAAA;AAAA,YACN,QAAQ,KAAA,GAAQ;AAAA,WACjB,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAA;AAC5B,UAAA,IAAI,SAAS,GAAA,EAAK;AAChB,YAAA,KAAA,IAAS,GAAA;AACT,YAAA,GAAA,IAAO,CAAA;AACP,YAAA;AAAA,UACF;AACA,UAAA,IAAI,SAAS,IAAA,EAAM;AACjB,YAAA,KAAA,IAAS,IAAA;AACT,YAAA,GAAA,IAAO,CAAA;AACP,YAAA;AAAA,UACF;AACA,UAAA,IAAI,SAAS,GAAA,EAAK;AAChB,YAAA,KAAA,IAAS,IAAA;AACT,YAAA,GAAA,IAAO,CAAA;AACP,YAAA;AAAA,UACF;AACA,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,CAAA,2BAAA,EAA8B,QAAQ,EAAE,CAAA,6BAAA,CAAA;AAAA,YACxC,MAAA;AAAA,YACA,GAAA,GAAM;AAAA,WACR;AAAA,QACF;AACA,QAAA,KAAA,IAAS,CAAA;AACT,QAAA,GAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAM,GAAA,IAAO,OAAA,CAAQ,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK;AACzC,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,6BAAA;AAAA,UACA,MAAA;AAAA,UACA,KAAA,GAAQ;AAAA,SACV;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,EAAA,KAAO,MAAA,IAAa,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,EAAG;AACxC,MAAA,MAAM,KAAA,GAAQ,GAAA;AACd,MAAA,OAAO,GAAA,GAAM,OAAO,OAAA,CAAQ,IAAA,CAAK,QAAQ,GAAG,CAAA,IAAK,EAAE,CAAA,EAAG;AACpD,QAAA,GAAA,EAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAKvC,MAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,KAAM,GAAA,IAAO,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AAChE,QAAA,GAAA,EAAA;AACA,QAAA,MAAM,QAAA,GAAW,GAAA;AACjB,QAAA,OAAO,GAAA,GAAM,OAAO,OAAA,CAAQ,IAAA,CAAK,QAAQ,GAAG,CAAA,IAAK,EAAE,CAAA,EAAG;AACpD,UAAA,GAAA,EAAA;AAAA,QACF;AACA,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,GAAG,CAAA;AAC7C,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,OAAA;AAAA,UACN,GAAA,EAAK,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAAA,UAC7B,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAAA,UACpC,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AAAA,UACvC,IAAA,EAAM,MAAA;AAAA,UACN,QAAQ,KAAA,GAAQ;AAAA,SACjB,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,GAAmB,IAAA;AACvB,MAAA,IAAI,QAAQ,KAAA,CAAM,GAAA,EAAK,GAAA,GAAM,CAAC,MAAM,IAAA,EAAM;AACxC,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,GAAA,IAAO,CAAA;AAAA,MACT,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAG,CAAA,KAAM,GAAA,EAAK;AAC/B,QAAA,IAAA,GAAO,SAAA;AACP,QAAA,GAAA,IAAO,CAAA;AAAA,MACT,WAAW,OAAA,CAAQ,KAAA,CAAM,KAAK,GAAA,GAAM,CAAC,MAAM,IAAA,EAAM;AAC/C,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,GAAA,IAAO,CAAA;AAAA,MACT;AACA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAAA,QAC7B,YAAA,EAAc,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAAA,QACxC,IAAA;AAAA,QACA,IAAA,EAAM,MAAA;AAAA,QACN,QAAQ,KAAA,GAAQ;AAAA,OACjB,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,QAAQ,GAAA,GAAM;AAAA,OACf,CAAA;AACD,MAAA,GAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,QAAQ,GAAA,GAAM;AAAA,OACf,CAAA;AACD,MAAA,GAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,EAAA,KAAO,MAAA,IAAa,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA,EAAG;AAC5C,MAAA,MAAM,KAAA,GAAQ,GAAA;AACd,MAAA,OACE,GAAA,GAAM,OACN,eAAA,CAAgB,IAAA,CAAK,QAAQ,GAAG,CAAA,IAAK,EAAE,CAAA,EACvC;AACA,QAAA,GAAA,EAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AACtC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,GAAA,EAAK,KAAA;AAAA,QACL,UAAA,EAAY,KAAA;AAAA,QACZ,IAAA,EAAM,MAAA;AAAA,QACN,QAAQ,KAAA,GAAQ;AAAA,OACjB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,yBAAyB,EAAE,CAAA,CAAA,CAAA;AAAA,MAC3B,MAAA;AAAA,MACA,GAAA,GAAM;AAAA,KACR;AAAA,EACF;AACF;;;AC3PA,IAAM,aAAA,GAAgB,CAAC,OAAA,EAAS,SAAA,EAAW,YAAY,MAAM,CAAA;AAC7D,IAAM,WAAA,GAAc,CAAC,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAChD,IAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA;AAC/C,IAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,SAAA,EAAW,UAAU,KAAK,CAAA;AAC3D,IAAM,iBAAA,GAAoB,CAAC,MAAA,EAAQ,UAAA,EAAY,SAAS,QAAQ,CAAA;AAChE,IAAM,aAAA,GAAgB;AAAA,EACpB,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAOA,IAAM,YAAA,GAAe;AAAA,EACnB,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,iBAAA,GAAoB,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA;AAC/C,IAAM,sBAAA,GAAyB,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,QAAQ,CAAA;AAChE,IAAM,kBAAA,GAAqB,CAAC,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AACtD,IAAM,kBAAA,GAAqB,CAAC,SAAA,EAAW,MAAA,EAAQ,WAAW,OAAO,CAAA;AACjE,IAAM,qBAAA,GAAwB,CAAC,QAAA,EAAU,QAAQ,CAAA;AAGjD,IAAM,iBAAA,GAA8B,EAAE,IAAA,EAAM,QAAA,EAAS;AAErD,IAAM,UAAA,GAAwC;AAAA,EAC5C,QAAQ,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC/B,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAI,KAAA,EAAO,CAAC,OAAO,CAAA,EAAE;AAAA,EACtC,QAAQ,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC/B,QAAQ,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC/B,SAAS,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAChC,QAAQ,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC/B,UAAU,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EACjC,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,qBAAA,EAAsB;AAAA,MACxD,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,KAC1B;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC9B,OAAA,EAAS;AAAA,IACP,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,MAAM,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC7B,GAAA,EAAK;AAAA,IACH,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IACnC,KAAA,EAAO,CAAC,QAAQ;AAAA,GAClB;AAAA,EACA,QAAQ,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC/B,OAAA,EAAS;AAAA,IACP,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,KAC1B;AAAA,IACA,KAAA,EAAO,CAAC,UAAA,EAAY,UAAU;AAAA,GAChC;AAAA,EACA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,YAAA,EAAa;AAAA,MAC5C,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,cAAA;AAAe,KAClD;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,QAAQ,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC/B,GAAA,EAAK;AAAA,IACH,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,cAAA;AAAe,KAClD;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,MAAM,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC7B,IAAA,EAAM,EAAE,KAAA,EAAO,IAAI,KAAA,EAAO,CAAC,SAAS,CAAA,EAAE;AAAA,EACtC,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,YAAA,EAAa;AAAA,MAC5C,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,KAAA,EAAO,CAAC,QAAA,EAAU,SAAS;AAAA,GAC7B;AAAA,EACA,YAAY,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EACnC,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS,KACzB;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACtB,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACtB,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,YAAA,EAAa;AAAA,MAC5C,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,aAAa,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EACpC,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS,KACzB;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,KAAA,EAAO,CAAC,MAAA,EAAQ,OAAO;AAAA,GACzB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA,EAAc;AAAA,MAC9C,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,WAAA,EAAY;AAAA,MAC1C,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,KAAA,EAAO,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO;AAAA,GACnC;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,KAAA,EAAO,CAAC,SAAA,EAAW,UAAU;AAAA,GAC/B;AAAA,EACA,UAAA,EAAY;AAAA,IACV,OAAO,EAAC;AAAA,IACR,KAAA,EAAO,CAAC,UAAU;AAAA,GACpB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC9B,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,iBAAA;AAAkB,KAClD;AAAA,IACA,KAAA,EAAO,CAAC,UAAU;AAAA,GACpB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA;AAAS,KAC5B;AAAA,IACA,KAAA,EAAO,CAAC,UAAU;AAAA,GACpB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,KAC1B;AAAA,IACA,KAAA,EAAO,CAAC,UAAU;AAAA,GACpB;AAAA,EACA,EAAA,EAAI;AAAA,IACF,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA,EAAc;AAAA,MAC9C,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,WAAA,EAAY;AAAA,MAC1C,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,KAAA,EAAO,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO;AAAA,GACnC;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,KAC3B;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,SAAS,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAChC,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACtB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,iBAAA,EAAkB;AAAA,MAChD,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACzB,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACzB,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,sBAAA;AAAuB,KAC3D;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,MAAM,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC7B,QAAA,EAAU;AAAA,IACR,OAAO,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IAClC,KAAA,EAAO,CAAC,WAAA,EAAa,UAAU;AAAA,GACjC;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAO,EAAC;AAAA,IACR,KAAA,EAAO,CAAC,SAAA,EAAW,UAAA,EAAY,aAAa;AAAA,GAC9C;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IACnC,KAAA,EAAO,CAAC,UAAA,EAAY,UAAA,EAAY,aAAa;AAAA,GAC/C;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAO,EAAC;AAAA,IACR,KAAA,EAAO,CAAC,IAAA,EAAM,KAAA,EAAO,YAAY,aAAa;AAAA,GAChD;AAAA,EACA,SAAS,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAChC,MAAM,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAC7B,QAAA,EAAU;AAAA,IACR,OAAO,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IACtC,KAAA,EAAO,CAAC,UAAU;AAAA,GACpB;AAAA,EACA,WAAW,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAClC,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,KAAA,EAAO,CAAC,UAAA,EAAY,UAAU;AAAA,GAChC;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,kBAAA,EAAmB;AAAA,MACjD,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,aAAA;AAAc,KAChD;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,YAAY,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EACnC,KAAA,EAAO;AAAA,IACL,OAAO,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IAClC,OAAO;AAAC,GACV;AAAA,EACA,SAAS,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAChC,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,kBAAA;AAAmB,KACnD;AAAA,IACA,OAAO;AAAC,GACV;AAAA,EACA,WAAW,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EAClC,OAAA,EAAS;AAAA,IACP,OAAO,EAAC;AAAA,IACR,KAAA,EAAO,CAAC,UAAA,EAAY,UAAU;AAAA;AAElC,CAAA;AAEA,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,GAAG,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,UAAA,IAAc,CAAA,KAAM,YAAY,CAAA;AAAA,EAC/E;AACF,CAAC,CAAA;AAGD,IAAM,0BAAA,uBAAiC,GAAA,CAAI;AAAA,EACzC,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,wCAAwB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEtD,IAAM,oBAAA,GACJ,mZAAA;AAMK,SAAS,MAAM,MAAA,EAA0B;AAC9C,EAAA,MAAM,MAAA,GAAS,SAAS,MAAM,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,CAAE,MAAA;AACzC,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,MAAM,CAAA;AAChC,EAAA,OAAO,MAAA,CAAO,cAAc,KAAK,CAAA;AACnC;AAEA,IAAM,SAAN,MAAa;AAAA,EACM,MAAA;AAAA,EACT,GAAA,GAAM,CAAA;AAAA,EAEd,YAAY,MAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,cAAc,WAAA,EAA+B;AAC3C,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAC9B,MAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,WAAA,EAAY;AAAA,IACzC;AAEA,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,QACvD,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,eAAe,QAAA,EAAU;AAChC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAG,CAAA,CAAA,CAAA;AAAA,QAC/D,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAG9B,IAAA,MAAM,cAAgC,EAAC;AACvC,IAAA,OAAO,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,OAAA,EAAS;AACnC,MAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,GAAA;AACnC,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,CAAA;AACvC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,wCAAA;AAAA,UACA,GAAA,CAAI,IAAA;AAAA,UACJ,GAAA,CAAI;AAAA,SACN;AAAA,MACF;AACA,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,eAAe,IAAI,CAAA,oDAAA,CAAA;AAAA,QACnB,GAAA,CAAI,IAAA;AAAA,QACJ,GAAA,CAAI;AAAA,OACN;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAC9B,MAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,wCAAA;AAAA,QACA,KAAA,CAAM,IAAA;AAAA,QACN,KAAA,CAAM;AAAA,OACR;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAgB,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,WAAA,EAAY;AAC5D,IAAA,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,WAAA,GAAc,WAAA;AAC9C,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAIQ,eAAA,GAAkC;AACxC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,OAAO,IAAA,CAAK,UAAA;AAAA,MAChB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA;AACpD,IAAA,IAAA,CAAK,mBAAA,CAAoB,cAAc,IAAI,CAAA;AAE3C,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,UAAA,EAAY,QAAQ,CAAA;AACtD,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,EAAA,EAAI;AACzC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,oIAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,UAAA,EAAY,UAAU,CAAA;AACxD,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,6FAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAA;AAEb,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,QAAQ,IAAA,EAAM,IAAA,EAAM,YAAY,QAAA,EAAS;AAAA,EACxE;AAAA;AAAA,EAIQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAEhC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,GAAQ,IAAA,CAAK,SAAQ,CAAE,WAAA;AAAA,IACzB;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA;AACvD,IAAA,MAAM,QAAA,GAA0B,WAAA,GAAc,IAAA,CAAK,mBAAA,KAAwB,EAAC;AAM5E,IAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACvD,IAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACvD,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,MAAM,QAAQ,MAAA,CAAO,QAAA,CAAS,OAAO,MAAA,CAAO,QAAA,CAAS,OAAO,MAAA,GAAS,MAAA;AACrE,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,6FAAA;AAAA,QACA,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,MAAM,QAAA,CAAS;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,MAAM,OAAmB,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,UAAU,QAAA,EAAS;AAC1E,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,IACf;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,GAAqC;AAC3C,IAAA,MAAM,WAA0B,EAAC;AACjC,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAIlE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,UAAU,IAAA,CAAK,UAAA,IAAc,KAAK,GAAA,GAAM,EAAA;AACnE,MAAA,IAAI,IAAA,KAAS,WAAW,QAAA,EAAU;AAChC,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,0CAAA;AAAA,UACA,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,KAAK,kBAAA,EAAmB;AAClD,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AACnB,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,MAAM,IAAI,aAAA;AAAA,cACR,mDAAA;AAAA,cACA,OAAO,QAAA,CAAS,IAAA;AAAA,cAChB,OAAO,QAAA,CAAS;AAAA,aAClB;AAAA,UACF;AACA,UAAA,UAAA,GAAa,MAAA;AACb,UAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,QACtB;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,KAAK,gBAAA,EAAiB;AACpC,MAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,+FAAA;AAAA,YACA,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,UAAA,GAAa,KAAA;AAAA,MACf,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,+FAAA;AAAA,YACA,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,UAAA,GAAa,KAAA;AAAA,MACf,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,mDAAA;AAAA,YACA,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,UAAA,GAAa,KAAA;AAAA,MACf,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,QAAA,QAAA,GAAW,IAAA;AAAA,MACb;AACA,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,sCAAsC,CAAA;AAChE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,GAAgC;AACtC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,0BAAA,EAA6B,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,QAChD,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,IAAA,IAAI,CAAC,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,cAAc,uBAAA,CAAwB,IAAI,GAAG,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,IAC/E;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,oEAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,qCAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,sCAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,sCAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,iDAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,uCAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,sCAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,0CAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,2CAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,6CAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,2DAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,QAAA,IAAY,SAAS,UAAA,EAAY;AAClE,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,IAAI,IAAI,CAAA,iCAAA,CAAA;AAAA,QACR,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,2CAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,8CAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA,CAAK,WAAA,EAAY;AAC/C,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA,CAAK,WAAA,EAAY;AAC/C,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA,CAAK,WAAA,EAAY;AAC/C,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA,CAAK,WAAA,EAAY;AAC/C,IAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,IAAA,CAAK,UAAA,EAAW;AAC7C,IAAA,OAAO,IAAA,CAAK,yBAAyB,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA,EAIQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,sBAAA,KAA2B,EAAC;AAChE,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC1D;AAAA,EAEQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,2BAAA,KAAgC,EAAC;AACrE,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC1D;AAAA;AAAA,EAIQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA;AACvD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,uHAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAS,GAAI,KAAK,mBAAA,EAAoB;AAC/D,IAAA,MAAM,IAAA,GAAmB,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,QAAA,EAAS;AAChE,IAAA,IAAI,OAAA,OAAc,OAAA,GAAU,OAAA;AAC5B,IAAA,IAAI,MAAA,OAAa,MAAA,GAAS,MAAA;AAC1B,IAAA,IAAI,QAAA,OAAe,QAAA,GAAW,QAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,mBAAA,GAIN;AACA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,oEAAA,EAAuE,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UAC1F,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,IAAI,YAAY,MAAA,EAAW;AACzB,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,mDAAA;AAAA,YACA,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,OAAA,GAAU,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAAA,MAC1C,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,kDAAA;AAAA,YACA,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,MAAA,GAAS,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,MACxC,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,oDAAA;AAAA,YACA,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,QAAA,GAAW,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,8EAA8E,IAAI,CAAA,EAAA,CAAA;AAAA,UAClF,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,oCAAoC,CAAA;AAC9D,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAS;AAAA,EACrC;AAAA,EAEQ,gBAAgB,IAAA,EAAyD;AAC/E,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC5C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,sBAAA,KAA2B,EAAC;AAChE,IAAA,MAAM,OACJ,IAAA,KAAS,SAAA,GACL,eAAA,GACA,IAAA,KAAS,WACP,cAAA,GACA,gBAAA;AACR,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,QAAA,EAAS;AAAA,EAChD;AAAA;AAAA,EAIQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,oBAAA,KAAyB,EAAC;AAC9D,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC1D;AAAA,EAEQ,oBAAA,GAAsC;AAC5C,IAAA,MAAM,WAA0B,EAAC;AACjC,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,wBAAA,EAA2B,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UAC9C,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,kDAAkD,IAAI,CAAA,EAAA,CAAA;AAAA,UACtD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,CAAA;AAAA,IACnC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,oCAAoC,CAAA;AAC9D,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,YAAA,GAA4B;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,IAAI,CAAA;AACxC,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACxD;AAAA;AAAA,EAIQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,UAAA,EAAY,UAAU,CAAA;AAC9D,IAAA,MAAM,SAAA,GACJ,aAAA,KAAkB,QAAA,GAAW,QAAA,GAAW,QAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,UAAA,EAAY,OAAO,CAAA;AACpD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,IAAI,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,sBAAA,KAA2B,EAAC;AAChE,IAAA,MAAM,IAAA,GAAkB;AAAA,MACtB,IAAA,EAAM,OAAA;AAAA,MACN,SAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,KAAA,GAAQ,KAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIQ,sBAAA,GAA2C;AACjD,IAAA,MAAM,WAA6B,EAAC;AACpC,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,sCAAsC,CAAA;AAChE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,GAAsC;AAC5C,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,0BAAA,EAA6B,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,QAChD,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,IAAA,IAAI,CAAC,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,cAAc,uBAAA,CAAwB,IAAI,GAAG,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,IAC/E;AACA,IAAA,IAAI,CAAC,0BAAA,CAA2B,GAAA,CAAI,IAAI,CAAA,EAAG;AACzC,MAAA,MAAM,MAAA,GAAS,kBAAkB,IAAI,CAAA;AACrC,MAAA,MAAM,IAAI,aAAA,CAAc,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,IAAA,CAAK,yBAAyB,IAAI,CAAA;AAAA,EAC3C;AAAA,EAEQ,yBAAyB,IAAA,EAA8B;AAC7D,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA,MACzB,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,YAAA,EAAa;AAAA,MAC3B,KAAK,MAAA;AACH,QAAA,OAAO,KAAK,SAAA,EAAU;AAAA,MACxB,KAAK,KAAA;AACH,QAAA,OAAO,KAAK,QAAA,EAAS;AAAA,MACvB,KAAK,KAAA;AACH,QAAA,OAAO,KAAK,QAAA,EAAS;AAAA,MACvB,KAAK,MAAA;AACH,QAAA,OAAO,KAAK,SAAA,EAAU;AAAA,MACxB,KAAK,MAAA;AACH,QAAA,OAAO,KAAK,SAAA,EAAU;AAAA,MACxB,KAAK,MAAA;AACH,QAAA,OAAO,KAAK,SAAA,EAAU;AAAA,MACxB,KAAK,QAAA;AACH,QAAA,OAAO,KAAK,WAAA,EAAY;AAAA,MAC1B,KAAK,YAAA;AACH,QAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,MAC9B,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA,MACzB,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA,MACzB,KAAK,QAAA;AACH,QAAA,OAAO,KAAK,WAAA,EAAY;AAAA,MAC1B,KAAK,IAAA;AACH,QAAA,OAAO,KAAK,OAAA,EAAQ;AAAA,MACtB,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA,MACzB,KAAK,MAAA;AACH,QAAA,OAAO,KAAK,SAAA,EAAU;AAAA,MACxB,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,YAAA,EAAa;AAAA,MAC3B,KAAK,MAAA;AACH,QAAA,OAAO,KAAK,SAAA,EAAU;AAAA,MACxB,KAAK,aAAA;AACH,QAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,MAC/B,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA,MACzB,KAAK,UAAA;AACH,QAAA,OAAO,KAAK,aAAA,EAAc;AAAA,MAC5B,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA,MACzB,KAAK,MAAA;AACH,QAAA,OAAO,KAAK,SAAA,EAAU;AAAA,MACxB,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,YAAA,EAAa;AAAA,MAC3B,KAAK,MAAA;AACH,QAAA,OAAO,KAAK,SAAA,EAAU;AAAA,MACxB,KAAK,YAAA;AACH,QAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,MAC9B,KAAK,UAAA;AACH,QAAA,OAAO,KAAK,aAAA,EAAc;AAAA,MAC5B,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA,MACzB,KAAK,QAAA;AACH,QAAA,OAAO,KAAK,WAAA,EAAY;AAAA,MAC1B,KAAK,MAAA;AACH,QAAA,OAAO,KAAK,SAAA,EAAU;AAAA,MACxB,KAAK,QAAA;AACH,QAAA,OAAO,KAAK,WAAA,EAAY;AAAA,MAC1B,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,YAAA,EAAa;AAAA,MAC3B,KAAK,QAAA;AACH,QAAA,OAAO,KAAK,WAAA,EAAY;AAAA,MAC1B,KAAK,WAAA;AACH,QAAA,OAAO,KAAK,cAAA,EAAe;AAAA,MAC7B,SAAS;AACP,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,QAAA,MAAM,IAAI,cAAc,uBAAA,CAAwB,IAAI,GAAG,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,MAC/E;AAAA;AACF,EACF;AAAA;AAAA,EAIQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,IAAI,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,sBAAA,KAA2B,EAAC;AAChE,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAA,GAAgE;AACtE,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,IAAI,CAAA;AACtD,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,WAAA,GACzB,IAAA,CAAK,0BAAA,EAA2B,GAChC,EAAE,QAAA,EAAU,EAAC,EAAuB,QAAQ,MAAA,EAAU;AAC1D,IAAA,MAAM,QAAmB,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,UAAU,QAAA,EAAS;AACzE,IAAA,OAAO,SAAS,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,EAAE,KAAA,EAAM;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,0BAAA,GAAkF;AACxF,IAAA,MAAM,WAA6B,EAAC;AACpC,IAAA,IAAI,MAAA;AACJ,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,UAAU,IAAA,CAAK,UAAA,IAAc,KAAK,GAAA,GAAM,MAAA;AACnE,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,qEAAA;AAAA,YACA,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,MAAA,GAAS,KAAK,WAAA,EAAY;AAC1B,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,4DAAA;AAAA,UACA,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,sCAAsC,CAAA;AAChE,IAAA,OAAO,SAAS,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,EAAE,QAAA,EAAS;AAAA,EACpD;AAAA,EAEQ,YAAA,GAA4B;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,IAAI,CAAA;AACxD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,sBAAA,KAA2B,EAAC;AAChE,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAClE;AAAA,EAEQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,gBAAA,KAAqB,EAAC;AAC1D,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EACxD;AAAA,EAEQ,gBAAA,GAA8B;AACpC,IAAA,MAAM,WAAsB,EAAC;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,gCAAA,EAAmC,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UACtD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,4CAA4C,IAAI,CAAA,EAAA,CAAA;AAAA,UAChD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,kCAAkC,CAAA;AAC5D,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,QAAA,GAAoB;AAC1B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC7C,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,IAAI,CAAA;AACpC,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACpD;AAAA,EAEQ,QAAA,GAAoB;AAC1B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,IAAI,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,2BAAA,KAAgC,EAAC;AAIrE,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,UAAA,EAAY,OAAO,CAAA;AACvD,IAAA,IAAA,CACG,SAAA,KAAc,OAAA,IAAW,SAAA,KAAc,QAAA,KACxC,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EACxC;AACA,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,8BAA8B,SAAS,CAAA,wFAAA,CAAA;AAAA,QAEvC,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,2BAAA,GAAgD;AACtD,IAAA,MAAM,WAA6B,EAAC;AACpC,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,KAAK,IAAA,KAAS,OAAA,IAAA,CAAY,KAAK,UAAA,IAAc,IAAA,CAAK,SAAS,QAAA,EAAU;AACvE,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,CAAA;AAChC,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,sCAAsC,CAAA;AAChE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,IAAA,CAAK,mBAAA,CAAoB,UAAU,IAAI,CAAA;AACvC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,QAAA,EAAS;AAAA,EAChD;AAAA,EAEQ,QAAA,GAAoB;AAC1B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAEhC,IAAA,IAAI,KAAA,GAAkB,EAAE,IAAA,EAAM,MAAA,EAAO;AAKrC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,OAAA,EAAQ;AACzB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,IAAA;AACzB,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,8DAAA,EAAiE,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,UACxE,GAAA,CAAI,IAAA;AAAA,UACJ,GAAA,CAAI;AAAA,SACN;AAAA,MACF;AACA,MAAA,KAAA,GAAQ,EAAE,MAAM,QAAA,EAAU,KAAA,EAAO,IAAI,YAAA,IAAgB,CAAA,EAAG,MAAM,IAAA,EAAK;AAAA,IACrE,WAAW,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,eAAe,MAAA,EAAQ;AAC9D,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,KAAA,GAAQ,EAAE,MAAM,MAAA,EAAO;AAAA,IACzB;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,IAAI,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,2BAAA,KAAgC,EAAC;AACrE,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC9D;AAAA;AAAA,EAIQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,iBAAA,KAAsB,EAAC;AAC3D,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EACxD;AAAA,EAEQ,iBAAA,GAA6C;AACnD,IAAA,MAAM,WAAoC,EAAC;AAC3C,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,+BAAA,EAAkC,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UACrD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,CAAC,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA,EAAG;AACpC,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,uDAAuD,IAAI,CAAA,EAAA,CAAA;AAAA,UAC3D,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,MAChC;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,kCAAkC,CAAA;AAC5D,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,OAAO,IAAA,CAAK,UAAA;AAAA,MAChB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,YAAY,QAAA,EAAS;AAAA,EACpD;AAAA,EAEQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AACrD,IAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,WAAA,GAC7B,IAAA,CAAK,iBAAA,EAAkB,GACvB,EAAE,QAAA,EAAU,EAAC,EAAuB,YAAY,MAAA,EAAU;AAC9D,IAAA,MAAM,OAAiB,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,UAAA,EAAY,UAAU,QAAA,EAAS;AAC7E,IAAA,IAAI,UAAA,OAAiB,UAAA,GAAa,UAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAAiF;AACvF,IAAA,MAAM,WAA6B,EAAC;AACpC,IAAA,IAAI,UAAA;AACJ,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,UAAU,IAAA,CAAK,UAAA,IAAc,KAAK,GAAA,GAAM,MAAA;AACnE,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,+CAAA;AAAA,YACA,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK;AAAA,WACP;AAAA,QACF;AACA,QAAA,UAAA,GAAa,KAAK,eAAA,EAAgB;AAClC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,+CAAA;AAAA,UACA,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,2CAA2C,CAAA;AACrE,IAAA,OAAO,aAAa,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,EAAE,QAAA,EAAS;AAAA,EAC5D;AAAA,EAEQ,eAAA,GAAkC;AACxC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA;AACpD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,sBAAA,KAA2B,EAAC;AAChE,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC9D;AAAA;AAAA,EAIQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAU,IAAA,CAAK,UAAA;AAAA,MACnB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,YAAY,QAAA,EAAS;AAAA,EACvD;AAAA,EAEQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,IAAA,CAAK,mBAAA,CAAoB,UAAU,IAAI,CAAA;AACvC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACvD;AAAA,EAEQ,eAAA,GAAkC;AACxC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA;AACpD,IAAA,IAAA,CAAK,mBAAA,CAAoB,cAAc,IAAI,CAAA;AAC3C,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EAC3D;AAAA,EAEQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,IAAI,CAAA;AACtC,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,QAAA,EAAS;AAAA,EAC/C;AAAA,EAEQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,GAAQ,IAAA,CAAK,SAAQ,CAAE,WAAA;AAAA,IACzB;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,IAAI,CAAA;AACtC,IAAA,MAAM,IAAA,GAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,QAAA,EAAS;AAC9D,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,KAAA,GAAQ,KAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,IAAA,CAAK,mBAAA,CAAoB,UAAU,IAAI,CAAA;AACvC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,QAAA,EAAS;AAAA,EAChD;AAAA,EAEQ,OAAA,GAAkB;AACxB,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,WAAW,IAAA,CAAK,UAAA;AAAA,MACpB,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,IAAe,EAAA;AAKtC,IAAA,IAAI,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACvD,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAC9C,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AACnC,MAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AACtC,MAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AACxC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,6DAA6D,KAAK,CAAA,mCAAA,EAAiC,SAAS,CAAA,YAAA,EAAe,IAAI,MAAM,KAAK,CAAA,CAAA,CAAA;AAAA,QAC1I,QAAA,CAAS,IAAA;AAAA,QACT,QAAA,CAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,mBAAA,CAAoB,MAAM,IAAI,CAAA;AACnC,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EAC1D;AAAA,EAEQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,IAAI,CAAA;AACtC,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,QAAA,EAAS;AAAA,EAC/C;AAAA,EAEQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAS;AAAA,EAC9C;AAAA,EAEQ,YAAA,GAA4B;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,IAAI,CAAA;AACxC,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,QAAA,EAAS;AAAA,EACjD;AAAA,EAEQ,aAAA,GAA8B;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAClD,IAAA,IAAA,CAAK,mBAAA,CAAoB,YAAY,IAAI,CAAA;AACzC,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,QAAA,EAAS;AAAA,EAClD;AAAA,EAEQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,IAAI,CAAA;AACtC,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,QAAA,EAAS;AAAA,EAC/C;AAAA;AAAA,EAIQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,UAAA,EAAY,MAAM,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,UAAA,EAAY,MAAM,CAAA;AAClD,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,GAAO,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,8DAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,GAAO,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,8DAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,iBAAA,KAAsB,EAAC;AAC3D,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,EAAM,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EACpE;AAAA,EAEQ,iBAAA,GAAgC;AACtC,IAAA,MAAM,WAAuB,EAAC;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,qBAAA,EAAwB,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UAC3C,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,6CAA6C,IAAI,CAAA,EAAA,CAAA;AAAA,UACjD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,kCAAkC,CAAA;AAC5D,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,GAAQ,IAAA,CAAK,SAAQ,CAAE,WAAA;AAAA,IACzB;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,UAAA,EAAY,KAAK,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,UAAA,EAAY,KAAK,CAAA;AACpD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,sBAAA,KAA2B,EAAC;AAChE,IAAA,MAAM,OAAiB,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,UAAU,QAAA,EAAS;AACtE,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,KAAA,GAAQ,KAAA;AACtC,IAAA,IAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,GAAA,GAAM,OAAA;AACtC,IAAA,IAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,GAAA,GAAM,OAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIQ,gBAAA,GAAoC;AAC1C,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,aAAa,CAAA;AACrD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,aAAA,EAAe,IAAI,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,qBAAA,KAA0B,EAAC;AAC/D,IAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAe,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC/D;AAAA,EAEQ,qBAAA,GAAwC;AAC9C,IAAA,MAAM,WAA2B,EAAC;AAClC,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,yBAAA,EAA4B,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UAC/C,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,wDAAwD,IAAI,CAAA,EAAA,CAAA;AAAA,UAC5D,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,CAAA;AAAA,IACpC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,yCAAyC,CAAA;AACnE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAA8B;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,UAAA,EAAY,MAAM,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,UAAA,EAAY,OAAO,CAAA;AACpD,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,iFAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,kFAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAA,CAAK,mBAAA,CAAoB,YAAY,IAAI,CAAA;AACzC,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EAC/D;AAAA;AAAA,EAIQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,IAAI,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,iBAAA,KAAsB,EAAC;AAC3D,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EACzD;AAAA,EAEQ,iBAAA,GAAgC;AACtC,IAAA,MAAM,WAAuB,EAAC;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,qBAAA,EAAwB,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UAC3C,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,8CAA8C,IAAI,CAAA,EAAA,CAAA;AAAA,UAClD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,mCAAmC,CAAA;AAC7D,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EAC5D;AAAA;AAAA,EAIQ,SAAA,GAAuB;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,iBAAA,KAAsB,EAAC;AAC3D,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EACxD;AAAA,EAEQ,iBAAA,GAAoC;AAC1C,IAAA,MAAM,WAA2B,EAAC;AAClC,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,qBAAA,EAAwB,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UAC3C,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,6CAA6C,IAAI,CAAA,EAAA,CAAA;AAAA,UACjD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,CAAA;AAAA,IACpC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,kCAAkC,CAAA;AAC5D,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAA8B;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAClD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,iBAAA,KAAsB,EAAC;AAC3D,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EACnE;AAAA;AAAA,EAIQ,YAAA,GAA4B;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,IAAI,CAAA;AACxD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,oBAAA,KAAyB,EAAC;AAC9D,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC3D;AAAA,EAEQ,oBAAA,GAAmC;AACzC,IAAA,MAAM,WAAuB,EAAC;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,qBAAA,EAAwB,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UAC3C,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,gDAAgD,IAAI,CAAA,EAAA,CAAA;AAAA,UACpD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,qCAAqC,CAAA;AAC/D,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,IAAI,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,iBAAA,KAAsB,EAAC;AAC3D,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC/D;AAAA,EAEQ,iBAAA,GAAiC;AACvC,IAAA,MAAM,WAAwB,EAAC;AAC/B,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,iDAAA,EAAoD,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UACvE,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,CAAA;AAAA,MACpC,CAAA,MAAA,IAAW,SAAS,WAAA,EAAa;AAC/B,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,CAAA;AAAA,MACrC,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,uEAAuE,IAAI,CAAA,EAAA,CAAA;AAAA,UAC3E,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,kCAAkC,CAAA;AAC5D,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAA8B;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAClD,IAAA,IAAA,CAAK,mBAAA,CAAoB,YAAY,IAAI,CAAA;AACzC,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACzD;AAAA,EAEQ,cAAA,GAAgC;AACtC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC1C,IAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,UAAA,EAAY,QAAA,EAAS;AAAA,EACnD;AAAA;AAAA,EAIQ,eAAA,GAAkC;AACxC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA;AACpD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,YAAA,EAAc,IAAI,CAAA;AAC3D,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,uBAAA,KAA4B,EAAC;AACjE,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC9D;AAAA,EAEQ,uBAAA,GAAuC;AAC7C,IAAA,MAAM,WAAwB,EAAC;AAC/B,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,sBAAA,EAAyB,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UAC5C,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,oDAAoD,IAAI,CAAA,EAAA,CAAA;AAAA,UACxD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,wCAAwC,CAAA;AAClE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,IAAI,CAAA;AACtC,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACtD;AAAA;AAAA,EAIQ,cAAA,GAAgC;AACtC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,WAAW,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,WAAA,EAAa,IAAI,CAAA;AAC1D,IAAA,MAAM,WAAW,WAAA,GAAc,IAAA,CAAK,sBAAA,CAAuB,IAAI,IAAI,EAAC;AAIpE,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,kBAAA;AACJ,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,EAAG;AAC1E,QAAA,aAAA,EAAA;AACA,QAAA,IAAI,aAAA,GAAgB,CAAA,IAAK,kBAAA,KAAuB,MAAA,EAAW;AACzD,UAAA,kBAAA,GAAqB,GAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,qFAAA;AAAA,QACA,mBAAmB,QAAA,CAAS,IAAA;AAAA,QAC5B,mBAAmB,QAAA,CAAS;AAAA,OAC9B;AAAA,IACF;AAIA,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAEvB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,CAAA,QAAA,EAAW,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,SAAA,EAC9E,QAAA,CAAS,IAAI,CAAA,wCAAA;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,EAC7D;AAAA,EAEQ,uBAAuB,aAAA,EAAqC;AAClE,IAAA,MAAM,WAA0B,EAAC;AACjC,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,KAAA,EAAO;AAClE,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,wBAAA,EAA2B,aAAA,CAAc,IAAI,CAAC,CAAA,CAAA;AAAA,UAC9C,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,GAAA;AACrC,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,qDAAqD,IAAI,CAAA,EAAA,CAAA;AAAA,UACzD,IAAA,CAAK,IAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,CAAA;AAAA,IACnC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,uCAAuC,CAAA;AAEjE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,YAAA,GAA4B;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,IAAI,CAAA;AACxC,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACxD;AAAA;AAAA,EAIQ,aAAA,GAA8B;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAClD,IAAA,IAAA,CAAK,mBAAA,CAAoB,YAAY,IAAI,CAAA;AACzC,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACzD;AAAA,EAEQ,UAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,IAAI,CAAA;AACtC,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACtD;AAAA,EAEQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,IAAA,CAAK,mBAAA,CAAoB,UAAU,IAAI,CAAA;AACvC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACvD;AAAA;AAAA,EAIQ,SAAA,GAAsB;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAC9C,IAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACrD;AAAA,EAEQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AAAA,MACf,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AAGjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,IAAA,CAAK,mBAAA,CAAoB,UAAU,IAAI,CAAA;AACvC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,GAAA,EAAK,YAAY,QAAA,EAAS;AAAA,EAC/D;AAAA;AAAA,EAIQ,YAAA,GAA4B;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,GAAQ,IAAA,CAAK,SAAQ,CAAE,WAAA;AAAA,IACzB;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,IAAI,CAAA;AACxC,IAAA,MAAM,IAAA,GAAoB,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,QAAA,EAAS;AAClE,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,KAAA,GAAQ,KAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,WAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA;AAAA,MACA,WAAA,IAAe,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,UAAA,EAAY,MAAM,CAAA;AACrD,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,mDAAA;AAAA,QACA,IAAA,CAAK,IAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,IAAA,CAAK,mBAAA,CAAoB,UAAU,IAAI,CAAA;AACvC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EACvD;AAAA;AAAA,EAIQ,gBAAgB,SAAA,EAAgC;AACtD,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,SAAS,CAAA,IAAK,EAAE,OAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAC9D,IAAA,MAAM,QAAqB,EAAC;AAE5B,IAAA,OAAO,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,OAAA,EAAS;AACnC,MAAA,MAAM,MAAA,GAAS,KAAK,OAAA,EAAQ;AAC5B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,GAAA;AACxC,MAAA,MAAM,QAAA,GAAW,WAAW,MAAM,CAAA;AAElC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAG;AACxB,QAAA,MAAM,QAAA,GAAW,KAAK,OAAA,EAAQ;AAI9B,QAAA,MAAM,OACJ,GAAA,KAAQ,IAAA,GAAO,iBAAA,GAAoB,KAAA,CAAM,MAAM,GAAG,CAAA;AACpD,QAAA,IAAI,SAAS,MAAA,EAAW;AACtB,UAAA,MAAM,aAAa,YAAA,CAAa,GAAA,EAAK,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAC7D,UAAA,MAAM,IAAA,GAAO,UAAA,GAAa,CAAA,gBAAA,EAAmB,UAAU,CAAA,EAAA,CAAA,GAAO,EAAA;AAC9D,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,CAAA,mBAAA,EAAsB,GAAG,CAAA,MAAA,EAAS,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,YACnD,MAAA,CAAO,IAAA;AAAA,YACP,MAAA,CAAO;AAAA,WACT;AAAA,QACF;AACA,QAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,QAAA,EAAU,IAAA,EAAM,KAAK,SAAS,CAAA;AACjE,QAAA,MAAM,OAAsB,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,OAAO,QAAA,EAAS;AACjE,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,UAAA,MAAM,UAAA,GAAa,YAAA,CAAa,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAChD,UAAA,MAAM,IAAA,GAAO,UAAA,GAAa,CAAA,gBAAA,EAAmB,UAAU,CAAA,EAAA,CAAA,GAAO,EAAA;AAC9D,UAAA,MAAM,IAAI,aAAA;AAAA,YACR,CAAA,cAAA,EAAiB,GAAG,CAAA,MAAA,EAAS,SAAS,IAAI,IAAI,CAAA,CAAA;AAAA,YAC9C,MAAA,CAAO,IAAA;AAAA,YACP,MAAA,CAAO;AAAA,WACT;AAAA,QACF;AACA,QAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,EAAK,UAAU,CAAA;AAAA,MAClD;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGQ,eAAA,CAAgB,WAAmB,SAAA,EAA2B;AACpE,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,UAAA,CAAW,SAAA,EAAW,CAAA,wBAAA,EAA2B,SAAS,CAAA,EAAA,CAAI,CAAA;AACnE,MAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,QAAA,EAAU;AACjC,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,IAAI,SAAS,CAAA,kGAAA,CAAA;AAAA,UACb,SAAA,CAAU,IAAA;AAAA,UACV,SAAA,CAAU;AAAA,SACZ;AAAA,MACF;AACA,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,SAAA,EAAW,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA,CAAG,CAAA;AAClE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,CAAoB,WAAmB,SAAA,EAAwB;AACrE,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,OAAA,EAAS;AAChC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,IAAI,SAAS,CAAA,sBAAA,CAAA;AAAA,QACb,SAAA,CAAU,IAAA;AAAA,QACV,SAAA,CAAU;AAAA,OACZ;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,SAAA,EAAW,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACpE;AAAA;AAAA,EAIQ,IAAA,CAAK,SAAS,CAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,GAAM,MAAA;AACvB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAC3B,IAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,GAAA;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAC/C,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAM,IAAI,aAAA,CAAc,oBAAA,EAAsB,CAAA,EAAG,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,OAAA,GAAiB;AACvB,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,IAAA,CAAK,GAAA,EAAA;AACL,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,MAAM,IAAA,EAA+B;AAC3C,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,IAAA,KAAS,IAAA,EAAM;AAC7B,MAAA,OAAO,KAAK,OAAA,EAAQ;AAAA,IACtB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,UAAA,CAAW,MAAiB,OAAA,EAAwB;AAC1D,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,IAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,aAAA,CAAc,OAAA,EAAS,CAAA,CAAE,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,KAAK,OAAA,EAAQ;AAAA,EACtB;AACF,CAAA;AAMA,SAAS,WAAW,KAAA,EAA8B;AAChD,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAClD;AAEA,SAAS,kBAAA,CAAmB,OAA6B,GAAA,EAAiC;AACxF,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,IAAU,CAAA,CAAE,QAAQ,GAAA,IAAO,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AACnE,MAAA,OAAO,EAAE,KAAA,CAAM,KAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,OAA6B,GAAA,EAAiC;AACxF,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,IAAU,CAAA,CAAE,QAAQ,GAAA,IAAO,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AACnE,MAAA,OAAO,EAAE,KAAA,CAAM,KAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,OAA6B,GAAA,EAAiC;AACvF,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,IAAU,CAAA,CAAE,QAAQ,GAAA,IAAO,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACvE,MAAA,OAAO,EAAE,KAAA,CAAM,KAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAsB;AAC3C,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,YAAA,EAAe,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,GAAG,CAAA,CAAA,CAAA;AAAA,IACrD,KAAK,QAAA;AACH,MAAA,OAAO,UAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,WAAA,IAAe,EAAE,CAAC,CAAA,CAAA;AAAA,IAC1D,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,OAAA,EAAU,MAAM,YAAY,CAAA,CAAA;AAAA,IACrC,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,MAAM,QAAQ,CAAA,CAAA;AAAA,IAClD,KAAK,SAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,KAAA;AAAA;AAEb;AAEA,SAAS,oBAAA,CACP,KAAA,EACA,IAAA,EACA,GAAA,EACA,SAAA,EACgB;AAChB,EAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AAEjC,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,cAAc,GAAG,CAAA,MAAA,EAAS,SAAS,CAAA,8BAAA,EAAiC,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA,UACxF,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,KAAA,CAAM,WAAA,IAAe,IAAI,QAAA,EAAS;AAAA,IAEpE,KAAK,QAAA;AACH,MAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,cAAc,GAAG,CAAA,MAAA,EAAS,SAAS,CAAA,8BAAA,EAAiC,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA,UACxF,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,MAAM,YAAA,IAAgB,CAAA;AAAA,QAC7B,IAAA,EAAM,MAAM,IAAA,IAAQ,IAAA;AAAA,QACpB;AAAA,OACF;AAAA,IAEF,KAAK,OAAA;AACH,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,cAAc,GAAG,CAAA,MAAA,EAAS,SAAS,CAAA,0CAAA,EAA6C,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA,UACpG,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,QAAA,IAAY,CAAA,MAAO,KAAA,CAAM,YAAY,CAAA,CAAA,EAAI;AAClD,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,mCAAA,EAAsC,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,MAAM,QAAQ,CAAA,CAAA,CAAA;AAAA,UACtE,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,GAAA,EAAK,MAAM,QAAA,IAAY,CAAA;AAAA,QACvB,GAAA,EAAK,MAAM,QAAA,IAAY,CAAA;AAAA,QACvB;AAAA,OACF;AAAA,IAEF,KAAK,OAAA;AACH,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,cAAc,GAAG,CAAA,MAAA,EAAS,SAAS,CAAA,mCAAA,EAAsC,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA,UAC7F,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,GAAA;AAAA,QACjC;AAAA,OACF;AAAA,IAEF,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,cAAc,GAAG,CAAA,MAAA,EAAS,SAAS,CAAA,mCAAA,EAAsC,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA,UAC7F,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,GAAA;AACxC,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAChC,QAAA,MAAM,UAAA,GAAa,YAAA,CAAa,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAClD,QAAA,MAAM,IAAA,GAAO,UAAA,GAAa,CAAA,eAAA,EAAkB,UAAU,CAAA,EAAA,CAAA,GAAO,EAAA;AAC7D,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,CAAA,EAAI,KAAK,CAAA,iBAAA,EAAoB,GAAG,CAAA,KAAA,EAAQ,SAAS,CAAA,oBAAA,EAAuB,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,KAAK,IAAI,CAAA,CAAA;AAAA,UACvG,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,QAAA,EAAS;AAAA,IAC/C;AAAA;AAEJ;AAEA,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,qCAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,sCAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,mDAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,6DAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,mDAAA;AAAA,IACT,KAAK,SAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,IAAI,IAAI,CAAA,iCAAA,CAAA;AAAA,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,wDAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,2CAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,kDAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,uCAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,8CAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,2BAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,sCAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,iDAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,uCAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,sCAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,0CAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,2CAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,6CAAA;AAAA,IACT;AACE,MAAA,OAAO,IAAI,IAAI,CAAA,qBAAA,CAAA;AAAA;AAErB;AAEA,SAAS,wBAAwB,IAAA,EAAsB;AAGrD,EAAA,MAAM,aAAa,YAAA,CAAa,IAAA,EAAM,CAAC,GAAG,gBAAgB,CAAC,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,CAAA,mBAAA,EAAsB,IAAI,CAAA,UAAA,EAAa,oBAAoB,CAAA,CAAA,CAAA;AACxE,EAAA,OAAO,UAAA,GAAa,CAAA,EAAG,IAAI,CAAA,gBAAA,EAAmB,UAAU,CAAA,EAAA,CAAA,GAAO,IAAA;AACjE;AAOO,SAAS,YAAA,CAAa,OAAe,UAAA,EAAmD;AAC7F,EAAA,IAAI,MAAM,MAAA,GAAS,CAAA,IAAK,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,MAAA;AACxD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAA,GAAW,QAAA;AACf,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,KAAA,EAAO,IAAI,CAAA;AACjC,IAAA,IAAI,IAAI,QAAA,EAAU;AAChB,MAAA,QAAA,GAAW,CAAA;AACX,MAAA,IAAA,GAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AAC1D,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,QAAA,IAAY,SAAA,EAAW,OAAO,IAAA;AACxD,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,WAAA,CAAY,GAAW,CAAA,EAAmB;AACjD,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,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AACpD,EAAA,MAAM,OAAO,IAAI,KAAA,CAAc,IAAI,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAC5C,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,CAAA,CAAE,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAC/D,MAAA,IAAA,CAAK,CAAC,IAAI,IAAA,CAAK,GAAA;AAAA,QAAA,CACZ,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA;AAAA,QAAA,CAChB,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA;AAAA,QAAA,CACpB,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA,IAAK;AAAA,OACvB;AAAA,IACF;AACA,IAAA,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AACpB;;;ACp2EO,SAAS,UAAU,GAAA,EAAuB;AAC/C,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAM,OAAO,EAAA;AACtB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA;AAChC,EAAA,IAAI,IAAI,WAAA,EAAa;AACnB,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,WAAA,EAAa;AAC/B,MAAA,aAAA,CAAc,CAAA,EAAG,GAAG,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;AAEA,SAAS,aAAA,CAAc,IAAA,EAAe,KAAA,EAAe,GAAA,EAAqB;AACxE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,EAAA,MAAM,OAAA,GACJ,KAAK,IAAA,KAAS,YAAA,GACV,WACA,IAAA,CAAK,IAAA,KAAS,aACZ,MAAA,GACA,IAAA,CAAK,SAAS,eAAA,GACZ,SAAA,GACA,KAAK,IAAA,KAAS,cAAA,GACZ,WACA,IAAA,CAAK,IAAA,KAAS,gBAAA,GACZ,UAAA,GACA,IAAA,CAAK,IAAA;AACnB,EAAA,MAAM,KAAA,GAAkB,CAAC,OAAO,CAAA;AAGhC,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,IAAK,IAAA,CAAoB,UAAU,MAAA,EAAW;AAC5C,QAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAoB,KAAe,CAAC,CAAA;AAAA,MAC9D;AACA,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAqB,KAAK,CAAC,CAAA;AACnD,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAkB,KAAK,CAAC,CAAA;AAChD,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAiB,KAAK,CAAC,CAAA;AAC/C,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAqB,KAAK,CAAC,CAAA;AACnD,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAkB,IAAI,CAAC,CAAA;AAC/C,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAkB,OAAO,CAAC,CAAA;AAClD,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAA;AAClC,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAA;AAClC,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAgB,KAAK,CAAC,CAAA;AAC9C,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAgB,KAAK,CAAC,CAAA;AAC9C,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,IAAK,IAAA,CAAmB,UAAU,MAAA,EAAW;AAC3C,QAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAmB,KAAe,CAAC,CAAA;AAAA,MAC7D;AACA,MAAA;AAAA,IACF,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,IAAI,IAAI,KAAA,CAAM,IAAA,KAAS,YAAY,GAAA,CAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AAC1D,QAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MACpC;AAEA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACpC;AACA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,MAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAkB,KAAK,CAAC,CAAA;AAChD,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAkB,KAAK,CAAC,CAAA;AAChD,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAwB,IAAI,CAAC,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAsB,KAAK,CAAC,CAAA;AACpD,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAkB,KAAK,CAAC,CAAA;AAChD,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAsB,KAAK,CAAC,CAAA;AACpD,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAmB,KAAK,CAAC,CAAA;AACjD,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAsB,KAAK,CAAC,CAAA;AACpD,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAmB,KAAK,CAAC,CAAA;AACjD,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAoB,KAAK,CAAC,CAAA;AAClD,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAkB,KAAK,CAAC,CAAA;AAChD,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAoB,QAAQ,CAAC,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,EAAA,GAAK,IAAA;AACX,MAAA,IAAI,EAAA,CAAG,UAAU,MAAA,EAAW,KAAA,CAAM,KAAK,WAAA,CAAY,EAAA,CAAG,KAAK,CAAC,CAAA;AAC5D,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAoB,KAAK,CAAC,CAAA;AAClD,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAa,IAAA,CAAqB,KAAK,CAAC,CAAA;AACnD,MAAA;AAIA;AAIJ,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,UAAA,EAAY;AAClC,IAAA,KAAA,CAAM,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,QAAA,GAAW,aAAa,IAAI,CAAA;AAClC,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,KAAK,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,GAAG,IAAI,GAAG,CAAA;AACvC,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,aAAA,CAAc,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,GAAG,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACnC;AACF;AAEA,SAAS,aAAa,IAAA,EAA0B;AAC9C,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,MAAM,IAAA,GAAkB,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AACzC,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,KAAK,UAAU,CAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAG1B,IAAA,MAAM,MAAA,GAAS,IAAA;AACf,IAAA,MAAM,OAAkB,EAAC;AACzB,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,OAAO,OAAO,CAAA;AAC5C,IAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,MAAM,CAAA;AAC1C,IAAA,IAAI,MAAA,CAAO,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,OAAO,QAAQ,CAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ,OAAQ,IAAA,CAAkB,QAAA;AACpD,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY,OAAO,EAAC;AAEtC,EAAA,IAAI,cAAc,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAS,IAAA,CAA4C,QAAQ,CAAA,EAAG;AAC9F,IAAA,OAAQ,IAAA,CAA4C,QAAA;AAAA,EACtD;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,mBAAmB,IAAA,EAAyB;AACnD,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAQ,IAAA,CAAuB,IAAA;AAAA,EACjC;AACA,EAAA,MAAM,IAAA,GAAO,IAAA;AACb,EAAA,OAAO,GAAG,IAAA,CAAK,GAAG,IAAI,cAAA,CAAe,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAClD;AAEA,SAAS,eAAe,CAAA,EAA2B;AACjD,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,QAAA;AACH,MAAA,OAAO,WAAA,CAAY,EAAE,KAAK,CAAA;AAAA,IAC5B,KAAK,QAAA;AACH,MAAA,IAAI,EAAE,IAAA,KAAS,SAAA,EAAW,OAAO,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA,CAAA;AAC3C,MAAA,IAAI,EAAE,IAAA,KAAS,IAAA,EAAM,OAAO,CAAA,EAAG,EAAE,KAAK,CAAA,EAAA,CAAA;AACtC,MAAA,OAAO,MAAA,CAAO,EAAE,KAAK,CAAA;AAAA,IACvB,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,CAAA;AAAA,IAC1B,KAAK,YAAA;AACH,MAAA,OAAO,CAAA,CAAE,KAAA;AAAA;AAEf;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,OACE,GAAA,GACA,CAAA,CACG,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CACnB,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA,GACvB,GAAA;AAEJ;;;AC8BO,IAAM,aAAA,GAAuB,OAAO,MAAA,CAAO;AAAA,EAChD,IAAA,EAAM,SAAA;AAAA,EAEN,UAAA,EAAY,SAAA;AAAA,EACZ,SAAA,EAAW,SAAA;AAAA,EACX,cAAA,EAAgB,SAAA;AAAA,EAChB,gBAAA,EAAkB,SAAA;AAAA,EAClB,iBAAA,EAAmB,SAAA;AAAA,EACnB,gBAAA,EAAkB,SAAA;AAAA,EAClB,iBAAA,EAAmB,SAAA;AAAA,EACnB,YAAA,EAAc,SAAA;AAAA,EACd,eAAA,EAAiB,SAAA;AAAA,EACjB,iBAAA,EAAmB,SAAA;AAAA,EACnB,UAAA,EAAY,SAAA;AAAA,EACZ,UAAA,EAAY,SAAA;AAAA,EACZ,iBAAA,EAAmB,SAAA;AAAA,EACnB,iBAAA,EAAmB,SAAA;AAAA,EACnB,aAAA,EAAe,SAAA;AAAA,EACf,cAAA,EAAgB,SAAA;AAAA,EAChB,gBAAA,EAAkB,SAAA;AAAA,EAClB,iBAAA,EAAmB,SAAA;AAAA,EACnB,eAAA,EAAiB,SAAA;AAAA,EACjB,qBAAA,EAAuB,SAAA;AAAA,EACvB,aAAA,EAAe,SAAA;AAAA,EACf,SAAA,EAAW,SAAA;AAAA,EACX,SAAA,EAAW,SAAA;AAAA,EACX,gBAAA,EAAkB,SAAA;AAAA,EAClB,eAAA,EAAiB,SAAA;AAAA,EACjB,gBAAA,EAAkB,SAAA;AAAA,EAClB,iBAAA,EAAmB,SAAA;AAAA,EACnB,WAAA,EAAa,SAAA;AAAA,EACb,eAAA,EAAiB,SAAA;AAAA,EAEjB,iBAAA,EAAmB,IAAA;AAAA,EACnB,gBAAA,EAAkB,CAAA;AAAA,EAClB,oBAAA,EAAsB,KAAA;AAAA,EACtB,iBAAA,EAAmB,CAAA;AAAA,EACnB,kBAAA,EAAoB,CAAA;AAAA,EACpB,iBAAA,EAAmB,IAAA;AAAA,EACnB,gBAAA,EAAkB,CAAA;AAAA,EAClB,eAAA,EAAiB,CAAA;AAAA,EACjB,qBAAA,EAAuB,GAAA;AAAA,EAEvB,UAAA,EAAY,0DAAA;AAAA,EACZ,QAAA,EAAU,EAAA;AAAA,EACV,aAAA,EAAe,EAAA;AAAA,EACf,oBAAA,EAAsB,EAAA;AAAA,EACtB,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,EAAA;AAAA,EACf,UAAA,EAAY,EAAA;AAAA,EACZ,gBAAA,EAAkB,GAAA;AAAA,EAElB,aAAA,EAAe,EAAA;AAAA,EACf,cAAA,EAAgB,EAAA;AAAA,EAChB,YAAA,EAAc,EAAA;AAAA,EACd,cAAA,EAAgB,EAAA;AAAA,EAChB,iBAAA,EAAmB,EAAA;AAAA,EACnB,cAAA,EAAgB,EAAA;AAAA,EAChB,kBAAA,EAAoB,EAAA;AAAA,EACpB,yBAAA,EAA2B,CAAA;AAAA,EAC3B,WAAA,EAAa,EAAA;AAAA,EACb,eAAA,EAAiB,EAAA;AAAA,EACjB,MAAA,EAAQ,CAAA;AAAA,EACR,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,aAAA,EAAe,EAAA;AAAA,EAEf,YAAA,EAAc,EAAA;AAAA,EACd,cAAA,EAAgB,EAAA;AAAA,EAChB,sBAAA,EAAwB,CAAA;AAAA,EACxB,oBAAA,EAAsB,CAAA;AAAA,EACtB,sBAAA,EAAwB,SAAA;AAAA,EACxB,WAAA,EAAa,EAAA;AAAA,EACb,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,WAAA,EAAa,EAAA;AAAA,EACb,iBAAA,EAAmB,EAAA;AAAA,EACnB,aAAA,EAAe,GAAA;AAAA,EACf,YAAA,EAAc,EAAA;AAAA,EACd,iBAAA,EAAmB,CAAA;AAAA,EACnB,iBAAA,EAAmB,CAAA;AAAA,EACnB,kBAAA,EAAoB,GAAA;AAAA,EACpB,iBAAA,EAAmB,GAAA;AAAA,EACnB,kBAAA,EAAoB,EAAA;AAAA,EACpB,QAAA,EAAU,EAAA;AAAA,EACV,cAAA,EAAgB,EAAA;AAAA,EAChB,kBAAA,EAAoB,CAAA;AAAA,EACpB,SAAA,EAAW,EAAA;AAAA,EACX,WAAA,EAAa,EAAA;AAAA,EACb,MAAA,EAAQ,CAAA;AAAA,EACR,YAAA,EAAc,EAAA;AAAA,EACd,cAAA,EAAgB,EAAA;AAAA,EAChB,mBAAA,EAAqB,EAAA;AAAA,EACrB,kBAAA,EAAoB,CAAA;AAAA,EACpB,mBAAA,EAAqB,SAAA;AAAA,EACrB,mBAAA,EAAqB,SAAA;AAAA,EACrB,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,EAAA;AAAA,EACb,aAAA,EAAe,CAAA;AAAA,EACf,UAAA,EAAY,GAAA;AAAA,EACZ,eAAA,EAAiB,GAAA;AAAA,EAEjB,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,CAAA;AAAA,EACb,iBAAA,EAAmB,EAAA;AAAA,EACnB,kBAAA,EAAoB,EAAA;AAAA,EACpB,mBAAA,EAAqB,EAAA;AAAA,EACrB,QAAA,EAAU,EAAA;AAAA,EACV,oBAAA,EAAsB,GAAA;AAAA,EACtB,gBAAA,EAAkB,GAAA;AAAA,EAClB,cAAA,EAAgB,EAAA;AAAA,EAChB,iBAAA,EAAmB,GAAA;AAAA,EACnB,kBAAA,EAAoB,GAAA;AAAA,EAEpB,YAAA,EAAc,SAAA;AAAA,EACd,gBAAA,EAAkB,SAAA;AAAA,EAClB,cAAA,EAAgB,SAAA;AAAA,EAChB,mBAAA,EAAqB,SAAA;AAAA,EACrB,kBAAA,EAAoB,SAAA;AAAA,EACpB,qBAAA,EAAuB,CAAA;AAAA,EACvB,mBAAA,EAAqB,CAAA;AAAA,EACrB,sBAAA,EAAwB,CAAA;AAAA,EACxB,kBAAA,EAAoB,EAAA;AAAA,EACpB,kBAAA,EAAoB,CAAA;AAAA,EACpB,aAAA,EAAe,EAAA;AAAA,EACf,gBAAA,EAAkB,EAAA;AAAA,EAClB,kBAAA,EAAoB,CAAA;AAAA,EAEpB,UAAA,EAAY,EAAA;AAAA,EACZ,aAAA,EAAe,EAAA;AAAA,EACf,oBAAA,EAAsB,SAAA;AAAA,EACtB,cAAA,EAAgB,SAAA;AAAA,EAChB,cAAA,EAAgB,SAAA;AAAA,EAChB,gBAAA,EAAkB,SAAA;AAAA,EAElB,YAAA,EAAc,EAAA;AAAA,EACd,cAAA,EAAgB,CAAA;AAAA,EAChB,mBAAA,EAAqB,SAAA;AAAA,EACrB,iBAAA,EAAmB,SAAA;AAAA,EACnB,kBAAA,EAAoB,SAAA;AAAA,EAEpB,SAAA,EAAW,EAAA;AAAA,EACX,WAAA,EAAa,EAAA;AAAA,EACb,YAAA,EAAc,EAAA;AAAA,EACd,aAAA,EAAe,SAAA;AAAA,EACf,cAAA,EAAgB,SAAA;AAAA,EAChB,eAAA,EAAiB,SAAA;AAAA,EACjB,aAAA,EAAe,EAAA;AAAA,EAEf,aAAA,EAAe,EAAA;AAAA,EACf,mBAAA,EAAqB,EAAA;AAAA,EACrB,cAAA,EAAgB,SAAA;AAAA,EAChB,kBAAA,EAAoB,SAAA;AAAA,EACpB,SAAA,EAAW,GAAA;AAAA,EACX,cAAA,EAAgB,EAAA;AAAA,EAChB,gBAAA,EAAkB,EAAA;AAAA,EAClB,WAAA,EAAa,SAAA;AAAA,EACb,eAAA,EAAiB,SAAA;AAAA,EACjB,iBAAA,EAAmB,SAAA;AAAA,EACnB,kBAAA,EAAoB,SAAA;AAAA,EAEpB,UAAA,EAAY,EAAA;AAAA,EACZ,YAAA,EAAc,EAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAU,SAAA;AAAA,EACV,cAAA,EAAgB,SAAA;AAAA,EAChB,kBAAA,EAAoB,SAAA;AAAA,EACpB,gBAAA,EAAkB,SAAA;AAAA,EAElB,eAAA,EAAiB,EAAA;AAAA,EACjB,gBAAA,EAAkB,EAAA;AAAA,EAClB,eAAA,EAAiB,EAAA;AAAA,EACjB,QAAA,EAAU,SAAA;AAAA,EACV,YAAA,EAAc,SAAA;AAAA,EACd,UAAA,EAAY,SAAA;AAAA,EAEZ,gBAAA,EAAkB,EAAA;AAAA,EAClB,aAAA,EAAe,CAAA;AAAA,EACf,wBAAA,EAA0B,SAAA;AAAA,EAC1B,sBAAA,EAAwB,SAAA;AAAA,EAExB,gBAAA,EAAkB,CAAA;AAAA,EAClB,kBAAA,EAAoB,EAAA;AAAA,EACpB,uBAAA,EAAyB,GAAA;AAAA,EACzB,iBAAA,EAAmB,SAAA;AAAA,EAEnB,eAAA,EAAiB,EAAA;AAAA,EACjB,iBAAA,EAAmB,EAAA;AAAA,EACnB,wBAAA,EAA0B,EAAA;AAAA,EAC1B,qBAAA,EAAuB,CAAA;AAAA,EACvB,WAAA,EAAa,SAAA;AAAA,EACb,eAAA,EAAiB,SAAA;AAAA,EACjB,qBAAA,EAAuB,SAAA;AAAA,EACvB,aAAA,EAAe,SAAA;AAAA,EACf,mBAAA,EAAqB,SAAA;AAAA,EACrB,qBAAA,EAAuB,SAAA;AAAA,EAEvB,WAAA,EAAa,EAAA;AAAA,EACb,YAAA,EAAc,SAAA;AAAA,EAEd,YAAA,EAAc,EAAA;AAAA,EACd,cAAA,EAAgB,EAAA;AAAA,EAChB,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,IAC1B,SAAS,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,IAC3D,MAAM,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,IACxD,SAAS,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,IAC3D,OAAO,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,SAAA,EAAW,QAAQ,SAAA;AAAU,GAC1D,CAAA;AAAA,EAED,eAAA,EAAiB,SAAA;AAAA,EACjB,iBAAA,EAAmB,IAAA;AAAA,EACnB,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,SAAA;AAAA,EACb,gBAAA,EAAkB,CAAA;AAAA,EAClB,iBAAA,EAAmB,EAAA;AAAA,EACnB,YAAA,EAAc,EAAA;AAAA,EACd,gBAAA,EAAkB,EAAA;AAAA,EAClB,kBAAA,EAAoB,EAAA;AAAA,EACpB,iBAAA,EAAmB,EAAA;AAAA,EACnB,kBAAA,EAAoB,CAAA;AAAA,EACpB,iBAAA,EAAmB,SAAA;AAAA,EACnB,eAAA,EAAiB,EAAA;AAAA,EACjB,mBAAA,EAAqB,GAAA;AAAA,EACrB,oBAAA,EAAsB,GAAA;AAAA,EACtB,iBAAA,EAAmB,EAAA;AAAA,EAEnB,OAAA,EAAS,OAAO,MAAA,CAAO;AAAA,IACrB,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,SAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,SAAA;AAAA,IACV,OAAA,EAAS,SAAA;AAAA,IACT,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACV,CAAA;AAAA,EACD,MAAA,EAAQ,OAAO,MAAA,CAAO;AAAA,IACpB,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA;AACR,GACD;AACH,CAAC;AAEM,IAAM,UAAA,GAAoB,OAAO,MAAA,CAAO;AAAA,EAC7C,GAAG,aAAA;AAAA,EACH,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,SAAA;AAAA,EACZ,SAAA,EAAW,SAAA;AAAA,EACX,cAAA,EAAgB,SAAA;AAAA,EAChB,gBAAA,EAAkB,SAAA;AAAA,EAClB,iBAAA,EAAmB,SAAA;AAAA,EACnB,gBAAA,EAAkB,SAAA;AAAA,EAClB,iBAAA,EAAmB,SAAA;AAAA,EACnB,YAAA,EAAc,SAAA;AAAA,EACd,eAAA,EAAiB,SAAA;AAAA,EACjB,iBAAA,EAAmB,SAAA;AAAA,EACnB,UAAA,EAAY,SAAA;AAAA,EACZ,UAAA,EAAY,SAAA;AAAA,EACZ,sBAAA,EAAwB,SAAA;AAAA,EACxB,mBAAA,EAAqB,SAAA;AAAA,EACrB,mBAAA,EAAqB,SAAA;AAAA,EACrB,iBAAA,EAAmB,SAAA;AAAA,EACnB,iBAAA,EAAmB,SAAA;AAAA,EACnB,aAAA,EAAe,SAAA;AAAA,EACf,cAAA,EAAgB,SAAA;AAAA,EAChB,gBAAA,EAAkB,SAAA;AAAA,EAClB,iBAAA,EAAmB,SAAA;AAAA,EACnB,eAAA,EAAiB,SAAA;AAAA,EACjB,qBAAA,EAAuB,SAAA;AAAA,EACvB,aAAA,EAAe,SAAA;AAAA,EACf,SAAA,EAAW,SAAA;AAAA,EACX,SAAA,EAAW,SAAA;AAAA,EACX,gBAAA,EAAkB,SAAA;AAAA,EAClB,eAAA,EAAiB,SAAA;AAAA,EACjB,gBAAA,EAAkB,SAAA;AAAA,EAClB,iBAAA,EAAmB,SAAA;AAAA,EACnB,WAAA,EAAa,SAAA;AAAA,EACb,eAAA,EAAiB,SAAA;AAAA,EAEjB,YAAA,EAAc,SAAA;AAAA,EACd,gBAAA,EAAkB,SAAA;AAAA,EAClB,cAAA,EAAgB,SAAA;AAAA,EAChB,mBAAA,EAAqB,SAAA;AAAA,EACrB,kBAAA,EAAoB,SAAA;AAAA,EAEpB,oBAAA,EAAsB,SAAA;AAAA,EACtB,cAAA,EAAgB,SAAA;AAAA,EAChB,cAAA,EAAgB,SAAA;AAAA,EAChB,gBAAA,EAAkB,SAAA;AAAA,EAElB,mBAAA,EAAqB,SAAA;AAAA,EACrB,iBAAA,EAAmB,SAAA;AAAA,EACnB,kBAAA,EAAoB,SAAA;AAAA,EAEpB,aAAA,EAAe,SAAA;AAAA,EACf,cAAA,EAAgB,SAAA;AAAA,EAChB,eAAA,EAAiB,SAAA;AAAA,EAEjB,cAAA,EAAgB,SAAA;AAAA,EAChB,kBAAA,EAAoB,SAAA;AAAA,EACpB,WAAA,EAAa,SAAA;AAAA,EACb,eAAA,EAAiB,SAAA;AAAA,EACjB,iBAAA,EAAmB,SAAA;AAAA,EACnB,kBAAA,EAAoB,SAAA;AAAA,EAEpB,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAU,SAAA;AAAA,EACV,cAAA,EAAgB,SAAA;AAAA,EAChB,kBAAA,EAAoB,SAAA;AAAA,EACpB,gBAAA,EAAkB,SAAA;AAAA,EAElB,QAAA,EAAU,SAAA;AAAA,EACV,YAAA,EAAc,SAAA;AAAA,EACd,UAAA,EAAY,SAAA;AAAA,EAEZ,wBAAA,EAA0B,SAAA;AAAA,EAC1B,sBAAA,EAAwB,SAAA;AAAA,EAExB,iBAAA,EAAmB,SAAA;AAAA,EAEnB,WAAA,EAAa,SAAA;AAAA,EACb,eAAA,EAAiB,SAAA;AAAA,EACjB,qBAAA,EAAuB,SAAA;AAAA,EACvB,aAAA,EAAe,SAAA;AAAA,EACf,mBAAA,EAAqB,SAAA;AAAA,EACrB,qBAAA,EAAuB,SAAA;AAAA,EAEvB,YAAA,EAAc,SAAA;AAAA,EAEd,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,IAC1B,SAAS,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,IAC3D,MAAM,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,IACxD,SAAS,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,IAC3D,OAAO,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,SAAA,EAAW,QAAQ,SAAA;AAAU,GAC1D,CAAA;AAAA,EAED,eAAA,EAAiB,SAAA;AAAA,EACjB,iBAAA,EAAmB,IAAA;AAAA,EACnB,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,SAAA;AAAA,EACb,iBAAA,EAAmB,SAAA;AAAA,EAEnB,OAAA,EAAS,OAAO,MAAA,CAAO;AAAA,IACrB,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,SAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,SAAA;AAAA,IACV,OAAA,EAAS,SAAA;AAAA,IACT,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACV,CAAA;AAAA,EACD,MAAA,EAAQ,OAAO,MAAA,CAAO;AAAA,IACpB,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA;AACR,GACD;AACH,CAAC;AAEM,SAAS,SAAS,IAAA,EAAiC;AACxD,EAAA,OAAO,IAAA,KAAS,SAAS,UAAA,GAAa,aAAA;AACxC;;;ACpmBO,SAAS,MAAA,CAAO,KAAe,KAAA,EAA4B;AAChE,EAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACb,IAAA,OAAO,EAAE,WAAA,EAAa,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,MAAM,YAAA,EAAa,EAAG,WAAA,EAAa,EAAC,EAAE;AAAA,EAClF;AAEA,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAC9C,EAAA,MAAM,aAAmB,QAAA,CAAS,KAAA;AAElC,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,WAAA,IAAe,EAAC;AACxC,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAE5B,IAAA,MAAMA,YAAW,cAAA,CAAe,GAAA,CAAI,MAAM,QAAA,EAAU,CAAA,EAAG,GAAG,KAAK,CAAA;AAC/D,IAAA,OAAO;AAAA,MACL,aAAa,UAAA,CAAW,KAAA;AAAA,MACxB,cAAc,UAAA,CAAW,MAAA;AAAA,MACzB,IAAA,EAAMA,SAAAA;AAAA,MACN,aAAa;AAAC,KAChB;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAmD;AAAA,IACvD,MAAM,EAAC;AAAA,IACP,OAAO,EAAC;AAAA,IACR,KAAK,EAAC;AAAA,IACN,QAAQ;AAAC,GACX;AACA,EAAA,KAAA,MAAW,KAAK,WAAA,EAAa,MAAA,CAAO,EAAE,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAGlD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAwC;AAClE,EAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,IAAA,aAAA,CAAc,GAAA,CAAI,CAAA,EAAG,iBAAA,CAAkB,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,aAAa,UAAA,CAAW,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAM,eAAe,KAAK,CAAA;AACvE,EAAA,MAAM,cAAc,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,KAAA,EAAO,eAAe,KAAK,CAAA;AAC1E,EAAA,MAAM,YAAY,UAAA,CAAW,KAAA,EAAO,MAAA,CAAO,GAAA,EAAK,eAAe,KAAK,CAAA;AACpE,EAAA,MAAM,eAAe,UAAA,CAAW,QAAA,EAAU,MAAA,CAAO,MAAA,EAAQ,eAAe,KAAK,CAAA;AAI7E,EAAA,MAAM,gBAAgB,aAAA,CAAc,KAAA,EAAO,MAAA,CAAO,GAAA,EAAK,eAAe,KAAK,CAAA;AAC3E,EAAA,MAAM,mBAAmB,aAAA,CAAc,QAAA,EAAU,MAAA,CAAO,MAAA,EAAQ,eAAe,KAAK,CAAA;AACpF,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,eAAe,gBAAgB,CAAA;AAE/E,EAAA,MAAM,kBAAkB,aAAA,CAAc,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAM,eAAe,KAAK,CAAA;AAC/E,EAAA,MAAM,mBAAmB,aAAA,CAAc,OAAA,EAAS,MAAA,CAAO,KAAA,EAAO,eAAe,KAAK,CAAA;AAClF,EAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,iBAAiB,gBAAgB,CAAA;AAEnF,EAAA,MAAM,WAAA,GAAc,aAAa,YAAA,GAAe,WAAA;AAChD,EAAA,MAAM,YAAA,GAAe,YAAY,aAAA,GAAgB,YAAA;AAEjD,EAAA,MAAM,OAAA,GAAU,UAAA,GAAA,CAAc,YAAA,GAAe,UAAA,CAAW,KAAA,IAAS,CAAA;AACjE,EAAA,MAAM,OAAA,GAAU,SAAA,GAAA,CAAa,aAAA,GAAgB,UAAA,CAAW,MAAA,IAAU,CAAA;AAElE,EAAA,MAAM,WAAW,cAAA,CAAe,GAAA,CAAI,MAAM,QAAA,EAAU,OAAA,EAAS,SAAS,KAAK,CAAA;AAG3E,EAAA,MAAM,KAAA,GAAQ,WAAW,QAAQ,CAAA;AAEjC,EAAA,MAAM,kBAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,QAAQ,CAAC,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAA,EAAY;AAC9D,IAAA,MAAM,MAAA,GAAS,sBAAA;AAAA,MACb,IAAA;AAAA,MACA,OAAO,IAAI,CAAA;AAAA,MACX,aAAA;AAAA,MACA,KAAA;AAAA,MACA,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,OAAO,UAAA,CAAW,KAAA,EAAO,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAO;AAAA,MAC7E,WAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AACF;AAEA,SAAS,YAAA,GAA4B;AACnC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,YAAY,EAAC;AAAA,MACb,UAAU,EAAC;AAAA,MACX,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA;AAAE,KACjC;AAAA,IACA,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG,CAAA;AAAA,IACH,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,UAAU;AAAC,GACb;AACF;AAMA,SAAS,YAAA,CAAa,MAAsB,KAAA,EAAoB;AAC9D,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,MAAA;AACH,MAAA,OAAO,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,IAChC,KAAK,QAAA;AACH,MAAA,OAAO,aAAA,CAAc,MAAM,KAAK,CAAA;AAAA,IAClC,KAAK,YAAA;AACH,MAAA,OAAO,iBAAA,CAAkB,MAAM,KAAK,CAAA;AAAA,IACtC,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,IACjC,KAAK,SAAA;AACH,MAAA,OAAO,eAAe,KAAK,CAAA;AAAA,IAC7B,KAAK,QAAA;AACH,MAAA,OAAO,aAAA,EAAc;AAAA,IACvB,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,IACjC,KAAK,SAAA;AACH,MAAA,OAAO,cAAA,CAAe,MAAM,KAAK,CAAA;AAAA,IACnC,KAAK,MAAA;AACH,MAAA,OAAO,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,IAChC,KAAK,KAAA;AACH,MAAA,OAAO,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,IAC/B,KAAK,KAAA;AACH,MAAA,OAAO,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,IAC/B,KAAK,MAAA;AACH,MAAA,OAAO,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,IAChC,KAAK,MAAA;AACH,MAAA,OAAO,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,IAChC,KAAK,IAAA;AACH,MAAA,OAAO,SAAA,CAAU,MAAM,KAAK,CAAA;AAAA,IAC9B,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,IACjC,KAAK,QAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,MAAA;AACH,MAAA,OAAO,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,IAChC,KAAK,aAAA;AACH,MAAA,OAAO,kBAAA,CAAmB,MAAM,KAAK,CAAA;AAAA,IACvC,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,IACjC,KAAK,UAAA;AACH,MAAA,OAAO,eAAA,CAAgB,MAAM,KAAK,CAAA;AAAA,IACpC,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,IAChC,KAAK,SAAA;AACH,MAAA,OAAO,cAAA,CAAe,MAAM,KAAK,CAAA;AAAA,IACnC,KAAK,MAAA;AACH,MAAA,OAAO,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,IAChC,KAAK,YAAA;AACH,MAAA,OAAO,iBAAA,CAAkB,MAAM,KAAK,CAAA;AAAA,IACtC,KAAK,UAAA;AACH,MAAA,OAAO,eAAA,CAAgB,MAAM,KAAK,CAAA;AAAA,IACpC,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,IACjC,KAAK,QAAA;AACH,MAAA,OAAO,aAAA,CAAc,MAAM,KAAK,CAAA;AAAA,IAClC,KAAK,MAAA;AACH,MAAA,OAAO,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,IAChC,KAAK,QAAA;AACH,MAAA,OAAO,aAAA,CAAc,MAAM,KAAK,CAAA;AAAA,IAClC,KAAK,SAAA;AACH,MAAA,OAAO,cAAA,CAAe,MAAM,KAAK,CAAA;AAAA,IACnC,KAAK,QAAA;AACH,MAAA,OAAO,aAAA,CAAc,MAAM,KAAK,CAAA;AAAA,IAClC,KAAK,WAAA;AACH,MAAA,OAAO,gBAAA,CAAiB,MAAM,KAAK,CAAA;AAAA;AAEzC;AAIA,SAAS,WAAA,CAAY,MAAiB,KAAA,EAAoB;AACxD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAiB,KAAA,KAAwB;AACrD,IAAA,SAAA,EAAA;AACA,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACtC,IAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,MAAM,UAAA,GAAa,MAAA;AAC3D,IAAA,IAAI,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AACxB,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAA,CAAE,UAAA,EAAY,WAAW,CAAA;AACvD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,KAAA,MAAW,SAAS,CAAA,CAAE,QAAA,EAAU,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,IACvD;AAAA,EACF,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,GAAG,CAAC,CAAA;AACxC,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,SAAA,GAAY,MAAM,aAAA,EAAc;AAChE;AAEA,SAAS,cAAA,CAAe,MAAmB,KAAA,EAAoB;AAC7D,EAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,MAAA;AAAA,IAC3B,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAM,MAAA,GAAS,KAAA,CAAM,gBAAA,GAAmB,KAAA,CAAM,mBAAA,GAAsB,CAAA;AAAA,IACxF;AAAA,GACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAM,aAAA,EAAc;AACtD;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AAGvD,EAAA,IAAI,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,IAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,CAAA,CAAE,UAAA,EAAY,UAAU,CAAA;AACvD,MAAA,MAAM,IAAA,GACJ,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA,IACtB,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,gBAAA,GAAmB,EAAA,GAAK,CAAA,CAAA;AAC9D,MAAA,IAAI,IAAA,GAAO,UAAU,QAAA,GAAW,IAAA;AAChC,MAAA,SAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa;AACjC,MAAA,SAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,MAAM,gBAAA,GAAmB,EAAA;AACvD,MAAA,IAAI,IAAA,GAAO,UAAU,QAAA,GAAW,IAAA;AAChC,MAAA,SAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,CAAM,WAAW,QAAA,GAAW,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,SAAA,GAAY,KAAA,CAAM,cAAA,GAAiB,CAAA;AAClD,EAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AACzB;AAEA,SAAS,iBAAA,CAAkB,MAAsB,KAAA,EAAoB;AACnE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,KAAA,CAAM,gBAAA,EAAiB;AAClF,EAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,GAAA;AAAA,IAC3B,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,SAAS,KAAA,CAAM,gBAAA,IAAoB,aAAA,CAAc,CAAA,CAAE,UAAA,EAAY,MAAM,CAAA,GAAI,KAAA,CAAM,WAAW,CAAA,GAAI,CAAA;AAAA,GAC/G;AACA,EAAA,MAAM,QACJ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAA,CAC/B,KAAK,QAAA,CAAS,MAAA,GAAS,CAAA,KAAM,KAAA,CAAM,gBAAgB,CAAA,GAAI,CAAA,CAAA;AAC1D,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,gBAAA,EAAiB;AACxD;AAEA,SAAS,eAAA,CAAgB,MAAoB,KAAA,EAAoB;AAC/D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,YAAA,GAAe,KAAA,CAAM,cAAA,GAAiB,MAAA;AAAA,IACnD,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,MAAM,UAAU;AAAA,GACvD;AACF;AAEA,SAAS,YAAA,CAAa,MAAiB,KAAA,EAAoB;AACzD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,cAAA,GAAiB,MAAA;AAAA,IAChD,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,MAAM,UAAU;AAAA,GACpD;AACF;AAEA,SAAS,aAAA,CAAc,MAAkB,KAAA,EAAoB;AAC3D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,cAAA,GAAiB,MAAA;AAAA,IAClD,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,MAAM,UAAU;AAAA,GACvD;AACF;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AACvD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,MAAM,YAAY,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,IAAI,EAAA,GAAK,CAAA;AAChE,EAAA,MAAM,aAAa,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY,UAAU,IAAI,EAAA,GAAK,CAAA;AACnE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAA,GAAS,SAAA,GAAY,UAAA,GAAa,MAAM,YAAA,GAAe,CAAA;AAAA,IAC9D,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,aAAA,CAAc,MAAkB,KAAA,EAAoB;AAC3D,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA,IAAK,QAAA;AAC1D,EAAA,MAAM,IAAA,GACJ,aAAa,OAAA,GACT,KAAA,CAAM,kBACN,QAAA,KAAa,OAAA,GACX,KAAA,CAAM,eAAA,GACN,KAAA,CAAM,gBAAA;AACd,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AACrC;AAEA,SAAS,cAAA,CAAe,MAAmB,KAAA,EAAoB;AAC7D,EAAA,MAAM,MAAA,GAAS,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,GAAS,KAAA,CAAM,gBAAA,GAAmB,KAAA,CAAM,cAAA,GAAiB,CAAA;AAChG,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAM,WAAA,GAAc,MAAA;AAAA,IAC3B,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,MAAM,UAAU;AAAA,GACtD;AACF;AAEA,SAAS,aAAA,CAAc,MAAkB,KAAA,EAAoB;AAC3D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAA,GAAS,EAAA,GAAK,KAAA,CAAM,cAAA,GAAiB,CAAA;AAAA;AAAA,IAC5C,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAqB,KAAA,EAAoB;AACjE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,wBAAA,EAA0B,MAAA,EAAQ,MAAM,eAAA,EAAgB;AAAA,EAChF;AAEA,EAAA,IAAI,UAAU,KAAA,CAAM,wBAAA;AACpB,EAAA,KAAA,MAAW,GAAA,IAAO,KAAK,QAAA,EAAU;AAC/B,IAAA,MAAM,SAAS,GAAA,CAAI,KAAA,CAAM,SAAS,KAAA,CAAM,gBAAA,GAAmB,MAAM,iBAAA,GAAoB,CAAA;AACrF,IAAA,IAAI,MAAA,GAAS,SAAS,OAAA,GAAU,MAAA;AAAA,EAClC;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,MAAA;AAAA,IAC/B,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AACvD,EAAA,OAAO;AAAA,IACL,OAAO,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACrD,MAAA,EAAQ,cAAA,CAAe,IAAA,CAAK,UAAA,EAAY,KAAK;AAAA,GAC/C;AACF;AAEA,SAAS,aAAA,CAAc,MAAkB,KAAA,EAAoB;AAC3D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA,KAAM,MAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,WAAA,GACf,KAAA,CAAM,cAAA,IAAkB,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,kBAAA,GAAqB,CAAA,CAAA,GAC3E,CAAA;AACJ,EAAA,OAAO;AAAA,IACL,KAAA,EACE,UAAA,GAAa,MAAA,GAAS,KAAA,CAAM,cAAA,GAAiB,KAAK,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,CAAA,CAAA;AAAA,IACzF,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,iBAAA,CAAkB,MAAsB,KAAA,EAAoB;AACnE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,CAAM,sBAAA,GAAyB,MAAM,oBAAA,GAAuB,MAAA,GAAS,MAAM,cAAA,GAAiB,CAAA;AAAA,IACnG,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,YAAA,CAAa,MAAiB,KAAA,EAAoB;AACzD,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,WAAA,GAAc,WAAA,CAAY,MAAA,GAAS,MAAM,gBAAA,GAAmB,CAAA;AAC1E,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAK,GAAA,CAAI,KAAA,CAAM,eAAe,KAAA,GAAQ,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAAA,IACpE,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,eAAe,KAAA,EAAoB;AAC1C,EAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,MAAM,aAAA,EAAc;AACjD;AAEA,SAAS,aAAA,GAAsB;AAI7B,EAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAC/B;AAEA,SAAS,YAAA,CAAa,MAAiB,KAAA,EAAoB;AACzD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,UAAU,CAAA;AAC3D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,YAAA,GAAe,CAAA;AAAA,IAC1C,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,YAAA,GAAe;AAAA,GAC9C;AACF;AAEA,SAAS,cAAA,CAAe,MAAmB,KAAA,EAAoB;AAC7D,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,UAAU,CAAA;AAC3D,EAAA,MAAM,SAAA,GACJ,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA,GAC1B,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA,GACnC,KAAA,CAAM,MAAA;AACR,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,OAAO,SAAS,CAAA;AAAA,IACtC,QACE,KAAA,CAAM,kBAAA,GACN,MAAM,yBAAA,GACN,KAAA,CAAM,SACN,KAAA,CAAM;AAAA,GACV;AACF;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AACvD,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAC,CAAA;AAC3D,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GACrD,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,SAAS,MAAA,GAAS,CAAC,IAAI,KAAA,CAAM,MAAA;AAChD,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,SAAA,EAAU;AACjD;AAEA,SAAS,UAAA,CAAW,MAAe,KAAA,EAAoB;AACrD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAClD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAS,KAAA,CAAM,WAAA,GAAc,KAAK,MAAA,GAAS,CAAA,GAAI,SAAS,CAAA,GAAI,CAAA,CAAA;AAAA,IACnE,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,UAAA,CAAW,MAAe,KAAA,EAAoB;AACrD,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA;AACxD;AAEA,SAAS,UAAA,CAAW,MAAe,KAAA,EAAoB;AACrD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,UAAU,CAAA;AAC3D,EAAA,IAAI,KAAK,KAAA,CAAM,IAAA,KAAS,YAAY,IAAA,CAAK,KAAA,CAAM,SAAS,IAAA,EAAM;AAC5D,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,MAAM,KAAA,EAAO,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,EACzD;AAGA,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,MAAM,eAAe,CAAA;AAAA,IAClD,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AACvD,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,KAAW,CAAA,SAAU,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAC7D,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,KAAS,MAAA,GAAS,WAAA,CAAY,OAAO,KAAK,CAAA,GAAI,WAAA,CAAY,KAAA,EAAO,KAAK,CAAA;AACzF,IAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,KAAA;AACnC,IAAA,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,EACjB;AACA,EAAA,MAAA,IAAA,CAAW,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,OAAA;AAC7C,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO;AACvC;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AACvD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,gBAAA;AACvC,EAAA,MAAM,eAAe,WAAA,CAAY,IAAA,CAAK,YAAY,SAAS,CAAA,GAAI,MAAM,kBAAA,GAAqB,CAAA;AAC1F,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,WAAA,GAAc,KAAA,GAAQ,YAAA;AAAA,IACnC,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AACvD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,UAAU,CAAA;AAC3D,EAAA,MAAM,eAAe,WAAA,CAAY,IAAA,CAAK,YAAY,SAAS,CAAA,GAAI,MAAM,kBAAA,GAAqB,CAAA;AAC1F,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,MAAM,gBAAA,GAAmB,YAAA;AAC5D,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,MAAM,CAAA,GAAI,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAClD,IAAA,OAAA,GAAU,CAAA,CAAE,SAAS,KAAA,CAAM,MAAA;AAC3B,IAAA,OAAA,GAAU,CAAA,CAAE,KAAA;AAAA,EACd;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAK,GAAA,CAAI,KAAA,CAAM,OAAO,MAAA,EAAQ,OAAO,CAAA,GAAI,KAAA,CAAM,WAAA,GAAc,CAAA;AAAA,IACpE,MAAA,EACE,MAAM,eAAA,GACN,KAAA,CAAM,4BACN,KAAA,CAAM,MAAA,GACN,OAAA,GACA,KAAA,CAAM,WAAA,GAAc;AAAA,GACxB;AACF;AAEA,SAAS,iBAAA,CAAkB,MAAsB,KAAA,EAAoB;AACnE,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA;AACxD;AAIA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AACvD,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,IAAA,EAAM,KAAK,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,GAAO,QAAA,CAAS,SAAS,IAAA,CAAK,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AACnE,EAAA,MAAM,MAAA,GAAS,KAAK,IAAA,GAAO,QAAA,CAAS,UAAU,IAAA,CAAK,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AACrE,EAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AACzB;AAEA,SAAS,iBAAA,CAAkB,MAAgB,KAAA,EAAoB;AAG7D,EAAA,IAAI,OAAO,KAAA,CAAM,WAAA;AACjB,EAAA,IAAI,OAAO,KAAA,CAAM,WAAA;AACjB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAA,EAAG,KAAK,CAAA;AAC9B,IAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,KAAA;AAC7B,IAAA,IAAI,CAAA,CAAE,MAAA,GAAS,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,MAAA;AAAA,EAChC;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AACrC;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AACvD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,UAAU,CAAA;AAC3D,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA,GAAS,MAAM,gBAAA,GAAmB,CAAA;AACzE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,CAAA;AAC/C,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAK,GAAA,CAAI,KAAA,CAAM,OAAO,MAAM,CAAA,GAAI,MAAM,WAAA,GAAc,CAAA;AAAA,IAC3D,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,MAAA,GAAS,MAAM,WAAA,GAAc;AAAA,GACtD;AACF;AAIA,SAAS,kBAAA,CAAmB,MAAuB,KAAA,EAAoB;AACrE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,MAAM,iBAAA,EAAkB;AAAA,EACrD;AACA,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,EAAG,KAAK,CAAC,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAA,CACpD,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,KAAK,KAAA,CAAM,kBAAA;AACrC,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,iBAAA,EAAkB;AACzD;AAEA,SAAS,eAAA,CAAgB,MAAoB,KAAA,EAAoB;AAC/D,EAAA,MAAM,OAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,gBAAA;AAElC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,mBAAA,GAAsB,CAAA,GAAI,KAAA;AAAA,IACvC,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAIA,SAAS,YAAA,CAAa,MAAiB,KAAA,EAAoB;AACzD,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,KAAW,CAAA,SAAU,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAC7D,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,EAAG,KAAK,CAAC,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAA,CACpD,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,KAAK,KAAA,CAAM,QAAA;AACrC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAChD,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAE;AACnC;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAAoB;AAEvD,EAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA,GAAS,MAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAgB,KAAA,CAAM,QAAA,CAAA;AACzF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,MAAM,YAAA,GAAe,MAAM,aAAA,GAAgB,CAAA;AAC3C,EAAA,MAAM,UAAA,GACJ,cAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA,KAAM,MAAA,GAAY,eAAe,CAAA,GAAI,CAAA;AAC5E,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,MAAA;AAAA,IACjC,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAIA,SAAS,eAAA,CAAgB,MAAoB,KAAA,EAAoB;AAC/D,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,KAAA,KAAU,MAAA,GAAY,KAAA,CAAM,gBAAgB,CAAA,GAAI,CAAA;AAC/D,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,CAAM,oBAAA;AAAA,IACb,MAAA,EAAQ,SAAS,KAAA,CAAM;AAAA,GACzB;AACF;AAEA,SAAS,YAAA,CAAa,MAAiB,KAAA,EAAoB;AACzD,EAAA,MAAM,QAAQ,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,KAAK,KAAA,CAAM,iBAAA;AAC/D,EAAA,MAAM,SAAS,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,QAAQ,KAAK,KAAA,CAAM,kBAAA;AACjE,EAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AACzB;AAEA,SAAS,SAAA,CAAU,MAAc,KAAA,EAAoB;AACnD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA,GAAS,cAAc,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA,GAAI,KAAA,CAAM,gBAAA;AACjF,EAAA,MAAM,UAAA,GACJ,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,MAAM,MAAA,GACvC,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,kBAAA,GAC7B,CAAA;AACN,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,UAAA,EAAY,aAAa,MAAA,GAAS,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,IACjF,MAAA,EAAQ,cAAA,CAAe,IAAA,CAAK,UAAA,EAAY,KAAK;AAAA,GAC/C;AACF;AAEA,SAAS,YAAA,CAAa,MAAiB,KAAA,EAAoB;AACzD,EAAA,MAAM,QAAQ,aAAA,CAAc,IAAA,CAAK,YAAY,OAAO,CAAA,IAAK,KAAK,KAAA,IAAS,EAAA;AACvE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACnC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,aAAA,EAAe,QAAQ,KAAA,CAAM,aAAA,GAAgB,CAAA,GAAI,KAAA,CAAM,iBAAiB,CAAA;AAAA,IAC9F,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,cAAc,KAAA,EAAoB;AACzC,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,CAAM,kBAAA;AAAA,IACb,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AAEA,SAAS,YAAA,CAAa,MAAiB,KAAA,EAAoB;AACzD,EAAA,MAAM,QAAQ,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,KAAK,KAAA,CAAM,iBAAA;AAC/D,EAAA,MAAM,SAAS,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,QAAQ,KAAK,KAAA,CAAM,kBAAA;AACjE,EAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AACzB;AAEA,SAAS,YAAY,KAAA,EAAoB;AACvC,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,MAAA,EAAQ,MAAM,QAAA,EAAS;AACzD;AAEA,SAAS,YAAA,CACP,QAAA,EACA,KAAA,EACA,SAAA,EACM;AACN,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AACxD,EAAA,MAAM,KAAA,GAAQ,SAAS,GAAA,CAAI,CAAC,MAAM,YAAA,CAAa,CAAA,EAAG,KAAK,CAAC,CAAA;AACxD,EAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,IAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA;AAAA,MACzB,CAAA;AAAA,MACA,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,QAAA,CAAS,CAAC,CAAA,EAAG,IAAA,KAAS,SAAA,GAAY,CAAA,GAAI,EAAE,KAAM;AAAA,KACxE;AACA,IAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AACnE,IAAA,MAAMC,KAAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,MAAA,GAAS,CAAC,IAAI,KAAA,CAAM,MAAA;AACtD,IAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,MAAA,EAAQ,mBAAmBA,KAAAA,EAAK;AAAA,EACjE;AACA,EAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AACjE,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAChE,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,MAAA,GAAS,CAAC,IAAI,KAAA,CAAM,MAAA;AACtD,EAAA,OAAO,EAAE,KAAA,EAAO,eAAA,GAAkB,IAAA,EAAM,QAAQ,cAAA,EAAe;AACjE;AAMA,SAAS,aAAA,CAAc,MAAkB,KAAA,EAAoB;AAI3D,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,MAAM,YAAA,EAAa;AAAA,EAChD;AACA,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,EAAG,KAAK,CAAC,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AACvD,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,YAAA,EAAa;AACpD;AAEA,SAAS,cAAA,CAAe,MAAmB,KAAA,EAAoB;AAC7D,EAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA,GAAS,MAAM,gBAAA,IAAoB,KAAA,CAAM,sBAAsB,KAAA,CAAM,QAAA,CAAA;AAC/F,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,KAAA,CAAM,cAAc,CAAA,GAAI,EAAA;AAC9D,EAAA,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,MAAA,EAAQ,MAAM,YAAA,EAAa;AAC3D;AAEA,SAAS,eACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,KAAA,EACA,QACA,MAAA,EACa;AACb,EAAA,MAAM,CAAA,GAAI,KAAK,QAAA,CAAS,MAAA;AACxB,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,IAAI,CAAA,EAAG;AACT,IAAA,MAAM,YAAY,KAAA,GAAQ,CAAA;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC5B,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,IAAA;AAAA,QACN,CAAA,EAAG,IAAI,CAAA,GAAI,SAAA;AAAA,QACX,CAAA;AAAA,QACA,KAAA,EAAO,SAAA;AAAA,QACP,MAAA;AAAA,QACA,UAAU;AAAC,OACZ,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAQ,QAAA,EAAS;AAC/C;AAgBA,SAAS,aAAA,CAAc,MAAkB,KAAA,EAAiC;AACxE,EAAA,MAAM,EAAE,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,YAAA,EAAa,GAAI,uBAAuB,IAAI,CAAA;AAEpF,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,YAAA,EAAc,KAAA,EAAO,UAAU,CAAA;AAC9D,EAAA,IAAI,YAAY,SAAA,CAAU,KAAA;AAC1B,EAAA,IAAI,aAAa,SAAA,CAAU,MAAA;AAE3B,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,EAAA,GAAK,qBAAA,CAAsB,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AACxD,IAAA,YAAA,GAAe,EAAA,CAAG,MAAA;AAClB,IAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,EAAA,CAAG,KAAK,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,MAAA,EAAQ,KAAK,CAAA;AACtC,IAAA,YAAA,GAAe,EAAA,CAAG,MAAA;AAClB,IAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,EAAA,CAAG,KAAK,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,EAAA,GAAK,qBAAA,CAAsB,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AACxD,IAAA,YAAA,GAAe,EAAA,CAAG,MAAA;AAClB,IAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,EAAA,CAAG,KAAK,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,MAAA,EAAQ,KAAK,CAAA;AACtC,IAAA,YAAA,GAAe,EAAA,CAAG,MAAA;AAClB,IAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,EAAA,CAAG,KAAK,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,KAAA,KAAU,MAAA;AACnC,EAAA,MAAM,UAAU,KAAA,CAAM,aAAA;AACtB,EAAA,MAAM,QAAA,GAAiB;AAAA,IACrB,KAAA,EAAO,YAAY,OAAA,GAAU,CAAA;AAAA,IAC7B,MAAA,EAAQ,aAAa,OAAA,GAAU;AAAA,GACjC;AACA,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,QAAA,CAAS,OAAO,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,KAAK,CAAC,CAAA;AACzE,EAAA,MAAM,WAAA,GAAA,CACH,cAAc,KAAA,CAAM,cAAA,GAAiB,KACtC,YAAA,GACA,YAAA,GACA,QAAA,CAAS,MAAA,GACT,YAAA,GACA,YAAA;AAEF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,QAAQ,WAAA,EAAY;AAAA,IAChD,IAAA,EAAM,QAAA;AAAA,IACN,YAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAQA,SAAS,aAAA,CAAc,MAAkB,KAAA,EAAoB;AAC3D,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,GACrB,YAAA,CAAa,KAAK,OAAA,CAAQ,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA,GACvD,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AAC1B,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,GACpB,YAAA,CAAa,KAAK,MAAA,CAAO,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA,GACtD,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AAC1B,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,GACtB,YAAA,CAAa,KAAK,QAAA,CAAS,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA,GACxD,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AAC1B,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA;AAAA,IACvB,WAAA,CAAY,MAAA;AAAA,IACZ,UAAA,CAAW,MAAA;AAAA,IACX,YAAA,CAAa,MAAA;AAAA,IACb,KAAA,CAAM;AAAA,GACR;AAIA,EAAA,MAAM,YAAA,GAAA,CACH,WAAA,CAAY,KAAA,GAAQ,CAAA,GAAI,IAAI,CAAA,KAC5B,UAAA,CAAW,KAAA,GAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,IAC3B,YAAA,CAAa,KAAA,GAAQ,IAAI,CAAA,GAAI,CAAA,CAAA;AAChC,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,YAAA,GAAe,CAAC,IAAI,KAAA,CAAM,MAAA;AACvD,EAAA,OAAO;AAAA,IACL,KAAA,EACE,YAAY,KAAA,GACZ,UAAA,CAAW,QACX,YAAA,CAAa,KAAA,GACb,QAAA,GACA,KAAA,CAAM,aAAA,GAAgB,CAAA;AAAA,IACxB,MAAA,EAAQ,WAAA,GAAc,KAAA,CAAM,cAAA,GAAiB;AAAA,GAC/C;AACF;AAEA,SAAS,qBAAA,CACP,IAAA,EACA,KAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,SAAS,QAAA,IAAY,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,EAAG;AAG9D,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,QAAA;AAC1C,IAAA,IAAIC,WAAAA,GAAa,CAAA;AACjB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,MAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,QAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,GAAS,MAAM,gBAAA,GAAmB,KAAA;AACtD,QAAA,IAAI,CAAA,GAAIA,WAAAA,EAAYA,WAAAA,GAAa,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,EAAG,KAAK,CAAA,CAAE,KAAA;AACjC,QAAA,IAAI,CAAA,GAAIA,WAAAA,EAAYA,WAAAA,GAAa,CAAA;AAAA,MACnC;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAOA,WAAAA,GAAa,KAAA,CAAM,aAAA,GAAgB,CAAA;AAAA,MAC1C,QAAQ,KAAA,CAAM;AAAA,KAChB;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,IAAA,EAAM,IAAI,IAAI,YAAA,GAAe,UAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,SAAS,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,IAAA,KAAS,QAAA,GAAW,KAAA,CAAM,iBAAiB,KAAA,CAAM,cAAA;AAC9D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,GAAgB,CAAA;AAAA,IAC3C,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,IAAA,GAAO;AAAA,GAChC;AACF;AAEA,SAAS,gBAAA,CAAiB,MAA+B,IAAA,EAAoC;AAC3F,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACvC,EAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CAAS,KAAA;AAAA,IAChC,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,KAAA,IAAS,CAAA,CAAE,IAAA,KAAS;AAAA,GACpF;AACA,EAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAIzB,EAAA,IAAI,IAAA,KAAS,UAAU,OAAO,IAAA;AAC9B,EAAA,OAAO,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACtD;AAEA,SAAS,uBAAuB,IAAA,EAO9B;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,KAAA;AACJ,EAAA,MAAM,eAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU,MAAA,GAAS,KAAA;AAAA,SAAA,IAC7B,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU,MAAA,GAAS,KAAA;AAAA,SAAA,IAClC,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU,MAAA,GAAS,KAAA;AAAA,SAAA,IAClC,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU,MAAA,GAAS,KAAA;AAAA,SAAA,IAClC,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,KAAA,GAAQ,KAAA;AAAA,SACpC,YAAA,CAAa,KAAK,KAAuB,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAO,YAAA,EAAa;AAC/D;AAEA,SAAS,UAAA,CAAW,OAA2B,KAAA,EAAsB;AACnE,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA;AACnB,EAAA,OACE,KAAA,CAAM,UAAU,KAAA,CAAM,gBAAA,IAAoB,MAAM,aAAA,GAAgB,KAAA,CAAM,QAAA,CAAA,CAAA,GACtE,KAAA,CAAM,aAAA,GAAgB,CAAA;AAE1B;AAMA,SAAS,cAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,GACA,KAAA,EACa;AACb,EAAA,MAAM,eAA8B,EAAC;AACrC,EAAA,MAAM,UAAA,GAAa,EAAE,KAAA,CAAM,KAAA;AAC3B,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,IAAI,EAAE,WAAA,EAAa;AACjB,IAAA,OAAA,IAAW,KAAA,CAAM,cAAA;AAAA,EACnB;AAEA,EAAA,MAAM,EAAE,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,KAAA,EAAO,YAAA,EAAa,GAAI,sBAAA,CAAuB,IAAI,CAAA;AAE3F,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,UAAA,GAAa,sBAAA;AAAA,MACjB,MAAA;AAAA,MACA,QAAA;AAAA,MACA,CAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,CAAA,CAAE,YAAA;AAAA,MACF;AAAA,KACF;AACA,IAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,IAAA,OAAA,IAAW,CAAA,CAAE,YAAA;AAAA,EACf;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,UAAA,GAAa,eAAe,MAAA,EAAQ,CAAA,EAAG,SAAS,UAAA,EAAY,CAAA,CAAE,cAAc,KAAK,CAAA;AACvF,IAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,IAAA,OAAA,IAAW,CAAA,CAAE,YAAA;AAAA,EACf;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA;AACd,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAM,aAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,QAAQ,KAAA,CAAM,aAAA;AACjC,EAAA,MAAM,cAAA,GAAiB,UAAA,GAAa,KAAA,CAAM,aAAA,GAAgB,CAAA;AAE1D,EAAA,IAAI,YAAA,GAAe,UAAA;AACnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA;AAC5B,IAAA,MAAM,YAAY,sBAAA,CAAuB,KAAA,EAAO,UAAA,EAAY,YAAA,EAAc,gBAAgB,KAAK,CAAA;AAC/F,IAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,IAAA,YAAA,IAAgB,SAAA,CAAU,MAAA;AAC1B,IAAA,IAAI,CAAA,GAAI,YAAA,CAAa,MAAA,GAAS,CAAA,kBAAmB,KAAA,CAAM,MAAA;AAAA,EACzD;AAEA,EAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,MAAA;AAChC,EAAA,OAAA,GAAU,QAAA;AAEV,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,UAAA,GAAa,sBAAA;AAAA,MACjB,MAAA;AAAA,MACA,QAAA;AAAA,MACA,CAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,CAAA,CAAE,YAAA;AAAA,MACF;AAAA,KACF;AACA,IAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,IAAA,OAAA,IAAW,CAAA,CAAE,YAAA;AAAA,EACf;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,UAAA,GAAa,eAAe,MAAA,EAAQ,CAAA,EAAG,SAAS,UAAA,EAAY,CAAA,CAAE,YAAmB,CAAA;AACvF,IAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,IAAA,OAAA,IAAW,CAAA,CAAE,YAAA;AAAA,EACf;AAEA,EAAA,IAAI,KAAA,EAAO;AAKT,IAAA,MAAM,aAAA,GAAsB;AAAA,MAC1B,CAAA;AAAA,MACA,CAAA,EAAG,KAAA;AAAA,MACH,KAAA,EAAO,UAAA;AAAA,MACP,QAAQ,QAAA,GAAW;AAAA,KACrB;AACA,IAAA,YAAA,CAAa,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,aAAA,EAAe,KAAK,CAAC,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ,EAAE,KAAA,CAAM,MAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,aAAA,CACP,IAAA,EACA,OAAA,EACA,KAAA,EACa;AAGb,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,IAAA;AAAA,IACA,GAAG,OAAA,CAAQ,CAAA;AAAA,IACX,GAAG,OAAA,CAAQ,CAAA;AAAA,IACX,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,UAAU;AAAC,GACb;AAGA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,UAAU,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,KAAU,MAAA;AAChC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,KAAc,QAAA,GAAW,MAAM,kBAAA,GAAqB,CAAA;AAC1E,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,KAAc,QAAA,GAAW,MAAM,eAAA,GAAkB,CAAA;AACzE,EAAA,MAAM,MAAA,GAAS,QAAA,GAAW,KAAA,CAAM,gBAAA,GAAmB,CAAA;AACnD,EAAA,MAAM,SAAS,KAAA,CAAM,YAAA;AACrB,EAAA,MAAM,YAAY,KAAA,CAAM,YAAA;AAExB,EAAA,MAAM,qBACJ,QAAA,GAAW,UAAA,GAAa,MAAA,GAAS,KAAA,CAAM,SAAS,MAAA,GAAS,SAAA;AAE3D,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AAC/B,IAAA,UAAA,GAAa,IAAA,CAAK,GAAA;AAAA,MAChB,KAAA,CAAM,mBAAA;AAAA,MACN,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,YAAA,GAAe;AAAA,KACrC;AAEA,IAAA,IAAI,UAAA,GAAa,OAAA,CAAQ,KAAA,GAAQ,KAAA,CAAM,oBAAoB,CAAA,EAAG;AAC5D,MAAA,UAAA,GAAa,KAAK,GAAA,CAAI,OAAA,CAAQ,QAAQ,KAAA,CAAM,iBAAA,GAAoB,GAAG,CAAC,CAAA;AAAA,IACtE;AACA,IAAA,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,oBAAA,EAAsB,kBAAkB,CAAA;AACrE,IAAA,MAAA,GAAS,OAAA,CAAQ,CAAA,GAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,UAAA,IAAc,CAAA;AACpD,IAAA,MAAA,GAAS,OAAA,CAAQ,CAAA,GAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,WAAA,IAAe,CAAA;AAAA,EACxD,CAAA,MAAO;AAEL,IAAA,UAAA,GAAa,OAAA,CAAQ,KAAA;AACrB,IAAA,WAAA,GAAc,kBAAA;AAEd,IAAA,IAAI,WAAA,GAAc,OAAA,CAAQ,MAAA,EAAQ,WAAA,GAAc,OAAA,CAAQ,MAAA;AACxD,IAAA,MAAA,GAAS,OAAA,CAAQ,CAAA;AACjB,IAAA,MAAA,GAAS,OAAA,CAAQ,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,WAAA;AAAA,EACxC;AAEA,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,IAAA;AAAA,IACA,CAAA,EAAG,MAAA;AAAA,IACH,CAAA,EAAG,MAAA;AAAA,IACH,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ,WAAA;AAAA,IACR,UAAU;AAAC,GACb;AAEA,EAAA,IAAI,UAAU,MAAA,GAAS,MAAA;AACvB,EAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AAC/B,IAAA,OAAA,IAAW,QAAA,GAAW,UAAA;AAAA,EACxB;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAA,IAAW,MAAA;AAAA,EACb;AAEA,EAAA,MAAM,QAAA,GAAW,SAAS,KAAA,CAAM,YAAA;AAChC,EAAA,MAAM,YAAA,GAAe,UAAA,GAAa,KAAA,CAAM,YAAA,GAAe,CAAA;AACvD,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,YAAY,sBAAA,CAAuB,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,cAAc,KAAK,CAAA;AACtF,IAAA,KAAA,CAAM,QAAA,CAAS,KAAK,SAAS,CAAA;AAC7B,IAAA,OAAA,IAAW,SAAA,CAAU,MAAA;AACrB,IAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,aAAc,KAAA,CAAM,MAAA;AAAA,EACrD;AAEA,EAAA,KAAA,CAAM,QAAA,CAAS,KAAK,KAAK,CAAA;AACzB,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,uBACP,IAAA,EACA,IAAA,EACA,GACA,CAAA,EACA,KAAA,EACA,QACA,KAAA,EACa;AAIb,EAAA,IAAI,SAAS,QAAA,IAAY,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,EAAG;AAC9D,IAAA,MAAMC,OAAAA,GAAS,IAAI,KAAA,CAAM,aAAA;AACzB,IAAA,MAAMC,WAAAA,GAAa,KAAA,GAAQ,KAAA,CAAM,aAAA,GAAgB,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,QAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,aAAa,KAAK,CAAA;AACrD,IAAA,MAAMC,YAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,KAAA,CAAM,gBAAA,GAAmB,KAAA;AAAA,MAC3D,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,YAAA,CAAa,KAAA,EAAO,KAAK,CAAA,CAAE,KAAA;AAAA,MACtC;AACA,MAAA,MAAM,MAAA,GAAS,CAAA,GAAA,CAAK,MAAA,GAAS,SAAA,IAAa,CAAA;AAC1C,MAAAA,SAAAA,CAAS,IAAA;AAAA,QACP,sBAAA,CAAuB,OAAOF,OAAAA,EAAQ,MAAA,EAAQ,KAAK,GAAA,CAAI,MAAA,EAAQC,WAAU,CAAA,EAAG,KAAK;AAAA,OACnF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,KAAA,EAAO,MAAA,EAAQ,UAAAC,SAAAA,EAAS;AAAA,EAC/C;AACA,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,IAAA,KAAS,QAAA,GAAW,KAAA,CAAM,iBAAiB,KAAA,CAAM,cAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM,aAAA;AACzB,EAAA,MAAM,SAAS,CAAA,GAAI,IAAA;AACnB,EAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,KAAA,CAAM,aAAA,GAAgB,CAAA;AAEjD,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,KAAK,CAAC,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,GAAI,KAAA,CAAM,MAAA;AAC3D,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAI,IAAA;AACpE,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU,WAAA,EAAA;AAExD,IAAA,IAAI,cAAc,CAAA,EAAG;AAInB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAa,cAAc,CAAA;AACrD,MAAA,MAAM,cAAc,KAAA,GAAQ,WAAA;AAC5B,MAAA,IAAI,OAAA,GAAU,MAAA;AACd,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,QAAA,MAAM,IAAI,KAAA,CAAM,IAAA,KAAS,WAAW,WAAA,GAAc,KAAA,CAAM,CAAC,CAAA,CAAG,KAAA;AAC5D,QAAA,QAAA,CAAS,KAAK,sBAAA,CAAuB,KAAA,EAAO,SAAS,MAAA,EAAQ,CAAA,EAAG,KAAK,CAAC,CAAA;AACtE,QAAA,OAAA,IAAW,IAAI,KAAA,CAAM,MAAA;AAAA,MACvB;AAAA,IACF,WACE,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,IACzB,KAAK,QAAA,CAAS,CAAC,CAAA,CAAG,IAAA,KAAS,SAC3B,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,CAAC,CAAY,CAAA,EAClD;AAKA,MAAA,QAAA,CAAS,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,CAAC,GAAI,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA,IAC5F,CAAA,MAAO;AAGL,MAAA,IAAI,OAAA,GAAU,SAAS,UAAA,GAAa,cAAA;AACpC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,QAAA,QAAA,CAAS,IAAA,CAAK,uBAAuB,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAA,CAAK,KAAA,EAAO,KAAK,CAAC,CAAA;AAC/E,QAAA,OAAA,IAAW,IAAA,CAAK,QAAQ,KAAA,CAAM,MAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,OAAA,GAAU,MAAA;AACd,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,EAAO,KAAK,CAAA;AACtC,MAAA,MAAM,SAAS,IAAA,KAAS,QAAA,GAAW,UAAU,UAAA,GAAa,IAAA,CAAK,SAAS,CAAA,GAAI,MAAA;AAC5E,MAAA,MAAM,UAAA,GAAa,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,UAAA;AACpD,MAAA,MAAM,YAAY,sBAAA,CAAuB,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,YAAY,KAAK,CAAA;AAClF,MAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,MAAA,OAAA,IAAW,SAAA,CAAU,MAAA;AACrB,MAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,aAAc,KAAA,CAAM,MAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAQ,QAAA,EAAS;AAC/C;AAOA,SAAS,eACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,KAAA,EACA,QACA,KAAA,EACa;AACb,EAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM,aAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM,cAAA;AACzB,EAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,KAAA,CAAM,aAAA,GAAgB,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,MAAA,GAAS,KAAA,CAAM,cAAA,GAAiB,CAAA;AAEpD,EAAA,MAAM,eAA8B,EAAC;AACrC,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,YAAA,CAAa,IAAA;AAAA,MACX,mBAAmB,IAAA,CAAK,OAAA,EAAS,QAAQ,MAAA,EAAQ,WAAA,EAAa,OAAO,MAAM;AAAA,KAC7E;AAAA,EACF;AACA,EAAA,IAAI,KAAK,MAAA,EAAQ;AAMf,IAAA,MAAM,cAAc,YAAA,CAAa,IAAA,CAAK,OAAO,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA,CAAE,KAAA;AAC5E,IAAA,MAAM,aAAA,GAAgB,MAAA,GAAA,CAAU,UAAA,GAAa,WAAA,IAAe,CAAA;AAC5D,IAAA,YAAA,CAAa,IAAA;AAAA,MACX,mBAAmB,IAAA,CAAK,MAAA,EAAQ,eAAe,MAAA,EAAQ,WAAA,EAAa,OAAO,MAAM;AAAA,KACnF;AAAA,EACF;AACA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,MAAM,gBAAgB,MAAA,GAAS,UAAA;AAC/B,IAAA,YAAA,CAAa,IAAA;AAAA,MACX,mBAAmB,IAAA,CAAK,QAAA,EAAU,eAAe,MAAA,EAAQ,WAAA,EAAa,OAAO,OAAO;AAAA,KACtF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,KAAA,EAAO,MAAA,EAAQ,UAAU,YAAA,EAAa;AAC7D;AAEA,SAAS,mBACP,IAAA,EACA,OAAA,EACA,MAAA,EACA,WAAA,EACA,OACA,MAAA,EACa;AACb,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,KAAK,CAAC,CAAA;AAC7D,EAAA,MAAM,kBACJ,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GACzC,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,SAAS,MAAA,GAAS,CAAC,IAAI,KAAA,CAAM,MAAA;AAEhD,EAAA,IAAI,OAAA,GAAU,MAAA,KAAW,MAAA,GAAS,OAAA,GAAU,OAAA,GAAU,eAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,OAAA;AACd,EAAA,MAAM,eAA8B,EAAC;AACrC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,MAAA,GAAS,MAAA,GAAA,CAAU,WAAA,GAAc,IAAA,CAAK,MAAA,IAAU,CAAA;AACtD,IAAA,YAAA,CAAa,IAAA,CAAK,uBAAuB,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAA,CAAK,KAAA,EAAO,KAAK,CAAC,CAAA;AACnF,IAAA,OAAA,IAAW,IAAA,CAAK,KAAA;AAChB,IAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,aAAc,KAAA,CAAM,MAAA;AAAA,EACrD;AACA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA,EAAG,KAAA;AAAA,IACH,CAAA,EAAG,MAAA;AAAA,IACH,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,sBAAA,CACP,KAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,OAAA;AACH,MAAA,OAAO,aAAA,CAAc,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAChD,KAAK,SAAA;AACH,MAAA,OAAO,eAAA,CAAgB,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAClD,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC/C,KAAK,KAAA;AACH,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC9C,KAAK,KAAA;AACH,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC9C,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC/C,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC/C,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC/C,KAAK,QAAA;AACH,MAAA,OAAO,cAAA,CAAe,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,IAC1C,KAAK,YAAA;AACH,MAAA,OAAO,aAAa,KAAA,EAAO,CAAA,EAAG,GAAG,iBAAA,CAAkB,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAClE,KAAK,OAAA;AACH,MAAA,OAAO,aAAA,CAAc,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAChD,KAAK,OAAA;AACH,MAAA,OAAO,aAAA,CAAc,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAChD,KAAK,QAAA;AACH,MAAA,OAAO,cAAA,CAAe,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IACjD,KAAK,IAAA;AACH,MAAA,OAAO,UAAA,CAAW,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC7C,KAAK,OAAA;AACH,MAAA,OAAO,aAAA,CAAc,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,IACzC,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,IACxC,KAAK,SAAA;AACH,MAAA,OAAO,eAAA,CAAgB,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAClD,KAAK,QAAA;AACH,MAAA,OAAO,cAAA,CAAe,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,IAC1C,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC/C,KAAK,aAAA;AACH,MAAA,OAAO,mBAAA,CAAoB,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IACtD,KAAK,OAAA;AACH,MAAA,OAAO,aAAA,CAAc,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAChD,KAAK,UAAA;AACH,MAAA,OAAO,gBAAA,CAAiB,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IACnD,KAAK,OAAA;AACH,MAAA,OAAO,aAAA,CAAc,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,IACzC,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC/C,KAAK,SAAA;AACH,MAAA,OAAO,eAAA,CAAgB,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAClD,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC/C,KAAK,YAAA;AACH,MAAA,OAAO,kBAAA,CAAmB,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IACrD,KAAK,UAAA;AACH,MAAA,OAAO,aAAa,KAAA,EAAO,CAAA,EAAG,GAAG,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAChE,KAAK,OAAA;AACH,MAAA,OAAO,aAAa,KAAA,EAAO,CAAA,EAAG,GAAG,YAAA,CAAa,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAC7D,KAAK,QAAA;AACH,MAAA,OAAO,aAAa,KAAA,EAAO,CAAA,EAAG,GAAG,aAAA,CAAc,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAC9D,KAAK,MAAA;AACH,MAAA,OAAO,aAAa,KAAA,EAAO,CAAA,EAAG,GAAG,WAAA,CAAY,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAC5D,KAAK,QAAA;AACH,MAAA,OAAO,aAAa,KAAA,EAAO,CAAA,EAAG,GAAG,aAAA,CAAc,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAC9D,KAAK,SAAA;AACH,MAAA,OAAO,aAAa,KAAA,EAAO,CAAA,EAAG,GAAG,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAC/D,KAAK,QAAA;AACH,MAAA,OAAO,aAAa,KAAA,EAAO,CAAA,EAAG,GAAG,aAAA,CAAc,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAC9D,KAAK,WAAA;AACH,MAAA,OAAO,iBAAA,CAAkB,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA;AAExD;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,IAAA,EACa;AACb,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,EAAC,EAAE;AAC5E;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAIb,EAAA,MAAM,OAAsB,EAAC;AAC7B,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAiB,KAAA,KAAwB;AACrD,IAAA,MAAM,IAAA,GAAO,CAAA,GAAI,KAAA,GAAQ,KAAA,CAAM,UAAA;AAC/B,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,IAAA,EAAM,CAAA;AAAA,MACN,CAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,aAAA;AAAA,MAC3B,KAAA,EAAO,KAAA,GAAQ,KAAA,GAAQ,KAAA,CAAM,UAAA;AAAA,MAC7B,QAAQ,KAAA,CAAM,aAAA;AAAA,MACd,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAA,CAAE,UAAA,EAAY,WAAW,CAAA;AACvD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,KAAA,MAAW,KAAK,CAAA,CAAE,QAAA,EAAU,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,GAAG,CAAC,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,aAAA;AACnC,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,KAAA,EAAO,MAAA,EAAQ,UAAU,IAAA,EAAK;AACrD;AAEA,SAAS,eAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,QAAA,EAAU;AAChC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,KAAA,CAAM,gBAAA,GAAmB,MAAM,mBAAA,GAAsB,CAAA;AACnF,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,IAAA;AAAA,MACN,CAAA,EAAG,OAAA;AAAA,MACH,CAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,QAAQ,KAAA,CAAM,aAAA;AAAA,MACd,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAA,IAAW,CAAA;AAAA,EACb;AACA,EAAA,OAAO,EAAE,MAAM,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAQ,KAAA,CAAM,eAAe,QAAA,EAAS;AACpE;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAEb,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AACpC,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,UAAU,CAAA,GAAI,CAAA;AAClB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAO,KAAA,CAAM,cAAA;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,CAAA;AAAA,MACN,GAAG,CAAA,GAAI,CAAA;AAAA,MACP,CAAA,EAAG,OAAA;AAAA,MACH,KAAA,EAAO,KAAK,KAAA,GAAQ,CAAA;AAAA,MACpB,MAAA,EAAQ,IAAA;AAAA,MACR,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAA,IAAW,IAAA;AAAA,EACb;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAS;AACxE;AAEA,SAAS,iBAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAEb,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AACzC,EAAA,MAAM,CAAA,GAAI,KAAK,QAAA,CAAS,MAAA;AACxB,EAAA,MAAM,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,GAAI,CAAA;AACtC,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,GAAA;AAAA,MACN,CAAA,EAAG,IAAI,CAAA,GAAI,IAAA;AAAA,MACX,CAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,QAAQ,KAAA,CAAM,eAAA;AAAA,MACd,UAAU;AAAC,KACZ,CAAA;AAAA,EACH;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAS;AACxE;AAEA,SAAS,kBAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAEb,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,cAAc,CAAA,CAAE,UAAA,EAAY,MAAM,CAAA,GAAI,KAAA,CAAM,WAAW,CAAA,GAAI,CAAA;AACzE,IAAA,MAAM,CAAA,GAAI,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,SAAS,KAAA,CAAM,gBAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,CAAA;AAAA,MACN,CAAA,EAAG,OAAA;AAAA,MACH,CAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,QAAQ,KAAA,CAAM,gBAAA;AAAA,MACd,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAA,IAAW,CAAA;AACX,IAAA,IAAI,CAAA,GAAI,KAAK,QAAA,CAAS,MAAA,GAAS,GAAG,OAAA,IAAW,KAAA,CAAM,gBAAgB,CAAA,GAAI,CAAA;AAAA,EACzE;AACA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,OAAO,OAAA,GAAU,CAAA;AAAA,IACjB,QAAQ,KAAA,CAAM,gBAAA;AAAA,IACd;AAAA,GACF;AACF;AAEA,SAAS,aAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM,YAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM,YAAA;AACzB,EAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,KAAA,CAAM,YAAA,GAAe,CAAA;AAEhD,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,YAAY,sBAAA,CAAuB,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,YAAY,KAAK,CAAA;AAClF,IAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,IAAA,OAAA,IAAW,SAAA,CAAU,MAAA;AACrB,IAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,aAAc,KAAA,CAAM,MAAA;AAAA,EACrD;AACA,EAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,GAAI,KAAA,CAAM,YAAA;AACnC,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAQ,QAAA,EAAS;AAC/C;AAEA,SAAS,eAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,MAAM,MAAA,GAAS,CAAA;AACf,EAAA,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,kBAAA,GAAqB,KAAA,CAAM,yBAAA;AACpD,EAAA,MAAM,UAAA,GAAa,KAAA;AAEnB,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,YAAY,sBAAA,CAAuB,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,YAAY,KAAK,CAAA;AAClF,IAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,IAAA,OAAA,IAAW,SAAA,CAAU,MAAA;AACrB,IAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,aAAc,KAAA,CAAM,MAAA;AAAA,EACrD;AACA,EAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,GAAI,KAAA,CAAM,YAAA;AACnC,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAQ,QAAA,EAAS;AAC/C;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,EAAO,KAAK,CAAA;AACpC,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,KAAA;AAAA,MACN,CAAA,EAAG,OAAA;AAAA,MACH,CAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAA,IAAW,IAAA,CAAK,QAAQ,KAAA,CAAM,MAAA;AAAA,EAChC;AACA,EAAA,OAAO,EAAE,MAAM,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAQ,KAAA,CAAM,WAAW,QAAA,EAAS;AAChE;AASA,SAAS,uBAAuB,IAAA,EAAwB;AACtD,EAAA,IAAI,IAAA,CAAK,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG,OAAO,IAAA;AAC3D,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,MAAM,GAAG,OAAO,IAAA;AACnF,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA,KAAM,QAAQ,OAAO,IAAA;AACjD,EAAA,OAAO,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,KAAM,OAAA;AACzC;AAEA,SAAS,WAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAIb,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,IAAI,MAAM,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,SAAS,MAAA,EAAQ;AACvD,MAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,MAAA,SAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,IAAA,EAAM;AAC7F,MAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAAA,IACnC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,MAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,MAAA,WAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,KAAK,EAAE,KAAK,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,GAAI,KAAA,CAAM,MAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,WAAW,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AAC3D,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,aAAa,QAAQ,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,SAAA,GAAY,CAAA,GAAI,SAAA,GAAY,SAAA,GAAY,CAAA;AAE1D,EAAA,MAAM,cAAc,SAAA,KAAc,CAAA,IAAK,WAAA,GAAc,CAAA,GAAI,YAAY,WAAA,GAAc,CAAA;AAGnF,EAAA,MAAM,iBAAiB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAO,CAAA,KAAM;AACrD,IAAA,IAAI,MAAM,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,SAAS,MAAA,EAAQ;AACvD,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,eAAe,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,CAAC,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,UAAA,CAAW,CAAC,CAAA,IAAK,CAAA;AAAA,EAC1B,CAAC,CAAA;AAGD,EAAA,MAAM,cAAA,GACJ,eAAe,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,GAAI,QAAA;AAKlD,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AACtC,EAAA,MAAM,aAAA,GACJ,SAAA,KAAc,CAAA,IAAK,WAAA,KAAgB,KAAK,OAAA,KAAY,OAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,cAAc,CAAA;AAEhD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,SAAA,GAAY,CAAA,IAAK,WAAA,GAAc,CAAA,EAAG;AACpC,IAAA,OAAA,GAAU,CAAA;AAAA,EACZ,WAAW,aAAA,EAAe;AACxB,IAAA,MAAM,CAAA,GAAI,KAAK,QAAA,CAAS,MAAA;AACxB,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAA,GAAU,CAAA,GAAI,KAAA;AAAA,IAChB,CAAA,MAAA,IAAW,YAAY,SAAA,EAAW;AAChC,MAAA,OAAA,GAAU,CAAA;AACV,MAAA,eAAA,GAAkB,CAAA,GAAI,CAAA,GAAI,KAAA,IAAS,CAAA,GAAI,CAAA,CAAA,GAAK,CAAA;AAAA,IAC9C,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,KAAA,IAAS,IAAI,CAAA,CAAA,GAAK,CAAA;AACvC,MAAA,OAAA,GAAU,CAAA,GAAI,IAAA;AACd,MAAA,eAAA,GAAkB,CAAA,GAAI,IAAA;AAAA,IACxB;AAAA,EACF,CAAA,MAAA,IAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,OAAA,GAAU,IAAI,KAAA,GAAQ,cAAA;AAAA,EACxB,CAAA,MAAA,IAAW,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAA,GAAU,CAAA,GAAA,CAAK,QAAQ,cAAA,IAAkB,CAAA;AAAA,EAC3C,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,CAAA;AAAA,EACZ;AAEA,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAC,CAAA,IAAK,CAAA;AACxC,IAAA,MAAM,YAAY,sBAAA,CAAuB,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,YAAY,KAAK,CAAA;AAC7E,IAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,IAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AACpB,IAAA,OAAA,IAAW,UAAA;AACX,IAAA,IAAI,SAAA,CAAU,MAAA,GAAS,SAAA,EAAW,SAAA,GAAY,SAAA,CAAU,MAAA;AACxD,IAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG,OAAA,IAAW,MAAM,MAAA,GAAS,eAAA;AAAA,EAC9D;AAMA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,IACE,KAAA,CAAM,IAAA,KAAS,KAAA,IACf,oBAAA,CAAqB,KAAK,CAAA,IAC1B,SAAA,IAAa,QAAA,CAAS,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA,CAAA,EACpC;AACA,MAAA,QAAA,CAAS,CAAC,CAAA,GAAI,WAAA,CAAY,KAAA,EAAO,QAAQ,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,cAAA,CAAe,CAAC,CAAA,IAAK,CAAA,EAAG,OAAO,SAAS,CAAA;AAAA,IAC/F;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,cAAc,CAAA;AAAA,IACrC,MAAA,EAAQ,SAAA;AAAA,IACR;AAAA,GACF;AACF;AAQA,SAAS,qBAAqB,IAAA,EAAwB;AACpD,EAAA,IAAI,IAAA,CAAK,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG,OAAO,IAAA;AAC3D,EAAA,OAAO,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,KAAM,OAAA;AACzC;AAEA,SAAS,YACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,KAAA,EACA,OACA,eAAA,EACa;AACb,EAAA,MAAM,QAAA,GACJ,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,KAAA;AAIhF,EAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,MACrC,CAAA,CAAE,IAAA,KAAS,WAAW,CAAA,GAAI,YAAA,CAAa,CAAA,EAAG,KAAK,CAAA,CAAE;AAAA,GACnD;AACA,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU,WAAA,EAAA;AAExD,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,GAAI,KAAA,CAAM,MAAA;AAC/D,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,GAAI,QAAA;AACnE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,eAAA,IAAmB,GAAG,aAAa,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,aAAa,CAAA;AAIhD,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,WAAA,GAAc,CAAA,GAAI,KAAA,GAAQ,WAAA,GAAc,CAAA;AAC7D,EAAA,MAAM,aAAA,GAAgB,WAAA,KAAgB,CAAA,IAAK,OAAA,KAAY,WAAW,KAAA,GAAQ,CAAA;AAE1E,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAA,GAAU,CAAA;AAAA,EACZ,WAAW,aAAA,EAAe;AACxB,IAAA,MAAM,CAAA,GAAI,KAAK,QAAA,CAAS,MAAA;AACxB,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAA,GAAU,CAAA,GAAI,KAAA;AAAA,IAChB,CAAA,MAAA,IAAW,YAAY,SAAA,EAAW;AAChC,MAAA,eAAA,GAAkB,CAAA,GAAI,CAAA,GAAI,KAAA,IAAS,CAAA,GAAI,CAAA,CAAA,GAAK,CAAA;AAAA,IAC9C,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,KAAA,IAAS,IAAI,CAAA,CAAA,GAAK,CAAA;AACvC,MAAA,OAAA,GAAU,CAAA,GAAI,IAAA;AACd,MAAA,eAAA,GAAkB,CAAA,GAAI,IAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAE3B,MAAA,QAAA,CAAS,KAAK,sBAAA,CAAuB,KAAA,EAAO,GAAG,OAAA,EAAS,QAAA,EAAU,KAAK,CAAC,CAAA;AACxE,MAAA,OAAA,IAAW,YAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,MAAM,YAAY,sBAAA,CAAuB,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,UAAU,KAAK,CAAA;AAC3E,MAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,MAAA,OAAA,IAAW,SAAA,CAAU,MAAA;AAAA,IACvB;AACA,IAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG,OAAA,IAAW,MAAM,MAAA,GAAS,eAAA;AAAA,EAC9D;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,OAAA,GAAU,CAAC,GAAG,QAAA,EAAS;AACxF;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,YACJ,KAAA,CAAM,IAAA,KAAS,MAAA,GACX,YAAA,CAAa,OAAO,CAAA,EAAG,OAAA,EAAS,KAAA,EAAO,KAAK,IAC5C,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,OAAO,KAAK,CAAA;AAClD,IAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,IAAA,OAAA,IAAW,SAAA,CAAU,MAAA;AACrB,IAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,aAAc,KAAA,CAAM,OAAA;AAAA,EACrD;AACA,EAAA,OAAO,EAAE,MAAM,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAQ,OAAA,GAAU,GAAG,QAAA,EAAS;AAC5D;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAQ,KAAA,CAAM,UAAA;AAAA,IACd,UAAU;AAAC,GACb;AACF;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM,WAAA;AACzB,EAAA,MAAM,SAAS,CAAA,GAAI,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,kBAAkB,KAAA,CAAM,yBAAA;AACrE,EAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,KAAA,CAAM,WAAA,GAAc,CAAA;AAE/C,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,YAAY,sBAAA,CAAuB,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,YAAY,KAAK,CAAA;AAClF,IAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,IAAA,OAAA,IAAW,SAAA,CAAU,MAAA;AACrB,IAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,aAAc,KAAA,CAAM,MAAA;AAAA,EACrD;AAEA,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,OAAA,IAAW,KAAA,CAAM,MAAA;AACjB,IAAA,MAAM,UAAA,GAAa,kBAAA;AAAA,MACjB,IAAA,CAAK,UAAA;AAAA,MACL,MAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AACxB,IAAA,OAAA,IAAW,UAAA,CAAW,MAAA;AAAA,EACxB;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,GAAI,KAAA,CAAM,WAAA;AACnC,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAQ,QAAA,EAAS;AAC/C;AAEA,SAAS,kBAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAEb,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,KAAK,CAAC,CAAA;AAC7D,EAAA,MAAM,aACJ,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GACzC,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,SAAS,MAAA,GAAS,CAAC,IAAI,KAAA,CAAM,MAAA;AAChD,EAAA,IAAI,OAAA,GAAU,IAAI,KAAA,GAAQ,UAAA;AAC1B,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,OAAO,sBAAA,CAAuB,KAAA,EAAO,SAAS,CAAA,EAAG,IAAA,CAAK,OAAO,KAAK,CAAA;AACxE,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,MAAA;AACpC,IAAA,OAAA,IAAW,IAAA,CAAK,QAAQ,KAAA,CAAM,MAAA;AAAA,EAChC;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,KAAA,EAAO,MAAA,EAAQ,MAAM,QAAA,EAAS;AACrD;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAEb,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,IAAA,EAAM,KAAK,CAAA;AAC9C,EAAA,MAAM,WAA0B,EAAC;AAIjC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,MAAA,IAAa,CAAA,CAAE,QAAQ,MAAA,EAAW;AAC9C,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA;AAAA,IACjC;AAAA,EACF;AACA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,IAAI,OAAA,GAAU,KAAK,IAAA,EAAM;AACvB,QAAA,OAAA,GAAU,CAAA;AACV,QAAA,OAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAA,GAAU,KAAK,IAAA,EAAM;AACzB,MAAA,IAAI,CAAC,QAAQ,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAO,EAAE,CAAA,EAAG;AAC3C,MAAA,OAAA,EAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,QAAA,EAAU;AAChC,IAAA,IAAI,IAAI,IAAA,CAAK,GAAA;AACb,IAAA,IAAI,IAAI,IAAA,CAAK,GAAA;AACb,IAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,MAAA,EAAW;AACtC,MAAA,WAAA,EAAY;AACZ,MAAA,CAAA,GAAI,OAAA;AACJ,MAAA,CAAA,GAAI,OAAA;AACJ,MAAA,OAAA,EAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA;AACnD,IAAA,MAAM,QAAQ,CAAA,GAAA,CAAK,QAAA,GAAW,CAAA,KAAM,QAAA,CAAS,QAAQ,KAAA,CAAM,MAAA,CAAA;AAC3D,IAAA,MAAM,QAAQ,CAAA,GAAA,CAAK,QAAA,GAAW,CAAA,KAAM,QAAA,CAAS,SAAS,KAAA,CAAM,MAAA,CAAA;AAC5D,IAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,SAAS,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,EACxF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA,EAAO,KAAK,IAAA,GAAO,QAAA,CAAS,SAAS,IAAA,CAAK,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AAAA,IAC5D,MAAA,EAAQ,KAAK,IAAA,GAAO,QAAA,CAAS,UAAU,IAAA,CAAK,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AAAA,IAC9D;AAAA,GACF;AACF;AAEA,SAAS,aACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,KAAA,EACA,QACA,KAAA,EACa;AACb,EAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM,WAAA;AACzB,EAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,KAAA,CAAM,WAAA,GAAc,CAAA;AAC/C,EAAA,IAAI,OAAA,GAAU,IAAI,KAAA,CAAM,WAAA;AACxB,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,IAAA,OAAA,IAAW,KAAA,CAAM,UAAA;AAAA,EACnB;AACA,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,OAAO,sBAAA,CAAuB,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,YAAY,KAAK,CAAA;AAC7E,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,IAAA,OAAA,IAAW,IAAA,CAAK,MAAA;AAChB,IAAA,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,aAAc,KAAA,CAAM,MAAA;AAAA,EACrD;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAQ,QAAA,EAAS;AAC/C;AAEA,SAAS,mBAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAEb,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,EAAG,KAAK,CAAC,CAAA;AAChE,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,KAAA;AAAA,MACN,CAAA,EAAG,OAAA;AAAA,MACH,CAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAA,IAAW,IAAA,CAAK,QAAQ,KAAA,CAAM,kBAAA;AAAA,EAChC;AACA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA,EAAO,UAAU,CAAA,IAAK,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,GAAI,MAAM,kBAAA,GAAqB,CAAA,CAAA;AAAA,IAC5E,QAAQ,KAAA,CAAM,iBAAA;AAAA,IACd;AAAA,GACF;AACF;AAEA,SAAS,aAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAEb,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,EAAG,KAAK,CAAC,CAAA;AAC5D,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,KAAA;AAAA,MACN,CAAA,EAAG,OAAA;AAAA,MACH,CAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAA,IAAW,IAAA,CAAK,QAAQ,KAAA,CAAM,QAAA;AAAA,EAChC;AACA,EAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,MAAA,GAAS,IAAI,OAAA,GAAU,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AACvE,EAAA,OAAO,EAAE,MAAM,CAAA,EAAG,CAAA,EAAG,OAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,CAAM,UAAA,EAAY,QAAA,EAAS;AACvE;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,KAAK,CAAA;AAExC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,KAAK,GAAA,CAAI,KAAA,EAAO,KAAA,CAAM,gBAAgB,CAAC,CAAA;AACtE,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,EAAC,EAAE;AACnE;AAEA,SAAS,aAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,KAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,KAAK,CAAA;AACrC,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,EAAC,EAAE;AAC5E;AAEA,SAAS,YAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AAEb,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,OAAO,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACrD,MAAA,EAAQ,cAAA,CAAe,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAAA,IAC7C,UAAU;AAAC,GACb;AACF;AAEA,SAAS,cAAA,CAAe,IAAA,EAAkB,CAAA,EAAW,CAAA,EAAW,KAAA,EAA2B;AACzF,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,KAAK,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,UAAU;AAAC,GACb;AACF;AAEA,SAAS,aAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,KAAK,CAAA;AACrC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAI,KAAA,EAAO,KAAA,CAAM,aAAA,GAAgB,CAAC,CAAC,CAAC,CAAA;AAAA,IACrF,QAAQ,KAAA,CAAM,WAAA;AAAA,IACd,UAAU;AAAC,GACb;AACF;AAEA,SAAS,aAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,KAAK,CAAA;AACrC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAG,CAAC,CAAC,CAAA;AAAA,IACjE,QAAQ,KAAA,CAAM,WAAA;AAAA,IACd,UAAU;AAAC,GACb;AACF;AAEA,SAAS,cAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,kBAAA,EAAoB,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAG,CAAC,CAAC,CAAA;AAAA,IAC/E,QAAQ,KAAA,CAAM,YAAA;AAAA,IACd,UAAU;AAAC,GACb;AACF;AAEA,SAAS,UAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,EAAQ,cAAA,CAAe,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAAA,IAC7C,UAAU;AAAC,GACb;AACF;AAEA,SAAS,aAAA,CAAc,IAAA,EAAiB,CAAA,EAAW,CAAA,EAAW,KAAA,EAA2B;AACvF,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,KAAK,CAAA;AACrC,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,EAAC,EAAE;AAC5E;AAEA,SAAS,YAAA,CAAa,IAAA,EAAgB,CAAA,EAAW,CAAA,EAAW,KAAA,EAA2B;AACrF,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,MAAA,EAAQ,KAAA,CAAM,QAAA,EAAU,QAAA,EAAU,EAAC,EAAE;AACnF;AAEA,SAAS,eAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,OACA,KAAA,EACa;AACb,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAQ,KAAA,CAAM,aAAA,EAAe,QAAA,EAAU,EAAC,EAAE;AACxE;AAEA,SAAS,cAAA,CACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,KAAA,EACa;AAGb,EAAA,OAAO,EAAE,MAAM,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,EAAC,EAAE;AACtD;AAMA,SAAS,OAAA,CAAQ,OAA2B,GAAA,EAAyC;AACnF,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,IAAI,KAAK,IAAA,KAAS,MAAA,IAAU,KAAK,GAAA,KAAQ,GAAA,SAAY,IAAA,CAAK,KAAA;AAAA,EAC5D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,aAAA,CAAc,OAA2B,GAAA,EAAiC;AACjF,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,KAAS,QAAA,GAAW,CAAA,CAAE,KAAA,GAAQ,MAAA;AAC1C;AAEA,SAAS,aAAA,CAAc,OAA2B,GAAA,EAAiC;AACjF,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,KAAS,QAAA,GAAW,CAAA,CAAE,KAAA,GAAQ,MAAA;AAC1C;AAEA,SAAS,YAAA,CAAa,OAA2B,GAAA,EAAiC;AAChF,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,KAAS,YAAA,GAAe,CAAA,CAAE,KAAA,GAAQ,MAAA;AAC9C;AAEA,SAAS,WAAA,CAAY,OAA2B,IAAA,EAAuB;AACrE,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,IAAI,KAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,IAAA,KAAS,MAAM,OAAO,IAAA;AAAA,EACzD;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAAwD;AACxE,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AACrC,EAAA,IAAI,MAAM,QAAA,IAAY,CAAA,KAAM,OAAA,IAAW,CAAA,KAAM,QAAQ,OAAO,CAAA;AAC5D,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WACP,KAAA,EACwC;AACxC,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,EAAO,SAAS,CAAA;AACvC,EAAA,IAAI,CAAA,KAAM,aAAa,CAAA,KAAM,QAAA,IAAY,MAAM,KAAA,IAAS,CAAA,KAAM,SAAS,OAAO,CAAA;AAC9E,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAA,CAAc,OAA2B,KAAA,EAAsB;AACtE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,EAAO,MAAM,CAAA;AACvC,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA,CAAM,gBAAgB,KAAA,CAAM,QAAA;AACzD,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA,CAAM,gBAAgB,KAAA,CAAM,QAAA;AACzD,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,SAAA,CAAU,OAAA,EAAiB,KAAA,EAA2B,KAAA,EAAsB;AACnF,EAAA,OAAO,QAAQ,MAAA,GAAS,KAAA,CAAM,gBAAA,GAAmB,aAAA,CAAc,OAAO,KAAK,CAAA;AAC7E;AAEA,SAAS,cAAA,CAAe,OAA2B,KAAA,EAAsB;AACvE,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,KAAK,CAAA;AACxC,EAAA,OAAO,MAAM,UAAA,GAAa,KAAA;AAC5B;AAEA,SAAS,YAAA,CAAa,OAA2B,KAAA,EAAsB;AACrE,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,OAAO,CAAA;AAC1C,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,CAAA;AAChC,EAAA,OAAO,KAAA,CAAM,SAAS,KAAA,CAAM,gBAAA,IAAoB,MAAM,aAAA,GAAgB,KAAA,CAAM,QAAA,CAAA,GAC1E,KAAA,CAAM,aAAA,GAAgB,CAAA;AAC1B;AAYA,SAAS,iBAAA,CAAkB,MAAsB,KAAA,EAAkC;AACjF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAIlC,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,gBAAgB,CAAC,CAAA;AACpF,EAAA,MAAM,KAAA,GAAQ,YAAA,GAAe,KAAA,CAAM,kBAAA,GAAqB,CAAA;AACxD,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,UAAA,GAAa,MAAM,kBAAA,GAAqB,CAAA;AAC5E,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAChC;AAOA,SAAS,UAAA,CACP,IAAA,EACA,IAAA,EACA,QAAA,EACA,KAAA,EACQ;AACR,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC9B,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,OAAA,EAAS;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,CAAG,KAAK,CAAC,CAAA;AAChE,IAAA,OAAO,IAAA,GAAO,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,gBAAA;AAAA,EAC5C;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,CAAG,MAAM,CAAC,CAAA;AACjE,EAAA,OAAO,IAAA,GAAO,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,gBAAA;AAC5C;AAQA,SAAS,aAAA,CACP,IAAA,EACA,IAAA,EACA,QAAA,EACA,KAAA,EACQ;AACR,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAC,MAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAE,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAA,CAAY,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,kBAAA;AAC3C,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,OAAA,EAAS;AACvC,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,GAAI,QAAA;AAAA,EACtD;AACA,EAAA,OAAO,IAAA,CAAK,OAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAI,QAAA;AACrD;AAcA,SAAS,WAAW,IAAA,EAAsC;AACxD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAkB;AAClC,EAAA,MAAM,KAAA,GAAuB,CAAC,IAAI,CAAA;AAClC,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,CAAA,GAAI,MAAM,GAAA,EAAI;AACpB,IAAA,MAAM,KAAK,aAAA,CAAe,CAAA,CAAE,KAAsC,UAAA,IAAc,IAAI,IAAI,CAAA;AACxF,IAAA,IAAI,OAAO,MAAA,IAAa,CAAC,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AACpC,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,QAAQ,CAAA;AAAA,IAClE;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,QAAA,EAAU,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACT;AAcA,SAAS,sBAAA,CACP,MACA,IAAA,EACA,QAAA,EACA,OACA,UAAA,EACA,WAAA,EACA,cACA,KAAA,EACkB;AAClB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAS/B,EAAA,MAAM,UAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAC3B,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,OAAA,EAAS;AACvC,MAAA,IAAA,GAAO,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,OAAO,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,GAAI,KAAK,KAAA,GAAQ,CAAA;AAAA,IACpD;AACA,IAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,GAAG,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAElC,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAGtC,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAChB,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,OAAA,GAAU,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,IAAA,CAAK,KAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,UAAU,CAAA,GAAI,CAAA;AAC1D,EAAA,MAAM,OAAA,GACJ,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,UAAU,YAAA,GAAe,WAAA;AAEvD,EAAA,IAAI,MAAA,GAAS,CAAA,QAAA;AACb,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,QAAA,GAAW,MAAA,KAAW,CAAA,QAAA,GAAY,OAAA,GAAU,SAAS,KAAA,CAAM,kBAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAM,QAAQ,CAAA;AACvC,IAAA,MAAA,GAAS,KAAA,GAAQ,SAAS,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,IAAA,GAAO,KAAA;AAAA,EACX;AAGA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,WAAW,MAAA,GAAS,OAAA;AAC1B,IAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,CAAA,CAAE,IAAA,IAAQ,QAAA;AAAA,EACrC;AAEA,EAAA,MAAM,MAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO,GAAI,CAAA;AAC/B,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAA,GAAO,UAAA,CAAW,CAAA,GAAI,UAAA,CAAW,KAAA,GAAQ,KAAA,CAAM,aAAA;AAC/C,MAAA,IAAA,GAAO,CAAA,CAAE,IAAA;AACT,MAAA,SAAA,GAAY,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG,IAAA,GAAO,IAAA,CAAK,SAAS,CAAA,EAAE;AACjD,MAAA,YAAA,GAAe;AAAA,QACb,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,KAAA;AAAA,QACrB,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS;AAAA,OAChC;AAAA,IACF,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,GAAO,UAAA,CAAW,CAAA,GAAI,KAAA,CAAM,aAAA,GAAgB,IAAA,CAAK,KAAA;AACjD,MAAA,IAAA,GAAO,CAAA,CAAE,IAAA;AACT,MAAA,SAAA,GAAY,EAAE,GAAG,IAAA,GAAO,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAE;AAC9D,MAAA,YAAA,GAAe,EAAE,GAAG,MAAA,CAAO,CAAA,EAAG,GAAG,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAE;AAAA,IAChE,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,MAAA,IAAA,GAAO,CAAA,CAAE,IAAA;AACT,MAAA,IAAA,GAAO,UAAA,CAAW,CAAA,GAAI,KAAA,CAAM,aAAA,GAAgB,IAAA,CAAK,MAAA;AACjD,MAAA,SAAA,GAAY,EAAE,GAAG,IAAA,GAAO,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,MAAA,EAAO;AAC9D,MAAA,YAAA,GAAe,EAAE,GAAG,MAAA,CAAO,CAAA,GAAI,OAAO,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,EAAE;AAAA,IAC/D,CAAA,MAAO;AAEL,MAAA,IAAA,GAAO,CAAA,CAAE,IAAA;AACT,MAAA,IAAA,GAAO,UAAA,CAAW,CAAA,GAAI,UAAA,CAAW,MAAA,GAAS,KAAA,CAAM,aAAA;AAChD,MAAA,SAAA,GAAY,EAAE,CAAA,EAAG,IAAA,GAAO,KAAK,KAAA,GAAQ,CAAA,EAAG,GAAG,IAAA,EAAK;AAChD,MAAA,YAAA,GAAe;AAAA,QACb,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,CAAA;AAAA,QAC7B,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO;AAAA,OACvB;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,IAAA;AAAA,MACA,CAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAG,IAAA;AAAA,MACH,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,GAAA;AACT;;;ACp/EA,IAAM,UAAA,GAAqC;AAAA;AAAA,EAEzC,OAAA,EACE,+NAAA;AAAA;AAAA,EAIF,QAAA,EACE,kPAAA;AAAA;AAAA,EAKF,QAAA,EACE,+IAAA;AAAA;AAAA,EAIF,QAAA,EACE,qJAAA;AAAA;AAAA,EAIF,SAAA,EACE,oMAAA;AAAA;AAAA,EAIF,QAAA,EACE,uKAAA;AAAA;AAAA,EAIF,KAAA,EACE,yLAAA;AAAA;AAAA,EAIF,SAAA,EACE,+NAAA;AAAA;AAAA,EAKF,WAAA,EACE,+sBAAA;AAAA;AAAA,EAWF,IAAA,EACE,kLAAA;AAAA;AAAA,EAIF,MAAA,EACE,0RAAA;AAAA;AAAA,EAMF,IAAA,EACE,8PAAA;AAAA;AAAA,EAKF,MAAA,EACE,2MAAA;AAAA;AAAA,EAIF,MAAA,EACE,gNAAA;AAAA;AAAA,EAIF,IAAA,EACE,4UAAA;AAAA;AAAA,EAKF,OAAA,EACE,oPAAA;AAAA;AAAA,EAKF,IAAA,EACE,qOAAA;AAAA;AAAA,EAIF,KAAA,EACE,oIAAA;AAAA;AAAA,EAGF,IAAA,EACE,8IAAA;AAAA;AAAA,EAIF,IAAA,EACE,wMAAA;AAAA,EAEF,KAAA,EACE;AACJ,CAAA;AAEO,SAAS,QAAQ,IAAA,EAAuB;AAC7C,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9D;AAOO,SAAS,cAAA,CACd,IAAA,EACA,CAAA,EACA,CAAA,EACA,MACA,KAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAC5B,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,MAAA;AAC/B,EAAA,MAAM,QAAQ,IAAA,GAAO,EAAA;AACrB,EAAA,OACE,CAAA,wBAAA,EAA2B,CAAC,CAAA,CAAA,EAAI,CAAC,WAAW,KAAK,CAAA,UAAA,EAAa,KAAK,CAAA,EAAA,CAAA,GACnE,IAAA,GACA,CAAA,IAAA,CAAA;AAEJ;;;AC/FO,SAAS,OAAA,CACd,GAAA,EACA,KAAA,EACA,OAAA,GAAuB,EAAC,EAChB;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAQ,GAAA,CAAI,WAAA;AAClB,EAAA,MAAM,SAAS,GAAA,CAAI,YAAA;AAEnB,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,oCAAA;AAAA,IACA,UAAU,KAAK,CAAA,CAAA,CAAA;AAAA,IACf,WAAW,MAAM,CAAA,CAAA,CAAA;AAAA,IACjB,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAA;AAAA,IAC/B,CAAA,aAAA,EAAgB,UAAA,CAAW,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA,CAAA;AAAA,IAC5C,CAAA,WAAA,EAAc,MAAM,QAAQ,CAAA,CAAA;AAAA,GAC9B;AACA,EAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,EAAW;AAC5B,IAAA,QAAA,CAAS,KAAK,CAAA,IAAA,EAAO,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAChD;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AACxC,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,4BAA4B,KAAK,CAAA,UAAA,EAAa,MAAM,CAAA,QAAA,EAAW,MAAM,UAAU,CAAA,IAAA;AAAA,GACjF;AAEA,EAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AAE/B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,WAAA,EAAa;AAC/B,IAAA,cAAA,CAAe,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,EAChC;AAEA,EAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAEA,SAAS,cAAA,CAAe,CAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAG5E,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,UAAA,EAAa,EAAE,YAAA,CAAa,CAAC,SAAS,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA,MAAA,EAAS,CAAA,CAAE,UAAU,CAAC,CAAA,MAAA,EAAS,EAAE,SAAA,CAAU,CAAC,aAAa,KAAA,CAAM,mBAAmB,CAAA,gBAAA,EAAmB,KAAA,CAAM,qBAAqB,CAAA,IAAA;AAAA,GACxL;AACA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,YAAA,EAAe,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA,MAAA,EAAS,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA,KAAA,EAAQ,KAAA,CAAM,mBAAmB,CAAA,QAAA,EAAW,MAAM,kBAAkB,CAAA,IAAA;AAAA,GAC9H;AACA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,CAAA,CAAE,CAAC,CAAA,KAAA,EAAQ,CAAA,CAAE,CAAC,CAAA,SAAA,EAAY,CAAA,CAAE,KAAK,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA,MAAA,EAAS,MAAM,sBAAsB,CAAA,MAAA,EAAS,KAAA,CAAM,sBAAsB,CAAA,QAAA,EAAW,KAAA,CAAM,YAAY,CAAA,UAAA,EAAa,KAAA,CAAM,gBAAgB,CAAA,gBAAA,EAAmB,KAAA,CAAM,qBAAqB,CAAA,IAAA;AAAA,GAC5P;AACA,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAA,GAAI,KAAA,CAAM,kBAAA;AAE1B,EAAA,IAAI,QAAA,GAAW,CAAA,CAAE,CAAA,GAAI,KAAA,CAAM,qBAAqB,KAAA,CAAM,QAAA;AACtD,EAAA,KAAA,MAAW,IAAA,IAAQ,EAAE,KAAA,EAAO;AAC1B,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,KAAK,CAAA,KAAA,EAAQ,QAAQ,CAAA,QAAA,EAAW,MAAM,cAAc,CAAA,EAAA,EAAK,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA;AAAA,KACvF;AACA,IAAA,QAAA,IAAY,KAAA,CAAM,UAAA;AAAA,EACpB;AACF;AAMA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,IAAA;AACvB,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AACH,MAAA,UAAA,CAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAC3B,MAAA;AAAA,IACF,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,cAAA,CAAe,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,CAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAC3B,MAAA;AAAA,IACF,KAAK,eAAA;AAAA,IACL,KAAK,cAAA;AAAA,IACL,KAAK,gBAAA;AAEH,MAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,SAAA,CAAU,IAAA,EAAM,OAAO,GAAG,CAAA;AAC1B,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,WAAA,CAAY,IAAA,EAAM,OAAO,GAAG,CAAA;AAC5B,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,OAAA,CAAQ,IAAA,EAAM,OAAO,GAAG,CAAA;AACxB,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,CAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAC3B,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,WAAA,CAAY,IAAA,EAAM,OAAO,GAAG,CAAA;AAC5B,MAAA;AAAA,IACF,KAAK,KAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,CAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAC3B,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,cAAA,CAAe,IAAA,EAAM,OAAO,GAAG,CAAA;AAC/B,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,SAAA,CAAU,IAAA,EAAM,OAAO,GAAG,CAAA;AAC1B,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,SAAA,CAAU,IAAA,EAAM,OAAO,GAAG,CAAA;AAC1B,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,CAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAC3B,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,MAAA,CAAO,IAAA,EAAM,OAAO,GAAG,CAAA;AACvB,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,SAAA,CAAU,IAAA,EAAM,OAAO,GAAG,CAAA;AAC1B,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,WAAA,CAAY,IAAA,EAAM,OAAO,GAAG,CAAA;AAC5B,MAAA;AAAA,IACF,KAAK,QAAA;AAGH,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,aAAA;AACH,MAAA,eAAA,CAAgB,IAAA,EAAM,OAAO,GAAG,CAAA;AAChC,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,YAAA,CAAa,IAAA,EAAM,OAAO,GAAG,CAAA;AAC7B,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,SAAA,CAAU,IAAA,EAAM,OAAO,GAAG,CAAA;AAC1B,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,YAAA,CAAa,IAAA,EAAM,OAAO,GAAG,CAAA;AAC7B,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,SAAA,CAAU,IAAA,EAAM,OAAO,GAAG,CAAA;AAC1B,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,YAAA,CAAa,IAAA,EAAM,OAAO,GAAG,CAAA;AAC7B,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,WAAA,CAAY,IAAA,EAAM,OAAO,GAAG,CAAA;AAC5B,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,YAAA,CAAa,IAAA,EAAM,OAAO,GAAG,CAAA;AAC7B,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,iBAAA,CAAkB,IAAA,EAAM,OAAO,GAAG,CAAA;AAClC,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,cAAA,CAAe,IAAA,EAAM,OAAO,GAAG,CAAA;AAC/B,MAAA;AAAA,IACF,KAAK,OAAA;AAGH,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,YAAA,CAAa,IAAA,EAAM,OAAO,GAAG,CAAA;AAC7B,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,SAAA,CAAU,IAAA,EAAM,OAAO,GAAG,CAAA;AAC1B,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,CAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAC3B,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,CAAS,IAAA,EAAM,OAAO,GAAG,CAAA;AACzB,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,CAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAC3B,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,WAAA,CAAY,IAAA,EAAM,OAAO,GAAG,CAAA;AAC5B,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,CAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAC3B,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,SAAA,CAAU,IAAA,EAAM,OAAO,GAAG,CAAA;AAC1B,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,aAAA,CAAc,IAAA,EAAM,OAAO,GAAG,CAAA;AAC9B,MAAA;AAIA;AAEN;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAGvE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,IAAA,CAAK,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,KAAK,CAAA,UAAA,EAAa,KAAK,MAAM,CAAA,QAAA,EACnE,MAAM,eAAe,CAAA,WAAA,EAAc,MAAM,iBAAiB,CAAA,IAAA;AAAA,GACvE;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,EAAA,IAAI,UAAU,MAAA,EAAW;AACzB,EAAA,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AACxC;AAEA,SAAS,cAAA,CACP,KAAA,EACA,IAAA,EACA,KAAA,EACA,GAAA,EACM;AACN,EAAA,MAAM,IAAI,KAAA,CAAM,iBAAA;AAChB,EAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AAE/B,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,GAAG,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAC9E,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,IAAI,CAAA,QAAA,EAAW,KAAA,CAAM,OAAO,aAAa,KAAA,CAAM,WAAW,CAAA,gBAAA,EAAmB,KAAA,CAAM,gBAAgB,CAAA,IAAA;AAAA,KACjH;AAEA,IAAA,MAAM,KAAK,KAAA,CAAM,iBAAA;AACjB,IAAA,MAAM,KAAK,KAAA,CAAM,kBAAA;AACjB,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAA,GAAA,CAAK,KAAA,CAAM,QAAQ,EAAA,IAAM,CAAA;AAC1C,IAAA,MAAM,KAAK,KAAA,CAAM,CAAA,GAAI,MAAM,YAAA,GAAe,CAAA,GAAI,MAAM,eAAA,GAAkB,CAAA;AACtE,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,EAAE,CAAA,KAAA,EAAQ,EAAE,CAAA,SAAA,EAAY,EAAE,CAAA,UAAA,EAAa,EAAE,CAAA,MAAA,EAAS,EAAA,GAAK,CAAC,CAAA,QAAA,EAAW,MAAM,iBAAiB,CAAA,IAAA;AAAA,KACxG;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,MAAA,EAC7F,CAAC,CAAA,MAAA,EAAS,CAAC,CAAA,QAAA,EAAW,KAAA,CAAM,OAAO,CAAA,UAAA,EAAa,KAAA,CAAM,WAAW,CAAA,gBAAA,EAAmB,KAAA,CAAM,gBAAgB,CAAA,IAAA;AAAA,KACrH;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,IAAA,MAAM,MAAA,GACJ,KAAK,SAAA,KAAc,QAAA,GACf,MAAM,CAAA,GAAI,KAAA,CAAM,eAAe,KAAA,CAAM,kBAAA,GAAqB,MAAM,eAAA,GAAkB,KAAA,CAAM,mBAAmB,GAAA,GAC3G,KAAA,CAAM,IAAI,KAAA,CAAM,YAAA,GAAe,MAAM,gBAAA,GAAmB,GAAA;AAC9D,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,YAAY,KAAA,CAAM,CAAA,GAAI,MAAM,KAAA,GAAQ,CAAC,QAAQ,MAAM,CAAA,kCAAA,EACnC,KAAA,CAAM,kBAAkB,6BAA6B,KAAA,CAAM,SAAS,KAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,KACjH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,KAAK,KAAA,CAAM,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACxD;AAMA,SAAS,kBAAA,CACP,CAAA,EACA,CAAA,EACA,KAAA,EACA,QACA,MAAA,EACQ;AACR,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,KAAA,GAAQ,GAAG,MAAM,CAAA;AAC5C,EAAA,OACE,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,GAAA,EACV,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAC,MACpB,CAAA,GAAI,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,GAAA,EAClB,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,CAAC,IAAI,CAAA,GAAI,KAAK,IAAI,CAAA,GAAI,CAAC,MACpC,CAAA,GAAI,KAAK,IAAI,CAAA,GAAI,MAAM,MACvB,CAAC,CAAA,CAAA,EAAI,IAAI,MAAM,CAAA,EAAA,CAAA;AAExB;AAMA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAGtE,EAAA,KAAA,MAAW,GAAA,IAAO,KAAK,QAAA,EAAU;AAC/B,IAAA,QAAA,CAAS,GAAA,EAAK,OAAO,GAAG,CAAA;AAAA,EAC1B;AACF;AAEA,SAAS,YAAA,CAAa,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAC1E,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,WAAW,CAAA;AACxD,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAWC,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AAEtD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,KAAK,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,QAAA,EAAW,MAAM,cAAc,CAAA,WAAA;AAAA,KAC/G;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,GAAU,KAAK,CAAA,GAAI,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAEpC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,KAAA,GAAQ,cAAc,QAAA,GAAM,QAAA;AAClC,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,OAAO,CAAA,KAAA,EAAQ,IAAA,GAAO,MAAM,QAAA,GAAW,CAAC,CAAA,aAAA,EAAgB,KAAA,CAAM,aAAa,CAAA,QAAA,EAAW,KAAA,CAAM,cAAc,KAAK,KAAK,CAAA,OAAA;AAAA,KAClI;AAAA,EACF;AACA,EAAA,OAAA,IAAW,EAAA;AAEX,EAAA,IAAI,QAAA,IAAY,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjC,IAAA,MAAM,QAAA,GAAW,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,cAAA;AAAA,MACjB,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAO,QAAA,GAAW,CAAA;AAAA,MAClB,QAAA;AAAA,MACA,KAAA,CAAM;AAAA,KACR;AACA,IAAA,IAAI,UAAA,EAAY,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AACnC,IAAA,OAAA,IAAW,QAAA,GAAW,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,QAAA,GAAW,UAAA,GAAa,KAAA,CAAM,gBAAA,GAAmB,KAAA,CAAM,SAAA;AAC7D,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,OAAO,CAAA,KAAA,EAAQ,IAAA,GAAO,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,QAAA,EAAW,QAAQ,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GACpG;AACF;AAEA,SAAS,WAAA,CAAY,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACzE,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,IAAA,CAAK,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,KAAK,CAAA,UAAA,EAAa,KAAK,MAAM,CAAA,QAAA,EAAW,MAAM,cAAc,CAAA,UAAA,EAAa,MAAM,kBAAkB,CAAA,qBAAA;AAAA,GACpJ;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,EAAE,CAAA,GAAI,KAAA,CAAM,mBAAmB,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,QAAA,EAAW,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,KACjJ;AAAA,EACF;AACF;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,GAAG,QAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,UAAA,EAAa,KAAK,MAAA,GAAS,CAAC,WAAW,KAAA,CAAM,WAAW,CAAA,UAAA,EAAa,KAAA,CAAM,eAAe,CAAA,4BAAA;AAAA,GAClK;AACA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,YAAA,CAAa,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAC1E,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,aAAa,KAAA,GAAQ,GAAA;AACrC,EAAA,MAAM,OAAO,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AACzD,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,gBAAgB,QAAQ,IAAI,CAAA,WAAA,EAAc,OAAO,CAAA,QAAA,EAAW,MAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GACnI;AACA,EAAA,MAAM,QAAA,GAAWA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AAC1D,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,gBAAgB,QAAQ,IAAI,CAAA,6BAAA,EAAgC,OAAO,CAAA,aAAA,EAAgB,KAAA,CAAM,aAAa,CAAA,QAAA,EAAW,KAAA,CAAM,iBAAiB,CAAA,EAAA,EAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,OAAA;AAAA,KAC3M;AAAA,EACF;AACF;AAEA,SAAS,iBAAA,CAAkB,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAC/E,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AACpC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAa,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,MAAA,EAAS,IAAI,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,MAAA,EAAS,IAAI,CAAA,UAAA,EAAa,MAAM,kBAAkB,CAAA,qBAAA;AAAA,GACxH;AACF;AAEA,SAAS,cAAA,CAAe,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAC5E,EAAA,MAAM,SAAS,IAAA,CAAK,QAAA;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,MAAA,GAAS,CAAA,KAAM,MAAA,CAAO,MAAA,GAAS,CAAA;AACrC,IAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,IAAA,MAAM,QAAA,GAAWA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AACtD,IAAA,IAAI,SAAS,CAAA,CAAE,CAAA;AACf,IAAA,MAAM,OAAO,CAAA,CAAE,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AACnD,IAAA,IAAI,QAAA,IAAY,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjC,MAAA,MAAM,QAAA,GAAW,EAAA;AACjB,MAAA,MAAM,UAAA,GAAa,cAAA;AAAA,QACjB,QAAA;AAAA,QACA,CAAA,CAAE,CAAA;AAAA,QACF,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,MAAA,GAAS,QAAA,IAAY,CAAA;AAAA,QAC9B,QAAA;AAAA,QACA,KAAA,CAAM;AAAA,OACR;AACA,MAAA,IAAI,UAAA,EAAY,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AACnC,MAAA,MAAA,IAAU,QAAA,GAAW,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,IAAA,GAAO,MAAA,GAAS,KAAA,CAAM,sBAAA,GAAyB,KAAA,CAAM,cAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,SAAS,KAAA,GAAQ,KAAA;AAChC,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,eAAA,EAAkB,MAAM,CAAA,QAAA,EAAW,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,KAClG;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,QAAQ,KAAA,CAAM,aAAA;AACpC,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,YAAY,KAAK,CAAA,KAAA,EAAQ,IAAI,CAAA,QAAA,EAAW,MAAM,wBAAwB,CAAA,eAAA;AAAA,OACxE;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAA,CAAc,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAC3E,EAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,EAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,EAAA,MAAM,SAAS,KAAA,CAAM,qBAAA;AAGrB,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,aAAa,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,MAAA,EACzF,MAAM,CAAA,MAAA,EAAS,MAAM,CAAA,QAAA,EAAW,KAAA,CAAM,WAAW,CAAA,UAAA,EAAa,KAAA,CAAM,eAAe,CAAA,qBAAA;AAAA,GAC9F;AAEA,EAAA,IAAI,MAAM,CAAA,EAAG;AAKb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACpD,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,UAAU,CAAA,KAAM,CAAA;AACtB,IAAA,MAAM,MAAA,GAAS,MAAM,CAAA,GAAI,CAAA;AACzB,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,CAAA,SAAA,EAAY,IAAI,CAAA,GAAI,GAAG,QAAQ,GAAA,CAAI,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,GAAA,CAAI,KAAA,GAAQ,CAAC,CAAA,UAAA,EAAa,GAAA,CAAI,SAAS,CAAC,CAAA,MAAA,EACrF,MAAM,CAAA,MAAA,EAAS,MAAM,CAAA,QAAA,EAAW,KAAA,CAAM,mBAAmB,CAAA,IAAA;AAAA,OACpE;AAAA,IACF,WAAW,OAAA,EAAS;AAElB,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,cAAc,GAAA,CAAI,CAAA,GAAI,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,GAAI,GAAG,CAAA,GAAA,EACpC,GAAA,CAAI,IAAI,GAAA,CAAI,KAAK,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,GAAG,CAAA,GAAA,EAChC,GAAA,CAAI,CAAA,GAAI,IAAI,KAAK,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,IAAI,MAAA,GAAS,GAAG,CAAA,GAAA,EAC7C,GAAA,CAAI,IAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,IAAI,MAAA,GAAS,GAAG,CAAA,GAAA,EAC1C,MAAM,IAAI,MAAM,CAAA,OAAA,EAAU,GAAA,CAAI,CAAA,GAAI,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,SAAS,GAAA,GAAM,MAAM,CAAA,GAAA,EAC1E,GAAA,CAAI,IAAI,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,MAAM,MAAM,CAAA,GAAA,EACnC,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,OAAA,EAAU,GAAA,CAAI,CAAA,GAAI,MAAM,IAAI,GAAA,CAAI,CAAA,GAAI,GAAG,CAAA,UAAA,EACnD,MAAM,mBAAmB,CAAA,IAAA;AAAA,OACtC;AAAA,IACF,WAAW,MAAA,EAAQ;AAEjB,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,CAAA,WAAA,EAAc,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,GAAI,GAAG,CAAA,GAAA,EAC3B,GAAA,CAAI,IAAI,GAAA,CAAI,KAAA,GAAQ,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,GAAI,GAAG,CAAA,GAAA,EACzC,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,OAAA,EAAU,GAAA,CAAI,IAAI,GAAA,CAAI,KAAA,GAAQ,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,GAAI,GAAA,GAAM,MAAM,CAAA,GAAA,EACzE,IAAI,CAAA,GAAI,GAAA,CAAI,KAAA,GAAQ,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,SAAS,GAAA,GAAM,MAAM,CAAA,GAAA,EAC5D,MAAM,IAAI,MAAM,CAAA,OAAA,EAAU,GAAA,CAAI,CAAA,GAAI,IAAI,KAAA,GAAQ,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,GAAG,MAChF,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA,UAAA,EAC7B,MAAM,mBAAmB,CAAA,IAAA;AAAA,OACtC;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,YAAY,GAAA,CAAI,CAAC,CAAA,KAAA,EAAQ,GAAA,CAAI,IAAI,GAAG,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,aAAa,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,QAAA,EACzE,MAAM,mBAAmB,CAAA,IAAA;AAAA,OACtC;AAAA,IACF;AAAA,EACF;AAKA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,IAAA,MAAM,YAAA,GAAe,OAAA,CAAS,IAAA,CAAK,IAAA,CAAqB,YAAY,UAAU,CAAA;AAC9E,IAAA,MAAM,YAAA,GAAe,OAAA,CAAS,IAAA,CAAK,IAAA,CAAqB,YAAY,UAAU,CAAA;AAC9E,IAAA,IAAI,gBAAgB,YAAA,EAAc;AAClC,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAChB,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,aAAa,EAAE,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,MAAA,EAAS,EAAE,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,UAAA,EACjE,MAAM,qBAAqB,CAAA,qBAAA;AAAA,KAC1C;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,QAAA,GAAW,KAAA,CAAM,qBAAA,GAAwB,KAAA,CAAM,aAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,WAAW,KAAA,GAAQ,KAAA;AAClC,IAAA,MAAM,OAAA,GAAU,WAAW,MAAA,GAAS,GAAA;AACpC,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,KAAA,GAAQ,CAAA;AAC/B,IAAA,MAAM,OAAO,GAAA,CAAI,CAAA,GAAI,IAAI,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AACvD,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,YAAY,EAAE,CAAA,KAAA,EAAQ,IAAI,CAAA,kCAAA,EAAqC,MAAM,aAAa,CAAA,eAAA,EAChE,MAAM,CAAA,WAAA,EAAc,OAAO,CAAA,QAAA,EAAW,IAAI,KAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,KACzF;AAAA,EACF;AACF;AAEA,SAAS,YAAA,CAAa,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAC1E,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,SAAS,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACpD,EAAA,MAAM,aAAa,CAAC,OAAA,CAAQ,KAAK,UAAA,EAAY,aAAa,IACtD,KAAA,GACA,IAAA;AAIJ,EAAA,MAAM,OAAA,GAAU,WAAW,KAAA,GAAQ,GAAA;AACnC,EAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AACnB,EAAA,MAAM,KAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,GAAO,CAAA;AAE7C,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,QAAA,GAAW,IAAA,CAAK,CAAA;AAChB,IAAA,MAAA,GAAS,QAAA,GAAW,OAAO,KAAA,CAAM,cAAA;AAAA,EACnC,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,IAAA,CAAK,CAAA;AACd,IAAA,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACnC;AAEA,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,YAAA,EAAe,OAAO,CAAA,EAAA,CAAI,CAAA;AACnC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,QAAA,GAAW,GAAG,CAAA,KAAA,EAAQ,EAAA,GAAK,GAAG,CAAA,SAAA,EAAY,IAAA,GAAO,CAAC,CAAA,UAAA,EAAa,OAAO,CAAC,CAAA,eAAA,EAAkB,MAAM,iBAAiB,CAAA,UAAA,EAAa,MAAM,mBAAmB,CAAA,uBAAA;AAAA,GACpK;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,WAAA,EAAc,QAAA,GAAW,IAAA,GAAO,IAAI,CAAA,CAAA,EAAI,EAAA,GAAK,IAAA,GAAO,IAAI,CAAA,GAAA,EAAM,QAAA,GAAW,IAAA,GAAO,IAAI,CAAA,CAAA,EAAI,KAAK,IAAA,GAAO,IAAI,CAAA,GAAA,EAAM,QAAA,GAAW,IAAA,GAAO,GAAG,CAAA,CAAA,EAAI,EAAA,GAAK,IAAA,GAAO,IAAI,CAAA,sBAAA,EAAyB,KAAA,CAAM,kBAAkB,CAAA,oEAAA;AAAA,KAC1M;AAAA,EACF;AACA,EAAA,MAAM,OAAO,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AACzD,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,QAAA,EAAW,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GACrF;AACA,EAAA,GAAA,CAAI,KAAK,CAAA,IAAA,CAAM,CAAA;AACjB;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACvE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,WAAW,KAAA,GAAQ,GAAA;AACnC,EAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AACnB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,SAAA,GAAY,IAAA,CAAK,IAAI,IAAA,GAAO,CAAA;AAC5B,IAAA,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,IAAA,GAAO,KAAA,CAAM,cAAA;AAAA,EACjC,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,IAAA,CAAK,CAAA;AACd,IAAA,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,IAAA,GAAO,CAAA;AAAA,EAC3C;AAEA,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,YAAA,EAAe,OAAO,CAAA,EAAA,CAAI,CAAA;AACnC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,YAAA,EAAe,SAAS,CAAA,MAAA,EAAS,EAAE,CAAA,KAAA,EAAQ,IAAA,GAAO,CAAA,GAAI,GAAG,CAAA,QAAA,EAAW,KAAA,CAAM,iBAAiB,CAAA,UAAA,EAAa,MAAM,mBAAmB,CAAA,uBAAA;AAAA,GACnI;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,YAAA,EAAe,SAAS,CAAA,MAAA,EAAS,EAAE,QAAQ,IAAA,GAAO,CAAC,CAAA,QAAA,EAAW,KAAA,CAAM,kBAAkB,CAAA,IAAA;AAAA,KACxF;AAAA,EACF;AACA,EAAA,MAAM,OAAO,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AACzD,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,QAAA,EAAW,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GACrF;AACA,EAAA,GAAA,CAAI,KAAK,CAAA,IAAA,CAAM,CAAA;AACjB;AAEA,SAAS,UAAA,CAAW,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACxE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,IAAI,KAAK,CAAC,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,WAAW,KAAA,GAAQ,GAAA;AACnC,EAAA,MAAM,IAAI,KAAA,CAAM,WAAA;AAChB,EAAA,MAAM,IAAI,KAAA,CAAM,YAAA;AAChB,EAAA,MAAM,KAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA;AAC1C,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,QAAA,GAAW,IAAA,CAAK,CAAA;AAChB,IAAA,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,cAAA;AAAA,EAC9B,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,IAAA,CAAK,CAAA;AACd,IAAA,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,IAAA,GAAO,EAAA,GAAK,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,cAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,IAAI,CAAA,GAAI,CAAA;AACtB,EAAA,MAAM,SAAS,EAAA,GAAK,QAAA,GAAW,IAAI,KAAA,GAAQ,CAAA,GAAI,WAAW,KAAA,GAAQ,CAAA;AAElE,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,YAAA,EAAe,OAAO,CAAA,EAAA,CAAI,CAAA;AACnC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,QAAQ,CAAA,KAAA,EAAQ,EAAE,CAAA,SAAA,EAAY,CAAC,CAAA,UAAA,EAAa,CAAC,CAAA,MAAA,EAAS,CAAA,GAAI,CAAC,CAAA,QAAA,EAAW,IAAI,CAAA,IAAA;AAAA,GACxF;AACA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,YAAA,EAAe,MAAM,CAAA,MAAA,EAAS,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,eAAe,CAAA,IAAA;AAAA,GACvF;AACA,EAAA,MAAM,OAAO,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AACzD,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,QAAA,EAAW,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GACrF;AACA,EAAA,GAAA,CAAI,KAAK,CAAA,IAAA,CAAM,CAAA;AACjB;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAWA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AAEtD,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,EAAA,GAAK,UAAU,KAAA,CAAM,cAAA;AACrB,IAAA,MAAA,GAAS,UAAU,KAAA,CAAM,kBAAA;AACzB,IAAA,SAAA,GAAY,KAAA,CAAM,gBAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA,EAAA,GAAK,KAAA,CAAM,MAAA;AACX,IAAA,MAAA,GAAS,UAAU,KAAA,CAAM,UAAA;AACzB,IAAA,SAAA,GAAY,UAAU,KAAA,CAAM,QAAA;AAAA,EAC9B;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,GAAG,QAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,SAAS,CAAC,CAAA,QAAA,EAAW,EAAE,CAAA,UAAA,EAAa,MAAM,CAAA,qBAAA;AAAA,GAC5J;AAEA,EAAA,IAAI,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,YAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAEpC,EAAA,IAAI,QAAA,IAAY,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjC,IAAA,MAAM,QAAA,GAAW,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,cAAA;AAAA,MACjB,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAO,QAAA,GAAW,CAAA;AAAA,MAClB,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,UAAA,EAAY,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AACnC,IAAA,OAAA,IAAW,QAAA,GAAW,CAAA;AAAA,EACxB;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,OAAO,CAAA,KAAA,EAAQ,IAAA,GAAO,KAAA,CAAM,WAAW,CAAC,CAAA,aAAA,EAAgB,KAAA,CAAM,aAAa,WAAW,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GACxI;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,MAAM,YAAA,GAAe,CAAA;AACtD,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,UAAA,EAAa,EAAA,GAAK,CAAC,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,CAAA,MAAA,EAAS,EAAA,GAAK,CAAC,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,aAAa,SAAS,CAAA,8CAAA,CAAA;AAAA,MAC1F,CAAA,UAAA,EAAa,EAAA,GAAK,CAAC,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,CAAA,MAAA,EAAS,EAAA,GAAK,CAAC,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,aAAa,SAAS,CAAA,8CAAA;AAAA,KAC5F;AAAA,EACF;AACF;AAEA,SAAS,UAAA,CAAW,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACxE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC/C,EAAA,MAAM,EAAA,GAAK,UAAU,KAAA,CAAM,QAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,UAAU,KAAA,CAAM,YAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,MAAA,GAAS,SAAA,GAAY,KAAA,CAAM,UAAA;AACxC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,GAAA;AAE3B,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,YAAA,EAAe,EAAE,CAAA,MAAA,EAAS,EAAE,QAAQ,CAAC,CAAA,QAAA,EAAW,EAAE,CAAA,UAAA,EAAa,MAAM,CAAA,qBAAA;AAAA,GACvE;AACA,EAAA,MAAM,QAAA,GAAA,CAAY,KAAK,QAAA,IAAY,GAAA,EAAK,MAAM,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AAChE,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,IAAA,CAAK,KAAA,GAAQ,IAAI,CAAC,CAAA;AAC3D,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,EAAE,CAAA,KAAA,EAAQ,EAAA,GAAK,QAAA,GAAW,CAAC,CAAA,kCAAA,EAAqC,QAAQ,CAAA,0BAAA,EAA6B,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,OAAA;AAAA,GAChJ;AACF;AAEA,SAAS,WAAA,CAAY,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACzE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,WAAA,GAAc,CAAA;AACxC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,WAAA,GAAc,CAAA,GAAI,CAAA;AAElC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,YAAA,EAAe,EAAE,CAAA,MAAA,EAAS,EAAE,QAAQ,CAAC,CAAA,sBAAA,EAAyB,KAAA,CAAM,YAAY,CAAA,uCAAA,EAA0C,CAAA,GAAI,GAAG,CAAA,CAAA,EAAI,IAAI,GAAG,CAAA,2BAAA;AAAA,GAC9I;AACA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,KAAA,CAAM,cAAc,KAAA,CAAM,MAAM,CAAA,KAAA,EAAQ,EAAA,GAAK,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,aAAA,EAAgB,KAAA,CAAM,aAAa,CAAA,QAAA,EAAW,KAAA,CAAM,cAAc,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,KACnL;AAAA,EACF;AACF;AAEA,SAAS,UAAA,CAAW,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACxE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,OAAA,GAAUC,aAAAA,CAAa,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA,IAAK,MAAA;AACzD,EAAA,MAAM,OAAQ,CAAC,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA,CAAY,QAAA;AAAA,IAC9D;AAAA,MAEG,OAAA,GACD,MAAA;AACJ,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,YAAA,CAAa,IAAI,CAAA;AAErC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,aAAa,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,QAAA,EAAW,KAAA,CAAM,EAAE,CAAA,UAAA,EAAa,KAAA,CAAM,MAAM,CAAA,qBAAA;AAAA,GACxK;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,cAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAEpC,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,cAAc,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,MAAA,GAAS,CAAC,CAAA,CAAA,EAAI,IAAA,GAAO,CAAC,CAAA,GAAA,EAAM,SAAS,EAAE,CAAA,CAAA,EAAI,OAAO,CAAC,CAAA,sBAAA,EAAyB,MAAM,MAAM,CAAA,sEAAA;AAAA,KAC5H;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,cAAc,MAAA,GAAS,CAAC,IAAI,IAAA,GAAO,CAAC,MAAM,MAAA,GAAS,EAAE,IAAI,IAAA,GAAO,CAAC,MAAM,MAAM,CAAA,CAAA,EAAI,OAAO,CAAC,CAAA,wBAAA,EAA2B,MAAM,MAAM,CAAA,+CAAA,CAAA;AAAA,MAChI,CAAA,UAAA,EAAa,MAAA,GAAS,CAAC,CAAA,MAAA,EAAS,OAAO,CAAC,CAAA,MAAA,EAAS,MAAA,GAAS,CAAC,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,CAAA,UAAA,EAAa,MAAM,MAAM,CAAA,8CAAA;AAAA,KACvG;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,UAAA,EAAa,MAAM,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,CAAA,MAAA,EAAS,MAAA,GAAS,EAAE,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,CAAA,UAAA,EAAa,MAAM,MAAM,CAAA,8CAAA,CAAA;AAAA,MAClG,CAAA,UAAA,EAAa,MAAA,GAAS,EAAE,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,CAAA,MAAA,EAAS,MAAM,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,CAAA,UAAA,EAAa,MAAM,MAAM,CAAA,8CAAA;AAAA,KACpG;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,YAAA,EAAe,SAAS,CAAC,CAAA,MAAA,EAAS,OAAO,CAAC,CAAA,gBAAA,EAAmB,MAAM,MAAM,CAAA,IAAA,CAAA;AAAA,MACzE,CAAA,UAAA,EAAa,MAAA,GAAS,CAAC,CAAA,MAAA,EAAS,OAAO,CAAC,CAAA,MAAA,EAAS,MAAA,GAAS,CAAC,CAAA,MAAA,EAAS,IAAA,GAAO,CAAC,CAAA,UAAA,EAAa,MAAM,MAAM,CAAA,8CAAA;AAAA,KACvG;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,MAAA,GAAS,EAAE,QAAQ,IAAA,GAAO,KAAA,CAAM,WAAW,CAAC,CAAA,aAAA,EAAgB,KAAA,CAAM,aAAa,6BAA6B,KAAA,CAAM,EAAE,KAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GAC7J;AACF;AAMA,SAAS,UAAA,CAAW,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACxE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,GAAG,QAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,UAAA,EAAa,KAAK,MAAA,GAAS,CAAC,yBACzE,KAAA,CAAM,iBAAiB,CAAA,gBAAA,EAAmB,KAAA,CAAM,iBAAiB,CAAA,IAAA;AAAA,GAC5F;AACA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,cAAA;AACjC,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,aAAa,IAAA,CAAK,CAAC,CAAA,MAAA,EAAS,SAAS,SAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAK,SAAS,SAAS,CAAA,UAAA,EACtE,MAAM,eAAe,CAAA,gBAAA,EAAmB,MAAM,iBAAiB,CAAA,IAAA;AAAA,KAC9E;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,CAAA,GAAI,MAAM,cAAA,GAAiB,CAAA,GAAI,MAAM,aAAA,GAAgB,CAAA;AACzE,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,YAAY,IAAA,CAAK,CAAA,GAAI,KAAK,KAAA,GAAQ,CAAC,QAAQ,MAAM,CAAA,kCAAA,EACZ,KAAA,CAAM,aAAa,6BAC7C,KAAA,CAAM,SAAS,KAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,KACvD;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,cAAA,CACP,IAAA,EACA,IAAA,EACA,KAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,UAAA,EAAa,KAAK,CAAC,CAAA,MAAA,EAAS,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,GAAI,KAAK,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAM,aAC5F,KAAA,CAAM,eAAe,CAAA,gBAAA,EAAmB,KAAA,CAAM,iBAAiB,CAAA,IAAA;AAAA,KAC9E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,aAAa,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,CAAA,GAAI,KAAK,KAAK,CAAA,MAAA,EAAS,KAAK,CAAC,CAAA,UAAA,EAChE,MAAM,eAAe,CAAA,gBAAA,EAAmB,MAAM,iBAAiB,CAAA,IAAA;AAAA,KAC9E;AAAA,EACF;AACA,EAAA,MAAM,aAAa,IAAA,CAAK,IAAA;AACxB,EAAA,MAAM,UAAU,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,UAAA,CAAW,YAAY,OAAO,CAAA;AAC3E,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,IAAA,IAAI,OAAA,IAAW,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AACrC,MAAA,oBAAA,CAAqB,CAAA,EAAG,OAAO,GAAG,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AACF;AAEA,SAAS,oBAAA,CAAqB,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAClF,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAA;AACxC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAC,CAAA,KAAA,EAAQ,QAAQ,CAAA,aAAA,EAAgB,KAAA,CAAM,aAAa,CAAA,0BAAA,EAA6B,MAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,OAAA;AAAA,GAChJ;AACF;AAOA,SAAS,UAAA,CAAW,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACxE,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,UAAA,EAAa,KAAK,CAAC,CAAA,MAAA,EAAS,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,GAAI,KAAK,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAM,aAC5F,KAAA,CAAM,eAAe,CAAA,gBAAA,EAAmB,KAAA,CAAM,iBAAiB,CAAA,IAAA;AAAA,GAC9E;AACA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACvE,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,aAAa,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,sBAAA,EACzE,KAAA,CAAM,gBAAgB,mBAAmB,KAAA,CAAM,gBAAgB,CAAA,oBAAA,EACjE,KAAA,CAAM,oBAAoB,CAAA,WAAA;AAAA,GACnD;AACA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,WAAA,CAAY,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACzE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,kBAAA,GAAqB,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,UAAU,KAAA,CAAM,iBAAA;AAGnC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,IAAA,CAAK,CAAC,CAAA,KAAA,EAAQ,MAAM,gBAChB,KAAA,CAAM,oBAAoB,CAAA,+CAAA,EAC/B,UAAU,KAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA,OAAA;AAAA,GAChE;AAGA,EAAA,MAAM,KAAA,GAAQD,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AACpD,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA;AAC5C,IAAA,eAAA;AAAA,MACE,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,MACtB,IAAA,CAAK,CAAA,GAAA,CAAK,KAAA,CAAM,kBAAA,GAAqB,MAAM,WAAA,IAAe,CAAA;AAAA,MAC1D,KAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,kBAAA;AAC7B,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,UAAA,EAAa,KAAK,CAAC,CAAA,MAAA,EAAS,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAK,CAAA,MAAA,EAAS,KAAK,CAAA,UAAA,EAC9D,MAAA,IAAU,MAAM,YAAY,CAAA,gBAAA,EAAmB,MAAM,kBAAkB,CAAA,WAAA,EAAc,MAAA,GAAS,KAAA,GAAQ,KAAK,CAAA,IAAA;AAAA,GAC1H;AAEA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAEtE,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAA;AACzC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAa,IAAA,CAAK,CAAC,CAAA,MAAA,EAAS,SAAS,SAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAK,SAAS,SAAS,CAAA,UAAA,EACtE,MAAM,eAAe,CAAA,gBAAA,EAAmB,MAAM,iBAAiB,CAAA,IAAA;AAAA,GAC9E;AACA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,OAAA,CAAQ,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACrE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,QAAA,GAAW,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,gBAAA;AACrD,EAAA,MAAM,MAAA,GAAS,WAAW,KAAA,GAAQ,KAAA;AAGlC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,WAAA;AAC9B,EAAA,MAAM,SAAS,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AAC3D,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,MAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,eAAA,EAAkB,MAAM,CAAA,QAAA,EAAW,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GACpG;AAGA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AAC7C,IAAA,eAAA;AAAA,MACE,SAAS,UAAA,GAAa,CAAA;AAAA,MACtB,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,GAAS,MAAM,WAAA,IAAe,CAAA;AAAA,MAC7C,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAC1C,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,aAAa,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,MAAA,EAAS,UAAU,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,MAAA,EAAS,UAAU,CAAA,UAAA,EAChF,MAAM,iBAAiB,CAAA,qBAAA;AAAA,KACtC;AAAA,EACF;AACF;AAEA,SAAS,UAAA,CAAW,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAExE,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAa,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,CAAA,GAAI,KAAK,KAAK,CAAA,MAAA,EAAS,KAAK,CAAC,CAAA,UAAA,EAChE,MAAM,eAAe,CAAA,gBAAA,EAAmB,MAAM,iBAAiB,CAAA,IAAA;AAAA,GAC9E;AACA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,WAAA,CAAY,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACzE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACtD,EAAA,MAAM,QAAA,GAAWA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AAEpD,EAAA,MAAM,QAAQ,UAAA,GACV,KAAA,CAAM,gBACN,UAAA,GACE,KAAA,CAAM,sBACN,KAAA,CAAM,mBAAA;AACZ,EAAA,MAAM,OAAA,GAAU,aAAa,MAAA,GAAS,GAAA;AAGtC,EAAA,MAAM,WAAA,GACJ,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,qBAAqB,KAAA,CAAM,mBAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,SAAS,WAAA,IAAe,CAAA;AACxD,EAAA,MAAM,QAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,MAAM,cAAA,IAAkB,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,QAAA;AAEd,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,YAAA,EAAe,OAAO,CAAA,EAAA,CAAI,CAAA;AAEnC,EAAA,IAAI,QAAA,IAAY,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjC,IAAA,MAAM,SAAS,cAAA,CAAe,QAAA,EAAU,OAAO,KAAA,EAAO,KAAA,CAAM,gBAAgB,KAAK,CAAA;AACjF,IAAA,IAAI,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EAC7B,CAAA,MAAO;AAEL,IAAA,MAAM,MAAA,GAAA,CAAU,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,IAAK,GAAA,EAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY;AAC/E,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,KAAA,GAAQ,GAAG,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,SAAA,EAAY,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA,UAAA,EAAa,KAAA,CAAM,cAAA,GAAiB,CAAC,yBAC1F,KAAK,CAAA,4BAAA,CAAA;AAAA,MAC9B,CAAA,SAAA,EAAY,QAAQ,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA,KAAA,EAAQ,KAAA,GAAQ,MAAM,cAAA,GAAiB,CAAA,GAAI,MAAM,aAAA,GAAgB,CAAC,qCACzE,KAAA,CAAM,aAAa,6BAA6B,KAAK,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAC,CAAA,OAAA;AAAA,KACnH;AAAA,EACF;AAGA,EAAA,MAAM,SAAS,KAAA,GAAQ,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,qBAAqB,KAAA,CAAM,mBAAA;AAC/E,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAA,EAAQ,MAAM,CAAA,kCAAA,EACZ,KAAA,CAAM,mBAAmB,CAAA,eAAA,EAAkB,UAAA,GAAa,QAAQ,KAAK,CAAA,QAAA,EAC/F,KAAK,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GAC7C;AAEA,EAAA,GAAA,CAAI,KAAK,CAAA,IAAA,CAAM,CAAA;AAGf,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA;AAC5C,IAAA,eAAA;AAAA,MACE,KAAA,GAAQ,KAAA,CAAM,cAAA,GAAiB,MAAA,GAAS,CAAA;AAAA,MACxC,KAAA,GAAQ,MAAM,WAAA,GAAc,CAAA;AAAA,MAC5B,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,OAAA,GAAU,KAAK,CAAA,GAAI,CAAA;AACzB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,GAAI,CAAA;AAC3C,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,eAAe,OAAA,GAAU,CAAC,SAAS,OAAO,CAAA,cAAA,EAAiB,MAAM,WAAW,CAAA,IAAA;AAAA,GAC9E;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,WAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAA;AACrC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,KAAA,EAAQ,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,OAAA;AAAA,GACpF;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,SAAS,CAAA,EAAG;AACvC,IAAA,qBAAA;AAAA,MACE,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,MAAM,kBAAA,GAAqB,CAAA;AAAA,MACjD,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,MACvB,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAE/C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,SAAA;AAEJ,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAC5B,IAAA,MAAA,GAAS,UAAU,CAAA,CAAE,MAAA;AACrB,IAAA,IAAA,GAAO,CAAA,CAAE,IAAA;AACT,IAAA,SAAA,GAAY,CAAA,CAAE,IAAA;AACd,IAAA,WAAA,GAAc,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,qBAAA,GAAwB,KAAA,CAAM,eAAA;AACvE,IAAA,SAAA,GAAY,CAAA,CAAE,KAAA;AAAA,EAChB,WAAW,QAAA,EAAU;AACnB,IAAA,MAAA,GAAS,UAAU,KAAA,CAAM,qBAAA;AACzB,IAAA,IAAA,GAAO,KAAA,CAAM,aAAA;AACb,IAAA,SAAA,GAAY,KAAA,CAAM,SAAA;AAClB,IAAA,WAAA,GAAc,KAAA,CAAM,qBAAA;AAAA,EACtB,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,UAAU,KAAA,CAAM,eAAA;AACzB,IAAA,IAAA,GAAO,KAAA,CAAM,aAAA;AACb,IAAA,SAAA,GAAY,KAAA,CAAM,SAAA;AAClB,IAAA,WAAA,GAAc,KAAA,CAAM,eAAA;AAAA,EACtB;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,GAAG,QAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,UAAA,EAAa,KAAK,MAAA,GAAS,CAAC,WACvF,IAAI,CAAA,UAAA,EAAa,MAAM,CAAA,gBAAA,EAAmB,WAAW,CAAA,WAAA;AAAA,GAClE;AAGA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,WAAA;AAC9B,EAAA,MAAM,SAAS,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,WAAA,GAAc,MAAM,eAAA,GAAkB,GAAA;AACpE,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,MAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,0BAAA,EAA6B,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GACnG;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,SAAS,CAAA;AAIrD,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAA;AACX,IAAA,MAAM,YAAA,GAAe,UAAA,GAAa,KAAA,CAAM,kBAAA,GAAqB,CAAA;AAC7D,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA,GAAI,KAAK,KAAA,GAAQ,KAAA,CAAM,cAAc,EAAA,GAAK,YAAA;AAC1D,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA,GAAI,MAAM,WAAA,GAAA,CAAe,KAAA,CAAM,kBAAkB,EAAA,IAAM,CAAA;AACvE,IAAA,MAAM,aAAa,cAAA,CAAe,SAAA,EAAW,EAAA,EAAI,EAAA,EAAI,IAAI,MAAM,CAAA;AAC/D,IAAA,IAAI,UAAA,EAAY,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,qBAAA;AAAA,MACE,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,cAAc,KAAA,CAAM,gBAAA;AAAA,MAChD,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,WAAA,GAAc,MAAM,eAAA,GAAkB,CAAA;AAAA,MACrD,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAOA,SAAS,qBAAA,CACP,EAAA,EACA,EAAA,EACA,KAAA,EACA,GAAA,EACM;AACN,EAAA,MAAM,IAAI,KAAA,CAAM,gBAAA;AAChB,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,WAAA,EAAc,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAE,MAAM,EAAA,GAAK,CAAC,IAAI,EAAA,GAAK,CAAC,yBACzC,KAAA,CAAM,iBAAiB,CAAA,gBAAA,EAAmB,KAAA,CAAM,uBAAuB,CAAA,mDAAA;AAAA,GAElG;AACF;AAMA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAA;AACxC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAC,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,OAAA;AAAA,GACzE;AACF;AAEA,SAAS,UAAA,CAAW,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACxE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,SAAS,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC/C,EAAA,IAAI,IAAA,GAAO,SAAA,GAAY,KAAA,CAAM,iBAAA,GAAoB,KAAA,CAAM,UAAA;AACvD,EAAA,IAAI,QAAA,GAAW,SAAA,GAAY,KAAA,CAAM,iBAAA,GAAoB,KAAA,CAAM,UAAA;AAC3D,EAAA,IAAI,MAAA,GAAS,UAAA,GAAa,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,iBAAA;AACtD,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,CAAC,UAAA,EAAY;AACvC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,QAAA,GAAW,SAAA;AACX,MAAA,MAAA,GAAS,MAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,MAAA;AACT,MAAA,QAAA,GAAW,MAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,aAAa,MAAA,GAAS,GAAA;AACtC,EAAA,MAAM,KAAA,GAAQA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AACpD,EAAA,MAAM,QAAA,GAAWA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,UAAA,GAAa,KAAA,CAAM,aAAA,GAAgB,QAAA;AAIrD,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,eAAe,OAAO,CAAA,EAAA,CAAA;AAAA,MACtB,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,GAAG,QAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,SAAS,CAAC,CAAA,QAAA,EACvF,IAAI,CAAA,UAAA,EAAa,MAAM,CAAA,gBAAA,EAAmB,KAAA,CAAM,iBAAiB,CAAA,WAAA,CAAA;AAAA,MAC5E,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAA,KAAA,EAC9E,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,+CAAA,EACH,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA,CAAA;AAAA,MACtF,CAAA,IAAA;AAAA,KACF;AAEA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,eAAA;AAAA,QACE,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA,GAAI,CAAA;AAAA,QACvD,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,GAAS,MAAM,WAAA,IAAe,CAAA;AAAA,QAC7C,KAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA;AAAA,EACF;AAKA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,gBAAA;AACzC,EAAA,MAAM,UAAA,GACJ,MAAM,cAAA,IAAkB,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA,GAAI,MAAM,kBAAA,GAAqB,CAAA,CAAA;AAC7E,EAAA,MAAM,SAAS,UAAA,GAAa,MAAA;AAC5B,EAAA,MAAM,aAAa,KAAA,KAAU,MAAA,GAAY,iBAAiB,KAAA,EAAO,KAAK,IAAI,CAAA,GAAI,CAAA;AAC9E,EAAA,MAAM,SAAS,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,UAAU,CAAA,GAAI,UAAA;AACpD,EAAA,MAAM,QAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,GAAS,MAAM,cAAA,IAAkB,CAAA;AAE9D,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,eAAe,OAAO,CAAA,EAAA,CAAA;AAAA,IACtB,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,GAAG,QAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,SAAS,CAAC,CAAA,QAAA,EACvF,IAAI,CAAA,UAAA,EAAa,MAAM,CAAA,gBAAA,EAAmB,KAAA,CAAM,iBAAiB,CAAA,WAAA;AAAA,GAC9E;AAEA,EAAA,MAAM,aAAa,cAAA,CAAe,QAAA,EAAU,QAAQ,KAAA,EAAO,KAAA,CAAM,gBAAgB,SAAS,CAAA;AAC1F,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,GAAA,CAAI,KAAK,UAAU,CAAA;AAAA,EACrB,CAAA,MAAO;AAGL,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,KAAK,WAAA,EAAY;AACtD,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,MAAA,GAAS,GAAG,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,SAAA,EAAY,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA,UAAA,EAClE,KAAA,CAAM,cAAA,GAAiB,CAAC,yBAAyB,SAAS,CAAA,4BAAA,CAAA;AAAA,MACvE,CAAA,SAAA,EAAY,SAAS,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA,KAAA,EAAQ,KAAA,GAAQ,MAAM,cAAA,GAAiB,CAAA,GAAI,MAAM,aAAA,GAAgB,CAAC,qCAC1E,KAAA,CAAM,aAAa,6BAA6B,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,KACtH;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,IAAA,MAAM,SAAS,MAAA,GAAS,UAAA;AACxB,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,YAAY,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,0BAAA,EAC1C,SAAS,KAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,KACnE;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,KAAK,CAAA,IAAA,CAAM,CAAA;AAEf,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,eAAA;AAAA,MACE,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA,GAAI,CAAA;AAAA,MACvD,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,GAAS,MAAM,WAAA,IAAe,CAAA;AAAA,MAC7C,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,cAAA,CAAe,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAC5E,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,sBAAA;AACvD,EAAA,MAAM,OAAA,GAAU,aAAa,MAAA,GAAS,GAAA;AACtC,EAAA,MAAM,kBAAA,GAAqB,EAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,cAAA;AAChC,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAG9C,EAAA,MAAM,GAAA,GAAM,iBAAiB,kBAAA,GAAqB,CAAA;AAClD,EAAA,MAAM,MAAA,GAAS,iBAAiB,kBAAA,GAAqB,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,QAAA;AACZ,EAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,CAAM,sBAAA;AAC/B,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,eAAe,OAAO,CAAA,EAAA,CAAA;AAAA,IACtB,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,cAAc,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,MAAM,yBACjD,KAAK,CAAA,uEAAA,CAAA;AAAA,IAC9B,CAAA,SAAA,EAAY,KAAA,GAAQ,KAAA,CAAM,oBAAoB,QAAQ,cAAA,GAAiB,KAAA,CAAM,QAAA,GAAW,CAAC,WAC9E,KAAK,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA,CAAA;AAAA,IAC3C,CAAA,IAAA;AAAA,GACF;AACF;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACvE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,WAAA,GAAcA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA,IAAK,EAAA;AACrE,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,aAAa,MAAA,GAAS,GAAA;AAEtC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,eAAe,OAAO,CAAA,EAAA,CAAA;AAAA,IACtB,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,aAAa,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,QAAA,EACvF,KAAA,CAAM,UAAU,aAAa,KAAA,CAAM,gBAAgB,CAAA,gBAAA,EAAmB,KAAA,CAAM,gBAAgB,CAAA,WAAA,CAAA;AAAA,IACvG,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,KAAA,CAAM,aAAa,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,QAAA,EAClF,KAAA,CAAM,gBAAgB,CAAA,EAAA,EAAK,UAAA,CAAW,WAAW,CAAC,CAAA,OAAA,CAAA;AAAA,IAC7D,CAAA,IAAA;AAAA,GACF;AACF;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACvE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,QAAQA,cAAAA,CAAc,IAAA,CAAK,YAAY,OAAO,CAAA,IAAK,KAAK,KAAA,IAAS,EAAA;AACvE,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,aAAa,MAAA,GAAS,GAAA;AACtC,EAAA,MAAM,WAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,MAAM,iBAAA,GAAoB,CAAA;AACjE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAEpC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,eAAe,OAAO,CAAA,EAAA,CAAA;AAAA,IACtB,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,aAAa,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,QAAA,EACvF,KAAA,CAAM,UAAU,aAAa,KAAA,CAAM,gBAAgB,CAAA,gBAAA,EAAmB,KAAA,CAAM,gBAAgB,CAAA,WAAA,CAAA;AAAA,IACvG,YAAY,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,aAAa,QAAQ,IAAA,GAAO,KAAA,CAAM,QAAA,GAAW,CAAC,WAAW,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA,CAAA;AAAA;AAAA,IAEzH,cAAc,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAC,CAAA,GAAA,EAAM,WAAW,EAAE,CAAA,CAAA,EAAI,OAAO,CAAC,CAAA,GAAA,EAAM,WAAW,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,CAAA,UAAA,EAAa,MAAM,iBAAiB,CAAA,IAAA,CAAA;AAAA,IACnI,CAAA,IAAA;AAAA,GACF;AACF;AAEA,SAAS,UAAA,CAAW,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACxE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,OAAO,KAAK,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAA,EAAI;AAC3E,EAAA,MAAM,QAAQE,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,KAAK,KAAA,CAAM,GAAA;AAC/D,EAAA,MAAM,KAAA,GAAQF,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AAEpD,EAAA,MAAM,SAAS,IAAA,CAAK,CAAA;AACpB,EAAA,MAAM,SAAS,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,GAAI,MAAM,iBAAA,GAAoB,CAAA;AACpE,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA;AACpB,EAAA,MAAM,MAAA,GAAS,SAAS,KAAA,GAAQ,KAAA,CAAM,QAAQ,KAAA,CAAM,GAAA,GAAM,MAAM,GAAA,CAAI,CAAA;AACpE,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,GAAS,MAAA;AACjC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAGtC,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,YAAY,IAAA,CAAK,CAAC,QAAQ,IAAA,CAAK,CAAA,GAAI,MAAM,QAAA,GAAW,GAAG,CAAA,aAAA,EACvC,KAAA,CAAM,aAAa,CAAA,QAAA,EAAW,KAAA,CAAM,cAAc,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,KAC1F;AAAA,EACF;AAGA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,MAAM,CAAA,KAAA,EAAQ,MAAM,YAAY,MAAM,CAAA,UAAA,EAAa,KAAA,CAAM,iBAAiB,WAC3E,KAAA,CAAM,gBAAgB,CAAA,MAAA,EAAS,KAAA,CAAM,oBAAoB,CAAC,CAAA,IAAA;AAAA,GACvE;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,MAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,SAAA,EAAY,SAAS,MAAM,CAAA,UAAA,EAAa,KAAA,CAAM,iBAAiB,WACpF,KAAA,CAAM,eAAe,CAAA,MAAA,EAAS,KAAA,CAAM,oBAAoB,CAAC,CAAA,IAAA;AAAA,GACtE;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,YAAA,EAAe,MAAM,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,EAAQ,KAAA,CAAM,iBAAiB,CAAA,QAAA,EACxD,KAAA,CAAM,gBAAgB,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,uBAAA;AAAA,GAChE;AACF;AAEA,SAAS,MAAA,CAAO,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACpE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAA;AAKxC,EAAA,MAAM,QAAA,GAAWA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AACtD,EAAA,IAAI,SAAS,IAAA,CAAK,CAAA;AAClB,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,MAAM,QAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,GAAS,MAAM,cAAA,IAAkB,CAAA;AAC9D,IAAA,MAAM,MAAA,GAAS,cAAA;AAAA,MACb,QAAA;AAAA,MACA,IAAA,CAAK,CAAA;AAAA,MACL,KAAA;AAAA,MACA,KAAA,CAAM,cAAA;AAAA,MACN,KAAA,CAAM;AAAA,KACR;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAM,SAAS,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,KAAK,WAAA,EAAY;AACtD,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,YAAY,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,SAAA,EAAY,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA,UAAA,EAClE,KAAA,CAAM,iBAAiB,CAAC,CAAA,sBAAA,EAAyB,MAAM,SAAS,CAAA,4BAAA,CAAA;AAAA,QAC7E,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,KAAA,CAAM,iBAAiB,CAAC,CAAA,KAAA,EAAQ,KAAA,GAAQ,KAAA,CAAM,cAAA,GAAiB,CAAA,GAAI,MAAM,aAAA,GAAgB,CAAC,CAAA,kCAAA,EAC1E,KAAA,CAAM,aAAa,CAAA,0BAAA,EAA6B,MAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,OAC5H;AAAA,IACF;AACA,IAAA,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,kBAAA;AAAA,EACjD;AAGA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,MAAM,CAAA,KAAA,EAAQ,QAAQ,CAAA,QAAA,EAAW,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GACzF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAK,CAAA,KAAA,EAAQ,QAAQ,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAA,EAAI,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GAC3G;AACF;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACvE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,KAAA,GAAQA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,IAAK,OAAA;AAGzD,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,QAAA,EACvF,KAAA,CAAM,aAAa,CAAA,UAAA,EAAa,KAAA,CAAM,gBAAgB,CAAA,gBAAA,EAAmB,KAAA,CAAM,gBAAgB,CAAA,oBAAA,EACnF,KAAA,CAAM,oBAAoB,CAAA,WAAA;AAAA,GACnD;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAa,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAK,SAAS,IAAA,CAAK,CAAA,GAAI,KAAK,MAAM,CAAA,UAAA,EAC9E,MAAM,gBAAgB,CAAA,qCAAA,CAAA;AAAA,IACnC,aAAa,IAAA,CAAK,CAAA,GAAI,KAAK,KAAK,CAAA,MAAA,EAAS,KAAK,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,CAAA,GAAI,KAAK,MAAM,CAAA,UAAA,EAC9E,MAAM,gBAAgB,CAAA,qCAAA;AAAA,GACrC;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,GAAW,CAAC,CAAA,kCAAA,EACnD,KAAA,CAAM,aAAa,CAAA,QAAA,EAAW,MAAM,cAAc,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,GAC/G;AACF;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,IAAA,GAAOA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA,IAAK,EAAA;AACvD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,CAAM,eAAA;AAE9B,EAAA,IAAI,IAAA,IAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzB,IAAA,MAAM,MAAA,GAAS,eAAe,IAAA,EAAM,IAAA,CAAK,GAAG,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACrE,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AACf,MAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAW,IAAA,IAAQ,GAAA;AACzB,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,UAAA,EAAa,KAAK,MAAA,GAAS,CAAC,yBACzE,KAAK,CAAA,4BAAA;AAAA,GAChC;AACA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY;AAC7C,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,kCAAA,EACnD,KAAA,CAAM,aAAa,WAAW,KAAK,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,GAChG;AACF;AAEA,SAAS,WAAA,CAAY,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACzE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAa,IAAA,CAAK,CAAC,CAAA,MAAA,EAAS,CAAC,SAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAK,SAAS,CAAC,CAAA,UAAA,EACtD,MAAM,YAAY,CAAA,gBAAA,EAAmB,MAAM,kBAAkB,CAAA,IAAA;AAAA,GAC5E;AACF;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAGtE,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC/C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,cAAc,KAAA,CAAM,eAAA;AAExB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAC5B,IAAA,MAAA,GAAS,UAAU,CAAA,CAAE,MAAA;AACrB,IAAA,IAAA,GAAO,CAAA,CAAE,IAAA;AACT,IAAA,SAAA,GAAY,CAAA,CAAE,IAAA;AACd,IAAA,SAAA,GAAY,CAAA,CAAE,KAAA;AACd,IAAA,IAAI,UAAU,QAAA,IAAY,KAAA,KAAU,eAAe,KAAA,KAAU,MAAA,IAAU,UAAU,OAAA,EAAS;AACxF,MAAA,WAAA,GAAc,KAAA,CAAM,qBAAA;AAAA,IACtB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,UAAU,KAAA,CAAM,eAAA;AACzB,IAAA,IAAA,GAAO,KAAA,CAAM,aAAA;AACb,IAAA,SAAA,GAAY,KAAA,CAAM,SAAA;AAAA,EACpB;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,GAAG,QAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,UAAA,EAAa,KAAK,MAAA,GAAS,CAAC,WACvF,IAAI,CAAA,UAAA,EAAa,MAAM,CAAA,gBAAA,EAAmB,WAAW,CAAA,WAAA;AAAA,GAClE;AAEA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,KAAA,CAAM,WAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,KAAA,CAAM,WAAA,GAAc,MAAM,QAAQ,CAAA,+BAAA,EACvD,MAAM,aAAa,CAAA,QAAA,EAAW,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,KACtG;AAAA,EACF;AAEA,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAA;AACX,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,MAAM,WAAA,GAAc,EAAA;AACrD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,WAAA;AAC1B,IAAA,MAAM,aAAa,cAAA,CAAe,SAAA,EAAW,EAAA,EAAI,EAAA,EAAI,IAAI,MAAM,CAAA;AAC/D,IAAA,IAAI,UAAA,EAAY,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAAA,EACrC;AAEA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,eAAA,CAAgB,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAE7E,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,CAAC,QAAQ,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,UAAA,EAAa,KAAK,MAAA,GAAS,CAAC,WACnF,KAAA,CAAM,aAAa,CAAA,UAAA,EAAa,KAAA,CAAM,gBAAgB,CAAA,4CAAA;AAAA,GACnE;AACA,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,YAAA,CAAa,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAC1E,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,QAAA,GAAWA,eAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA,IAAK,iBAAA,CAAkB,KAAK,IAAI,CAAA;AACtF,EAAA,MAAM,YAAY,KAAA,CAAM,eAAA;AACxB,EAAA,IAAI,QAAA,IAAY,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjC,IAAA,MAAM,MAAA,GAAS,cAAA;AAAA,MACb,QAAA;AAAA,MACA,IAAA,CAAK,CAAA;AAAA,MACL,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,GAAS,MAAM,mBAAA,IAAuB,CAAA;AAAA,MACrD,KAAA,CAAM,mBAAA;AAAA,MACN;AAAA,KACF;AACA,IAAA,IAAI,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EAC7B,CAAA,MAAO;AAEL,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,GAAG,QAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,mBAAA,IAAuB,IAAI,GAAG,CAAA,SAAA,EAChF,MAAM,mBAAA,GAAsB,CAAC,aAAa,KAAA,CAAM,mBAAA,GAAsB,CAAC,CAAA,sBAAA,EAC1D,SAAS,CAAA,4BAAA;AAAA,KACpC;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,CAAM,mBAAA,GAAsB,CAAA;AACnD,EAAA,MAAM,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AAC1D,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAY,KAAK,CAAA,KAAA,EAAQ,KAAK,CAAA,aAAA,EAAgB,MAAM,aAAa,CAAA,QAAA,EAAW,KAAA,CAAM,cAAc,KAC3F,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,kBAAA,EACZ,SAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,MAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAgB,KAAA,CAAM,QAAA,CAAS,QAAQ,KAAK,CAAA,aAAA,EAC3G,KAAA,CAAM,aAAa,6BAA6B,KAAA,CAAM,SAAS,KAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GAC5G;AACF;AAEA,SAAS,kBAAkB,IAAA,EAAkC;AAC3D,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AAE3B,EAAA,IAAI,6BAAA,CAA8B,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,SAAA;AACtD,EAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,UAAA;AAC/C,EAAA,IAAI,6BAAA,CAA8B,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,UAAA;AACtD,EAAA,IAAI,wCAAA,CAAyC,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,UAAA;AACjE,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,WAAA;AAC1C,EAAA,IAAI,uBAAA,CAAwB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,UAAA;AAChD,EAAA,IAAI,yBAAA,CAA0B,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,OAAA;AAClD,EAAA,IAAI,4BAAA,CAA6B,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,WAAA;AACrD,EAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,aAAA;AACjD,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,MAAA;AAC/B,EAAA,IAAI,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,QAAA;AACrC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAEvE,EAAA,KAAA,MAAW,KAAK,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,CAAA,EAAG,OAAO,GAAG,CAAA;AACvD;AAEA,SAAS,QAAA,CAAS,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACtE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC/C,EAAA,MAAM,aAAa,KAAA,CAAM,cAAA;AACzB,EAAA,MAAM,UAAA,GAAa,MAAA,KAAW,OAAA,GAAU,KAAA,CAAM,iBAAiB,KAAA,CAAM,SAAA,CAAA;AACrE,EAAA,MAAM,WAAA,GAAc,SAAS,KAAA,GAAQ,KAAA;AACrC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAA;AACxC,EAAA,MAAM,MAAA,GACJ,KAAK,KAAA,CAAM,MAAA,GAAS,MAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAgB,KAAA,CAAM,QAAA,CAAA;AAK5E,EAAA,MAAM,QAAA,GAAWA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,MAAM,aAAA,GAAgB,CAAA;AAC3C,EAAA,IAAI,QAAQ,IAAA,CAAK,CAAA;AACjB,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAA,CAAK,IAAA,CAAK,SAAS,YAAA,IAAgB,CAAA;AACtD,IAAA,MAAM,SAAS,cAAA,CAAe,QAAA,EAAU,KAAK,CAAA,EAAG,KAAA,EAAO,cAAc,UAAU,CAAA;AAC/E,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAM,SAAS,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,KAAK,WAAA,EAAY;AACtD,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,GAAG,QAAQ,KAAA,GAAQ,GAAG,CAAA,SAAA,EAAY,YAAA,GAAe,CAAC,CAAA,UAAA,EAC1D,YAAA,GAAe,CAAC,yBAAyB,UAAU,CAAA,4BAAA,CAAA;AAAA,QAChE,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,YAAA,GAAe,CAAC,CAAA,KAAA,EAAQ,KAAA,GAAQ,eAAe,CAAA,GAAI,KAAA,CAAM,gBAAgB,CAAC,CAAA,kCAAA,EAC1D,MAAM,aAAa,CAAA,0BAAA,EAA6B,UAAU,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,OACvH;AAAA,IACF;AACA,IAAA,KAAA,GAAQ,IAAA,CAAK,IAAI,YAAA,GAAe,CAAA;AAAA,EAClC;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAK,CAAA,KAAA,EAAQ,QAAQ,gBAAgB,KAAA,CAAM,aAAa,CAAA,6BAAA,EACpC,UAAU,KAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA,OAAA;AAAA,GACrF;AACA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,KAAA,GAAQ,MAAA,GAAS,CAAC,QAAQ,QAAQ,CAAA,eAAA,EAAkB,WAAW,CAAA,QAAA,EAAW,UAAU,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,OAAA;AAAA,GAC7H;AACF;AAEA,SAAS,YAAA,CAAa,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AAC1E,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,KAAA,GAAQA,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQE,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA,IAAK,CAAA;AACzD,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAGA,eAAc,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA,IAAK,GAAG,CAAA;AACpE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,GAAQ,GAAG,CAAA;AAEhC,EAAA,MAAM,IAAA,GAAO,UAAU,MAAA,GAAY,IAAA,CAAK,IAAI,KAAA,CAAM,aAAA,GAAgB,IAAI,IAAA,CAAK,CAAA;AAC3E,EAAA,MAAM,YAAY,KAAA,CAAM,cAAA;AAExB,EAAA,IAAI,UAAU,MAAA,EAAW;AAEvB,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,YAAY,IAAA,CAAK,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,KAAA,CAAM,aAAa,CAAA,aAAA,EACtC,KAAA,CAAM,aAAa,CAAA,QAAA,EAAW,KAAA,CAAM,cAAc,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,KAC1F;AACA,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA;AAC/B,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,YAAY,IAAA,CAAK,CAAA,GAAI,KAAK,KAAK,CAAA,KAAA,EAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,aAAa,CAAA,+BAAA,EACjC,KAAA,CAAM,aAAa,CAAA,0BAAA,EAA6B,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,KACzH;AAAA,EACF;AAGA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,EAAY,IAAA,CAAK,KAAK,CAAA,UAAA,EAAa,SAAS,CAAA,QAAA,EAC/D,KAAA,CAAM,gBAAgB,CAAA,MAAA,EAAS,YAAY,CAAC,CAAA,IAAA;AAAA,GACzD;AAEA,EAAA,MAAM,SAAA,GAAY,UAAU,KAAA,CAAM,eAAA;AAClC,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAa,SAAS,CAAA,QAAA,EACtE,SAAS,CAAA,MAAA,EAAS,YAAY,CAAC,CAAA,IAAA;AAAA,GAC5C;AACF;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,KAAA,EAAc,GAAA,EAAqB;AACvE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,QAAA,GAAWD,aAAAA,CAAa,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AACrD,EAAA,MAAM,IAAA,GACJ,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,QAAQ,QAAA,GAAW,KAAA;AACzD,EAAA,MAAM,KAAA,GAAQD,cAAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,UAAU,KAAA,CAAM,gBAAA;AAC/B,EAAA,MAAM,OAAO,KAAA,CAAM,aAAA;AAGnB,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,KAAA,EAAQ,KAAK,CAAA,GAAI,GAAG,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,GAAQ,CAAC,aAAa,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,QAAA,EACvF,IAAI,CAAA,UAAA,EAAa,MAAM,CAAA,gBAAA,EAAmB,KAAA,CAAM,gBAAgB,CAAA,oBAAA,EACpD,KAAA,CAAM,oBAAoB,CAAA,WAAA;AAAA,GACnD;AAGA,EAAA,MAAM,KAAA,GAAQ,EAAA;AACd,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,GAAI,KAAA;AACpB,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,GAAI,KAAA;AACpB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,KAAK,MAAA,GAAS,KAAA,GAAQ,KAAK,KAAA,KAAU,MAAA,GAAY,KAAA,CAAM,aAAA,GAAgB,CAAA,GAAI,CAAA,CAAA;AACtF,EAAA,MAAM,WAAA,GAAc,UAAU,KAAA,CAAM,cAAA;AAEpC,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,CAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAK,IAAA,EAAM,MAAM,GAAG,CAAA;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,EAAA,GAAK,EAAA,IAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,GAAA,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,IAAA,GAAO,IAAI,IAAA,GAAO,GAAA;AACtC,MAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACrB,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,CAAA,SAAA,EAAY,EAAE,CAAA,KAAA,EAAQ,EAAE,YAAY,IAAI,CAAA,UAAA,EAAa,EAAE,CAAA,QAAA,EAAW,WAAW,CAAA,mBAAA;AAAA,OAC/E;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAI;AAAA,MACf,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK;AAAA,MACnB,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,IAAA,EAAK;AAAA,MAClB,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAA,EAAI;AAAA,MAClB,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA;AAAI,KACjB;AACA,IAAA,MAAM,IAAA,GAAO,MAAA,CACV,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,CAAA,CAAE,IAAI,EAAE,CAAA,CAAE,CAAA,CACxE,IAAA,CAAK,GAAG,CAAA;AACX,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,IAAI,CAAA,sBAAA,EAAyB,WAAW,CAAA,sEAAA;AAAA,KACtD;AACA,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,CAAA,YAAA,EAAe,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,MAAA,EAAS,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,cAAA,EAAiB,WAAW,CAAA,IAAA;AAAA,OAChF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACrB,IAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACrB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA;AAC7B,IAAA,GAAA,CAAI,IAAA,CAAK,eAAe,EAAE,CAAA,MAAA,EAAS,EAAE,CAAA,KAAA,EAAQ,CAAC,CAAA,QAAA,EAAW,WAAW,CAAA,mBAAA,CAAqB,CAAA;AAEzF,IAAA,MAAM,IAAA,GAAO,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,CAAK,EAAA,GAAK,CAAA,GAAK,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,CAAC,CAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,CAAK,EAAA,GAAK,CAAA,GAAK,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,CAAC,CAAA;AAC/D,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,cAAc,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,IAAI,EAAA,GAAK,CAAC,MAAM,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,OAAA,EAAU,IAAI,IAAI,IAAI,CAAA,UAAA,EAC/D,MAAM,UAAU,CAAA,kBAAA;AAAA,KAC7B;AAAA,EACF;AAGA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,SAAA,EAAY,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAA,GAAI,IAAA,CAAK,SAAS,CAAC,CAAA,kCAAA,EAC9B,MAAM,aAAa,CAAA,QAAA,EAAW,MAAM,cAAc,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA,OAAA;AAAA,KAC/G;AAAA,EACF;AACF;AAYA,SAAS,SAAA,CAAU,OAA6B,KAAA,EAAsB;AACpE,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAA;AACtC,EAAA,MAAM,MAAA,GAASC,aAAAA,CAAa,KAAA,EAAO,QAAQ,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAOA,aAAAA,CAAa,KAAA,EAAO,MAAM,CAAA;AACvC,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AAE1C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,MAAA,KAAW,SAAS,UAAA,GAAa,KAAA;AAAA,OAAA,IAC5B,MAAA,KAAW,YAAY,UAAA,GAAa,KAAA;AAAA,OAAA,IACpC,MAAA,KAAW,QAAQ,UAAA,GAAa,KAAA;AAAA,OAAA,IAChC,MAAA,KAAW,WAAW,UAAA,GAAa,KAAA;AAAA,OAAA,IACnC,QAAQ,UAAA,GAAa,KAAA;AAE9B,EAAA,IAAI,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,UAAU,CAAA,CAAA,CAAG,CAAA;AAExD,EAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,QAAA,GAAW,KAAA,CAAM,aAAA;AAAA,OAAA,IAC9B,IAAA,KAAS,OAAA,EAAS,QAAA,GAAW,KAAA,CAAM,aAAA;AAC5C,EAAA,IAAI,aAAa,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,CAAG,CAAA;AAE3D,EAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,CAAqB,CAAA;AAK9C,EAAA,MAAM,IAAA,GAAO,WAAA,KAAgB,OAAA,GAAU,KAAA,CAAM,iBAAiB,KAAA,CAAM,SAAA,CAAA;AACpE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,CAAG,CAAA;AAE3B,EAAA,OAAO,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC7B;AAEA,SAAS,gBACP,CAAA,EACA,CAAA,EACA,IAAA,EACA,KAAA,EACA,KACA,MAAA,EACM;AACN,EAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AACtC,EAAA,MAAM,IAAI,KAAA,CAAM,WAAA;AAChB,EAAA,MAAM,IAAA,GAAO,UAAU,KAAA,CAAM,SAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,MAAA,GAAS,SAAA,GAAY,KAAA,CAAM,SAAA;AAC5C,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,CAAA,SAAA,EAAY,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,SAAA,EAAY,CAAC,CAAA,UAAA,EAAa,CAAC,CAAA,MAAA,EAAS,CAAA,GAAI,CAAC,CAAA,QAAA,EAAW,IAAI,CAAA,IAAA,CAAA;AAAA,IAC9E,YAAY,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,KAAA,EAAQ,CAAA,GAAI,IAAI,CAAA,GAAI,KAAA,CAAM,gBAAgB,CAAC,CAAA,kCAAA,EAC3B,MAAM,aAAa,CAAA,0BAAA,EAC7C,QAAQ,CAAA,EAAA,EAAK,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA;AAAA,GAC1C;AACF;AAEA,SAAS,SAAA,CAAU,OAA6B,KAAA,EAAkC;AAChF,EAAA,MAAM,CAAA,GAAIA,aAAAA,CAAa,KAAA,EAAO,QAAQ,CAAA;AACtC,EAAA,IAAI,CAAA,KAAM,QAAW,OAAO,MAAA;AAC5B,EAAA,OAAO,KAAA,CAAM,QAAQ,CAAe,CAAA;AACtC;AAEA,SAAS,SAAS,KAAA,EAAoD;AACpE,EAAA,MAAM,CAAA,GAAIA,aAAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AACrC,EAAA,IAAI,CAAA,KAAM,QAAW,OAAO,MAAA;AAC5B,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,MAAc,KAAA,EAAsB;AAC5D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAgB,KAAA,CAAM,QAAA,CAAA;AACpE,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,KAAA,GAAQ,KAAA,CAAM,aAAA,GAAgB,CAAA;AACrD;AAMA,SAAS,OAAA,CAAQ,OAA6B,IAAA,EAAuB;AACnE,EAAA,OAAO,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,MAAA,IAAW,CAAA,CAAoB,IAAA,KAAS,IAAI,CAAA;AAClF;AAEA,SAASE,QAAAA,CAAQ,OAA6B,GAAA,EAAyC;AACrF,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAW,CAAA,CAAoB,QAAQ,GAAA,EAAK;AACzD,MAAA,OAAQ,CAAA,CAAoB,KAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAASH,cAAAA,CAAc,OAA6B,GAAA,EAAiC;AACnF,EAAA,MAAM,CAAA,GAAIG,QAAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,KAAS,QAAA,GAAW,CAAA,CAAE,KAAA,GAAQ,MAAA;AAC1C;AAEA,SAASD,cAAAA,CAAc,OAA6B,GAAA,EAAiC;AACnF,EAAA,MAAM,CAAA,GAAIC,QAAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,KAAS,QAAA,GAAW,CAAA,CAAE,KAAA,GAAQ,MAAA;AAC1C;AAEA,SAASF,aAAAA,CAAa,OAA6B,GAAA,EAAiC;AAClF,EAAA,MAAM,CAAA,GAAIE,QAAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,KAAS,YAAA,GAAe,CAAA,CAAE,KAAA,GAAQ,MAAA;AAC9C;AAEA,SAAS,YAAA,CACP,OACA,GAAA,EAC0C;AAC1C,EAAA,MAAM,CAAA,GAAIA,QAAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,KAAS,OAAA,GAAU,EAAE,GAAA,EAAK,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI,GAAI,MAAA;AAC5D;AAEA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,CAAA;AAChC,EAAA,IAAI,CAAA,GAAI,GAAG,OAAO,CAAA;AAClB,EAAA,IAAI,CAAA,GAAI,GAAG,OAAO,CAAA;AAClB,EAAA,OAAO,CAAA;AACT;AAMA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AACzB;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AACzB;;;ACz3DO,SAAS,eAAA,CACd,MAAA,EACA,OAAA,GAAkC,EAAC,EAC3B;AACR,EAAA,MAAM,GAAA,GAAM,MAAM,MAAM,CAAA;AACxB,EAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACb,IAAA,OAAO,QAAA,EAAS;AAAA,EAClB;AACA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,IAAS,SAAA,EAAU,CAAE,KAAA;AAC/C,EAAA,MAAM,KAAA,GAAe,SAAS,SAAS,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,EAAK,KAAK,CAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,QAAQ,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAG,GAAI,EAAC;AAClE,EAAA,OAAO,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AACtC;AAEA,SAAS,QAAA,GAAmB;AAC1B,EAAA,OAAO,qEAAA;AACT;;;ACIO,SAAS,WAAW,MAAA,EAAuC;AAChE,EAAA,WAAA,CAAY,MAAM,CAAA;AACpB;AAMO,SAASC,OAAM,MAAA,EAA0B;AAC9C,EAAA,OAAO,MAAY,MAAM,CAAA;AAC3B;AAQO,SAASC,WAAU,GAAA,EAAuB;AAC/C,EAAA,OAAO,UAAa,GAAG,CAAA;AACzB;AAYA,eAAsB,MAAA,CACpB,EAAA,EACA,MAAA,EACA,OAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAqD,EAAE,EAAA,EAAG;AAChE,EAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,MAAA,EAAQ,MAAM,CAAA;AAC1C,EAAA,OAAO,EAAE,GAAA,EAAI;AACf;AAEA,IAAM,WAAW,EAAE,UAAA,EAAY,OAAAD,MAAAA,EAAO,SAAA,EAAAC,YAAW,MAAA,EAAO;AACxD,IAAO,aAAA,GAAQ","file":"index.cjs","sourcesContent":["export type WireloomTheme = 'default' | 'dark';\nexport type WireloomSecurityLevel = 'strict' | 'loose';\n\nexport interface WireloomConfig {\n  theme: WireloomTheme;\n  securityLevel: WireloomSecurityLevel;\n}\n\nconst DEFAULT_CONFIG: Readonly<WireloomConfig> = Object.freeze({\n  theme: 'default',\n  securityLevel: 'strict',\n});\n\nlet currentConfig: WireloomConfig = { ...DEFAULT_CONFIG };\n\nexport function mergeConfig(partial: Partial<WireloomConfig>): void {\n  currentConfig = { ...currentConfig, ...partial };\n}\n\nexport function getConfig(): WireloomConfig {\n  return { ...currentConfig };\n}\n\nexport function resetConfig(): void {\n  currentConfig = { ...DEFAULT_CONFIG };\n}\n","/**\n * Parse-time errors. All user-facing errors from the lexer and parser\n * go through this class so they carry precise line/column information\n * and a consistent message format.\n */\n\nexport class WireloomError extends Error {\n  readonly line: number;\n  readonly column: number;\n\n  constructor(message: string, line: number, column: number) {\n    super(`Line ${line}, col ${column}: ${message}`);\n    this.name = 'WireloomError';\n    this.line = line;\n    this.column = column;\n  }\n}\n","/**\n * Wireloom lexer.\n *\n * Converts a source string into a token stream including synthetic\n * INDENT/DEDENT markers that let the parser handle indentation\n * structurally instead of counting spaces on every line.\n */\n\nimport { WireloomError } from './errors.js';\nimport type { LengthUnit } from './ast.js';\n\nexport type TokenKind =\n  | 'ident'\n  | 'string'\n  | 'number'\n  | 'range'\n  | 'equals'\n  | 'colon'\n  | 'newline'\n  | 'indent'\n  | 'dedent'\n  | 'eof';\n\nexport interface Token {\n  kind: TokenKind;\n  /** Raw source text this token was produced from (for error messages). */\n  raw: string;\n  /** For `string` tokens, the unescaped string value. */\n  stringValue?: string;\n  /** For `number` tokens, the parsed numeric value. */\n  numericValue?: number;\n  /** For `number` tokens, the unit suffix (`px` by default). */\n  unit?: LengthUnit;\n  /** For `range` tokens, the minimum bound. */\n  rangeMin?: number;\n  /** For `range` tokens, the maximum bound. */\n  rangeMax?: number;\n  /** For `ident` tokens, the identifier text. */\n  identValue?: string;\n  line: number;\n  column: number;\n}\n\nconst ALLOWED_INDENT_SIZES = [2, 4] as const;\n\nexport function tokenize(source: string): Token[] {\n  const tokens: Token[] = [];\n  // Normalize line endings.\n  const src = source.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n  const lines = src.split('\\n');\n  const indentStack: number[] = [0];\n  // The file's indent unit is detected on the first indented line (must be\n  // 2 or 4 spaces). All subsequent lines must use multiples of this unit.\n  let indentUnit: number | null = null;\n\n  for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n    const rawLine = lines[lineIdx] ?? '';\n    const lineNo = lineIdx + 1;\n\n    // Detect tab in leading whitespace — forbidden.\n    const leadingWhitespace = /^[ \\t]*/.exec(rawLine)?.[0] ?? '';\n    if (leadingWhitespace.includes('\\t')) {\n      const tabColumn = leadingWhitespace.indexOf('\\t') + 1;\n      throw new WireloomError(\n        'tab in indentation (use 2 or 4 spaces, not tabs)',\n        lineNo,\n        tabColumn,\n      );\n    }\n\n    // A line consisting only of whitespace, or only a comment after whitespace,\n    // is a \"logical blank\" and does not participate in indentation tracking.\n    const trimmed = rawLine.trim();\n    if (trimmed === '' || trimmed.startsWith('#')) {\n      continue;\n    }\n\n    const indentSpaces = leadingWhitespace.length;\n\n    // Detect the file's indent unit on the first indented line.\n    if (indentUnit === null && indentSpaces > 0) {\n      if (!ALLOWED_INDENT_SIZES.includes(indentSpaces as 2 | 4)) {\n        throw new WireloomError(\n          `first indented line uses ${indentSpaces} spaces; Wireloom accepts 2 or 4 spaces per level (pick one and use it consistently)`,\n          lineNo,\n          1,\n        );\n      }\n      indentUnit = indentSpaces;\n    }\n\n    const unit = indentUnit ?? 2;\n\n    if (indentSpaces % unit !== 0) {\n      throw new WireloomError(\n        `indentation of ${indentSpaces} spaces is not a multiple of ${unit} (this file uses ${unit}-space indentation)`,\n        lineNo,\n        1,\n      );\n    }\n\n    const currentLevel = indentStack[indentStack.length - 1] ?? 0;\n\n    if (indentSpaces > currentLevel) {\n      if (indentSpaces - currentLevel !== unit) {\n        throw new WireloomError(\n          `indentation jumped ${indentSpaces - currentLevel} spaces (only one level of ${unit} at a time is allowed)`,\n          lineNo,\n          1,\n        );\n      }\n      indentStack.push(indentSpaces);\n      tokens.push({\n        kind: 'indent',\n        raw: ' '.repeat(unit),\n        line: lineNo,\n        column: 1,\n      });\n    } else if (indentSpaces < currentLevel) {\n      while ((indentStack[indentStack.length - 1] ?? 0) > indentSpaces) {\n        indentStack.pop();\n        tokens.push({\n          kind: 'dedent',\n          raw: '',\n          line: lineNo,\n          column: 1,\n        });\n      }\n      const backTo = indentStack[indentStack.length - 1] ?? 0;\n      if (backTo !== indentSpaces) {\n        throw new WireloomError(\n          `indentation does not match any outer level (found ${indentSpaces}, open levels: ${indentStack.join(', ')})`,\n          lineNo,\n          1,\n        );\n      }\n    }\n\n    // Tokenize the line content after leading whitespace.\n    tokenizeLineContent(rawLine, indentSpaces, lineNo, tokens);\n    tokens.push({\n      kind: 'newline',\n      raw: '\\n',\n      line: lineNo,\n      column: rawLine.length + 1,\n    });\n  }\n\n  // Emit DEDENTs for any remaining open levels.\n  while (indentStack.length > 1) {\n    indentStack.pop();\n    tokens.push({\n      kind: 'dedent',\n      raw: '',\n      line: lines.length + 1,\n      column: 1,\n    });\n  }\n\n  tokens.push({\n    kind: 'eof',\n    raw: '',\n    line: lines.length + 1,\n    column: 1,\n  });\n  return tokens;\n}\n\nfunction tokenizeLineContent(\n  rawLine: string,\n  startColumn0: number,\n  lineNo: number,\n  tokens: Token[],\n): void {\n  let col = startColumn0;\n  const end = rawLine.length;\n\n  while (col < end) {\n    const ch = rawLine[col];\n\n    // Whitespace between tokens.\n    if (ch === ' ') {\n      col++;\n      continue;\n    }\n\n    // Inline comment — terminates the line.\n    if (ch === '#') {\n      return;\n    }\n\n    // String literal.\n    if (ch === '\"') {\n      const start = col;\n      let value = '';\n      col++; // consume opening quote\n      while (col < end) {\n        const c = rawLine[col];\n        if (c === '\"') {\n          col++;\n          tokens.push({\n            kind: 'string',\n            raw: rawLine.slice(start, col),\n            stringValue: value,\n            line: lineNo,\n            column: start + 1,\n          });\n          break;\n        }\n        if (c === '\\\\') {\n          const next = rawLine[col + 1];\n          if (next === '\"') {\n            value += '\"';\n            col += 2;\n            continue;\n          }\n          if (next === '\\\\') {\n            value += '\\\\';\n            col += 2;\n            continue;\n          }\n          if (next === 'n') {\n            value += '\\n';\n            col += 2;\n            continue;\n          }\n          throw new WireloomError(\n            `invalid escape sequence \"\\\\${next ?? ''}\" (supported: \\\\\", \\\\\\\\, \\\\n)`,\n            lineNo,\n            col + 1,\n          );\n        }\n        value += c;\n        col++;\n      }\n      if (col > end || rawLine[col - 1] !== '\"') {\n        throw new WireloomError(\n          'unterminated string literal',\n          lineNo,\n          start + 1,\n        );\n      }\n      continue;\n    }\n\n    // Number or range literal.\n    if (ch !== undefined && /[0-9]/.test(ch)) {\n      const start = col;\n      while (col < end && /[0-9]/.test(rawLine[col] ?? '')) {\n        col++;\n      }\n      const digits = rawLine.slice(start, col);\n\n      // Check for range form: digits \"-\" digits (no whitespace).\n      // A range is unambiguous here: `-` can't start an identifier (idents start\n      // with a letter/underscore), and negative numbers aren't in the grammar.\n      if (rawLine[col] === '-' && /[0-9]/.test(rawLine[col + 1] ?? '')) {\n        col++; // consume \"-\"\n        const maxStart = col;\n        while (col < end && /[0-9]/.test(rawLine[col] ?? '')) {\n          col++;\n        }\n        const maxDigits = rawLine.slice(maxStart, col);\n        tokens.push({\n          kind: 'range',\n          raw: rawLine.slice(start, col),\n          rangeMin: Number.parseInt(digits, 10),\n          rangeMax: Number.parseInt(maxDigits, 10),\n          line: lineNo,\n          column: start + 1,\n        });\n        continue;\n      }\n\n      let unit: LengthUnit = 'px';\n      if (rawLine.slice(col, col + 2) === 'px') {\n        unit = 'px';\n        col += 2;\n      } else if (rawLine[col] === '%') {\n        unit = 'percent';\n        col += 1;\n      } else if (rawLine.slice(col, col + 2) === 'fr') {\n        unit = 'fr';\n        col += 2;\n      }\n      tokens.push({\n        kind: 'number',\n        raw: rawLine.slice(start, col),\n        numericValue: Number.parseInt(digits, 10),\n        unit,\n        line: lineNo,\n        column: start + 1,\n      });\n      continue;\n    }\n\n    // `=`\n    if (ch === '=') {\n      tokens.push({\n        kind: 'equals',\n        raw: '=',\n        line: lineNo,\n        column: col + 1,\n      });\n      col++;\n      continue;\n    }\n\n    // `:`\n    if (ch === ':') {\n      tokens.push({\n        kind: 'colon',\n        raw: ':',\n        line: lineNo,\n        column: col + 1,\n      });\n      col++;\n      continue;\n    }\n\n    // Identifier.\n    if (ch !== undefined && /[a-zA-Z_]/.test(ch)) {\n      const start = col;\n      while (\n        col < end &&\n        /[a-zA-Z0-9_-]/.test(rawLine[col] ?? '')\n      ) {\n        col++;\n      }\n      const ident = rawLine.slice(start, col);\n      tokens.push({\n        kind: 'ident',\n        raw: ident,\n        identValue: ident,\n        line: lineNo,\n        column: start + 1,\n      });\n      continue;\n    }\n\n    throw new WireloomError(\n      `unexpected character \"${ch}\"`,\n      lineNo,\n      col + 1,\n    );\n  }\n}\n","/**\n * Wireloom parser — recursive-descent, token-driven.\n *\n * Consumes a tokenized source stream and produces a {@link Document}\n * conforming to ast.ts. Errors are always {@link WireloomError} with\n * line/column information.\n */\n\nimport type {\n  AnnotationNode,\n  AnnotationSide,\n  Attribute,\n  AttributePair,\n  AttributeValue,\n  AvatarNode,\n  BackButtonNode,\n  BreadcrumbNode,\n  ButtonNode,\n  CellNode,\n  TabBarNode,\n  TabItemNode,\n  ChartNode,\n  CheckboxNode,\n  ChipNode,\n  ColNode,\n  ColWidth,\n  ComboNode,\n  ContainerChild,\n  CrumbNode,\n  DividerNode,\n  Document,\n  FooterNode,\n  GridNode,\n  HeaderNode,\n  IconNode,\n  ImageNode,\n  InputNode,\n  ItemNode,\n  KvNode,\n  ListNode,\n  MenubarNode,\n  MenuChild,\n  MenuItemNode,\n  MenuNode,\n  NavbarNode,\n  NavbarSlotNode,\n  PanelNode,\n  ProgressNode,\n  RadioNode,\n  ResourceBarNode,\n  ResourceNode,\n  RowNode,\n  SectionNode,\n  SegmentedNode,\n  SegmentNode,\n  SeparatorNode,\n  SheetNode,\n  SheetPlacement,\n  SliderNode,\n  SlotFooterNode,\n  SlotNode,\n  SourcePosition,\n  SpacerNode,\n  SpinnerNode,\n  StatNode,\n  StatsNode,\n  StatusNode,\n  TabNode,\n  TabsNode,\n  TextNode,\n  ToggleNode,\n  TreeNode_,\n  TreeItemNode,\n  WindowChild,\n  WindowNode,\n} from './ast.js';\nimport { WireloomError } from './errors.js';\nimport { tokenize, type Token, type TokenKind } from './lexer.js';\n\n// ---------------------------------------------------------------------------\n// Attribute rule system\n// ---------------------------------------------------------------------------\n\ntype AttrSpec =\n  | { kind: 'string' }\n  | { kind: 'number' }\n  | { kind: 'range' }\n  | { kind: 'ident' }\n  | { kind: 'enum'; values: readonly string[] };\n\ninterface AttrRules {\n  attrs: Record<string, AttrSpec>;\n  flags: string[];\n}\n\nconst WEIGHT_VALUES = ['light', 'regular', 'semibold', 'bold'] as const;\nconst SIZE_VALUES = ['small', 'regular', 'large'] as const;\nconst ALIGN_VALUES = ['left', 'center', 'right'] as const;\nconst JUSTIFY_VALUES = ['start', 'between', 'around', 'end'] as const;\nconst INPUT_TYPE_VALUES = ['text', 'password', 'email', 'search'] as const;\nconst ACCENT_VALUES = [\n  'research',\n  'military',\n  'industry',\n  'wealth',\n  'approval',\n  'warning',\n  'danger',\n  'success',\n] as const;\n/**\n * Unified state enum for slots and cells. Covers tier/lifecycle UIs —\n * e.g. Matrix sectors (locked/available/purchased/maxed) and Oligarchy\n * investments (growing/ripe/withering/cashed). Kept as a single enum so\n * authors don't have to remember which states apply to which primitive.\n */\nconst STATE_VALUES = [\n  'locked',\n  'available',\n  'active',\n  'purchased',\n  'maxed',\n  'growing',\n  'ripe',\n  'withering',\n  'cashed',\n] as const;\nconst CHART_KIND_VALUES = ['bar', 'line', 'pie'] as const;\nconst ANNOTATION_SIDE_VALUES = ['left', 'right', 'top', 'bottom'] as const;\nconst AVATAR_SIZE_VALUES = ['small', 'medium', 'large'] as const;\nconst STATUS_KIND_VALUES = ['success', 'info', 'warning', 'error'] as const;\nconst SHEET_POSITION_VALUES = ['bottom', 'center'] as const;\n\n/** Spec for the universal `id=\"…\"` attribute, accepted on every primitive. */\nconst UNIVERSAL_ID_SPEC: AttrSpec = { kind: 'string' };\n\nconst ATTR_RULES: Record<string, AttrRules> = {\n  window: { attrs: {}, flags: [] },\n  header: { attrs: {}, flags: ['large'] },\n  footer: { attrs: {}, flags: [] },\n  navbar: { attrs: {}, flags: [] },\n  leading: { attrs: {}, flags: [] },\n  center: { attrs: {}, flags: [] },\n  trailing: { attrs: {}, flags: [] },\n  sheet: {\n    attrs: {\n      position: { kind: 'enum', values: SHEET_POSITION_VALUES },\n      title: { kind: 'string' },\n    },\n    flags: [],\n  },\n  panel: { attrs: {}, flags: [] },\n  section: {\n    attrs: {\n      badge: { kind: 'string' },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: [],\n  },\n  tabs: { attrs: {}, flags: [] },\n  tab: {\n    attrs: { badge: { kind: 'string' } },\n    flags: ['active'],\n  },\n  tabbar: { attrs: {}, flags: [] },\n  tabitem: {\n    attrs: {\n      icon: { kind: 'string' },\n      badge: { kind: 'string' },\n    },\n    flags: ['selected', 'disabled'],\n  },\n  row: {\n    attrs: {\n      align: { kind: 'enum', values: ALIGN_VALUES },\n      justify: { kind: 'enum', values: JUSTIFY_VALUES },\n    },\n    flags: [],\n  },\n  spacer: { attrs: {}, flags: [] },\n  col: {\n    attrs: {\n      justify: { kind: 'enum', values: JUSTIFY_VALUES },\n    },\n    flags: [],\n  },\n  list: { attrs: {}, flags: [] },\n  item: { attrs: {}, flags: ['chevron'] },\n  slot: {\n    attrs: {\n      state: { kind: 'enum', values: STATE_VALUES },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: ['active', 'chevron'],\n  },\n  slotFooter: { attrs: {}, flags: [] },\n  grid: {\n    attrs: {\n      cols: { kind: 'number' },\n      rows: { kind: 'number' },\n    },\n    flags: [],\n  },\n  cell: {\n    attrs: {\n      row: { kind: 'number' },\n      col: { kind: 'number' },\n      state: { kind: 'enum', values: STATE_VALUES },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: [],\n  },\n  resourcebar: { attrs: {}, flags: [] },\n  resource: {\n    attrs: {\n      name: { kind: 'string' },\n      value: { kind: 'string' },\n      icon: { kind: 'string' },\n    },\n    flags: [],\n  },\n  stats: { attrs: {}, flags: [] },\n  stat: {\n    attrs: {\n      icon: { kind: 'string' },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: ['bold', 'muted'],\n  },\n  text: {\n    attrs: {\n      weight: { kind: 'enum', values: WEIGHT_VALUES },\n      size: { kind: 'enum', values: SIZE_VALUES },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: ['bold', 'italic', 'muted'],\n  },\n  button: {\n    attrs: {\n      badge: { kind: 'string' },\n      icon: { kind: 'string' },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: ['primary', 'disabled'],\n  },\n  backbutton: {\n    attrs: {},\n    flags: ['disabled'],\n  },\n  input: {\n    attrs: {\n      placeholder: { kind: 'string' },\n      type: { kind: 'enum', values: INPUT_TYPE_VALUES },\n    },\n    flags: ['disabled'],\n  },\n  combo: {\n    attrs: {\n      value: { kind: 'string' },\n      options: { kind: 'string' },\n    },\n    flags: ['disabled'],\n  },\n  slider: {\n    attrs: {\n      range: { kind: 'range' },\n      value: { kind: 'number' },\n      label: { kind: 'string' },\n    },\n    flags: ['disabled'],\n  },\n  kv: {\n    attrs: {\n      weight: { kind: 'enum', values: WEIGHT_VALUES },\n      size: { kind: 'enum', values: SIZE_VALUES },\n      icon: { kind: 'string' },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: ['bold', 'italic', 'muted'],\n  },\n  image: {\n    attrs: {\n      label: { kind: 'string' },\n      width: { kind: 'number' },\n      height: { kind: 'number' },\n    },\n    flags: [],\n  },\n  icon: {\n    attrs: {\n      name: { kind: 'string' },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: [],\n  },\n  divider: { attrs: {}, flags: [] },\n  progress: {\n    attrs: {\n      value: { kind: 'number' },\n      max: { kind: 'number' },\n      label: { kind: 'string' },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: [],\n  },\n  chart: {\n    attrs: {\n      kind: { kind: 'enum', values: CHART_KIND_VALUES },\n      label: { kind: 'string' },\n      width: { kind: 'number' },\n      height: { kind: 'number' },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: [],\n  },\n  annotation: {\n    attrs: {\n      target: { kind: 'string' },\n      position: { kind: 'enum', values: ANNOTATION_SIDE_VALUES },\n    },\n    flags: [],\n  },\n  tree: { attrs: {}, flags: [] },\n  treeNode: {\n    attrs: { icon: { kind: 'string' } },\n    flags: ['collapsed', 'selected'],\n  },\n  checkbox: {\n    attrs: {},\n    flags: ['checked', 'disabled', 'label-right'],\n  },\n  radio: {\n    attrs: { group: { kind: 'string' } },\n    flags: ['selected', 'disabled', 'label-right'],\n  },\n  toggle: {\n    attrs: {},\n    flags: ['on', 'off', 'disabled', 'label-right'],\n  },\n  menubar: { attrs: {}, flags: [] },\n  menu: { attrs: {}, flags: [] },\n  menuitem: {\n    attrs: { shortcut: { kind: 'string' } },\n    flags: ['disabled'],\n  },\n  separator: { attrs: {}, flags: [] },\n  chip: {\n    attrs: {\n      icon: { kind: 'string' },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: ['closable', 'selected'],\n  },\n  avatar: {\n    attrs: {\n      size: { kind: 'enum', values: AVATAR_SIZE_VALUES },\n      accent: { kind: 'enum', values: ACCENT_VALUES },\n    },\n    flags: [],\n  },\n  breadcrumb: { attrs: {}, flags: [] },\n  crumb: {\n    attrs: { icon: { kind: 'string' } },\n    flags: [],\n  },\n  spinner: { attrs: {}, flags: [] },\n  status: {\n    attrs: {\n      kind: { kind: 'enum', values: STATUS_KIND_VALUES },\n    },\n    flags: [],\n  },\n  segmented: { attrs: {}, flags: [] },\n  segment: {\n    attrs: {},\n    flags: ['selected', 'disabled'],\n  },\n};\n\nconst VALID_PRIMITIVES = new Set([\n  ...Object.keys(ATTR_RULES).filter((k) => k !== 'treeNode' && k !== 'slotFooter'),\n  'node',\n]);\n\n/** Primitives allowed as direct children of a general container (panel/section/row/col/slot/header/footer). */\nconst CONTAINER_CHILD_PRIMITIVES = new Set([\n  'panel',\n  'section',\n  'tabs',\n  'row',\n  'col',\n  'list',\n  'slot',\n  'grid',\n  'resourcebar',\n  'stats',\n  'text',\n  'button',\n  'backbutton',\n  'input',\n  'combo',\n  'slider',\n  'kv',\n  'image',\n  'icon',\n  'divider',\n  'progress',\n  'chart',\n  'tree',\n  'menubar',\n  'menu',\n  'breadcrumb',\n  'checkbox',\n  'radio',\n  'toggle',\n  'chip',\n  'avatar',\n  'spinner',\n  'status',\n  'segmented',\n]);\n\nconst LIST_CHILD_PRIMITIVES = new Set(['item', 'slot']);\n\nconst PRIMITIVE_LIST_HUMAN =\n  'window, header, footer, navbar, leading, center, trailing, tabbar, tabitem, sheet, panel, section, tabs, tab, row, col, list, item, slot, segmented, segment, grid, cell, resourcebar, resource, stats, stat, text, button, backbutton, input, combo, slider, kv, image, icon, divider, spacer, progress, chart, tree, node, menubar, menu, menuitem, separator, chip, avatar, breadcrumb, crumb, spinner, status';\n\n// ---------------------------------------------------------------------------\n// Public entry point\n// ---------------------------------------------------------------------------\n\nexport function parse(source: string): Document {\n  const tokens = tokenize(source);\n  const lines = source.split(/\\r\\n|\\r|\\n/).length;\n  const parser = new Parser(tokens);\n  return parser.parseDocument(lines);\n}\n\nclass Parser {\n  private readonly tokens: Token[];\n  private pos = 0;\n\n  constructor(tokens: Token[]) {\n    this.tokens = tokens;\n  }\n\n  parseDocument(sourceLines: number): Document {\n    if (this.peek().kind === 'eof') {\n      return { kind: 'document', sourceLines };\n    }\n\n    const head = this.peek();\n    if (head.kind !== 'ident') {\n      throw new WireloomError(\n        `expected root \"window\" node, got ${describeToken(head)}`,\n        head.line,\n        head.column,\n      );\n    }\n    if (head.identValue !== 'window') {\n      throw new WireloomError(\n        `root node must be \"window\", got \"${head.identValue ?? head.raw}\"`,\n        head.line,\n        head.column,\n      );\n    }\n\n    const root = this.parseWindow();\n\n    // After the window, any number of annotations may follow as siblings.\n    const annotations: AnnotationNode[] = [];\n    while (this.peek().kind === 'ident') {\n      const tok = this.peek();\n      const name = tok.identValue ?? tok.raw;\n      if (name === 'annotation') {\n        annotations.push(this.parseAnnotation());\n        continue;\n      }\n      if (name === 'window') {\n        throw new WireloomError(\n          'only one root \"window\" node is allowed',\n          tok.line,\n          tok.column,\n        );\n      }\n      throw new WireloomError(\n        `unexpected \"${name}\" after \"window\" — only \"annotation\" may follow`,\n        tok.line,\n        tok.column,\n      );\n    }\n\n    if (this.peek().kind !== 'eof') {\n      const extra = this.peek();\n      throw new WireloomError(\n        'only one root \"window\" node is allowed',\n        extra.line,\n        extra.column,\n      );\n    }\n\n    const doc: Document = { kind: 'document', root, sourceLines };\n    if (annotations.length > 0) doc.annotations = annotations;\n    return doc;\n  }\n\n  // --- Annotation -----------------------------------------------------------\n\n  private parseAnnotation(): AnnotationNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const body = this.expectKind(\n      'string',\n      '\"annotation\" requires a label string (e.g., annotation \"Power Button\" target=\"power-btn\" position=right)',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('annotation');\n    this.parseLeafTerminator('annotation', head);\n\n    const target = getAttrStringValue(attributes, 'target');\n    if (target === undefined || target === '') {\n      throw new WireloomError(\n        '\"annotation\" requires target=\"…\" referencing an id in the window (e.g., annotation \"Power\" target=\"power-btn\" position=right)',\n        head.line,\n        head.column,\n      );\n    }\n    const sideRaw = getAttrIdentValue(attributes, 'position');\n    if (sideRaw === undefined) {\n      throw new WireloomError(\n        '\"annotation\" requires position=left|right|top|bottom (explicit placement — no default)',\n        head.line,\n        head.column,\n      );\n    }\n    const side = sideRaw as AnnotationSide;\n\n    return { kind: 'annotation', target, side, body, attributes, position };\n  }\n\n  // --- Window ---------------------------------------------------------------\n\n  private parseWindow(): WindowNode {\n    const head = this.consume();\n    const position = positionOf(head);\n\n    let title: string | undefined;\n    if (this.peek().kind === 'string') {\n      title = this.consume().stringValue;\n    }\n\n    const attributes = this.parseAttributes('window');\n    const hasChildren = this.parseTerminator('window', head);\n    const children: WindowChild[] = hasChildren ? this.parseWindowChildren() : [];\n\n    // Mobile chrome bands are mutually exclusive — a window should pick either\n    // a docked tab bar or a footer, not both. Reporting the error on the\n    // second-declared one gives a more useful source location than reporting\n    // on `window` itself.\n    const tabbar = children.find((c) => c.kind === 'tabbar');\n    const footer = children.find((c) => c.kind === 'footer');\n    if (tabbar && footer) {\n      const later = tabbar.position.line > footer.position.line ? tabbar : footer;\n      throw new WireloomError(\n        '\"tabbar\" and \"footer\" are mutually exclusive in the same window — use one or the other',\n        later.position.line,\n        later.position.column,\n      );\n    }\n\n    const node: WindowNode = { kind: 'window', attributes, children, position };\n    if (title !== undefined) {\n      node.title = title;\n    }\n    return node;\n  }\n\n  private parseWindowChildren(): WindowChild[] {\n    const children: WindowChild[] = [];\n    let navbarSeen: WindowChild | undefined;\n    let headerSeen: WindowChild | undefined;\n    let footerSeen: FooterNode | undefined;\n    let sawSheet = false;\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      // Capture the source position of the next primitive *before* parsing\n      // it, so conflict errors (navbar/header, second sheet) point at the\n      // offending keyword rather than wherever the parser advanced to.\n      const head = this.peek();\n      const name = head.kind === 'ident' ? head.identValue ?? head.raw : '';\n      if (name === 'sheet' && sawSheet) {\n        throw new WireloomError(\n          'only one \"sheet\" is allowed per \"window\"',\n          head.line,\n          head.column,\n        );\n      }\n      if (name === 'panel') {\n        const { panel, footer } = this.parseTopLevelPanel();\n        children.push(panel);\n        if (footer) {\n          if (footerSeen) {\n            throw new WireloomError(\n              'a \"window\" may contain at most one \"footer\" block',\n              footer.position.line,\n              footer.position.column,\n            );\n          }\n          footerSeen = footer;\n          children.push(footer);\n        }\n        continue;\n      }\n      const child = this.parseWindowChild();\n      if (child.kind === 'navbar') {\n        if (headerSeen) {\n          throw new WireloomError(\n            'navbar and header cannot both appear in a window — pick one (they share the chrome band)',\n            head.line,\n            head.column,\n          );\n        }\n        navbarSeen = child;\n      } else if (child.kind === 'header') {\n        if (navbarSeen) {\n          throw new WireloomError(\n            'navbar and header cannot both appear in a window — pick one (they share the chrome band)',\n            head.line,\n            head.column,\n          );\n        }\n        headerSeen = child;\n      } else if (child.kind === 'footer') {\n        if (footerSeen) {\n          throw new WireloomError(\n            'a \"window\" may contain at most one \"footer\" block',\n            head.line,\n            head.column,\n          );\n        }\n        footerSeen = child;\n      } else if (child.kind === 'sheet') {\n        sawSheet = true;\n      }\n      children.push(child);\n    }\n    this.expectKind('dedent', 'children block did not close cleanly');\n    return children;\n  }\n\n  private parseWindowChild(): WindowChild {\n    const head = this.peek();\n    if (head.kind !== 'ident') {\n      throw new WireloomError(\n        `expected a primitive, got ${describeToken(head)}`,\n        head.line,\n        head.column,\n      );\n    }\n    const name = head.identValue ?? head.raw;\n    if (!VALID_PRIMITIVES.has(name)) {\n      throw new WireloomError(unknownPrimitiveMessage(name), head.line, head.column);\n    }\n    if (name === 'window') {\n      throw new WireloomError(\n        '\"window\" cannot be nested — only one root \"window\" is allowed',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'tab') {\n      throw new WireloomError(\n        '\"tab\" may only appear inside \"tabs\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'item') {\n      throw new WireloomError(\n        '\"item\" may only appear inside \"list\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'cell') {\n      throw new WireloomError(\n        '\"cell\" may only appear inside \"grid\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'resource') {\n      throw new WireloomError(\n        '\"resource\" may only appear inside \"resourcebar\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'stat') {\n      throw new WireloomError(\n        '\"stat\" may only appear inside \"stats\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'node') {\n      throw new WireloomError(\n        '\"node\" may only appear inside \"tree\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'menuitem') {\n      throw new WireloomError(\n        '\"menuitem\" may only appear inside \"menu\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'separator') {\n      throw new WireloomError(\n        '\"separator\" may only appear inside \"menu\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'crumb') {\n      throw new WireloomError(\n        '\"crumb\" may only appear inside \"breadcrumb\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'spacer') {\n      throw new WireloomError(\n        '\"spacer\" may only appear inside \"row\", \"col\", or \"footer\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'leading' || name === 'center' || name === 'trailing') {\n      throw new WireloomError(\n        `\"${name}\" may only appear inside \"navbar\"`,\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'tabitem') {\n      throw new WireloomError(\n        '\"tabitem\" may only appear inside \"tabbar\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'segment') {\n      throw new WireloomError(\n        '\"segment\" may only appear inside \"segmented\"',\n        head.line,\n        head.column,\n      );\n    }\n    if (name === 'header') return this.parseHeader();\n    if (name === 'footer') return this.parseFooter();\n    if (name === 'navbar') return this.parseNavbar();\n    if (name === 'tabbar') return this.parseTabBar();\n    if (name === 'sheet') return this.parseSheet();\n    return this.parseContainerChildNamed(name);\n  }\n\n  // --- Header / Footer ------------------------------------------------------\n\n  private parseHeader(): HeaderNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('header');\n    const hasChildren = this.parseTerminator('header', head);\n    const children = hasChildren ? this.parseContainerChildren() : [];\n    return { kind: 'header', attributes, children, position };\n  }\n\n  private parseFooter(): FooterNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('footer');\n    const hasChildren = this.parseTerminator('footer', head);\n    const children = hasChildren ? this.parseChildrenAllowingSpacer() : [];\n    return { kind: 'footer', attributes, children, position };\n  }\n\n  // --- Navbar ---------------------------------------------------------------\n\n  private parseNavbar(): NavbarNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('navbar');\n    const hasChildren = this.parseTerminator('navbar', head);\n    if (!hasChildren) {\n      throw new WireloomError(\n        '\"navbar\" requires \"leading:\", \"center:\", and/or \"trailing:\" sub-blocks (e.g., navbar:\\n  leading:\\n    button \"Back\")',\n        head.line,\n        head.column,\n      );\n    }\n    const { leading, center, trailing } = this.parseNavbarChildren();\n    const node: NavbarNode = { kind: 'navbar', attributes, position };\n    if (leading) node.leading = leading;\n    if (center) node.center = center;\n    if (trailing) node.trailing = trailing;\n    return node;\n  }\n\n  /**\n   * Parse a navbar's child block. `leading:`, `center:`, and `trailing:` are\n   * accepted; each may appear at most once. Source order doesn't matter — the\n   * renderer always anchors leading on the left, center horizontally centered,\n   * and trailing on the right.\n   */\n  private parseNavbarChildren(): {\n    leading: NavbarSlotNode | undefined;\n    center: NavbarSlotNode | undefined;\n    trailing: NavbarSlotNode | undefined;\n  } {\n    let leading: NavbarSlotNode | undefined;\n    let center: NavbarSlotNode | undefined;\n    let trailing: NavbarSlotNode | undefined;\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"leading:\", \"center:\", or \"trailing:\" inside \"navbar\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name === 'leading') {\n        if (leading !== undefined) {\n          throw new WireloomError(\n            '\"navbar\" may contain at most one \"leading:\" block',\n            head.line,\n            head.column,\n          );\n        }\n        leading = this.parseNavbarSlot('leading');\n      } else if (name === 'center') {\n        if (center !== undefined) {\n          throw new WireloomError(\n            '\"navbar\" may contain at most one \"center:\" block',\n            head.line,\n            head.column,\n          );\n        }\n        center = this.parseNavbarSlot('center');\n      } else if (name === 'trailing') {\n        if (trailing !== undefined) {\n          throw new WireloomError(\n            '\"navbar\" may contain at most one \"trailing:\" block',\n            head.line,\n            head.column,\n          );\n        }\n        trailing = this.parseNavbarSlot('trailing');\n      } else {\n        throw new WireloomError(\n          `\"navbar\" accepts only \"leading:\", \"center:\", or \"trailing:\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n    }\n    this.expectKind('dedent', 'navbar block did not close cleanly');\n    return { leading, center, trailing };\n  }\n\n  private parseNavbarSlot(side: 'leading' | 'center' | 'trailing'): NavbarSlotNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes(side);\n    const hasChildren = this.parseTerminator(side, head);\n    const children = hasChildren ? this.parseContainerChildren() : [];\n    const kind =\n      side === 'leading'\n        ? 'navbarLeading'\n        : side === 'center'\n          ? 'navbarCenter'\n          : 'navbarTrailing';\n    return { kind, attributes, children, position };\n  }\n\n  // --- TabBar / TabItem -----------------------------------------------------\n\n  private parseTabBar(): TabBarNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('tabbar');\n    const hasChildren = this.parseTerminator('tabbar', head);\n    const children = hasChildren ? this.parseTabItemChildren() : [];\n    return { kind: 'tabbar', attributes, children, position };\n  }\n\n  private parseTabItemChildren(): TabItemNode[] {\n    const children: TabItemNode[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"tabitem\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name !== 'tabitem') {\n        throw new WireloomError(\n          `\"tabbar\" accepts only \"tabitem\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseTabItem());\n    }\n    this.expectKind('dedent', 'tabbar block did not close cleanly');\n    return children;\n  }\n\n  private parseTabItem(): TabItemNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"tabitem\" requires a label string (e.g., tabitem \"Home\" icon=\"planet\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('tabitem');\n    this.parseLeafTerminator('tabitem', head);\n    return { kind: 'tabitem', label, attributes, position };\n  }\n\n  // --- Sheet ----------------------------------------------------------------\n\n  private parseSheet(): SheetNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('sheet');\n    const placementAttr = getAttrIdentValue(attributes, 'position');\n    const placement: SheetPlacement =\n      placementAttr === 'center' ? 'center' : 'bottom';\n    const title = getAttrStringValue(attributes, 'title');\n    const hasChildren = this.parseTerminator('sheet', head);\n    const children = hasChildren ? this.parseContainerChildren() : [];\n    const node: SheetNode = {\n      kind: 'sheet',\n      placement,\n      attributes,\n      children,\n      position,\n    };\n    if (title !== undefined) node.title = title;\n    return node;\n  }\n\n  // --- Container children ---------------------------------------------------\n\n  private parseContainerChildren(): ContainerChild[] {\n    const children: ContainerChild[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      children.push(this.parseContainerChild());\n    }\n    this.expectKind('dedent', 'children block did not close cleanly');\n    return children;\n  }\n\n  private parseContainerChild(): ContainerChild {\n    const head = this.peek();\n    if (head.kind !== 'ident') {\n      throw new WireloomError(\n        `expected a primitive, got ${describeToken(head)}`,\n        head.line,\n        head.column,\n      );\n    }\n    const name = head.identValue ?? head.raw;\n    if (!VALID_PRIMITIVES.has(name)) {\n      throw new WireloomError(unknownPrimitiveMessage(name), head.line, head.column);\n    }\n    if (!CONTAINER_CHILD_PRIMITIVES.has(name)) {\n      const reason = placementErrorFor(name);\n      throw new WireloomError(reason, head.line, head.column);\n    }\n    return this.parseContainerChildNamed(name);\n  }\n\n  private parseContainerChildNamed(name: string): ContainerChild {\n    switch (name) {\n      case 'panel':\n        return this.parsePanel();\n      case 'section':\n        return this.parseSection();\n      case 'tabs':\n        return this.parseTabs();\n      case 'row':\n        return this.parseRow();\n      case 'col':\n        return this.parseCol();\n      case 'list':\n        return this.parseList();\n      case 'slot':\n        return this.parseSlot();\n      case 'text':\n        return this.parseText();\n      case 'button':\n        return this.parseButton();\n      case 'backbutton':\n        return this.parseBackButton();\n      case 'input':\n        return this.parseInput();\n      case 'combo':\n        return this.parseCombo();\n      case 'slider':\n        return this.parseSlider();\n      case 'kv':\n        return this.parseKv();\n      case 'image':\n        return this.parseImage();\n      case 'icon':\n        return this.parseIcon();\n      case 'divider':\n        return this.parseDivider();\n      case 'grid':\n        return this.parseGrid();\n      case 'resourcebar':\n        return this.parseResourceBar();\n      case 'stats':\n        return this.parseStats();\n      case 'progress':\n        return this.parseProgress();\n      case 'chart':\n        return this.parseChart();\n      case 'tree':\n        return this.parseTree();\n      case 'menubar':\n        return this.parseMenubar();\n      case 'menu':\n        return this.parseMenu();\n      case 'breadcrumb':\n        return this.parseBreadcrumb();\n      case 'checkbox':\n        return this.parseCheckbox();\n      case 'radio':\n        return this.parseRadio();\n      case 'toggle':\n        return this.parseToggle();\n      case 'chip':\n        return this.parseChip();\n      case 'avatar':\n        return this.parseAvatar();\n      case 'spinner':\n        return this.parseSpinner();\n      case 'status':\n        return this.parseStatus();\n      case 'segmented':\n        return this.parseSegmented();\n      default: {\n        const head = this.peek();\n        throw new WireloomError(unknownPrimitiveMessage(name), head.line, head.column);\n      }\n    }\n  }\n\n  // --- Panel / Section / Row / Col ------------------------------------------\n\n  private parsePanel(): PanelNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('panel');\n    const hasChildren = this.parseTerminator('panel', head);\n    const children = hasChildren ? this.parseContainerChildren() : [];\n    return { kind: 'panel', attributes, children, position };\n  }\n\n  /**\n   * Parse a `panel` that is a direct child of `window`. In this position only,\n   * a trailing `footer:` block is accepted as authoring sugar and desugared\n   * into a sibling window footer.\n   */\n  private parseTopLevelPanel(): { panel: PanelNode; footer?: FooterNode } {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('panel');\n    const hasChildren = this.parseTerminator('panel', head);\n    const { children, footer } = hasChildren\n      ? this.parseTopLevelPanelChildren()\n      : { children: [] as ContainerChild[], footer: undefined };\n    const panel: PanelNode = { kind: 'panel', attributes, children, position };\n    return footer ? { panel, footer } : { panel };\n  }\n\n  /**\n   * Parse children of a top-level `panel`. Accepts normal container children\n   * plus an optional trailing `footer:` block, which is normalized to a real\n   * window footer by {@link parseTopLevelPanel}.\n   */\n  private parseTopLevelPanelChildren(): { children: ContainerChild[]; footer?: FooterNode } {\n    const children: ContainerChild[] = [];\n    let footer: FooterNode | undefined;\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      const name = head.kind === 'ident' ? head.identValue ?? head.raw : undefined;\n      if (name === 'footer') {\n        if (footer !== undefined) {\n          throw new WireloomError(\n            'a top-level \"panel\" may contain at most one trailing \"footer\" block',\n            head.line,\n            head.column,\n          );\n        }\n        footer = this.parseFooter();\n        continue;\n      }\n      if (footer !== undefined) {\n        throw new WireloomError(\n          '\"footer\" inside a top-level \"panel\" must be the last child',\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseContainerChild());\n    }\n    this.expectKind('dedent', 'children block did not close cleanly');\n    return footer ? { children, footer } : { children };\n  }\n\n  private parseSection(): SectionNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const title = this.expectKind(\n      'string',\n      '\"section\" requires a title string (e.g., section \"Economy\":)',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('section');\n    const hasChildren = this.parseTerminator('section', head);\n    const children = hasChildren ? this.parseContainerChildren() : [];\n    return { kind: 'section', title, attributes, children, position };\n  }\n\n  private parseTabs(): TabsNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('tabs');\n    const hasChildren = this.parseTerminator('tabs', head);\n    const children = hasChildren ? this.parseTabChildren() : [];\n    return { kind: 'tabs', attributes, children, position };\n  }\n\n  private parseTabChildren(): TabNode[] {\n    const children: TabNode[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected a \"tab\" primitive, got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name !== 'tab') {\n        throw new WireloomError(\n          `\"tabs\" accepts only \"tab\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseTab());\n    }\n    this.expectKind('dedent', 'tabs block did not close cleanly');\n    return children;\n  }\n\n  private parseTab(): TabNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"tab\" requires a string label (e.g., tab \"Government\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('tab');\n    this.parseLeafTerminator('tab', head);\n    return { kind: 'tab', label, attributes, position };\n  }\n\n  private parseRow(): RowNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('row');\n    const hasChildren = this.parseTerminator('row', head);\n    const children = hasChildren ? this.parseChildrenAllowingSpacer() : [];\n    // `align=right|center` packs all children toward one edge; a `spacer` spreads\n    // them to both edges. Combining them is contradictory intent, so reject it\n    // loudly instead of silently letting the spacer win.\n    const alignAttr = getAttrIdentValue(attributes, 'align');\n    if (\n      (alignAttr === 'right' || alignAttr === 'center') &&\n      children.some((c) => c.kind === 'spacer')\n    ) {\n      throw new WireloomError(\n        `\"row\" cannot combine align=${alignAttr} with a \"spacer\" child — ` +\n          'a spacer already spreads children to both ends; remove one',\n        head.line,\n        head.column,\n      );\n    }\n    return { kind: 'row', attributes, children, position };\n  }\n\n  /**\n   * Parse children for a flex container that accepts `spacer` (flex gap — v0.5).\n   * Used by `row`, `col`, and the `footer` chrome band. Kept as a separate pass\n   * so spacer stays grammar-restricted to these containers without widening the\n   * general container-child union (`parseContainerChild` still rejects spacer).\n   */\n  private parseChildrenAllowingSpacer(): ContainerChild[] {\n    const children: ContainerChild[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind === 'ident' && (head.identValue ?? head.raw) === 'spacer') {\n        children.push(this.parseSpacer());\n        continue;\n      }\n      children.push(this.parseContainerChild());\n    }\n    this.expectKind('dedent', 'children block did not close cleanly');\n    return children;\n  }\n\n  private parseSpacer(): SpacerNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('spacer');\n    this.parseLeafTerminator('spacer', head);\n    return { kind: 'spacer', attributes, position };\n  }\n\n  private parseCol(): ColNode {\n    const head = this.consume();\n    const position = positionOf(head);\n\n    let width: ColWidth = { kind: 'fill' };\n\n    // Optional width positional: either a pixel NUMBER or the bare identifier\n    // `fill`. Percent / fr units are not accepted as a positional — they're\n    // grammar errors here, not a silently-different sizing mode.\n    const next = this.peek();\n    if (next.kind === 'number') {\n      const tok = this.consume();\n      const unit = tok.unit ?? 'px';\n      if (unit !== 'px') {\n        throw new WireloomError(\n          `\"col\" positional width must be a pixel number or \"fill\"; got \"${tok.raw}\"`,\n          tok.line,\n          tok.column,\n        );\n      }\n      width = { kind: 'length', value: tok.numericValue ?? 0, unit: 'px' };\n    } else if (next.kind === 'ident' && next.identValue === 'fill') {\n      this.consume();\n      width = { kind: 'fill' };\n    }\n\n    const attributes = this.parseAttributes('col');\n    const hasChildren = this.parseTerminator('col', head);\n    const children = hasChildren ? this.parseChildrenAllowingSpacer() : [];\n    return { kind: 'col', width, attributes, children, position };\n  }\n\n  // --- List / Item / Slot ---------------------------------------------------\n\n  private parseList(): ListNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('list');\n    const hasChildren = this.parseTerminator('list', head);\n    const children = hasChildren ? this.parseListChildren() : [];\n    return { kind: 'list', attributes, children, position };\n  }\n\n  private parseListChildren(): (ItemNode | SlotNode)[] {\n    const children: (ItemNode | SlotNode)[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"item\" or \"slot\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (!LIST_CHILD_PRIMITIVES.has(name)) {\n        throw new WireloomError(\n          `\"list\" accepts only \"item\" or \"slot\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      if (name === 'item') {\n        children.push(this.parseItem());\n      } else {\n        children.push(this.parseSlot());\n      }\n    }\n    this.expectKind('dedent', 'list block did not close cleanly');\n    return children;\n  }\n\n  private parseItem(): ItemNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const text = this.expectKind(\n      'string',\n      '\"item\" requires a string text argument (e.g., item \"Home\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('item');\n    this.parseLeafTerminator('item', head);\n    return { kind: 'item', text, attributes, position };\n  }\n\n  private parseSlot(): SlotNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const title = this.expectKind(\n      'string',\n      '\"slot\" requires a title string (e.g., slot \"Colonial Defense Pact\":)',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('slot');\n    const hasChildren = this.parseTerminator('slot', head);\n    const { children, slotFooter } = hasChildren\n      ? this.parseSlotChildren()\n      : { children: [] as ContainerChild[], slotFooter: undefined };\n    const node: SlotNode = { kind: 'slot', title, attributes, children, position };\n    if (slotFooter) node.slotFooter = slotFooter;\n    return node;\n  }\n\n  /**\n   * Parse children of a `slot`. Accepts standard container children plus an\n   * optional trailing `footer:` block (at most one, must be the last child).\n   */\n  private parseSlotChildren(): { children: ContainerChild[]; slotFooter?: SlotFooterNode } {\n    const children: ContainerChild[] = [];\n    let slotFooter: SlotFooterNode | undefined;\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      const name = head.kind === 'ident' ? head.identValue ?? head.raw : undefined;\n      if (name === 'footer') {\n        if (slotFooter !== undefined) {\n          throw new WireloomError(\n            '\"slot\" may contain at most one \"footer\" block',\n            head.line,\n            head.column,\n          );\n        }\n        slotFooter = this.parseSlotFooter();\n        continue;\n      }\n      // Non-footer child: if a footer is already parsed, that footer wasn't last.\n      if (slotFooter !== undefined) {\n        throw new WireloomError(\n          '\"footer\" inside \"slot\" must be the last child',\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseContainerChild());\n    }\n    this.expectKind('dedent', 'slot children block did not close cleanly');\n    return slotFooter ? { children, slotFooter } : { children };\n  }\n\n  private parseSlotFooter(): SlotFooterNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('slotFooter');\n    const hasChildren = this.parseTerminator('footer', head);\n    const children = hasChildren ? this.parseContainerChildren() : [];\n    return { kind: 'slotFooter', attributes, children, position };\n  }\n\n  // --- Leaves ---------------------------------------------------------------\n\n  private parseText(): TextNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const content = this.expectKind(\n      'string',\n      '\"text\" requires a string argument (e.g., text \"Hello\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('text');\n    this.parseLeafTerminator('text', head);\n    return { kind: 'text', content, attributes, position };\n  }\n\n  private parseButton(): ButtonNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"button\" requires a string label (e.g., button \"Save\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('button');\n    this.parseLeafTerminator('button', head);\n    return { kind: 'button', label, attributes, position };\n  }\n\n  private parseBackButton(): BackButtonNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"backbutton\" requires a parent label string (e.g., backbutton \"Notes\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('backbutton');\n    this.parseLeafTerminator('backbutton', head);\n    return { kind: 'backbutton', label, attributes, position };\n  }\n\n  private parseInput(): InputNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('input');\n    this.parseLeafTerminator('input', head);\n    return { kind: 'input', attributes, position };\n  }\n\n  private parseCombo(): ComboNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    let label: string | undefined;\n    if (this.peek().kind === 'string') {\n      label = this.consume().stringValue;\n    }\n    const attributes = this.parseAttributes('combo');\n    this.parseLeafTerminator('combo', head);\n    const node: ComboNode = { kind: 'combo', attributes, position };\n    if (label !== undefined) node.label = label;\n    return node;\n  }\n\n  private parseSlider(): SliderNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('slider');\n    this.parseLeafTerminator('slider', head);\n    return { kind: 'slider', attributes, position };\n  }\n\n  private parseKv(): KvNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const labelTok = this.expectKind(\n      'string',\n      '\"kv\" requires a label string (e.g., kv \"Tax Rate\" \"30%\")',\n    );\n    const label = labelTok.stringValue ?? '';\n\n    // Common mistake: writing both label and value as a single combined\n    // string (e.g., `kv \"Tax Rate=30%\"`). Detect and emit a targeted hint\n    // so the user doesn't have to guess what went wrong.\n    if (this.peek().kind !== 'string' && /[=:]/.test(label)) {\n      const splitChar = label.includes('=') ? '=' : ':';\n      const idx = label.indexOf(splitChar);\n      const left = label.slice(0, idx).trim();\n      const right = label.slice(idx + 1).trim();\n      throw new WireloomError(\n        `\"kv\" needs two separate strings (label, value). Got only \"${label}\" — if you meant to split on \"${splitChar}\", try: kv \"${left}\" \"${right}\"`,\n        labelTok.line,\n        labelTok.column,\n      );\n    }\n\n    const value = this.expectKind(\n      'string',\n      '\"kv\" requires a value string after the label (e.g., kv \"Tax Rate\" \"30%\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('kv');\n    this.parseLeafTerminator('kv', head);\n    return { kind: 'kv', label, value, attributes, position };\n  }\n\n  private parseImage(): ImageNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('image');\n    this.parseLeafTerminator('image', head);\n    return { kind: 'image', attributes, position };\n  }\n\n  private parseIcon(): IconNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('icon');\n    this.parseLeafTerminator('icon', head);\n    return { kind: 'icon', attributes, position };\n  }\n\n  private parseDivider(): DividerNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('divider');\n    this.parseLeafTerminator('divider', head);\n    return { kind: 'divider', attributes, position };\n  }\n\n  private parseProgress(): ProgressNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('progress');\n    this.parseLeafTerminator('progress', head);\n    return { kind: 'progress', attributes, position };\n  }\n\n  private parseChart(): ChartNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('chart');\n    this.parseLeafTerminator('chart', head);\n    return { kind: 'chart', attributes, position };\n  }\n\n  // --- Grid / Cell ----------------------------------------------------------\n\n  private parseGrid(): GridNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('grid');\n    const cols = getAttrNumberValue(attributes, 'cols');\n    const rows = getAttrNumberValue(attributes, 'rows');\n    if (cols === undefined || cols < 1) {\n      throw new WireloomError(\n        '\"grid\" requires cols=N with N>=1 (e.g., grid cols=5 rows=5:)',\n        head.line,\n        head.column,\n      );\n    }\n    if (rows === undefined || rows < 1) {\n      throw new WireloomError(\n        '\"grid\" requires rows=N with N>=1 (e.g., grid cols=5 rows=5:)',\n        head.line,\n        head.column,\n      );\n    }\n    const hasChildren = this.parseTerminator('grid', head);\n    const children = hasChildren ? this.parseGridChildren() : [];\n    return { kind: 'grid', cols, rows, attributes, children, position };\n  }\n\n  private parseGridChildren(): CellNode[] {\n    const children: CellNode[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"cell\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name !== 'cell') {\n        throw new WireloomError(\n          `\"grid\" accepts only \"cell\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseCell());\n    }\n    this.expectKind('dedent', 'grid block did not close cleanly');\n    return children;\n  }\n\n  private parseCell(): CellNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    let label: string | undefined;\n    if (this.peek().kind === 'string') {\n      label = this.consume().stringValue;\n    }\n    const attributes = this.parseAttributes('cell');\n    const rowAttr = getAttrNumberValue(attributes, 'row');\n    const colAttr = getAttrNumberValue(attributes, 'col');\n    const hasChildren = this.parseTerminator('cell', head);\n    const children = hasChildren ? this.parseContainerChildren() : [];\n    const node: CellNode = { kind: 'cell', attributes, children, position };\n    if (label !== undefined) node.label = label;\n    if (rowAttr !== undefined) node.row = rowAttr;\n    if (colAttr !== undefined) node.col = colAttr;\n    return node;\n  }\n\n  // --- ResourceBar / Resource ----------------------------------------------\n\n  private parseResourceBar(): ResourceBarNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('resourcebar');\n    const hasChildren = this.parseTerminator('resourcebar', head);\n    const children = hasChildren ? this.parseResourceChildren() : [];\n    return { kind: 'resourcebar', attributes, children, position };\n  }\n\n  private parseResourceChildren(): ResourceNode[] {\n    const children: ResourceNode[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"resource\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name !== 'resource') {\n        throw new WireloomError(\n          `\"resourcebar\" accepts only \"resource\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseResource());\n    }\n    this.expectKind('dedent', 'resourcebar block did not close cleanly');\n    return children;\n  }\n\n  private parseResource(): ResourceNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('resource');\n    const name = getAttrStringValue(attributes, 'name');\n    const value = getAttrStringValue(attributes, 'value');\n    if (name === undefined) {\n      throw new WireloomError(\n        '\"resource\" requires name=\"…\" (e.g., resource name=\"Credits\" value=\"1,500\")',\n        head.line,\n        head.column,\n      );\n    }\n    if (value === undefined) {\n      throw new WireloomError(\n        '\"resource\" requires value=\"…\" (e.g., resource name=\"Credits\" value=\"1,500\")',\n        head.line,\n        head.column,\n      );\n    }\n    this.parseLeafTerminator('resource', head);\n    return { kind: 'resource', name, value, attributes, position };\n  }\n\n  // --- Stats / Stat --------------------------------------------------------\n\n  private parseStats(): StatsNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('stats');\n    const hasChildren = this.parseTerminator('stats', head);\n    const children = hasChildren ? this.parseStatChildren() : [];\n    return { kind: 'stats', attributes, children, position };\n  }\n\n  private parseStatChildren(): StatNode[] {\n    const children: StatNode[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"stat\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name !== 'stat') {\n        throw new WireloomError(\n          `\"stats\" accepts only \"stat\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseStat());\n    }\n    this.expectKind('dedent', 'stats block did not close cleanly');\n    return children;\n  }\n\n  private parseStat(): StatNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"stat\" requires a label string (e.g., stat \"INT\" \"4\")',\n    ).stringValue ?? '';\n    const value = this.expectKind(\n      'string',\n      '\"stat\" requires a value string after the label (e.g., stat \"INT\" \"4\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('stat');\n    this.parseLeafTerminator('stat', head);\n    return { kind: 'stat', label, value, attributes, position };\n  }\n\n  // --- Tree / node ---------------------------------------------------------\n\n  private parseTree(): TreeNode_ {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('tree');\n    const hasChildren = this.parseTerminator('tree', head);\n    const children = hasChildren ? this.parseTreeChildren() : [];\n    return { kind: 'tree', attributes, children, position };\n  }\n\n  private parseTreeChildren(): TreeItemNode[] {\n    const children: TreeItemNode[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"node\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name !== 'node') {\n        throw new WireloomError(\n          `\"tree\" accepts only \"node\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseTreeNode());\n    }\n    this.expectKind('dedent', 'tree block did not close cleanly');\n    return children;\n  }\n\n  private parseTreeNode(): TreeItemNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"node\" requires a label string (e.g., node \"src\":)',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('treeNode');\n    const hasChildren = this.parseTerminator('node', head);\n    const children = hasChildren ? this.parseTreeChildren() : [];\n    return { kind: 'treeNode', label, attributes, children, position };\n  }\n\n  // --- Menubar / Menu ------------------------------------------------------\n\n  private parseMenubar(): MenubarNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('menubar');\n    const hasChildren = this.parseTerminator('menubar', head);\n    const children = hasChildren ? this.parseMenubarChildren() : [];\n    return { kind: 'menubar', attributes, children, position };\n  }\n\n  private parseMenubarChildren(): MenuNode[] {\n    const children: MenuNode[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"menu\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name !== 'menu') {\n        throw new WireloomError(\n          `\"menubar\" accepts only \"menu\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseMenu());\n    }\n    this.expectKind('dedent', 'menubar block did not close cleanly');\n    return children;\n  }\n\n  private parseMenu(): MenuNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"menu\" requires a label string (e.g., menu \"File\":)',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('menu');\n    const hasChildren = this.parseTerminator('menu', head);\n    const children = hasChildren ? this.parseMenuChildren() : [];\n    return { kind: 'menu', label, attributes, children, position };\n  }\n\n  private parseMenuChildren(): MenuChild[] {\n    const children: MenuChild[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"menuitem\", \"separator\", or \"menu\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name === 'menuitem') {\n        children.push(this.parseMenuItem());\n      } else if (name === 'separator') {\n        children.push(this.parseSeparator());\n      } else if (name === 'menu') {\n        children.push(this.parseMenu());\n      } else {\n        throw new WireloomError(\n          `\"menu\" accepts only \"menuitem\", \"separator\", or nested \"menu\" (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n    }\n    this.expectKind('dedent', 'menu block did not close cleanly');\n    return children;\n  }\n\n  private parseMenuItem(): MenuItemNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"menuitem\" requires a label string (e.g., menuitem \"Open…\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('menuitem');\n    this.parseLeafTerminator('menuitem', head);\n    return { kind: 'menuitem', label, attributes, position };\n  }\n\n  private parseSeparator(): SeparatorNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('separator');\n    this.parseLeafTerminator('separator', head);\n    return { kind: 'separator', attributes, position };\n  }\n\n  // --- Breadcrumb / crumb --------------------------------------------------\n\n  private parseBreadcrumb(): BreadcrumbNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('breadcrumb');\n    const hasChildren = this.parseTerminator('breadcrumb', head);\n    const children = hasChildren ? this.parseBreadcrumbChildren() : [];\n    return { kind: 'breadcrumb', attributes, children, position };\n  }\n\n  private parseBreadcrumbChildren(): CrumbNode[] {\n    const children: CrumbNode[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"crumb\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name !== 'crumb') {\n        throw new WireloomError(\n          `\"breadcrumb\" accepts only \"crumb\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseCrumb());\n    }\n    this.expectKind('dedent', 'breadcrumb block did not close cleanly');\n    return children;\n  }\n\n  private parseCrumb(): CrumbNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"crumb\" requires a label string (e.g., crumb \"Documents\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('crumb');\n    this.parseLeafTerminator('crumb', head);\n    return { kind: 'crumb', label, attributes, position };\n  }\n\n  // --- Segmented / segment -------------------------------------------------\n\n  private parseSegmented(): SegmentedNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const attributes = this.parseAttributes('segmented');\n    const hasChildren = this.parseTerminator('segmented', head);\n    const children = hasChildren ? this.parseSegmentedChildren(head) : [];\n\n    // Exactly one segment may carry `selected`. Multiple is a parse error —\n    // the semantic of a segmented control is \"pick one of N\".\n    let selectedCount = 0;\n    let firstExtraSelected: SegmentNode | undefined;\n    for (const seg of children) {\n      if (seg.attributes.some((a) => a.kind === 'flag' && a.flag === 'selected')) {\n        selectedCount++;\n        if (selectedCount > 1 && firstExtraSelected === undefined) {\n          firstExtraSelected = seg;\n        }\n      }\n    }\n    if (firstExtraSelected) {\n      throw new WireloomError(\n        '\"segmented\" allows at most one \"segment\" with the \"selected\" flag; pick exactly one',\n        firstExtraSelected.position.line,\n        firstExtraSelected.position.column,\n      );\n    }\n\n    // Zero or one segment is syntactically legal but renders as a degenerate\n    // control. Warn so authors notice; don't block rendering.\n    if (children.length < 2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `wireloom: \"segmented\" with ${children.length} segment${children.length === 1 ? '' : 's'} at ` +\n          `line ${position.line} — at least 2 segments recommended.`,\n      );\n    }\n\n    return { kind: 'segmented', attributes, children, position };\n  }\n\n  private parseSegmentedChildren(containerHead: Token): SegmentNode[] {\n    const children: SegmentNode[] = [];\n    while (this.peek().kind !== 'dedent' && this.peek().kind !== 'eof') {\n      const head = this.peek();\n      if (head.kind !== 'ident') {\n        throw new WireloomError(\n          `expected \"segment\", got ${describeToken(head)}`,\n          head.line,\n          head.column,\n        );\n      }\n      const name = head.identValue ?? head.raw;\n      if (name !== 'segment') {\n        throw new WireloomError(\n          `\"segmented\" accepts only \"segment\" children (got \"${name}\")`,\n          head.line,\n          head.column,\n        );\n      }\n      children.push(this.parseSegment());\n    }\n    this.expectKind('dedent', 'segmented block did not close cleanly');\n    void containerHead;\n    return children;\n  }\n\n  private parseSegment(): SegmentNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"segment\" requires a label string (e.g., segment \"Day\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('segment');\n    this.parseLeafTerminator('segment', head);\n    return { kind: 'segment', label, attributes, position };\n  }\n\n  // --- Form controls -------------------------------------------------------\n\n  private parseCheckbox(): CheckboxNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"checkbox\" requires a label string (e.g., checkbox \"Enable\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('checkbox');\n    this.parseLeafTerminator('checkbox', head);\n    return { kind: 'checkbox', label, attributes, position };\n  }\n\n  private parseRadio(): RadioNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"radio\" requires a label string (e.g., radio \"Light\" group=\"theme\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('radio');\n    this.parseLeafTerminator('radio', head);\n    return { kind: 'radio', label, attributes, position };\n  }\n\n  private parseToggle(): ToggleNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"toggle\" requires a label string (e.g., toggle \"Dark mode\" on)',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('toggle');\n    this.parseLeafTerminator('toggle', head);\n    return { kind: 'toggle', label, attributes, position };\n  }\n\n  // --- Chip / avatar -------------------------------------------------------\n\n  private parseChip(): ChipNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"chip\" requires a label string (e.g., chip \"Filter\")',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('chip');\n    this.parseLeafTerminator('chip', head);\n    return { kind: 'chip', label, attributes, position };\n  }\n\n  private parseAvatar(): AvatarNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const raw = this.expectKind(\n      'string',\n      '\"avatar\" requires an initials string (e.g., avatar \"BW\")',\n    ).stringValue ?? '';\n    // Initials are truncated to two characters at render time; preserve the\n    // source value in the AST so serialization roundtrips byte-identical.\n    const attributes = this.parseAttributes('avatar');\n    this.parseLeafTerminator('avatar', head);\n    return { kind: 'avatar', initials: raw, attributes, position };\n  }\n\n  // --- Spinner / status ----------------------------------------------------\n\n  private parseSpinner(): SpinnerNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    let label: string | undefined;\n    if (this.peek().kind === 'string') {\n      label = this.consume().stringValue;\n    }\n    const attributes = this.parseAttributes('spinner');\n    this.parseLeafTerminator('spinner', head);\n    const node: SpinnerNode = { kind: 'spinner', attributes, position };\n    if (label !== undefined) node.label = label;\n    return node;\n  }\n\n  private parseStatus(): StatusNode {\n    const head = this.consume();\n    const position = positionOf(head);\n    const label = this.expectKind(\n      'string',\n      '\"status\" requires a label string (e.g., status \"Saved\" kind=success)',\n    ).stringValue ?? '';\n    const attributes = this.parseAttributes('status');\n    const kindAttr = getAttrIdentValue(attributes, 'kind');\n    if (kindAttr === undefined) {\n      throw new WireloomError(\n        '\"status\" requires kind=success|info|warning|error',\n        head.line,\n        head.column,\n      );\n    }\n    this.parseLeafTerminator('status', head);\n    return { kind: 'status', label, attributes, position };\n  }\n\n  // --- Attributes / terminators --------------------------------------------\n\n  private parseAttributes(primitive: string): Attribute[] {\n    const rules = ATTR_RULES[primitive] ?? { attrs: {}, flags: [] };\n    const attrs: Attribute[] = [];\n\n    while (this.peek().kind === 'ident') {\n      const keyTok = this.consume();\n      const key = keyTok.identValue ?? keyTok.raw;\n      const position = positionOf(keyTok);\n\n      if (this.match('equals')) {\n        const valueTok = this.consume();\n        // `id=\"…\"` is universal — valid on every primitive. Used as the\n        // target of `annotation` nodes. No uniqueness check in the parser;\n        // layout uses the first match if duplicates are present.\n        const spec: AttrSpec | undefined =\n          key === 'id' ? UNIVERSAL_ID_SPEC : rules.attrs[key];\n        if (spec === undefined) {\n          const suggestion = suggestMatch(key, Object.keys(rules.attrs));\n          const hint = suggestion ? `. Did you mean \"${suggestion}\"?` : '';\n          throw new WireloomError(\n            `unknown attribute \"${key}\" on \"${primitive}\"${hint}`,\n            keyTok.line,\n            keyTok.column,\n          );\n        }\n        const value = coerceAttributeValue(valueTok, spec, key, primitive);\n        const pair: AttributePair = { kind: 'pair', key, value, position };\n        attrs.push(pair);\n      } else {\n        if (!rules.flags.includes(key)) {\n          const suggestion = suggestMatch(key, rules.flags);\n          const hint = suggestion ? `. Did you mean \"${suggestion}\"?` : '';\n          throw new WireloomError(\n            `unknown flag \"${key}\" on \"${primitive}\"${hint}`,\n            keyTok.line,\n            keyTok.column,\n          );\n        }\n        attrs.push({ kind: 'flag', flag: key, position });\n      }\n    }\n\n    return attrs;\n  }\n\n  /** Returns true if a children block follows, false for a leaf. */\n  private parseTerminator(primitive: string, headToken: Token): boolean {\n    if (this.match('colon')) {\n      this.expectKind('newline', `expected newline after \"${primitive}:\"`);\n      if (this.peek().kind !== 'indent') {\n        throw new WireloomError(\n          `\"${primitive}\" ends with \":\" but has no indented children (for a flex gap in a row, use the \"spacer\" primitive)`,\n          headToken.line,\n          headToken.column,\n        );\n      }\n      this.consume(); // indent\n      return true;\n    }\n    this.expectKind('newline', `expected newline after \"${primitive}\"`);\n    return false;\n  }\n\n  private parseLeafTerminator(primitive: string, headToken: Token): void {\n    if (this.peek().kind === 'colon') {\n      throw new WireloomError(\n        `\"${primitive}\" cannot have children`,\n        headToken.line,\n        headToken.column,\n      );\n    }\n    this.expectKind('newline', `expected newline after \"${primitive}\"`);\n  }\n\n  // --- Token helpers --------------------------------------------------------\n\n  private peek(offset = 0): Token {\n    const idx = this.pos + offset;\n    const tok = this.tokens[idx];\n    if (tok !== undefined) return tok;\n    const last = this.tokens[this.tokens.length - 1];\n    if (last === undefined) {\n      throw new WireloomError('empty token stream', 1, 1);\n    }\n    return last;\n  }\n\n  private consume(): Token {\n    const tok = this.peek();\n    this.pos++;\n    return tok;\n  }\n\n  private match(kind: TokenKind): Token | null {\n    if (this.peek().kind === kind) {\n      return this.consume();\n    }\n    return null;\n  }\n\n  private expectKind(kind: TokenKind, message: string): Token {\n    const t = this.peek();\n    if (t.kind !== kind) {\n      throw new WireloomError(message, t.line, t.column);\n    }\n    return this.consume();\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction positionOf(token: Token): SourcePosition {\n  return { line: token.line, column: token.column };\n}\n\nfunction getAttrStringValue(attrs: readonly Attribute[], key: string): string | undefined {\n  for (const a of attrs) {\n    if (a.kind === 'pair' && a.key === key && a.value.kind === 'string') {\n      return a.value.value;\n    }\n  }\n  return undefined;\n}\n\nfunction getAttrNumberValue(attrs: readonly Attribute[], key: string): number | undefined {\n  for (const a of attrs) {\n    if (a.kind === 'pair' && a.key === key && a.value.kind === 'number') {\n      return a.value.value;\n    }\n  }\n  return undefined;\n}\n\nfunction getAttrIdentValue(attrs: readonly Attribute[], key: string): string | undefined {\n  for (const a of attrs) {\n    if (a.kind === 'pair' && a.key === key && a.value.kind === 'identifier') {\n      return a.value.value;\n    }\n  }\n  return undefined;\n}\n\nfunction describeToken(token: Token): string {\n  switch (token.kind) {\n    case 'ident':\n      return `identifier \"${token.identValue ?? token.raw}\"`;\n    case 'string':\n      return `string ${JSON.stringify(token.stringValue ?? '')}`;\n    case 'number':\n      return `number ${token.numericValue}`;\n    case 'range':\n      return `range ${token.rangeMin}-${token.rangeMax}`;\n    case 'newline':\n      return 'end of line';\n    case 'eof':\n      return 'end of file';\n    case 'indent':\n      return 'indentation';\n    case 'dedent':\n      return 'dedent';\n    case 'colon':\n      return '\":\"';\n    case 'equals':\n      return '\"=\"';\n  }\n}\n\nfunction coerceAttributeValue(\n  token: Token,\n  spec: AttrSpec,\n  key: string,\n  primitive: string,\n): AttributeValue {\n  const position = positionOf(token);\n\n  switch (spec.kind) {\n    case 'string':\n      if (token.kind !== 'string') {\n        throw new WireloomError(\n          `attribute \"${key}\" on \"${primitive}\" expects a string value, got ${describeToken(token)}`,\n          token.line,\n          token.column,\n        );\n      }\n      return { kind: 'string', value: token.stringValue ?? '', position };\n\n    case 'number':\n      if (token.kind !== 'number') {\n        throw new WireloomError(\n          `attribute \"${key}\" on \"${primitive}\" expects a number value, got ${describeToken(token)}`,\n          token.line,\n          token.column,\n        );\n      }\n      return {\n        kind: 'number',\n        value: token.numericValue ?? 0,\n        unit: token.unit ?? 'px',\n        position,\n      };\n\n    case 'range':\n      if (token.kind !== 'range') {\n        throw new WireloomError(\n          `attribute \"${key}\" on \"${primitive}\" expects a range value like \"0-100\", got ${describeToken(token)}`,\n          token.line,\n          token.column,\n        );\n      }\n      if ((token.rangeMax ?? 0) <= (token.rangeMin ?? 0)) {\n        throw new WireloomError(\n          `range must be N-M with M > N, got \"${token.rangeMin}-${token.rangeMax}\"`,\n          token.line,\n          token.column,\n        );\n      }\n      return {\n        kind: 'range',\n        min: token.rangeMin ?? 0,\n        max: token.rangeMax ?? 0,\n        position,\n      };\n\n    case 'ident':\n      if (token.kind !== 'ident') {\n        throw new WireloomError(\n          `attribute \"${key}\" on \"${primitive}\" expects an identifier value, got ${describeToken(token)}`,\n          token.line,\n          token.column,\n        );\n      }\n      return {\n        kind: 'identifier',\n        value: token.identValue ?? token.raw,\n        position,\n      };\n\n    case 'enum': {\n      if (token.kind !== 'ident') {\n        throw new WireloomError(\n          `attribute \"${key}\" on \"${primitive}\" expects an identifier value, got ${describeToken(token)}`,\n          token.line,\n          token.column,\n        );\n      }\n      const value = token.identValue ?? token.raw;\n      if (!spec.values.includes(value)) {\n        const suggestion = suggestMatch(value, spec.values);\n        const hint = suggestion ? ` Did you mean \"${suggestion}\"?` : '';\n        throw new WireloomError(\n          `\"${value}\" is not a valid ${key} on \"${primitive}\" (expected one of: ${spec.values.join(', ')}).${hint}`,\n          token.line,\n          token.column,\n        );\n      }\n      return { kind: 'identifier', value, position };\n    }\n  }\n}\n\nfunction placementErrorFor(name: string): string {\n  switch (name) {\n    case 'tab':\n      return '\"tab\" may only appear inside \"tabs\"';\n    case 'item':\n      return '\"item\" may only appear inside \"list\"';\n    case 'header':\n      return '\"header\" may only appear directly inside \"window\"';\n    case 'footer':\n      return '\"footer\" may only appear directly inside \"window\" or \"slot\"';\n    case 'navbar':\n      return '\"navbar\" may only appear directly inside \"window\"';\n    case 'leading':\n    case 'center':\n    case 'trailing':\n      return `\"${name}\" may only appear inside \"navbar\"`;\n    case 'tabbar':\n      return '\"tabbar\" may only appear as a direct child of \"window\"';\n    case 'tabitem':\n      return '\"tabitem\" may only appear inside \"tabbar\"';\n    case 'sheet':\n      return '\"sheet\" may only appear directly inside \"window\"';\n    case 'spacer':\n      return '\"spacer\" may only appear inside \"row\"';\n    case 'segment':\n      return '\"segment\" may only appear inside \"segmented\"';\n    case 'window':\n      return '\"window\" cannot be nested';\n    case 'cell':\n      return '\"cell\" may only appear inside \"grid\"';\n    case 'resource':\n      return '\"resource\" may only appear inside \"resourcebar\"';\n    case 'stat':\n      return '\"stat\" may only appear inside \"stats\"';\n    case 'node':\n      return '\"node\" may only appear inside \"tree\"';\n    case 'menuitem':\n      return '\"menuitem\" may only appear inside \"menu\"';\n    case 'separator':\n      return '\"separator\" may only appear inside \"menu\"';\n    case 'crumb':\n      return '\"crumb\" may only appear inside \"breadcrumb\"';\n    default:\n      return `\"${name}\" is not allowed here`;\n  }\n}\n\nfunction unknownPrimitiveMessage(name: string): string {\n  // Suggestions should only point at source-level keywords; `treeNode` and\n  // `slotFooter` are AST-only names that users never write.\n  const suggestion = suggestMatch(name, [...VALID_PRIMITIVES]);\n  const base = `unknown primitive \"${name}\" (valid: ${PRIMITIVE_LIST_HUMAN})`;\n  return suggestion ? `${base}. Did you mean \"${suggestion}\"?` : base;\n}\n\n/**\n * Returns the closest candidate string to `input` within a small edit-distance\n * threshold, or `undefined` if nothing close enough is found. Used to power\n * \"did you mean?\" hints in error messages.\n */\nexport function suggestMatch(input: string, candidates: readonly string[]): string | undefined {\n  if (input.length < 2 || candidates.length === 0) return undefined;\n  let best: string | undefined;\n  let bestDist = Infinity;\n  for (const cand of candidates) {\n    const d = levenshtein(input, cand);\n    if (d < bestDist) {\n      bestDist = d;\n      best = cand;\n    }\n  }\n  // Only offer a suggestion when the edit distance is small relative to the\n  // input — prevents noisy suggestions for wildly off inputs.\n  const threshold = Math.min(2, Math.floor(input.length / 2));\n  if (best !== undefined && bestDist <= threshold) return best;\n  return undefined;\n}\n\n/** Standard Levenshtein edit distance. */\nfunction 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 = Array.from({ length: n + 1 }, (_, i) => i);\n  const curr = new Array<number>(n + 1).fill(0);\n  for (let i = 1; i <= m; i++) {\n    curr[0] = i;\n    for (let j = 1; j <= n; j++) {\n      const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1;\n      curr[j] = Math.min(\n        (prev[j] ?? 0) + 1,\n        (curr[j - 1] ?? 0) + 1,\n        (prev[j - 1] ?? 0) + cost,\n      );\n    }\n    prev = [...curr];\n  }\n  return prev[n] ?? 0;\n}\n","/**\n * AST → source serializer.\n *\n * Emits a canonical wireloom source string from a {@link Document}. Used\n * primarily for roundtrip idempotence tests and as a building block for\n * future tooling (formatter, structural diff). Output is not byte-identical\n * to hand-written source — comments and non-canonical whitespace are lost —\n * but re-parsing the output must yield an AST that deep-equals the input.\n */\n\nimport type {\n  AnnotationNode,\n  AnyNode,\n  Attribute,\n  AttributeFlag,\n  AttributePair,\n  AttributeValue,\n  AvatarNode,\n  CellNode,\n  TabItemNode,\n  CheckboxNode,\n  ChipNode,\n  ColNode,\n  ComboNode,\n  CrumbNode,\n  Document,\n  GridNode,\n  ItemNode,\n  KvNode,\n  MenuItemNode,\n  MenuNode,\n  NavbarNode,\n  RadioNode,\n  SectionNode,\n  SegmentNode,\n  SlotNode,\n  SpinnerNode,\n  StatNode,\n  StatusNode,\n  TabNode,\n  TextNode,\n  ToggleNode,\n  TreeItemNode,\n  WindowNode,\n} from './ast.js';\n\nexport function serialize(doc: Document): string {\n  if (!doc.root) return '';\n  const lines: string[] = [];\n  serializeNode(doc.root, 0, lines);\n  if (doc.annotations) {\n    for (const a of doc.annotations) {\n      serializeNode(a, 0, lines);\n    }\n  }\n  return lines.join('\\n') + '\\n';\n}\n\nfunction serializeNode(node: AnyNode, depth: number, out: string[]): void {\n  const indent = '  '.repeat(depth);\n  const keyword =\n    node.kind === 'slotFooter'\n      ? 'footer'\n      : node.kind === 'treeNode'\n        ? 'node'\n        : node.kind === 'navbarLeading'\n          ? 'leading'\n          : node.kind === 'navbarCenter'\n            ? 'center'\n            : node.kind === 'navbarTrailing'\n              ? 'trailing'\n              : node.kind;\n  const parts: string[] = [keyword];\n\n  // Positional args by kind.\n  switch (node.kind) {\n    case 'window':\n      if ((node as WindowNode).title !== undefined) {\n        parts.push(quoteString((node as WindowNode).title as string));\n      }\n      break;\n    case 'section':\n      parts.push(quoteString((node as SectionNode).title));\n      break;\n    case 'slot':\n      parts.push(quoteString((node as SlotNode).title));\n      break;\n    case 'tab':\n      parts.push(quoteString((node as TabNode).label));\n      break;\n    case 'tabitem':\n      parts.push(quoteString((node as TabItemNode).label));\n      break;\n    case 'item':\n      parts.push(quoteString((node as ItemNode).text));\n      break;\n    case 'text':\n      parts.push(quoteString((node as TextNode).content));\n      break;\n    case 'button':\n      parts.push(quoteString(node.label));\n      break;\n    case 'backbutton':\n      parts.push(quoteString(node.label));\n      break;\n    case 'kv':\n      parts.push(quoteString((node as KvNode).label));\n      parts.push(quoteString((node as KvNode).value));\n      break;\n    case 'combo':\n      if ((node as ComboNode).label !== undefined) {\n        parts.push(quoteString((node as ComboNode).label as string));\n      }\n      break;\n    case 'col': {\n      const col = node as ColNode;\n      if (col.width.kind === 'length' && col.width.unit === 'px') {\n        parts.push(String(col.width.value));\n      }\n      // `fill` and default are both emitted as no positional — identical re-parse.\n      break;\n    }\n    case 'cell': {\n      const cell = node as CellNode;\n      if (cell.label !== undefined) {\n        parts.push(quoteString(cell.label));\n      }\n      break;\n    }\n    case 'stat':\n      parts.push(quoteString((node as StatNode).label));\n      parts.push(quoteString((node as StatNode).value));\n      break;\n    case 'annotation':\n      parts.push(quoteString((node as AnnotationNode).body));\n      break;\n    case 'treeNode':\n      parts.push(quoteString((node as TreeItemNode).label));\n      break;\n    case 'menu':\n      parts.push(quoteString((node as MenuNode).label));\n      break;\n    case 'menuitem':\n      parts.push(quoteString((node as MenuItemNode).label));\n      break;\n    case 'crumb':\n      parts.push(quoteString((node as CrumbNode).label));\n      break;\n    case 'checkbox':\n      parts.push(quoteString((node as CheckboxNode).label));\n      break;\n    case 'radio':\n      parts.push(quoteString((node as RadioNode).label));\n      break;\n    case 'toggle':\n      parts.push(quoteString((node as ToggleNode).label));\n      break;\n    case 'chip':\n      parts.push(quoteString((node as ChipNode).label));\n      break;\n    case 'avatar':\n      parts.push(quoteString((node as AvatarNode).initials));\n      break;\n    case 'spinner': {\n      const sp = node as SpinnerNode;\n      if (sp.label !== undefined) parts.push(quoteString(sp.label));\n      break;\n    }\n    case 'status':\n      parts.push(quoteString((node as StatusNode).label));\n      break;\n    case 'segment':\n      parts.push(quoteString((node as SegmentNode).label));\n      break;\n    default:\n      // No positional args for header/footer/panel/tabs/row/list/input/slider/image/icon/divider/\n      // grid/resourcebar/resource/stats/progress/chart/slotFooter.\n      break;\n  }\n\n  // Attributes\n  for (const attr of node.attributes) {\n    parts.push(serializeAttribute(attr));\n  }\n\n  const children = nodeChildren(node);\n  if (children.length > 0) {\n    out.push(indent + parts.join(' ') + ':');\n    for (const child of children) {\n      serializeNode(child, depth + 1, out);\n    }\n  } else {\n    out.push(indent + parts.join(' '));\n  }\n}\n\nfunction nodeChildren(node: AnyNode): AnyNode[] {\n  if (node.kind === 'slot') {\n    const slot = node as SlotNode;\n    const kids: AnyNode[] = [...slot.children];\n    if (slot.slotFooter) kids.push(slot.slotFooter);\n    return kids;\n  }\n  if (node.kind === 'navbar') {\n    // navbar's \"children\" in source order are leading then trailing — the AST\n    // shape stores them as named optional fields rather than a flat array.\n    const navbar = node as NavbarNode;\n    const kids: AnyNode[] = [];\n    if (navbar.leading) kids.push(navbar.leading);\n    if (navbar.center) kids.push(navbar.center);\n    if (navbar.trailing) kids.push(navbar.trailing);\n    return kids;\n  }\n  if (node.kind === 'grid') return (node as GridNode).children;\n  if (node.kind === 'resource') return [];\n  // Most other branches just forward their children array.\n  if ('children' in node && Array.isArray((node as unknown as { children: AnyNode[] }).children)) {\n    return (node as unknown as { children: AnyNode[] }).children;\n  }\n  return [];\n}\n\nfunction serializeAttribute(attr: Attribute): string {\n  if (attr.kind === 'flag') {\n    return (attr as AttributeFlag).flag;\n  }\n  const pair = attr as AttributePair;\n  return `${pair.key}=${serializeValue(pair.value)}`;\n}\n\nfunction serializeValue(v: AttributeValue): string {\n  switch (v.kind) {\n    case 'string':\n      return quoteString(v.value);\n    case 'number':\n      if (v.unit === 'percent') return `${v.value}%`;\n      if (v.unit === 'fr') return `${v.value}fr`;\n      return String(v.value);\n    case 'range':\n      return `${v.min}-${v.max}`;\n    case 'identifier':\n      return v.value;\n  }\n}\n\nfunction quoteString(s: string): string {\n  return (\n    '\"' +\n    s\n      .replace(/\\\\/g, '\\\\\\\\')\n      .replace(/\"/g, '\\\\\"')\n      .replace(/\\n/g, '\\\\n') +\n    '\"'\n  );\n}\n","/**\n * Theme definitions for the Wireloom SVG renderer.\n *\n * A theme bundles colors, strokes, typography, and spacing into a single\n * object consumed by the layout engine and SVG emitter.\n */\n\nexport type AccentName =\n  | 'research'\n  | 'military'\n  | 'industry'\n  | 'wealth'\n  | 'approval'\n  | 'warning'\n  | 'danger'\n  | 'success';\n\nexport type StateName =\n  | 'locked'\n  | 'available'\n  | 'active'\n  | 'purchased'\n  | 'maxed'\n  | 'growing'\n  | 'ripe'\n  | 'withering'\n  | 'cashed';\n\n/** Rendering style for a cell/slot in a given state. */\nexport interface StateStyle {\n  border: string;\n  fill: string;\n  text: string;\n  /** Optional right-shoulder badge glyph rendered on the node (e.g. 🔒, ✓). */\n  badge?: string;\n}\n\nexport interface Theme {\n  name: string;\n\n  // Colors\n  background: string;\n  textColor: string;\n  mutedTextColor: string;\n  placeholderColor: string;\n  windowBorderColor: string;\n  panelBorderColor: string;\n  sectionTitleColor: string;\n  dividerColor: string;\n  chromeLineColor: string;\n  buttonBorderColor: string;\n  buttonFill: string;\n  buttonText: string;\n  primaryButtonFill: string;\n  primaryButtonText: string;\n  disabledColor: string;\n  tabActiveColor: string;\n  tabInactiveColor: string;\n  tabUnderlineColor: string;\n  slotBorderColor: string;\n  slotActiveBorderColor: string;\n  slotFillColor: string;\n  badgeFill: string;\n  badgeText: string;\n  sliderTrackColor: string;\n  sliderFillColor: string;\n  sliderThumbColor: string;\n  comboChevronColor: string;\n  bulletColor: string;\n  iconStrokeColor: string;\n\n  // Borders and strokes\n  windowStrokeWidth: number;\n  panelStrokeWidth: number;\n  panelStrokeDasharray: string;\n  chromeStrokeWidth: number;\n  dividerStrokeWidth: number;\n  buttonStrokeWidth: number;\n  inputStrokeWidth: number;\n  slotStrokeWidth: number;\n  slotActiveStrokeWidth: number;\n\n  // Typography\n  fontFamily: string;\n  fontSize: number;\n  titleFontSize: number;\n  sectionTitleFontSize: number;\n  smallFontSize: number;\n  largeFontSize: number;\n  badgeFontSize: number;\n  lineHeight: number;\n  averageCharWidth: number;\n\n  // Spacing\n  windowPadding: number;\n  titleBarHeight: number;\n  panelPadding: number;\n  headerPaddingY: number;\n  largeHeaderHeight: number;\n  footerPaddingY: number;\n  sectionTitleHeight: number;\n  sectionTitlePaddingBottom: number;\n  slotPadding: number;\n  slotTitleHeight: number;\n  rowGap: number;\n  colGap: number;\n  listGap: number;\n  dividerHeight: number;\n\n  // Controls\n  buttonHeight: number;\n  buttonPaddingX: number;\n  backButtonChevronWidth: number;\n  backButtonChevronGap: number;\n  backButtonChevronColor: string;\n  inputHeight: number;\n  inputPaddingX: number;\n  inputMinWidth: number;\n  comboHeight: number;\n  comboChevronWidth: number;\n  comboMinWidth: number;\n  sliderHeight: number;\n  sliderTrackHeight: number;\n  sliderThumbRadius: number;\n  sliderDefaultWidth: number;\n  imageDefaultWidth: number;\n  imageDefaultHeight: number;\n  iconSize: number;\n  /**\n   * Pixel size of the small inline icon glyph painted alongside text content\n   * inside `button`, `kv`, and `stat`. Smaller than the standalone `icon`\n   * primitive's box so the glyph reads as a leading mark, not a control.\n   */\n  inlineIconSize: number;\n  /** Horizontal gap between inline icon and the text it leads. */\n  inlineIconLabelGap: number;\n  tabHeight: number;\n  tabPaddingX: number;\n  tabGap: number;\n  tabbarHeight: number;\n  tabbarIconSize: number;\n  tabbarLabelFontSize: number;\n  tabbarIconLabelGap: number;\n  tabbarSelectedColor: string;\n  tabbarInactiveColor: string;\n  bulletWidth: number;\n  badgeHeight: number;\n  badgePaddingX: number;\n  kvMinWidth: number;\n  colFillMinWidth: number;\n\n  // v0.4 additions\n  cellMinSize: number;\n  cellPadding: number;\n  resourceBarHeight: number;\n  resourceBarItemGap: number;\n  resourceBarIconSize: number;\n  statsGap: number;\n  progressDefaultWidth: number;\n  progressMaxWidth: number;\n  progressHeight: number;\n  chartDefaultWidth: number;\n  chartDefaultHeight: number;\n\n  // v0.4.5 — widget primitives (tree/menubar/breadcrumb/chip/avatar/spinner/status/checkbox/radio/toggle)\n  treeIndent: number;\n  treeRowHeight: number;\n  treeIndentGuideColor: string;\n  treeGlyphColor: string;\n  treeSelectedBg: string;\n  treeSelectedText: string;\n\n  checkboxSize: number;\n  checkboxRowGap: number;\n  checkboxBorderColor: string;\n  checkboxFillColor: string;\n  checkboxCheckColor: string;\n\n  radioSize: number;\n  toggleWidth: number;\n  toggleHeight: number;\n  toggleOnColor: string;\n  toggleOffColor: string;\n  toggleKnobColor: string;\n  radioGroupGap: number;\n\n  menubarHeight: number;\n  menubarItemPaddingX: number;\n  menubarBgColor: string;\n  menubarBorderColor: string;\n  menuWidth: number;\n  menuItemHeight: number;\n  menuItemPaddingX: number;\n  menuBgColor: string;\n  menuBorderColor: string;\n  menuShortcutColor: string;\n  menuSeparatorColor: string;\n\n  chipHeight: number;\n  chipPaddingX: number;\n  chipBg: string;\n  chipBorder: string;\n  chipText: string;\n  chipSelectedBg: string;\n  chipSelectedBorder: string;\n  chipSelectedText: string;\n\n  avatarSizeSmall: number;\n  avatarSizeMedium: number;\n  avatarSizeLarge: number;\n  avatarBg: string;\n  avatarBorder: string;\n  avatarText: string;\n\n  breadcrumbHeight: number;\n  breadcrumbGap: number;\n  breadcrumbSeparatorColor: string;\n  breadcrumbCurrentColor: string;\n\n  // Disclosure chevron (v0.5) — trailing glyph on `slot`/`item` flagged with `chevron`.\n  chevronGlyphSize: number;\n  chevronGlyphGutter: number;\n  chevronGlyphStrokeWidth: number;\n  chevronGlyphColor: string;\n\n  // Segmented control (v0.5) — rounded pill with equal-width, mutually-exclusive segments.\n  segmentedHeight: number;\n  segmentedPaddingX: number;\n  segmentedMinSegmentWidth: number;\n  segmentedCornerRadius: number;\n  segmentedBg: string;\n  segmentedBorder: string;\n  segmentedDividerColor: string;\n  segmentedText: string;\n  segmentedSelectedBg: string;\n  segmentedSelectedText: string;\n\n  spinnerSize: number;\n  spinnerColor: string;\n\n  statusHeight: number;\n  statusPaddingX: number;\n  /** Per-kind background/text for status pills. Keys: success|info|warning|error. */\n  statusColors: Readonly<Record<'success' | 'info' | 'warning' | 'error', { bg: string; fg: string; border: string }>>;\n\n  // v0.50 — sheet overlay\n  sheetScrimColor: string;\n  sheetScrimOpacity: number;\n  sheetBg: string;\n  sheetBorder: string;\n  sheetStrokeWidth: number;\n  sheetCornerRadius: number;\n  sheetPadding: number;\n  sheetTitleHeight: number;\n  sheetTitleFontSize: number;\n  sheetGrabberWidth: number;\n  sheetGrabberHeight: number;\n  sheetGrabberColor: string;\n  sheetGrabberGap: number;\n  sheetCenterMinWidth: number;\n  sheetCenterMinHeight: number;\n  sheetCenterMargin: number;\n\n  // Annotations (user-manual-style callouts with leader lines)\n  annotationBg: string;\n  annotationBorder: string;\n  annotationText: string;\n  annotationLineColor: string;\n  annotationDotColor: string;\n  annotationStrokeWidth: number;\n  annotationDotRadius: number;\n  annotationCornerRadius: number;\n  annotationPaddingX: number;\n  annotationPaddingY: number;\n  annotationGap: number;\n  annotationMargin: number;\n  annotationStackGap: number;\n\n  /** Maps accent name → color used for borders, fills, and text treatments. */\n  accents: Readonly<Record<AccentName, string>>;\n  /** Maps state name → visual treatment applied to slots and cells. */\n  states: Readonly<Record<StateName, StateStyle>>;\n}\n\nexport const DEFAULT_THEME: Theme = Object.freeze({\n  name: 'default',\n\n  background: '#ffffff',\n  textColor: '#2d2d2d',\n  mutedTextColor: '#7a7f87',\n  placeholderColor: '#9aa0a6',\n  windowBorderColor: '#505050',\n  panelBorderColor: '#8a8a8a',\n  sectionTitleColor: '#6b7078',\n  dividerColor: '#c4c4c4',\n  chromeLineColor: '#b0b0b0',\n  buttonBorderColor: '#505050',\n  buttonFill: '#ffffff',\n  buttonText: '#2d2d2d',\n  primaryButtonFill: '#3a3a3a',\n  primaryButtonText: '#ffffff',\n  disabledColor: '#b8b8b8',\n  tabActiveColor: '#2d2d2d',\n  tabInactiveColor: '#8a8f97',\n  tabUnderlineColor: '#3a3a3a',\n  slotBorderColor: '#b5b8bd',\n  slotActiveBorderColor: '#3a3a3a',\n  slotFillColor: '#fafbfc',\n  badgeFill: '#eef0f3',\n  badgeText: '#505560',\n  sliderTrackColor: '#dde0e4',\n  sliderFillColor: '#6b7078',\n  sliderThumbColor: '#3a3a3a',\n  comboChevronColor: '#6b7078',\n  bulletColor: '#8a8f97',\n  iconStrokeColor: '#6b7078',\n\n  windowStrokeWidth: 1.25,\n  panelStrokeWidth: 1,\n  panelStrokeDasharray: '4 3',\n  chromeStrokeWidth: 1,\n  dividerStrokeWidth: 1,\n  buttonStrokeWidth: 1.25,\n  inputStrokeWidth: 1,\n  slotStrokeWidth: 1,\n  slotActiveStrokeWidth: 1.5,\n\n  fontFamily: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n  fontSize: 14,\n  titleFontSize: 16,\n  sectionTitleFontSize: 11,\n  smallFontSize: 12,\n  largeFontSize: 18,\n  badgeFontSize: 11,\n  lineHeight: 20,\n  averageCharWidth: 7.2,\n\n  windowPadding: 16,\n  titleBarHeight: 36,\n  panelPadding: 12,\n  headerPaddingY: 10,\n  largeHeaderHeight: 64,\n  footerPaddingY: 10,\n  sectionTitleHeight: 22,\n  sectionTitlePaddingBottom: 8,\n  slotPadding: 10,\n  slotTitleHeight: 22,\n  rowGap: 8,\n  colGap: 8,\n  listGap: 6,\n  dividerHeight: 12,\n\n  buttonHeight: 32,\n  buttonPaddingX: 16,\n  backButtonChevronWidth: 8,\n  backButtonChevronGap: 6,\n  backButtonChevronColor: '#2d2d2d',\n  inputHeight: 32,\n  inputPaddingX: 12,\n  inputMinWidth: 220,\n  comboHeight: 32,\n  comboChevronWidth: 24,\n  comboMinWidth: 180,\n  sliderHeight: 28,\n  sliderTrackHeight: 4,\n  sliderThumbRadius: 7,\n  sliderDefaultWidth: 220,\n  imageDefaultWidth: 120,\n  imageDefaultHeight: 80,\n  iconSize: 24,\n  inlineIconSize: 14,\n  inlineIconLabelGap: 6,\n  tabHeight: 36,\n  tabPaddingX: 14,\n  tabGap: 2,\n  tabbarHeight: 56,\n  tabbarIconSize: 22,\n  tabbarLabelFontSize: 11,\n  tabbarIconLabelGap: 3,\n  tabbarSelectedColor: '#2d2d2d',\n  tabbarInactiveColor: '#8a8f97',\n  bulletWidth: 16,\n  badgeHeight: 18,\n  badgePaddingX: 8,\n  kvMinWidth: 200,\n  colFillMinWidth: 220,\n\n  cellMinSize: 80,\n  cellPadding: 8,\n  resourceBarHeight: 28,\n  resourceBarItemGap: 16,\n  resourceBarIconSize: 18,\n  statsGap: 18,\n  progressDefaultWidth: 200,\n  progressMaxWidth: 600,\n  progressHeight: 18,\n  chartDefaultWidth: 220,\n  chartDefaultHeight: 120,\n\n  annotationBg: '#fefcf3',\n  annotationBorder: '#b8a26b',\n  annotationText: '#3d3526',\n  annotationLineColor: '#8a7a4f',\n  annotationDotColor: '#8a7a4f',\n  annotationStrokeWidth: 1,\n  annotationDotRadius: 3,\n  annotationCornerRadius: 4,\n  annotationPaddingX: 12,\n  annotationPaddingY: 8,\n  annotationGap: 48,\n  annotationMargin: 16,\n  annotationStackGap: 8,\n\n  treeIndent: 18,\n  treeRowHeight: 22,\n  treeIndentGuideColor: '#d8dadf',\n  treeGlyphColor: '#6b7078',\n  treeSelectedBg: '#e7edf5',\n  treeSelectedText: '#2d2d2d',\n\n  checkboxSize: 16,\n  checkboxRowGap: 8,\n  checkboxBorderColor: '#6b7078',\n  checkboxFillColor: '#ffffff',\n  checkboxCheckColor: '#2d2d2d',\n\n  radioSize: 16,\n  toggleWidth: 32,\n  toggleHeight: 18,\n  toggleOnColor: '#3a3a3a',\n  toggleOffColor: '#c4c4c4',\n  toggleKnobColor: '#ffffff',\n  radioGroupGap: 14,\n\n  menubarHeight: 28,\n  menubarItemPaddingX: 12,\n  menubarBgColor: '#f5f6f8',\n  menubarBorderColor: '#c4c4c4',\n  menuWidth: 200,\n  menuItemHeight: 24,\n  menuItemPaddingX: 12,\n  menuBgColor: '#ffffff',\n  menuBorderColor: '#8a8a8a',\n  menuShortcutColor: '#8a9099',\n  menuSeparatorColor: '#d8dadf',\n\n  chipHeight: 22,\n  chipPaddingX: 10,\n  chipBg: '#eef0f3',\n  chipBorder: '#c4c8ce',\n  chipText: '#3a3e44',\n  chipSelectedBg: '#3a3a3a',\n  chipSelectedBorder: '#3a3a3a',\n  chipSelectedText: '#ffffff',\n\n  avatarSizeSmall: 24,\n  avatarSizeMedium: 32,\n  avatarSizeLarge: 44,\n  avatarBg: '#e2e5ea',\n  avatarBorder: '#b5b8bd',\n  avatarText: '#3a3e44',\n\n  breadcrumbHeight: 22,\n  breadcrumbGap: 6,\n  breadcrumbSeparatorColor: '#8a9099',\n  breadcrumbCurrentColor: '#2d2d2d',\n\n  chevronGlyphSize: 5,\n  chevronGlyphGutter: 14,\n  chevronGlyphStrokeWidth: 1.4,\n  chevronGlyphColor: '#8a9099',\n\n  segmentedHeight: 28,\n  segmentedPaddingX: 14,\n  segmentedMinSegmentWidth: 64,\n  segmentedCornerRadius: 6,\n  segmentedBg: '#eef0f3',\n  segmentedBorder: '#c4c8ce',\n  segmentedDividerColor: '#b5b8bd',\n  segmentedText: '#3a3e44',\n  segmentedSelectedBg: '#3a3a3a',\n  segmentedSelectedText: '#ffffff',\n\n  spinnerSize: 16,\n  spinnerColor: '#6b7078',\n\n  statusHeight: 22,\n  statusPaddingX: 10,\n  statusColors: Object.freeze({\n    success: { bg: '#e8f3ec', fg: '#205537', border: '#3f8f5c' },\n    info: { bg: '#e7edf5', fg: '#234273', border: '#3f7cc2' },\n    warning: { bg: '#f7efdc', fg: '#6b4e15', border: '#c79a2e' },\n    error: { bg: '#f5e4e2', fg: '#5c2420', border: '#b0413c' },\n  }),\n\n  sheetScrimColor: '#1a1a1a',\n  sheetScrimOpacity: 0.45,\n  sheetBg: '#ffffff',\n  sheetBorder: '#8a8a8a',\n  sheetStrokeWidth: 1,\n  sheetCornerRadius: 14,\n  sheetPadding: 16,\n  sheetTitleHeight: 22,\n  sheetTitleFontSize: 15,\n  sheetGrabberWidth: 40,\n  sheetGrabberHeight: 4,\n  sheetGrabberColor: '#b5b8bd',\n  sheetGrabberGap: 10,\n  sheetCenterMinWidth: 260,\n  sheetCenterMinHeight: 120,\n  sheetCenterMargin: 24,\n\n  accents: Object.freeze({\n    research: '#3f7cc2',\n    military: '#b55442',\n    industry: '#c28a3a',\n    wealth: '#3f8f5c',\n    approval: '#7a56b0',\n    warning: '#c79a2e',\n    danger: '#b0413c',\n    success: '#3f8f5c',\n  }),\n  states: Object.freeze({\n    locked: {\n      border: '#b8b8b8',\n      fill: '#f0f0f0',\n      text: '#8a8f97',\n      badge: 'lock',\n    },\n    available: {\n      border: '#7a7f87',\n      fill: '#fafbfc',\n      text: '#2d2d2d',\n    },\n    active: {\n      border: '#3a3a3a',\n      fill: '#fafbfc',\n      text: '#2d2d2d',\n    },\n    purchased: {\n      border: '#3f8f5c',\n      fill: '#e8f3ec',\n      text: '#205537',\n      badge: 'check',\n    },\n    maxed: {\n      border: '#c28a3a',\n      fill: '#f7efdc',\n      text: '#6b4e15',\n      badge: 'star',\n    },\n    growing: {\n      border: '#7a9a5a',\n      fill: '#edf4e2',\n      text: '#44552a',\n    },\n    ripe: {\n      border: '#3f8f5c',\n      fill: '#d9eedf',\n      text: '#205537',\n      badge: 'check',\n    },\n    withering: {\n      border: '#a07245',\n      fill: '#f0e4d5',\n      text: '#6b4e2e',\n    },\n    cashed: {\n      border: '#b8b8b8',\n      fill: '#ededed',\n      text: '#7a7f87',\n    },\n  }),\n}) as Theme;\n\nexport const DARK_THEME: Theme = Object.freeze({\n  ...DEFAULT_THEME,\n  name: 'dark',\n  background: '#1e1e1e',\n  textColor: '#e0e0e0',\n  mutedTextColor: '#8a9099',\n  placeholderColor: '#6b7075',\n  windowBorderColor: '#8a8a8a',\n  panelBorderColor: '#6b6b6b',\n  sectionTitleColor: '#8a9099',\n  dividerColor: '#404040',\n  chromeLineColor: '#555555',\n  buttonBorderColor: '#b0b0b0',\n  buttonFill: '#2a2a2a',\n  buttonText: '#e0e0e0',\n  backButtonChevronColor: '#e0e0e0',\n  tabbarSelectedColor: '#f0f0f0',\n  tabbarInactiveColor: '#707780',\n  primaryButtonFill: '#d4d4d4',\n  primaryButtonText: '#1e1e1e',\n  disabledColor: '#5a5a5a',\n  tabActiveColor: '#f0f0f0',\n  tabInactiveColor: '#707780',\n  tabUnderlineColor: '#d4d4d4',\n  slotBorderColor: '#555a62',\n  slotActiveBorderColor: '#d4d4d4',\n  slotFillColor: '#252525',\n  badgeFill: '#353a42',\n  badgeText: '#b8bcc4',\n  sliderTrackColor: '#404040',\n  sliderFillColor: '#a0a4ac',\n  sliderThumbColor: '#d4d4d4',\n  comboChevronColor: '#8a9099',\n  bulletColor: '#707780',\n  iconStrokeColor: '#8a9099',\n\n  annotationBg: '#2c2a22',\n  annotationBorder: '#7a6a42',\n  annotationText: '#e8dfc4',\n  annotationLineColor: '#a8966a',\n  annotationDotColor: '#a8966a',\n\n  treeIndentGuideColor: '#404040',\n  treeGlyphColor: '#8a9099',\n  treeSelectedBg: '#2f3a4c',\n  treeSelectedText: '#e0e0e0',\n\n  checkboxBorderColor: '#8a9099',\n  checkboxFillColor: '#252525',\n  checkboxCheckColor: '#e0e0e0',\n\n  toggleOnColor: '#d4d4d4',\n  toggleOffColor: '#555555',\n  toggleKnobColor: '#1e1e1e',\n\n  menubarBgColor: '#2a2a2a',\n  menubarBorderColor: '#555555',\n  menuBgColor: '#252525',\n  menuBorderColor: '#6b6b6b',\n  menuShortcutColor: '#8a9099',\n  menuSeparatorColor: '#404040',\n\n  chipBg: '#353a42',\n  chipBorder: '#555a62',\n  chipText: '#b8bcc4',\n  chipSelectedBg: '#d4d4d4',\n  chipSelectedBorder: '#d4d4d4',\n  chipSelectedText: '#1e1e1e',\n\n  avatarBg: '#353a42',\n  avatarBorder: '#555a62',\n  avatarText: '#d4d4d4',\n\n  breadcrumbSeparatorColor: '#707780',\n  breadcrumbCurrentColor: '#f0f0f0',\n\n  chevronGlyphColor: '#8a9099',\n\n  segmentedBg: '#353a42',\n  segmentedBorder: '#555a62',\n  segmentedDividerColor: '#555a62',\n  segmentedText: '#b8bcc4',\n  segmentedSelectedBg: '#d4d4d4',\n  segmentedSelectedText: '#1e1e1e',\n\n  spinnerColor: '#8a9099',\n\n  statusColors: Object.freeze({\n    success: { bg: '#1f2e24', fg: '#b0e0c2', border: '#6bbd86' },\n    info: { bg: '#1f2a3a', fg: '#b0c7e8', border: '#6ba4e8' },\n    warning: { bg: '#3a2f1c', fg: '#f0d79a', border: '#e2aa57' },\n    error: { bg: '#3a2220', fg: '#edb4ae', border: '#d66863' },\n  }),\n\n  sheetScrimColor: '#000000',\n  sheetScrimOpacity: 0.55,\n  sheetBg: '#2a2a2a',\n  sheetBorder: '#6b6b6b',\n  sheetGrabberColor: '#555a62',\n\n  accents: Object.freeze({\n    research: '#6ba4e8',\n    military: '#d47967',\n    industry: '#e2aa57',\n    wealth: '#6bbd86',\n    approval: '#a58fd0',\n    warning: '#e2b84a',\n    danger: '#d66863',\n    success: '#6bbd86',\n  }),\n  states: Object.freeze({\n    locked: {\n      border: '#5a5a5a',\n      fill: '#2a2a2a',\n      text: '#707780',\n      badge: 'lock',\n    },\n    available: {\n      border: '#8a9099',\n      fill: '#252525',\n      text: '#e0e0e0',\n    },\n    active: {\n      border: '#d4d4d4',\n      fill: '#252525',\n      text: '#f0f0f0',\n    },\n    purchased: {\n      border: '#6bbd86',\n      fill: '#1f2e24',\n      text: '#b0e0c2',\n      badge: 'check',\n    },\n    maxed: {\n      border: '#e2aa57',\n      fill: '#3a2f1c',\n      text: '#f0d79a',\n      badge: 'star',\n    },\n    growing: {\n      border: '#9abb6f',\n      fill: '#242d1c',\n      text: '#c5d9a7',\n    },\n    ripe: {\n      border: '#6bbd86',\n      fill: '#1f3528',\n      text: '#b0e0c2',\n      badge: 'check',\n    },\n    withering: {\n      border: '#b58a5c',\n      fill: '#332a22',\n      text: '#d1b89a',\n    },\n    cashed: {\n      border: '#5a5a5a',\n      fill: '#2a2a2a',\n      text: '#8a9099',\n    },\n  }),\n}) as Theme;\n\nexport function getTheme(name: 'default' | 'dark'): Theme {\n  return name === 'dark' ? DARK_THEME : DEFAULT_THEME;\n}\n","/**\n * Layout engine for Wireloom (v0.2).\n *\n * Two-pass approach:\n *   1. Bottom-up `measure*` computes each node's intrinsic size.\n *   2. Top-down `position*` assigns absolute (x, y, width, height),\n *      distributing row slack across any `fill` columns and honoring\n *      `row align=…` for alignment.\n */\n\nimport type {\n  AnnotationNode,\n  AnnotationSide,\n  AnyNode,\n  Attribute,\n  AttributeFlag,\n  AttributePair,\n  AttributeValue,\n  AvatarNode,\n  BackButtonNode,\n  BreadcrumbNode,\n  ButtonNode,\n  CellNode,\n  TabBarNode,\n  TabItemNode,\n  ChartNode,\n  CheckboxNode,\n  ChipNode,\n  ColNode,\n  ComboNode,\n  ContainerChild,\n  CrumbNode,\n  DividerNode,\n  Document,\n  FooterNode,\n  GridNode,\n  HeaderNode,\n  IconNode,\n  ImageNode,\n  InputNode,\n  ItemNode,\n  KvNode,\n  ListNode,\n  MenubarNode,\n  MenuNode,\n  NavbarNode,\n  NavbarSlotNode,\n  PanelNode,\n  ProgressNode,\n  RadioNode,\n  ResourceBarNode,\n  ResourceNode,\n  RowNode,\n  SectionNode,\n  SegmentedNode,\n  SheetNode,\n  SliderNode,\n  SlotFooterNode,\n  SlotNode,\n  SpacerNode,\n  SpinnerNode,\n  StatNode,\n  StatsNode,\n  StatusNode,\n  TabNode,\n  TabsNode,\n  TextNode,\n  ToggleNode,\n  TreeItemNode,\n  TreeNode_,\n  WindowNode,\n} from '../parser/ast.js';\nimport type { Theme } from './themes.js';\n\nexport interface LaidOutNode {\n  node: AnyNode;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  children: LaidOutNode[];\n}\n\ninterface Size {\n  width: number;\n  height: number;\n}\n\n/**\n * A laid-out annotation: box rect + the two endpoints for its leader line.\n * Coordinates are in the same absolute canvas space as `LaidOutNode`.\n */\nexport interface LaidAnnotation {\n  node: AnnotationNode;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  /** Text lines (already split on `\\n`) for SVG emit. */\n  lines: string[];\n  /** Leader-line endpoint attached to the annotation box. */\n  boxAnchor: { x: number; y: number };\n  /** Leader-line endpoint attached to the target element. */\n  targetAnchor: { x: number; y: number };\n}\n\n/**\n * Full laid-out document: the window tree plus any annotations, with\n * an outer canvas size that already accounts for annotation margins.\n */\nexport interface LaidDocument {\n  canvasWidth: number;\n  canvasHeight: number;\n  root: LaidOutNode;\n  annotations: LaidAnnotation[];\n}\n\n// ---------------------------------------------------------------------------\n// Public entry\n// ---------------------------------------------------------------------------\n\n/**\n * Lay out a parsed document into absolute coordinates.\n *\n * The window is placed inside a canvas large enough to hold its annotation\n * margins. Annotations with targets that can't be resolved are silently\n * dropped — surface that as a warning in calling tools if desired.\n */\nexport function layout(doc: Document, theme: Theme): LaidDocument {\n  if (!doc.root) {\n    return { canvasWidth: 0, canvasHeight: 0, root: emptyLaidOut(), annotations: [] };\n  }\n\n  const measured = measureWindow(doc.root, theme);\n  const windowSize: Size = measured.outer;\n\n  const annotations = doc.annotations ?? [];\n  if (annotations.length === 0) {\n    // Fast path — identical to pre-v0.4 behavior.\n    const laidRoot = positionWindow(doc.root, measured, 0, 0, theme);\n    return {\n      canvasWidth: windowSize.width,\n      canvasHeight: windowSize.height,\n      root: laidRoot,\n      annotations: [],\n    };\n  }\n\n  // Group annotations by side so we can size margins independently.\n  const bySide: Record<AnnotationSide, AnnotationNode[]> = {\n    left: [],\n    right: [],\n    top: [],\n    bottom: [],\n  };\n  for (const a of annotations) bySide[a.side].push(a);\n\n  // Measure each annotation box once; reused during margin sizing + stacking.\n  const measuredBoxes = new Map<AnnotationNode, MeasuredAnnotation>();\n  for (const a of annotations) {\n    measuredBoxes.set(a, measureAnnotation(a, theme));\n  }\n\n  const marginLeft = sideMargin('left', bySide.left, measuredBoxes, theme);\n  const marginRight = sideMargin('right', bySide.right, measuredBoxes, theme);\n  const marginTop = sideMargin('top', bySide.top, measuredBoxes, theme);\n  const marginBottom = sideMargin('bottom', bySide.bottom, measuredBoxes, theme);\n\n  // Horizontal side margins may need to expand to fit stacked top/bottom\n  // annotations if the window itself is narrower than the top/bottom stack.\n  const topStackWidth = stackMainAxis('top', bySide.top, measuredBoxes, theme);\n  const bottomStackWidth = stackMainAxis('bottom', bySide.bottom, measuredBoxes, theme);\n  const contentWidth = Math.max(windowSize.width, topStackWidth, bottomStackWidth);\n\n  const leftStackHeight = stackMainAxis('left', bySide.left, measuredBoxes, theme);\n  const rightStackHeight = stackMainAxis('right', bySide.right, measuredBoxes, theme);\n  const contentHeight = Math.max(windowSize.height, leftStackHeight, rightStackHeight);\n\n  const canvasWidth = marginLeft + contentWidth + marginRight;\n  const canvasHeight = marginTop + contentHeight + marginBottom;\n\n  const windowX = marginLeft + (contentWidth - windowSize.width) / 2;\n  const windowY = marginTop + (contentHeight - windowSize.height) / 2;\n\n  const laidRoot = positionWindow(doc.root, measured, windowX, windowY, theme);\n\n  // Build id → rect map by walking the laid tree.\n  const idMap = buildIdMap(laidRoot);\n\n  const laidAnnotations: LaidAnnotation[] = [];\n  for (const side of ['left', 'right', 'top', 'bottom'] as const) {\n    const placed = placeAnnotationsOnSide(\n      side,\n      bySide[side],\n      measuredBoxes,\n      idMap,\n      { x: windowX, y: windowY, width: windowSize.width, height: windowSize.height },\n      canvasWidth,\n      canvasHeight,\n      theme,\n    );\n    laidAnnotations.push(...placed);\n  }\n\n  return {\n    canvasWidth,\n    canvasHeight,\n    root: laidRoot,\n    annotations: laidAnnotations,\n  };\n}\n\nfunction emptyLaidOut(): LaidOutNode {\n  return {\n    node: {\n      kind: 'window',\n      attributes: [],\n      children: [],\n      position: { line: 1, column: 1 },\n    } as WindowNode,\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n    children: [],\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Measurement (bottom-up intrinsic sizes)\n// ---------------------------------------------------------------------------\n\nfunction measureChild(node: ContainerChild, theme: Theme): Size {\n  switch (node.kind) {\n    case 'text':\n      return measureText(node, theme);\n    case 'button':\n      return measureButton(node, theme);\n    case 'backbutton':\n      return measureBackButton(node, theme);\n    case 'input':\n      return measureInput(node, theme);\n    case 'divider':\n      return measureDivider(theme);\n    case 'spacer':\n      return measureSpacer();\n    case 'panel':\n      return measurePanel(node, theme);\n    case 'section':\n      return measureSection(node, theme);\n    case 'tabs':\n      return measureTabs(node, theme);\n    case 'row':\n      return measureRow(node, theme);\n    case 'col':\n      return measureCol(node, theme);\n    case 'list':\n      return measureList(node, theme);\n    case 'slot':\n      return measureSlot(node, theme);\n    case 'kv':\n      return measureKv(node, theme);\n    case 'combo':\n      return measureCombo(node, theme);\n    case 'slider':\n      return measureSlider(theme);\n    case 'image':\n      return measureImage(node, theme);\n    case 'icon':\n      return measureIcon(theme);\n    case 'grid':\n      return measureGrid(node, theme);\n    case 'resourcebar':\n      return measureResourceBar(node, theme);\n    case 'stats':\n      return measureStats(node, theme);\n    case 'progress':\n      return measureProgress(node, theme);\n    case 'chart':\n      return measureChart(node, theme);\n    case 'tree':\n      return measureTree(node, theme);\n    case 'menubar':\n      return measureMenubar(node, theme);\n    case 'menu':\n      return measureMenu(node, theme);\n    case 'breadcrumb':\n      return measureBreadcrumb(node, theme);\n    case 'checkbox':\n      return measureCheckbox(node, theme);\n    case 'radio':\n      return measureRadio(node, theme);\n    case 'toggle':\n      return measureToggle(node, theme);\n    case 'chip':\n      return measureChip(node, theme);\n    case 'avatar':\n      return measureAvatar(node, theme);\n    case 'spinner':\n      return measureSpinner(node, theme);\n    case 'status':\n      return measureStatus(node, theme);\n    case 'segmented':\n      return measureSegmented(node, theme);\n  }\n}\n\n// --- v0.4.5 measurements --------------------------------------------------\n\nfunction measureTree(node: TreeNode_, theme: Theme): Size {\n  let maxW = 0;\n  let totalRows = 0;\n  const walk = (n: TreeItemNode, depth: number): void => {\n    totalRows++;\n    const labelW = n.label.length * theme.averageCharWidth;\n    const rowW = depth * theme.treeIndent + theme.treeIndent + labelW;\n    if (rowW > maxW) maxW = rowW;\n    const collapsed = hasFlagAttr(n.attributes, 'collapsed');\n    if (!collapsed) {\n      for (const child of n.children) walk(child, depth + 1);\n    }\n  };\n  for (const n of node.children) walk(n, 0);\n  return { width: maxW, height: totalRows * theme.treeRowHeight };\n}\n\nfunction measureMenubar(node: MenubarNode, theme: Theme): Size {\n  const totalW = node.children.reduce(\n    (acc, m) => acc + m.label.length * theme.averageCharWidth + theme.menubarItemPaddingX * 2,\n    0,\n  );\n  return { width: totalW, height: theme.menubarHeight };\n}\n\nfunction measureMenu(node: MenuNode, theme: Theme): Size {\n  // Standalone menu renders as a dropdown box with its items. Width is\n  // max(menuWidth, widest row). Height is items * row + 1px border.\n  let maxLabel = node.label.length * theme.averageCharWidth;\n  let itemCount = 0;\n  for (const c of node.children) {\n    if (c.kind === 'menuitem') {\n      const shortcut = getAttrString(c.attributes, 'shortcut');\n      const rowW =\n        c.label.length * theme.averageCharWidth +\n        (shortcut ? shortcut.length * theme.averageCharWidth + 24 : 0);\n      if (rowW > maxLabel) maxLabel = rowW;\n      itemCount++;\n    } else if (c.kind === 'separator') {\n      itemCount++;\n    } else if (c.kind === 'menu') {\n      const rowW = c.label.length * theme.averageCharWidth + 24;\n      if (rowW > maxLabel) maxLabel = rowW;\n      itemCount++;\n    }\n  }\n  const width = Math.max(theme.menuWidth, maxLabel + theme.menuItemPaddingX * 2);\n  const height = itemCount * theme.menuItemHeight + 4; // border padding\n  return { width, height };\n}\n\nfunction measureBreadcrumb(node: BreadcrumbNode, theme: Theme): Size {\n  if (node.children.length === 0) return { width: 0, height: theme.breadcrumbHeight };\n  const labels = node.children.map(\n    (c) => c.label.length * theme.averageCharWidth + (getAttrString(c.attributes, 'icon') ? theme.iconSize + 4 : 0),\n  );\n  const total =\n    labels.reduce((a, b) => a + b, 0) +\n    (node.children.length - 1) * (theme.breadcrumbGap * 2 + 8); // chevron width\n  return { width: total, height: theme.breadcrumbHeight };\n}\n\nfunction measureCheckbox(node: CheckboxNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth;\n  return {\n    width: theme.checkboxSize + theme.checkboxRowGap + labelW,\n    height: Math.max(theme.checkboxSize, theme.lineHeight),\n  };\n}\n\nfunction measureRadio(node: RadioNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth;\n  return {\n    width: theme.radioSize + theme.checkboxRowGap + labelW,\n    height: Math.max(theme.radioSize, theme.lineHeight),\n  };\n}\n\nfunction measureToggle(node: ToggleNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth;\n  return {\n    width: theme.toggleWidth + theme.checkboxRowGap + labelW,\n    height: Math.max(theme.toggleHeight, theme.lineHeight),\n  };\n}\n\nfunction measureChip(node: ChipNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth;\n  const iconExtra = getAttrString(node.attributes, 'icon') ? 16 : 0;\n  const closeExtra = hasFlagAttr(node.attributes, 'closable') ? 16 : 0;\n  return {\n    width: labelW + iconExtra + closeExtra + theme.chipPaddingX * 2,\n    height: theme.chipHeight,\n  };\n}\n\nfunction measureAvatar(node: AvatarNode, theme: Theme): Size {\n  const sizeName = getAttrIdent(node.attributes, 'size') ?? 'medium';\n  const size =\n    sizeName === 'small'\n      ? theme.avatarSizeSmall\n      : sizeName === 'large'\n        ? theme.avatarSizeLarge\n        : theme.avatarSizeMedium;\n  return { width: size, height: size };\n}\n\nfunction measureSpinner(node: SpinnerNode, theme: Theme): Size {\n  const labelW = node.label ? node.label.length * theme.averageCharWidth + theme.checkboxRowGap : 0;\n  return {\n    width: theme.spinnerSize + labelW,\n    height: Math.max(theme.spinnerSize, theme.lineHeight),\n  };\n}\n\nfunction measureStatus(node: StatusNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth;\n  return {\n    width: labelW + 14 + theme.statusPaddingX * 2, // icon glyph + padding\n    height: theme.statusHeight,\n  };\n}\n\nfunction measureSegmented(node: SegmentedNode, theme: Theme): Size {\n  if (node.children.length === 0) {\n    return { width: theme.segmentedMinSegmentWidth, height: theme.segmentedHeight };\n  }\n  // All segments get the same width — take the widest label plus padding.\n  let maxSegW = theme.segmentedMinSegmentWidth;\n  for (const seg of node.children) {\n    const labelW = seg.label.length * theme.averageCharWidth + theme.segmentedPaddingX * 2;\n    if (labelW > maxSegW) maxSegW = labelW;\n  }\n  return {\n    width: maxSegW * node.children.length,\n    height: theme.segmentedHeight,\n  };\n}\n\nfunction measureText(node: TextNode, theme: Theme): Size {\n  return {\n    width: textWidth(node.content, node.attributes, theme),\n    height: textLineHeight(node.attributes, theme),\n  };\n}\n\nfunction measureButton(node: ButtonNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth;\n  const badgeW = badgeWidthOf(node.attributes, theme);\n  const hasIconAttr = getAttrString(node.attributes, 'icon') !== undefined;\n  const iconBlockW = hasIconAttr\n    ? theme.inlineIconSize + (node.label.length > 0 ? theme.inlineIconLabelGap : 0)\n    : 0;\n  return {\n    width:\n      iconBlockW + labelW + theme.buttonPaddingX * 2 + (badgeW > 0 ? badgeW + theme.rowGap : 0),\n    height: theme.buttonHeight,\n  };\n}\n\nfunction measureBackButton(node: BackButtonNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth;\n  return {\n    width: theme.backButtonChevronWidth + theme.backButtonChevronGap + labelW + theme.buttonPaddingX * 2,\n    height: theme.buttonHeight,\n  };\n}\n\nfunction measureInput(node: InputNode, theme: Theme): Size {\n  const placeholder = getAttrString(node.attributes, 'placeholder');\n  const textW = placeholder ? placeholder.length * theme.averageCharWidth : 0;\n  return {\n    width: Math.max(theme.inputMinWidth, textW + theme.inputPaddingX * 2),\n    height: theme.inputHeight,\n  };\n}\n\nfunction measureDivider(theme: Theme): Size {\n  return { width: 0, height: theme.dividerHeight };\n}\n\nfunction measureSpacer(): Size {\n  // Spacer's intrinsic size is zero on both axes. Its rendered width comes\n  // from the row's slack-distribution pass; it contributes no height so it\n  // never forces the row taller than its other children.\n  return { width: 0, height: 0 };\n}\n\nfunction measurePanel(node: PanelNode, theme: Theme): Size {\n  const inner = measureStack(node.children, theme, 'vertical');\n  return {\n    width: inner.width + theme.panelPadding * 2,\n    height: inner.height + theme.panelPadding * 2,\n  };\n}\n\nfunction measureSection(node: SectionNode, theme: Theme): Size {\n  const inner = measureStack(node.children, theme, 'vertical');\n  const titleRowW =\n    node.title.length * theme.averageCharWidth +\n    badgeWidthOf(node.attributes, theme) +\n    theme.rowGap;\n  return {\n    width: Math.max(inner.width, titleRowW),\n    height:\n      theme.sectionTitleHeight +\n      theme.sectionTitlePaddingBottom +\n      inner.height +\n      theme.panelPadding,\n  };\n}\n\nfunction measureTabs(node: TabsNode, theme: Theme): Size {\n  const sizes = node.children.map((t) => measureTab(t, theme));\n  const total = sizes.reduce((acc, s) => acc + s.width, 0) +\n    Math.max(0, node.children.length - 1) * theme.tabGap;\n  return { width: total, height: theme.tabHeight };\n}\n\nfunction measureTab(node: TabNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth;\n  const badgeW = badgeWidthOf(node.attributes, theme);\n  return {\n    width: labelW + theme.tabPaddingX * 2 + (badgeW > 0 ? badgeW + 6 : 0),\n    height: theme.tabHeight,\n  };\n}\n\nfunction measureRow(node: RowNode, theme: Theme): Size {\n  return measureStack(node.children, theme, 'horizontal');\n}\n\nfunction measureCol(node: ColNode, theme: Theme): Size {\n  const inner = measureStack(node.children, theme, 'vertical');\n  if (node.width.kind === 'length' && node.width.unit === 'px') {\n    return { width: node.width.value, height: inner.height };\n  }\n  // `fill` — use max(content, colFillMinWidth) for parent-sizing purposes.\n  // The actual width gets assigned during row positioning when slack is distributed.\n  return {\n    width: Math.max(inner.width, theme.colFillMinWidth),\n    height: inner.height,\n  };\n}\n\nfunction measureList(node: ListNode, theme: Theme): Size {\n  if (node.children.length === 0) return { width: 0, height: 0 };\n  let maxW = 0;\n  let totalH = 0;\n  for (const child of node.children) {\n    const size = child.kind === 'item' ? measureItem(child, theme) : measureSlot(child, theme);\n    if (size.width > maxW) maxW = size.width;\n    totalH += size.height;\n  }\n  totalH += (node.children.length - 1) * theme.listGap;\n  return { width: maxW, height: totalH };\n}\n\nfunction measureItem(node: ItemNode, theme: Theme): Size {\n  const textW = node.text.length * theme.averageCharWidth;\n  const chevronExtra = hasFlagAttr(node.attributes, 'chevron') ? theme.chevronGlyphGutter : 0;\n  return {\n    width: theme.bulletWidth + textW + chevronExtra,\n    height: theme.lineHeight,\n  };\n}\n\nfunction measureSlot(node: SlotNode, theme: Theme): Size {\n  const inner = measureStack(node.children, theme, 'vertical');\n  const chevronExtra = hasFlagAttr(node.attributes, 'chevron') ? theme.chevronGlyphGutter : 0;\n  const titleW = node.title.length * theme.averageCharWidth + chevronExtra;\n  let footerH = 0;\n  let footerW = 0;\n  if (node.slotFooter) {\n    const f = measureSlotFooter(node.slotFooter, theme);\n    footerH = f.height + theme.colGap;\n    footerW = f.width;\n  }\n  return {\n    width: Math.max(inner.width, titleW, footerW) + theme.slotPadding * 2,\n    height:\n      theme.slotTitleHeight +\n      theme.sectionTitlePaddingBottom +\n      inner.height +\n      footerH +\n      theme.slotPadding * 2,\n  };\n}\n\nfunction measureSlotFooter(node: SlotFooterNode, theme: Theme): Size {\n  return measureStack(node.children, theme, 'horizontal');\n}\n\n// --- Grid / Cell ----------------------------------------------------------\n\nfunction measureGrid(node: GridNode, theme: Theme): Size {\n  const cellSize = preferredCellSize(node, theme);\n  const width = node.cols * cellSize.width + (node.cols - 1) * theme.rowGap;\n  const height = node.rows * cellSize.height + (node.rows - 1) * theme.colGap;\n  return { width, height };\n}\n\nfunction preferredCellSize(node: GridNode, theme: Theme): Size {\n  // Cell size is the max intrinsic of any child cell, with a minimum for\n  // aesthetic consistency (matrix-style grids look odd if cells are tiny).\n  let maxW = theme.cellMinSize;\n  let maxH = theme.cellMinSize;\n  for (const c of node.children) {\n    const s = measureCell(c, theme);\n    if (s.width > maxW) maxW = s.width;\n    if (s.height > maxH) maxH = s.height;\n  }\n  return { width: maxW, height: maxH };\n}\n\nfunction measureCell(node: CellNode, theme: Theme): Size {\n  const inner = measureStack(node.children, theme, 'vertical');\n  const labelW = node.label ? node.label.length * theme.averageCharWidth : 0;\n  const labelH = node.label ? theme.lineHeight : 0;\n  return {\n    width: Math.max(inner.width, labelW) + theme.cellPadding * 2,\n    height: inner.height + labelH + theme.cellPadding * 2,\n  };\n}\n\n// --- ResourceBar ----------------------------------------------------------\n\nfunction measureResourceBar(node: ResourceBarNode, theme: Theme): Size {\n  if (node.children.length === 0) {\n    return { width: 0, height: theme.resourceBarHeight };\n  }\n  const sizes = node.children.map((r) => measureResource(r, theme));\n  const total = sizes.reduce((acc, s) => acc + s.width, 0) +\n    (node.children.length - 1) * theme.resourceBarItemGap;\n  return { width: total, height: theme.resourceBarHeight };\n}\n\nfunction measureResource(node: ResourceNode, theme: Theme): Size {\n  const text = `${node.name}: ${node.value}`;\n  const textW = text.length * theme.averageCharWidth;\n  // Icon + small gap + text\n  return {\n    width: theme.resourceBarIconSize + 6 + textW,\n    height: theme.resourceBarHeight,\n  };\n}\n\n// --- Stats ----------------------------------------------------------------\n\nfunction measureStats(node: StatsNode, theme: Theme): Size {\n  if (node.children.length === 0) return { width: 0, height: 0 };\n  const sizes = node.children.map((s) => measureStat(s, theme));\n  const total = sizes.reduce((acc, s) => acc + s.width, 0) +\n    (node.children.length - 1) * theme.statsGap;\n  const h = Math.max(...sizes.map((s) => s.height));\n  return { width: total, height: h };\n}\n\nfunction measureStat(node: StatNode, theme: Theme): Size {\n  // \"LABEL value\" — inline compact form, optionally prefixed by a small icon.\n  const labelW = node.label.length * theme.averageCharWidth * (theme.smallFontSize / theme.fontSize);\n  const valueW = node.value.length * theme.averageCharWidth;\n  const statIconSize = theme.smallFontSize + 2;\n  const iconBlockW =\n    getAttrString(node.attributes, 'icon') !== undefined ? statIconSize + 4 : 0;\n  return {\n    width: iconBlockW + labelW + 6 + valueW,\n    height: theme.lineHeight,\n  };\n}\n\n// --- Progress / Chart -----------------------------------------------------\n\nfunction measureProgress(node: ProgressNode, theme: Theme): Size {\n  const label = getAttrString(node.attributes, 'label');\n  const labelH = label !== undefined ? theme.smallFontSize + 4 : 0;\n  return {\n    width: theme.progressDefaultWidth,\n    height: labelH + theme.progressHeight,\n  };\n}\n\nfunction measureChart(node: ChartNode, theme: Theme): Size {\n  const width = getAttrNumber(node.attributes, 'width') ?? theme.chartDefaultWidth;\n  const height = getAttrNumber(node.attributes, 'height') ?? theme.chartDefaultHeight;\n  return { width, height };\n}\n\nfunction measureKv(node: KvNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth;\n  const valueW = node.value.length * textSizeScale(node.attributes, theme) * theme.averageCharWidth;\n  const iconBlockW =\n    getAttrString(node.attributes, 'icon') !== undefined\n      ? theme.inlineIconSize + theme.inlineIconLabelGap\n      : 0;\n  return {\n    width: Math.max(theme.kvMinWidth, iconBlockW + labelW + valueW + theme.rowGap * 3),\n    height: textLineHeight(node.attributes, theme),\n  };\n}\n\nfunction measureCombo(node: ComboNode, theme: Theme): Size {\n  const value = getAttrString(node.attributes, 'value') ?? node.label ?? '';\n  const textW = value.length * theme.averageCharWidth;\n  return {\n    width: Math.max(theme.comboMinWidth, textW + theme.inputPaddingX * 2 + theme.comboChevronWidth),\n    height: theme.comboHeight,\n  };\n}\n\nfunction measureSlider(theme: Theme): Size {\n  return {\n    width: theme.sliderDefaultWidth,\n    height: theme.sliderHeight,\n  };\n}\n\nfunction measureImage(node: ImageNode, theme: Theme): Size {\n  const width = getAttrNumber(node.attributes, 'width') ?? theme.imageDefaultWidth;\n  const height = getAttrNumber(node.attributes, 'height') ?? theme.imageDefaultHeight;\n  return { width, height };\n}\n\nfunction measureIcon(theme: Theme): Size {\n  return { width: theme.iconSize, height: theme.iconSize };\n}\n\nfunction measureStack(\n  children: ContainerChild[],\n  theme: Theme,\n  direction: 'vertical' | 'horizontal',\n): Size {\n  if (children.length === 0) return { width: 0, height: 0 };\n  const sizes = children.map((c) => measureChild(c, theme));\n  if (direction === 'vertical') {\n    const maxChildWidth = Math.max(\n      0,\n      ...sizes.map((s, i) => (children[i]?.kind === 'divider' ? 0 : s.width)),\n    );\n    const totalChildHeight = sizes.reduce((acc, s) => acc + s.height, 0);\n    const gaps = Math.max(0, children.length - 1) * theme.colGap;\n    return { width: maxChildWidth, height: totalChildHeight + gaps };\n  }\n  const totalChildWidth = sizes.reduce((acc, s) => acc + s.width, 0);\n  const maxChildHeight = Math.max(0, ...sizes.map((s) => s.height));\n  const gaps = Math.max(0, children.length - 1) * theme.rowGap;\n  return { width: totalChildWidth + gaps, height: maxChildHeight };\n}\n\n// ---------------------------------------------------------------------------\n// TabBar (bottom mobile-chrome band)\n// ---------------------------------------------------------------------------\n\nfunction measureTabBar(node: TabBarNode, theme: Theme): Size {\n  // Width is the intrinsic sum of tabitem widths; the window grows to fit.\n  // At position time the band is stretched to the outer window width and\n  // items are re-distributed evenly.\n  if (node.children.length === 0) {\n    return { width: 0, height: theme.tabbarHeight };\n  }\n  const sizes = node.children.map((t) => measureTabItem(t, theme));\n  const total = sizes.reduce((acc, s) => acc + s.width, 0);\n  return { width: total, height: theme.tabbarHeight };\n}\n\nfunction measureTabItem(node: TabItemNode, theme: Theme): Size {\n  const labelW = node.label.length * theme.averageCharWidth * (theme.tabbarLabelFontSize / theme.fontSize);\n  const minItemWidth = Math.max(labelW, theme.tabbarIconSize) + 12;\n  return { width: minItemWidth, height: theme.tabbarHeight };\n}\n\nfunction positionTabBar(\n  node: TabBarNode,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  _theme: Theme,\n): LaidOutNode {\n  const n = node.children.length;\n  const children: LaidOutNode[] = [];\n  if (n > 0) {\n    const itemWidth = width / n;\n    for (let i = 0; i < n; i++) {\n      const item = node.children[i]!;\n      children.push({\n        node: item,\n        x: x + i * itemWidth,\n        y,\n        width: itemWidth,\n        height,\n        children: [],\n      });\n    }\n  }\n  return { node, x, y, width, height, children };\n}\n\n// ---------------------------------------------------------------------------\n// Window measurement (separate from generic because of title bar + header/footer)\n// ---------------------------------------------------------------------------\n\ninterface WindowMeasurement {\n  outer: Size;\n  body: Size;\n  headerHeight: number;\n  navbarHeight: number;\n  footerHeight: number;\n  tabbarHeight: number;\n  hasTitleBar: boolean;\n}\n\nfunction measureWindow(node: WindowNode, theme: Theme): WindowMeasurement {\n  const { header, navbar, footer, tabbar, bodyChildren } = classifyWindowChildren(node);\n\n  const bodyStack = measureStack(bodyChildren, theme, 'vertical');\n  let bodyWidth = bodyStack.width;\n  let bodyHeight = bodyStack.height;\n\n  let headerHeight = 0;\n  if (header) {\n    const hs = measureHeaderOrFooter(header, theme, 'header');\n    headerHeight = hs.height;\n    bodyWidth = Math.max(bodyWidth, hs.width);\n  }\n  let navbarHeight = 0;\n  if (navbar) {\n    const ns = measureNavbar(navbar, theme);\n    navbarHeight = ns.height;\n    bodyWidth = Math.max(bodyWidth, ns.width);\n  }\n  let footerHeight = 0;\n  if (footer) {\n    const fs = measureHeaderOrFooter(footer, theme, 'footer');\n    footerHeight = fs.height;\n    bodyWidth = Math.max(bodyWidth, fs.width);\n  }\n  let tabbarHeight = 0;\n  if (tabbar) {\n    const ts = measureTabBar(tabbar, theme);\n    tabbarHeight = ts.height;\n    bodyWidth = Math.max(bodyWidth, ts.width);\n  }\n\n  const hasTitleBar = node.title !== undefined;\n  const padding = theme.windowPadding;\n  const bodySize: Size = {\n    width: bodyWidth + padding * 2,\n    height: bodyHeight + padding * 2,\n  };\n  const outerWidth = Math.max(bodySize.width, titleWidth(node.title, theme));\n  const outerHeight =\n    (hasTitleBar ? theme.titleBarHeight : 0) +\n    headerHeight +\n    navbarHeight +\n    bodySize.height +\n    footerHeight +\n    tabbarHeight;\n\n  return {\n    outer: { width: outerWidth, height: outerHeight },\n    body: bodySize,\n    headerHeight,\n    navbarHeight,\n    footerHeight,\n    tabbarHeight,\n    hasTitleBar,\n  };\n}\n\n/**\n * Measure a navbar's intrinsic size. Width is `leading + trailing` plus\n * window padding (the central spacer's width is variable). Height is the\n * tallest slot child plus chrome-band vertical padding, with a floor of\n * the standard button height so an empty-ish navbar still reads as a band.\n */\nfunction measureNavbar(node: NavbarNode, theme: Theme): Size {\n  const leadingSize = node.leading\n    ? measureStack(node.leading.children, theme, 'horizontal')\n    : { width: 0, height: 0 };\n  const centerSize = node.center\n    ? measureStack(node.center.children, theme, 'horizontal')\n    : { width: 0, height: 0 };\n  const trailingSize = node.trailing\n    ? measureStack(node.trailing.children, theme, 'horizontal')\n    : { width: 0, height: 0 };\n  const innerHeight = Math.max(\n    leadingSize.height,\n    centerSize.height,\n    trailingSize.height,\n    theme.buttonHeight,\n  );\n  // Minimum navbar width: enough to fit all three clusters side-by-side with\n  // gaps, so the center cluster can sit between leading and trailing without\n  // overlap at the smallest measured size.\n  const presentSlots =\n    (leadingSize.width > 0 ? 1 : 0) +\n    (centerSize.width > 0 ? 1 : 0) +\n    (trailingSize.width > 0 ? 1 : 0);\n  const totalGap = Math.max(0, presentSlots - 1) * theme.rowGap;\n  return {\n    width:\n      leadingSize.width +\n      centerSize.width +\n      trailingSize.width +\n      totalGap +\n      theme.windowPadding * 2,\n    height: innerHeight + theme.headerPaddingY * 2,\n  };\n}\n\nfunction measureHeaderOrFooter(\n  node: HeaderNode | FooterNode,\n  theme: Theme,\n  kind: 'header' | 'footer',\n): Size {\n  if (kind === 'header' && hasFlagAttr(node.attributes, 'large')) {\n    // Large-title header: tall band, text child promoted to largeFontSize/bold\n    // for width calculation so outer window grows to fit the oversized title.\n    const scale = theme.largeFontSize / theme.fontSize;\n    let titleWidth = 0;\n    for (const c of node.children) {\n      if (c.kind === 'text') {\n        const w = c.content.length * theme.averageCharWidth * scale;\n        if (w > titleWidth) titleWidth = w;\n      } else {\n        const w = measureChild(c, theme).width;\n        if (w > titleWidth) titleWidth = w;\n      }\n    }\n    return {\n      width: titleWidth + theme.windowPadding * 2,\n      height: theme.largeHeaderHeight,\n    };\n  }\n  const direction = footerHorizontal(node, kind) ? 'horizontal' : 'vertical';\n  const inner = measureStack(node.children, theme, direction);\n  const padY = kind === 'header' ? theme.headerPaddingY : theme.footerPaddingY;\n  return {\n    width: inner.width + theme.windowPadding * 2,\n    height: inner.height + padY * 2,\n  };\n}\n\nfunction footerHorizontal(node: HeaderNode | FooterNode, kind: 'header' | 'footer'): boolean {\n  if (node.children.length === 0) return false;\n  const allBandable = node.children.every(\n    (c) => c.kind === 'button' || c.kind === 'text' || c.kind === 'row' || c.kind === 'spacer',\n  );\n  if (!allBandable) return false;\n  // Footers default to a horizontal action band. Headers stay vertical/centered\n  // (their normal title behavior) unless they explicitly opt in with a `spacer`,\n  // which turns the header into a left/right action band (e.g. title + button).\n  if (kind === 'footer') return true;\n  return node.children.some((c) => c.kind === 'spacer');\n}\n\nfunction classifyWindowChildren(node: WindowNode): {\n  header: HeaderNode | undefined;\n  navbar: NavbarNode | undefined;\n  footer: FooterNode | undefined;\n  tabbar: TabBarNode | undefined;\n  sheet: SheetNode | undefined;\n  bodyChildren: ContainerChild[];\n} {\n  let header: HeaderNode | undefined;\n  let navbar: NavbarNode | undefined;\n  let footer: FooterNode | undefined;\n  let tabbar: TabBarNode | undefined;\n  let sheet: SheetNode | undefined;\n  const bodyChildren: ContainerChild[] = [];\n  for (const child of node.children) {\n    if (child.kind === 'header') header = child;\n    else if (child.kind === 'navbar') navbar = child;\n    else if (child.kind === 'footer') footer = child;\n    else if (child.kind === 'tabbar') tabbar = child;\n    else if (child.kind === 'sheet') sheet = child;\n    else bodyChildren.push(child as ContainerChild);\n  }\n  return { header, navbar, footer, tabbar, sheet, bodyChildren };\n}\n\nfunction titleWidth(title: string | undefined, theme: Theme): number {\n  if (!title) return 0;\n  return (\n    title.length * (theme.averageCharWidth * (theme.titleFontSize / theme.fontSize)) +\n    theme.windowPadding * 2\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Position (top-down with width assignment + fill distribution)\n// ---------------------------------------------------------------------------\n\nfunction positionWindow(\n  node: WindowNode,\n  m: WindowMeasurement,\n  x: number,\n  y: number,\n  theme: Theme,\n): LaidOutNode {\n  const childrenLaid: LaidOutNode[] = [];\n  const outerWidth = m.outer.width;\n  let cursorY = y;\n\n  if (m.hasTitleBar) {\n    cursorY += theme.titleBarHeight;\n  }\n\n  const { header, navbar, footer, tabbar, sheet, bodyChildren } = classifyWindowChildren(node);\n\n  if (header) {\n    const laidHeader = positionHeaderOrFooter(\n      header,\n      'header',\n      x,\n      cursorY,\n      outerWidth,\n      m.headerHeight,\n      theme,\n    );\n    childrenLaid.push(laidHeader);\n    cursorY += m.headerHeight;\n  }\n\n  if (navbar) {\n    const laidNavbar = positionNavbar(navbar, x, cursorY, outerWidth, m.navbarHeight, theme);\n    childrenLaid.push(laidNavbar);\n    cursorY += m.navbarHeight;\n  }\n\n  const bodyY = cursorY;\n  const bodyInnerX = x + theme.windowPadding;\n  const bodyInnerY = bodyY + theme.windowPadding;\n  const bodyInnerWidth = outerWidth - theme.windowPadding * 2;\n\n  let innerCursorY = bodyInnerY;\n  for (let i = 0; i < bodyChildren.length; i++) {\n    const child = bodyChildren[i]!;\n    const laidChild = positionContainerChild(child, bodyInnerX, innerCursorY, bodyInnerWidth, theme);\n    childrenLaid.push(laidChild);\n    innerCursorY += laidChild.height;\n    if (i < bodyChildren.length - 1) innerCursorY += theme.colGap;\n  }\n\n  const bodyEndY = bodyY + m.body.height;\n  cursorY = bodyEndY;\n\n  if (footer) {\n    const laidFooter = positionHeaderOrFooter(\n      footer,\n      'footer',\n      x,\n      cursorY,\n      outerWidth,\n      m.footerHeight,\n      theme,\n    );\n    childrenLaid.push(laidFooter);\n    cursorY += m.footerHeight;\n  }\n\n  if (tabbar) {\n    const laidTabBar = positionTabBar(tabbar, x, cursorY, outerWidth, m.tabbarHeight, theme);\n    childrenLaid.push(laidTabBar);\n    cursorY += m.tabbarHeight;\n  }\n\n  if (sheet) {\n    // Overlay the sheet on top of the window body area (excludes the title\n    // bar and header/footer chrome so the scrim reads as \"dims the content,\n    // not the whole frame\"). Kept last in children so the SVG emitter paints\n    // it after everything else — this is the renderer's z-order signal.\n    const overlayBounds: Rect = {\n      x,\n      y: bodyY,\n      width: outerWidth,\n      height: bodyEndY - bodyY,\n    };\n    childrenLaid.push(positionSheet(sheet, overlayBounds, theme));\n  }\n\n  return {\n    node,\n    x,\n    y,\n    width: outerWidth,\n    height: m.outer.height,\n    children: childrenLaid,\n  };\n}\n\nfunction positionSheet(\n  node: SheetNode,\n  overlay: Rect,\n  theme: Theme,\n): LaidOutNode {\n  // The sheet's top-level rect IS the scrim — it covers the full overlay area.\n  // The sheet panel itself is the (only) child, positioned inside the scrim.\n  const scrim: LaidOutNode = {\n    node,\n    x: overlay.x,\n    y: overlay.y,\n    width: overlay.width,\n    height: overlay.height,\n    children: [],\n  };\n\n  // Intrinsic content size for the sheet body.\n  const inner = measureStack(node.children, theme, 'vertical');\n  const hasTitle = node.title !== undefined;\n  const grabberH = node.placement === 'bottom' ? theme.sheetGrabberHeight : 0;\n  const grabberGap = node.placement === 'bottom' ? theme.sheetGrabberGap : 0;\n  const titleH = hasTitle ? theme.sheetTitleHeight : 0;\n  const topPad = theme.sheetPadding;\n  const bottomPad = theme.sheetPadding;\n\n  const panelContentHeight =\n    grabberH + grabberGap + titleH + inner.height + topPad + bottomPad;\n\n  let panelX: number;\n  let panelY: number;\n  let panelWidth: number;\n  let panelHeight: number;\n\n  if (node.placement === 'center') {\n    panelWidth = Math.max(\n      theme.sheetCenterMinWidth,\n      inner.width + theme.sheetPadding * 2,\n    );\n    // Center sheets don't stretch beyond the overlay width.\n    if (panelWidth > overlay.width - theme.sheetCenterMargin * 2) {\n      panelWidth = Math.max(overlay.width - theme.sheetCenterMargin * 2, 0);\n    }\n    panelHeight = Math.max(theme.sheetCenterMinHeight, panelContentHeight);\n    panelX = overlay.x + (overlay.width - panelWidth) / 2;\n    panelY = overlay.y + (overlay.height - panelHeight) / 2;\n  } else {\n    // Bottom sheet — fills overlay width, anchored to its bottom edge.\n    panelWidth = overlay.width;\n    panelHeight = panelContentHeight;\n    // Clamp so the sheet never exceeds the overlay height; trims content pad.\n    if (panelHeight > overlay.height) panelHeight = overlay.height;\n    panelX = overlay.x;\n    panelY = overlay.y + overlay.height - panelHeight;\n  }\n\n  const panel: LaidOutNode = {\n    node,\n    x: panelX,\n    y: panelY,\n    width: panelWidth,\n    height: panelHeight,\n    children: [],\n  };\n\n  let cursorY = panelY + topPad;\n  if (node.placement === 'bottom') {\n    cursorY += grabberH + grabberGap;\n  }\n  if (hasTitle) {\n    cursorY += titleH;\n  }\n\n  const contentX = panelX + theme.sheetPadding;\n  const contentWidth = panelWidth - theme.sheetPadding * 2;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const laidChild = positionContainerChild(child, contentX, cursorY, contentWidth, theme);\n    panel.children.push(laidChild);\n    cursorY += laidChild.height;\n    if (i < node.children.length - 1) cursorY += theme.colGap;\n  }\n\n  scrim.children.push(panel);\n  return scrim;\n}\n\nfunction positionHeaderOrFooter(\n  node: HeaderNode | FooterNode,\n  kind: 'header' | 'footer',\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  theme: Theme,\n): LaidOutNode {\n  // Large-title header: single visible row, left-aligned, vertically centered.\n  // Text children are sized at largeFontSize so their laid rect matches the\n  // forced style emitted by emitChromeBand.\n  if (kind === 'header' && hasFlagAttr(node.attributes, 'large')) {\n    const innerX = x + theme.windowPadding;\n    const innerWidth = width - theme.windowPadding * 2;\n    const scale = theme.largeFontSize / theme.fontSize;\n    const rowHeight = Math.round(theme.lineHeight * scale);\n    const children: LaidOutNode[] = [];\n    for (const child of node.children) {\n      let childW: number;\n      if (child.kind === 'text') {\n        childW = child.content.length * theme.averageCharWidth * scale;\n      } else {\n        childW = measureChild(child, theme).width;\n      }\n      const childY = y + (height - rowHeight) / 2;\n      children.push(\n        positionContainerChild(child, innerX, childY, Math.min(childW, innerWidth), theme),\n      );\n    }\n    return { node, x, y, width, height, children };\n  }\n  const horizontal = footerHorizontal(node, kind);\n  const padY = kind === 'header' ? theme.headerPaddingY : theme.footerPaddingY;\n  const innerX = x + theme.windowPadding;\n  const innerY = y + padY;\n  const innerWidth = width - theme.windowPadding * 2;\n\n  const children: LaidOutNode[] = [];\n  if (horizontal) {\n    const sizes = node.children.map((c) => measureChild(c, theme));\n    const gaps = Math.max(0, node.children.length - 1) * theme.rowGap;\n    const intrinsicTotal = sizes.reduce((acc, s) => acc + s.width, 0) + gaps;\n    let spacerCount = 0;\n    for (const c of node.children) if (c.kind === 'spacer') spacerCount++;\n\n    if (spacerCount > 0) {\n      // A spacer turns the band into a left-anchored flex row: non-spacer\n      // children keep their measured width, spacers split the remaining slack.\n      // This is what lets one cluster sit hard-left and another hard-right.\n      const slack = Math.max(0, innerWidth - intrinsicTotal);\n      const spacerWidth = slack / spacerCount;\n      let cursorX = innerX;\n      for (let i = 0; i < node.children.length; i++) {\n        const child = node.children[i]!;\n        const w = child.kind === 'spacer' ? spacerWidth : sizes[i]!.width;\n        children.push(positionContainerChild(child, cursorX, innerY, w, theme));\n        cursorX += w + theme.rowGap;\n      }\n    } else if (\n      node.children.length === 1 &&\n      node.children[0]!.kind === 'row' &&\n      rowUsesHorizontalSlack(node.children[0] as RowNode)\n    ) {\n      // A lone `row` child that anchors content (spacer / align / justify / fill)\n      // is stretched to the full band width so its anchoring resolves against the\n      // real available space instead of its intrinsic width. Plain rows fall\n      // through to the right-packed branch, preserving the classic action bar.\n      children.push(positionContainerChild(node.children[0]!, innerX, innerY, innerWidth, theme));\n    } else {\n      // No spacer: preserve the classic right-packed action bar (Cancel / Apply\n      // sit bottom-right) by anchoring the cluster to the band's right edge.\n      let cursorX = innerX + innerWidth - intrinsicTotal;\n      for (let i = 0; i < node.children.length; i++) {\n        const child = node.children[i]!;\n        const size = sizes[i]!;\n        children.push(positionContainerChild(child, cursorX, innerY, size.width, theme));\n        cursorX += size.width + theme.rowGap;\n      }\n    }\n  } else {\n    let cursorY = innerY;\n    for (let i = 0; i < node.children.length; i++) {\n      const child = node.children[i]!;\n      const size = measureChild(child, theme);\n      const childX = kind === 'header' ? innerX + (innerWidth - size.width) / 2 : innerX;\n      const childWidth = kind === 'header' ? size.width : innerWidth;\n      const laidChild = positionContainerChild(child, childX, cursorY, childWidth, theme);\n      children.push(laidChild);\n      cursorY += laidChild.height;\n      if (i < node.children.length - 1) cursorY += theme.colGap;\n    }\n  }\n\n  return { node, x, y, width, height, children };\n}\n\n/**\n * Lay out a navbar as a chrome band: leading children anchor to the left of\n * the inner padding, trailing children anchor to the right. Each child is\n * vertically centered within the band's content area.\n */\nfunction positionNavbar(\n  node: NavbarNode,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  theme: Theme,\n): LaidOutNode {\n  const innerX = x + theme.windowPadding;\n  const innerY = y + theme.headerPaddingY;\n  const innerWidth = width - theme.windowPadding * 2;\n  const innerHeight = height - theme.headerPaddingY * 2;\n\n  const slotChildren: LaidOutNode[] = [];\n  if (node.leading) {\n    slotChildren.push(\n      positionNavbarSlot(node.leading, innerX, innerY, innerHeight, theme, 'left'),\n    );\n  }\n  if (node.center) {\n    // Center cluster: horizontally centered within the navbar's inner band,\n    // regardless of leading/trailing widths. The intrinsic-width calculation\n    // in measureNavbar guarantees enough room for all three at minimum size;\n    // at larger window widths the cluster stays centered and may visually\n    // drift off-balance from leading/trailing (acceptable for a wireframe).\n    const centerWidth = measureStack(node.center.children, theme, 'horizontal').width;\n    const centerAnchorX = innerX + (innerWidth - centerWidth) / 2;\n    slotChildren.push(\n      positionNavbarSlot(node.center, centerAnchorX, innerY, innerHeight, theme, 'left'),\n    );\n  }\n  if (node.trailing) {\n    const trailingRight = innerX + innerWidth;\n    slotChildren.push(\n      positionNavbarSlot(node.trailing, trailingRight, innerY, innerHeight, theme, 'right'),\n    );\n  }\n  return { node, x, y, width, height, children: slotChildren };\n}\n\nfunction positionNavbarSlot(\n  node: NavbarSlotNode,\n  anchorX: number,\n  innerY: number,\n  innerHeight: number,\n  theme: Theme,\n  anchor: 'left' | 'right',\n): LaidOutNode {\n  const sizes = node.children.map((c) => measureChild(c, theme));\n  const totalChildWidth =\n    sizes.reduce((acc, s) => acc + s.width, 0) +\n    Math.max(0, node.children.length - 1) * theme.rowGap;\n\n  let cursorX = anchor === 'left' ? anchorX : anchorX - totalChildWidth;\n  const slotX = cursorX;\n  const childrenLaid: LaidOutNode[] = [];\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const size = sizes[i]!;\n    const childY = innerY + (innerHeight - size.height) / 2;\n    childrenLaid.push(positionContainerChild(child, cursorX, childY, size.width, theme));\n    cursorX += size.width;\n    if (i < node.children.length - 1) cursorX += theme.rowGap;\n  }\n  return {\n    node,\n    x: slotX,\n    y: innerY,\n    width: totalChildWidth,\n    height: innerHeight,\n    children: childrenLaid,\n  };\n}\n\nfunction positionContainerChild(\n  child: ContainerChild,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  switch (child.kind) {\n    case 'panel':\n      return positionPanel(child, x, y, width, theme);\n    case 'section':\n      return positionSection(child, x, y, width, theme);\n    case 'tabs':\n      return positionTabs(child, x, y, width, theme);\n    case 'row':\n      return positionRow(child, x, y, width, theme);\n    case 'col':\n      return positionCol(child, x, y, width, theme);\n    case 'list':\n      return positionList(child, x, y, width, theme);\n    case 'slot':\n      return positionSlot(child, x, y, width, theme);\n    case 'text':\n      return positionText(child, x, y, width, theme);\n    case 'button':\n      return positionButton(child, x, y, theme);\n    case 'backbutton':\n      return positionLeaf(child, x, y, measureBackButton(child, theme));\n    case 'input':\n      return positionInput(child, x, y, width, theme);\n    case 'combo':\n      return positionCombo(child, x, y, width, theme);\n    case 'slider':\n      return positionSlider(child, x, y, width, theme);\n    case 'kv':\n      return positionKv(child, x, y, width, theme);\n    case 'image':\n      return positionImage(child, x, y, theme);\n    case 'icon':\n      return positionIcon(child, x, y, theme);\n    case 'divider':\n      return positionDivider(child, x, y, width, theme);\n    case 'spacer':\n      return positionSpacer(child, x, y, width);\n    case 'grid':\n      return positionGrid(child, x, y, width, theme);\n    case 'resourcebar':\n      return positionResourceBar(child, x, y, width, theme);\n    case 'stats':\n      return positionStats(child, x, y, width, theme);\n    case 'progress':\n      return positionProgress(child, x, y, width, theme);\n    case 'chart':\n      return positionChart(child, x, y, theme);\n    case 'tree':\n      return positionTree(child, x, y, width, theme);\n    case 'menubar':\n      return positionMenubar(child, x, y, width, theme);\n    case 'menu':\n      return positionMenu(child, x, y, width, theme);\n    case 'breadcrumb':\n      return positionBreadcrumb(child, x, y, width, theme);\n    case 'checkbox':\n      return positionLeaf(child, x, y, measureCheckbox(child, theme));\n    case 'radio':\n      return positionLeaf(child, x, y, measureRadio(child, theme));\n    case 'toggle':\n      return positionLeaf(child, x, y, measureToggle(child, theme));\n    case 'chip':\n      return positionLeaf(child, x, y, measureChip(child, theme));\n    case 'avatar':\n      return positionLeaf(child, x, y, measureAvatar(child, theme));\n    case 'spinner':\n      return positionLeaf(child, x, y, measureSpinner(child, theme));\n    case 'status':\n      return positionLeaf(child, x, y, measureStatus(child, theme));\n    case 'segmented':\n      return positionSegmented(child, x, y, width, theme);\n  }\n}\n\nfunction positionLeaf(\n  node: AnyNode,\n  x: number,\n  y: number,\n  size: Size,\n): LaidOutNode {\n  return { node, x, y, width: size.width, height: size.height, children: [] };\n}\n\nfunction positionTree(\n  node: TreeNode_,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  // Flatten tree into rows; each row is a leaf LaidOutNode whose node is the\n  // TreeItemNode. Depth is packed into x-offset so the SVG emitter can paint\n  // indent guides directly from the row rect.\n  const rows: LaidOutNode[] = [];\n  const walk = (n: TreeItemNode, depth: number): void => {\n    const rowX = x + depth * theme.treeIndent;\n    rows.push({\n      node: n,\n      x: rowX,\n      y: y + rows.length * theme.treeRowHeight,\n      width: width - depth * theme.treeIndent,\n      height: theme.treeRowHeight,\n      children: [],\n    });\n    const collapsed = hasFlagAttr(n.attributes, 'collapsed');\n    if (!collapsed) {\n      for (const c of n.children) walk(c, depth + 1);\n    }\n  };\n  for (const n of node.children) walk(n, 0);\n  const height = rows.length * theme.treeRowHeight;\n  return { node, x, y, width, height, children: rows };\n}\n\nfunction positionMenubar(\n  node: MenubarNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  const children: LaidOutNode[] = [];\n  let cursorX = x;\n  for (const menu of node.children) {\n    const w = menu.label.length * theme.averageCharWidth + theme.menubarItemPaddingX * 2;\n    children.push({\n      node: menu,\n      x: cursorX,\n      y,\n      width: w,\n      height: theme.menubarHeight,\n      children: [],\n    });\n    cursorX += w;\n  }\n  return { node, x, y, width, height: theme.menubarHeight, children };\n}\n\nfunction positionMenu(\n  node: MenuNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  void width;\n  const size = measureMenu(node, theme);\n  const children: LaidOutNode[] = [];\n  let cursorY = y + 2;\n  for (const c of node.children) {\n    const rowH = theme.menuItemHeight;\n    children.push({\n      node: c,\n      x: x + 2,\n      y: cursorY,\n      width: size.width - 4,\n      height: rowH,\n      children: [],\n    });\n    cursorY += rowH;\n  }\n  return { node, x, y, width: size.width, height: size.height, children };\n}\n\nfunction positionSegmented(\n  node: SegmentedNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  void width;\n  const size = measureSegmented(node, theme);\n  const n = node.children.length;\n  const segW = n > 0 ? size.width / n : 0;\n  const children: LaidOutNode[] = [];\n  for (let i = 0; i < n; i++) {\n    const seg = node.children[i]!;\n    children.push({\n      node: seg,\n      x: x + i * segW,\n      y,\n      width: segW,\n      height: theme.segmentedHeight,\n      children: [],\n    });\n  }\n  return { node, x, y, width: size.width, height: size.height, children };\n}\n\nfunction positionBreadcrumb(\n  node: BreadcrumbNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  void width;\n  const children: LaidOutNode[] = [];\n  let cursorX = x;\n  for (let i = 0; i < node.children.length; i++) {\n    const c = node.children[i] as CrumbNode;\n    const iconW = getAttrString(c.attributes, 'icon') ? theme.iconSize + 4 : 0;\n    const w = iconW + c.label.length * theme.averageCharWidth;\n    children.push({\n      node: c,\n      x: cursorX,\n      y,\n      width: w,\n      height: theme.breadcrumbHeight,\n      children: [],\n    });\n    cursorX += w;\n    if (i < node.children.length - 1) cursorX += theme.breadcrumbGap * 2 + 8;\n  }\n  return {\n    node,\n    x,\n    y,\n    width: cursorX - x,\n    height: theme.breadcrumbHeight,\n    children,\n  };\n}\n\nfunction positionPanel(\n  node: PanelNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  const innerX = x + theme.panelPadding;\n  const innerY = y + theme.panelPadding;\n  const innerWidth = width - theme.panelPadding * 2;\n\n  const children: LaidOutNode[] = [];\n  let cursorY = innerY;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const laidChild = positionContainerChild(child, innerX, cursorY, innerWidth, theme);\n    children.push(laidChild);\n    cursorY += laidChild.height;\n    if (i < node.children.length - 1) cursorY += theme.colGap;\n  }\n  const height = cursorY - y + theme.panelPadding;\n  return { node, x, y, width, height, children };\n}\n\nfunction positionSection(\n  node: SectionNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  const innerX = x;\n  const innerY = y + theme.sectionTitleHeight + theme.sectionTitlePaddingBottom;\n  const innerWidth = width;\n\n  const children: LaidOutNode[] = [];\n  let cursorY = innerY;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const laidChild = positionContainerChild(child, innerX, cursorY, innerWidth, theme);\n    children.push(laidChild);\n    cursorY += laidChild.height;\n    if (i < node.children.length - 1) cursorY += theme.colGap;\n  }\n  const height = cursorY - y + theme.panelPadding;\n  return { node, x, y, width, height, children };\n}\n\nfunction positionTabs(\n  node: TabsNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  const children: LaidOutNode[] = [];\n  let cursorX = x;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const size = measureTab(child, theme);\n    children.push({\n      node: child,\n      x: cursorX,\n      y,\n      width: size.width,\n      height: size.height,\n      children: [],\n    });\n    cursorX += size.width + theme.tabGap;\n  }\n  return { node, x, y, width, height: theme.tabHeight, children };\n}\n\n/**\n * True when a `row` would consume horizontal slack if given more width than its\n * intrinsic content — i.e. it has a `spacer`, a `fill` col, or an explicit\n * `align=`/`justify=`. Used to decide whether a lone row inside a chrome band\n * should be stretched to the full band width (so its anchoring resolves) or left\n * at intrinsic width (preserving the classic right-packed action bar).\n */\nfunction rowUsesHorizontalSlack(node: RowNode): boolean {\n  if (node.children.some((c) => c.kind === 'spacer')) return true;\n  if (node.children.some((c) => c.kind === 'col' && c.width.kind === 'fill')) return true;\n  if (getAlign(node.attributes) !== 'left') return true;\n  return getJustify(node.attributes) !== 'start';\n}\n\nfunction positionRow(\n  node: RowNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  // Pass 1: classify children and compute their base (measured) widths.\n  // `col fill` and `spacer` both get base width 0 — their real width comes\n  // from distributing slack in pass 2.\n  const baseWidths: number[] = [];\n  let fillCount = 0;\n  let spacerCount = 0;\n  for (const child of node.children) {\n    if (child.kind === 'col' && child.width.kind === 'fill') {\n      baseWidths.push(0);\n      fillCount++;\n    } else if (child.kind === 'col' && child.width.kind === 'length' && child.width.unit === 'px') {\n      baseWidths.push(child.width.value);\n    } else if (child.kind === 'spacer') {\n      baseWidths.push(0);\n      spacerCount++;\n    } else {\n      baseWidths.push(measureChild(child, theme).width);\n    }\n  }\n\n  const gapTotal = Math.max(0, node.children.length - 1) * theme.rowGap;\n  const fixedTotal = baseWidths.reduce((acc, w) => acc + w, 0);\n  const available = Math.max(0, width - fixedTotal - gapTotal);\n  const fillWidth = fillCount > 0 ? available / fillCount : 0;\n  // Spacers only consume slack when there are no fills — fills win precedence.\n  const spacerWidth = fillCount === 0 && spacerCount > 0 ? available / spacerCount : 0;\n\n  // Assigned widths per child after slack distribution.\n  const assignedWidths = node.children.map((child, i) => {\n    if (child.kind === 'col' && child.width.kind === 'fill') {\n      return Math.max(fillWidth, theme.colFillMinWidth);\n    }\n    if (child.kind === 'spacer') {\n      return Math.max(spacerWidth, 0);\n    }\n    return baseWidths[i] ?? 0;\n  });\n\n  // Compute effective row width (may exceed parent width if fill cols hit their minimum).\n  const effectiveWidth =\n    assignedWidths.reduce((acc, w) => acc + w, 0) + gapTotal;\n\n  // Slack that will be consumed by `justify=…` when it applies. When fills or\n  // explicit spacers are present, they already ate the slack — justify is a\n  // no-op and alignment falls back to start.\n  const justify = getJustify(node.attributes);\n  const align = getAlign(node.attributes);\n  const justifyActive =\n    fillCount === 0 && spacerCount === 0 && justify !== 'start';\n  const slack = Math.max(0, width - effectiveWidth);\n\n  let cursorX: number;\n  let extraGapBetween = 0;\n  if (fillCount > 0 || spacerCount > 0) {\n    cursorX = x;\n  } else if (justifyActive) {\n    const n = node.children.length;\n    if (justify === 'end') {\n      cursorX = x + slack;\n    } else if (justify === 'between') {\n      cursorX = x;\n      extraGapBetween = n > 1 ? slack / (n - 1) : 0;\n    } else {\n      // 'around' — equal space on both sides of each child (half-units at edges).\n      const unit = n > 0 ? slack / (2 * n) : 0;\n      cursorX = x + unit;\n      extraGapBetween = 2 * unit;\n    }\n  } else if (align === 'right') {\n    cursorX = x + width - effectiveWidth;\n  } else if (align === 'center') {\n    cursorX = x + (width - effectiveWidth) / 2;\n  } else {\n    cursorX = x;\n  }\n\n  const children: LaidOutNode[] = [];\n  const childXs: number[] = [];\n  let maxHeight = 0;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const childWidth = assignedWidths[i] ?? 0;\n    const laidChild = positionContainerChild(child, cursorX, y, childWidth, theme);\n    children.push(laidChild);\n    childXs.push(cursorX);\n    cursorX += childWidth;\n    if (laidChild.height > maxHeight) maxHeight = laidChild.height;\n    if (i < node.children.length - 1) cursorX += theme.rowGap + extraGapBetween;\n  }\n\n  // Stretch pass: give `col` children that use vertical slack (a `spacer` child\n  // or `justify=`) the row's content height so they can anchor content to the\n  // top/bottom or spread it. Plain cols are left untouched, so their geometry —\n  // and the existing fixtures — stay exactly as before.\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    if (\n      child.kind === 'col' &&\n      colUsesVerticalSlack(child) &&\n      maxHeight > (children[i]?.height ?? 0)\n    ) {\n      children[i] = positionCol(child, childXs[i] ?? x, y, assignedWidths[i] ?? 0, theme, maxHeight);\n    }\n  }\n\n  return {\n    node,\n    x,\n    y,\n    width: Math.max(width, effectiveWidth),\n    height: maxHeight,\n    children,\n  };\n}\n\n/**\n * True when a `col` uses vertical slack distribution — i.e. it contains a\n * `spacer` child or carries `justify=` other than the default `start`. The row\n * stretch pass only re-lays such cols, so plain content-sized cols keep their\n * exact prior geometry (and fixtures stay stable).\n */\nfunction colUsesVerticalSlack(node: ColNode): boolean {\n  if (node.children.some((c) => c.kind === 'spacer')) return true;\n  return getJustify(node.attributes) !== 'start';\n}\n\nfunction positionCol(\n  node: ColNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n  availableHeight?: number,\n): LaidOutNode {\n  const colWidth =\n    node.width.kind === 'length' && node.width.unit === 'px' ? node.width.value : width;\n\n  // Base (content) heights. `spacer` contributes 0 — it only consumes vertical\n  // slack in pass 2, mirroring how `spacer` behaves on the horizontal axis.\n  const baseHeights = node.children.map((c) =>\n    c.kind === 'spacer' ? 0 : measureChild(c, theme).height,\n  );\n  let spacerCount = 0;\n  for (const c of node.children) if (c.kind === 'spacer') spacerCount++;\n\n  const gapTotal = Math.max(0, node.children.length - 1) * theme.colGap;\n  const contentHeight = baseHeights.reduce((acc, h) => acc + h, 0) + gapTotal;\n  const target = Math.max(availableHeight ?? 0, contentHeight);\n  const slack = Math.max(0, target - contentHeight);\n\n  // Vertical distribution: spacers win precedence (eat all slack); otherwise\n  // `justify=` shifts/spreads content; default is top-anchored.\n  const justify = getJustify(node.attributes);\n  const spacerHeight = spacerCount > 0 ? slack / spacerCount : 0;\n  const justifyActive = spacerCount === 0 && justify !== 'start' && slack > 0;\n\n  let cursorY = y;\n  let extraGapBetween = 0;\n  if (spacerCount > 0) {\n    cursorY = y;\n  } else if (justifyActive) {\n    const n = node.children.length;\n    if (justify === 'end') {\n      cursorY = y + slack;\n    } else if (justify === 'between') {\n      extraGapBetween = n > 1 ? slack / (n - 1) : 0;\n    } else {\n      // 'around' — equal space above and below each child (half-units at edges).\n      const unit = n > 0 ? slack / (2 * n) : 0;\n      cursorY = y + unit;\n      extraGapBetween = 2 * unit;\n    }\n  }\n\n  const children: LaidOutNode[] = [];\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    if (child.kind === 'spacer') {\n      // A spacer occupies vertical slack but paints nothing; advance the cursor.\n      children.push(positionContainerChild(child, x, cursorY, colWidth, theme));\n      cursorY += spacerHeight;\n    } else {\n      const laidChild = positionContainerChild(child, x, cursorY, colWidth, theme);\n      children.push(laidChild);\n      cursorY += laidChild.height;\n    }\n    if (i < node.children.length - 1) cursorY += theme.colGap + extraGapBetween;\n  }\n  return { node, x, y, width: colWidth, height: Math.max(target, cursorY - y), children };\n}\n\nfunction positionList(\n  node: ListNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  const children: LaidOutNode[] = [];\n  let cursorY = y;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const laidChild =\n      child.kind === 'item'\n        ? positionItem(child, x, cursorY, width, theme)\n        : positionSlot(child, x, cursorY, width, theme);\n    children.push(laidChild);\n    cursorY += laidChild.height;\n    if (i < node.children.length - 1) cursorY += theme.listGap;\n  }\n  return { node, x, y, width, height: cursorY - y, children };\n}\n\nfunction positionItem(\n  node: ItemNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  return {\n    node,\n    x,\n    y,\n    width,\n    height: theme.lineHeight,\n    children: [],\n  };\n}\n\nfunction positionSlot(\n  node: SlotNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  const innerX = x + theme.slotPadding;\n  const innerY = y + theme.slotPadding + theme.slotTitleHeight + theme.sectionTitlePaddingBottom;\n  const innerWidth = width - theme.slotPadding * 2;\n\n  const children: LaidOutNode[] = [];\n  let cursorY = innerY;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const laidChild = positionContainerChild(child, innerX, cursorY, innerWidth, theme);\n    children.push(laidChild);\n    cursorY += laidChild.height;\n    if (i < node.children.length - 1) cursorY += theme.colGap;\n  }\n\n  if (node.slotFooter) {\n    cursorY += theme.colGap;\n    const laidFooter = positionSlotFooter(\n      node.slotFooter,\n      innerX,\n      cursorY,\n      innerWidth,\n      theme,\n    );\n    children.push(laidFooter);\n    cursorY += laidFooter.height;\n  }\n\n  const height = cursorY - y + theme.slotPadding;\n  return { node, x, y, width, height, children };\n}\n\nfunction positionSlotFooter(\n  node: SlotFooterNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  // Right-align children horizontally.\n  const sizes = node.children.map((c) => measureChild(c, theme));\n  const totalWidth =\n    sizes.reduce((acc, s) => acc + s.width, 0) +\n    Math.max(0, node.children.length - 1) * theme.rowGap;\n  let cursorX = x + width - totalWidth;\n  const children: LaidOutNode[] = [];\n  let maxH = 0;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const size = sizes[i]!;\n    const laid = positionContainerChild(child, cursorX, y, size.width, theme);\n    children.push(laid);\n    if (laid.height > maxH) maxH = laid.height;\n    cursorX += size.width + theme.rowGap;\n  }\n  return { node, x, y, width, height: maxH, children };\n}\n\nfunction positionGrid(\n  node: GridNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  void width;\n  const cellSize = preferredCellSize(node, theme);\n  const children: LaidOutNode[] = [];\n\n  // Auto-flow tracker: walks cells L→R, T→B, skipping positions already\n  // claimed by explicit row/col attributes.\n  const claimed = new Set<string>();\n  for (const c of node.children) {\n    if (c.row !== undefined && c.col !== undefined) {\n      claimed.add(`${c.row}:${c.col}`);\n    }\n  }\n  let flowRow = 1;\n  let flowCol = 1;\n  const advanceFlow = (): void => {\n    while (true) {\n      if (flowCol > node.cols) {\n        flowCol = 1;\n        flowRow++;\n      }\n      if (flowRow > node.rows) return;\n      if (!claimed.has(`${flowRow}:${flowCol}`)) return;\n      flowCol++;\n    }\n  };\n\n  for (const cell of node.children) {\n    let r = cell.row;\n    let c = cell.col;\n    if (r === undefined || c === undefined) {\n      advanceFlow();\n      r = flowRow;\n      c = flowCol;\n      flowCol++;\n    }\n    // Clamp into grid bounds so out-of-range explicit positions still render.\n    const clampedR = Math.min(Math.max(1, r), node.rows);\n    const clampedC = Math.min(Math.max(1, c), node.cols);\n    const cellX = x + (clampedC - 1) * (cellSize.width + theme.rowGap);\n    const cellY = y + (clampedR - 1) * (cellSize.height + theme.colGap);\n    children.push(positionCell(cell, cellX, cellY, cellSize.width, cellSize.height, theme));\n  }\n\n  return {\n    node,\n    x,\n    y,\n    width: node.cols * cellSize.width + (node.cols - 1) * theme.rowGap,\n    height: node.rows * cellSize.height + (node.rows - 1) * theme.colGap,\n    children,\n  };\n}\n\nfunction positionCell(\n  node: CellNode,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  theme: Theme,\n): LaidOutNode {\n  const innerX = x + theme.cellPadding;\n  const innerWidth = width - theme.cellPadding * 2;\n  let cursorY = y + theme.cellPadding;\n  if (node.label !== undefined) {\n    cursorY += theme.lineHeight;\n  }\n  const children: LaidOutNode[] = [];\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const laid = positionContainerChild(child, innerX, cursorY, innerWidth, theme);\n    children.push(laid);\n    cursorY += laid.height;\n    if (i < node.children.length - 1) cursorY += theme.colGap;\n  }\n  return { node, x, y, width, height, children };\n}\n\nfunction positionResourceBar(\n  node: ResourceBarNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  void width;\n  const sizes = node.children.map((r) => measureResource(r, theme));\n  const children: LaidOutNode[] = [];\n  let cursorX = x;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const size = sizes[i]!;\n    children.push({\n      node: child,\n      x: cursorX,\n      y,\n      width: size.width,\n      height: size.height,\n      children: [],\n    });\n    cursorX += size.width + theme.resourceBarItemGap;\n  }\n  return {\n    node,\n    x,\n    y,\n    width: cursorX - x - (node.children.length > 0 ? theme.resourceBarItemGap : 0),\n    height: theme.resourceBarHeight,\n    children,\n  };\n}\n\nfunction positionStats(\n  node: StatsNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  void width;\n  const sizes = node.children.map((s) => measureStat(s, theme));\n  const children: LaidOutNode[] = [];\n  let cursorX = x;\n  for (let i = 0; i < node.children.length; i++) {\n    const child = node.children[i]!;\n    const size = sizes[i]!;\n    children.push({\n      node: child,\n      x: cursorX,\n      y,\n      width: size.width,\n      height: size.height,\n      children: [],\n    });\n    cursorX += size.width + theme.statsGap;\n  }\n  const used = node.children.length > 0 ? cursorX - x - theme.statsGap : 0;\n  return { node, x, y, width: used, height: theme.lineHeight, children };\n}\n\nfunction positionProgress(\n  node: ProgressNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  const size = measureProgress(node, theme);\n  // Expand to available width up to a reasonable cap so progress bars can stretch.\n  const w = Math.max(size.width, Math.min(width, theme.progressMaxWidth));\n  return { node, x, y, width: w, height: size.height, children: [] };\n}\n\nfunction positionChart(\n  node: ChartNode,\n  x: number,\n  y: number,\n  theme: Theme,\n): LaidOutNode {\n  const size = measureChart(node, theme);\n  return { node, x, y, width: size.width, height: size.height, children: [] };\n}\n\nfunction positionText(\n  node: TextNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  void width;\n  return {\n    node,\n    x,\n    y,\n    width: textWidth(node.content, node.attributes, theme),\n    height: textLineHeight(node.attributes, theme),\n    children: [],\n  };\n}\n\nfunction positionButton(node: ButtonNode, x: number, y: number, theme: Theme): LaidOutNode {\n  const size = measureButton(node, theme);\n  return {\n    node,\n    x,\n    y,\n    width: size.width,\n    height: size.height,\n    children: [],\n  };\n}\n\nfunction positionInput(\n  node: InputNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  const size = measureInput(node, theme);\n  return {\n    node,\n    x,\n    y,\n    width: Math.min(width, Math.max(size.width, Math.min(width, theme.inputMinWidth * 2))),\n    height: theme.inputHeight,\n    children: [],\n  };\n}\n\nfunction positionCombo(\n  node: ComboNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  const size = measureCombo(node, theme);\n  return {\n    node,\n    x,\n    y,\n    width: Math.min(width, Math.max(size.width, Math.min(width, 320))),\n    height: theme.comboHeight,\n    children: [],\n  };\n}\n\nfunction positionSlider(\n  node: SliderNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  return {\n    node,\n    x,\n    y,\n    width: Math.min(width, Math.max(theme.sliderDefaultWidth, Math.min(width, 360))),\n    height: theme.sliderHeight,\n    children: [],\n  };\n}\n\nfunction positionKv(\n  node: KvNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  return {\n    node,\n    x,\n    y,\n    width,\n    height: textLineHeight(node.attributes, theme),\n    children: [],\n  };\n}\n\nfunction positionImage(node: ImageNode, x: number, y: number, theme: Theme): LaidOutNode {\n  const size = measureImage(node, theme);\n  return { node, x, y, width: size.width, height: size.height, children: [] };\n}\n\nfunction positionIcon(node: IconNode, x: number, y: number, theme: Theme): LaidOutNode {\n  return { node, x, y, width: theme.iconSize, height: theme.iconSize, children: [] };\n}\n\nfunction positionDivider(\n  node: DividerNode,\n  x: number,\n  y: number,\n  width: number,\n  theme: Theme,\n): LaidOutNode {\n  return { node, x, y, width, height: theme.dividerHeight, children: [] };\n}\n\nfunction positionSpacer(\n  node: SpacerNode,\n  x: number,\n  y: number,\n  width: number,\n): LaidOutNode {\n  // Spacer has zero intrinsic height so it never makes the row taller; width\n  // is whatever the row-layout pass assigned from the slack budget.\n  return { node, x, y, width, height: 0, children: [] };\n}\n\n// ---------------------------------------------------------------------------\n// Attribute / typography helpers\n// ---------------------------------------------------------------------------\n\nfunction getAttr(attrs: readonly unknown[], key: string): AttributeValue | undefined {\n  for (const a of attrs) {\n    const attr = a as AttributeFlag | AttributePair;\n    if (attr.kind === 'pair' && attr.key === key) return attr.value;\n  }\n  return undefined;\n}\n\nfunction getAttrString(attrs: readonly unknown[], key: string): string | undefined {\n  const v = getAttr(attrs, key);\n  return v?.kind === 'string' ? v.value : undefined;\n}\n\nfunction getAttrNumber(attrs: readonly unknown[], key: string): number | undefined {\n  const v = getAttr(attrs, key);\n  return v?.kind === 'number' ? v.value : undefined;\n}\n\nfunction getAttrIdent(attrs: readonly unknown[], key: string): string | undefined {\n  const v = getAttr(attrs, key);\n  return v?.kind === 'identifier' ? v.value : undefined;\n}\n\nfunction hasFlagAttr(attrs: readonly unknown[], flag: string): boolean {\n  for (const a of attrs) {\n    const attr = a as AttributeFlag | AttributePair;\n    if (attr.kind === 'flag' && attr.flag === flag) return true;\n  }\n  return false;\n}\n\nfunction getAlign(attrs: readonly unknown[]): 'left' | 'center' | 'right' {\n  const v = getAttrIdent(attrs, 'align');\n  if (v === 'center' || v === 'right' || v === 'left') return v;\n  return 'left';\n}\n\nfunction getJustify(\n  attrs: readonly unknown[],\n): 'start' | 'between' | 'around' | 'end' {\n  const v = getAttrIdent(attrs, 'justify');\n  if (v === 'between' || v === 'around' || v === 'end' || v === 'start') return v;\n  return 'start';\n}\n\nfunction textSizeScale(attrs: readonly unknown[], theme: Theme): number {\n  const size = getAttrIdent(attrs, 'size');\n  if (size === 'small') return theme.smallFontSize / theme.fontSize;\n  if (size === 'large') return theme.largeFontSize / theme.fontSize;\n  return 1;\n}\n\nfunction textWidth(content: string, attrs: readonly unknown[], theme: Theme): number {\n  return content.length * theme.averageCharWidth * textSizeScale(attrs, theme);\n}\n\nfunction textLineHeight(attrs: readonly unknown[], theme: Theme): number {\n  const scale = textSizeScale(attrs, theme);\n  return theme.lineHeight * scale;\n}\n\nfunction badgeWidthOf(attrs: readonly unknown[], theme: Theme): number {\n  const badge = getAttrString(attrs, 'badge');\n  if (badge === undefined) return 0;\n  return badge.length * theme.averageCharWidth * (theme.badgeFontSize / theme.fontSize) +\n    theme.badgePaddingX * 2;\n}\n\n// ---------------------------------------------------------------------------\n// Annotations — measurement, margin sizing, placement\n// ---------------------------------------------------------------------------\n\ninterface MeasuredAnnotation {\n  width: number;\n  height: number;\n  lines: string[];\n}\n\nfunction measureAnnotation(node: AnnotationNode, theme: Theme): MeasuredAnnotation {\n  const lines = node.body.split('\\n');\n  // Box sizes to its longest line. Authors control wrapping with literal \"\\n\" —\n  // no hidden word-wrap at render time, so the output is predictable when\n  // machine-generated.\n  const contentWidth = Math.max(...lines.map((l) => l.length * theme.averageCharWidth));\n  const width = contentWidth + theme.annotationPaddingX * 2;\n  const height = lines.length * theme.lineHeight + theme.annotationPaddingY * 2;\n  return { width, height, lines };\n}\n\n/**\n * Returns the thickness of the canvas margin on `side` — how much canvas\n * has to extend beyond the window edge to hold stacked annotation boxes\n * plus the leader-line gap. Zero if there are no annotations on this side.\n */\nfunction sideMargin(\n  side: AnnotationSide,\n  list: AnnotationNode[],\n  measured: Map<AnnotationNode, MeasuredAnnotation>,\n  theme: Theme,\n): number {\n  if (list.length === 0) return 0;\n  if (side === 'left' || side === 'right') {\n    const maxW = Math.max(...list.map((a) => measured.get(a)!.width));\n    return maxW + theme.annotationGap + theme.annotationMargin;\n  }\n  const maxH = Math.max(...list.map((a) => measured.get(a)!.height));\n  return maxH + theme.annotationGap + theme.annotationMargin;\n}\n\n/**\n * Total extent along the main axis (i.e. along the window edge) needed to\n * stack this side's annotations without overlap. Used to grow the canvas\n * perpendicular dimension when top/bottom stacks exceed window width (or\n * left/right stacks exceed window height).\n */\nfunction stackMainAxis(\n  side: AnnotationSide,\n  list: AnnotationNode[],\n  measured: Map<AnnotationNode, MeasuredAnnotation>,\n  theme: Theme,\n): number {\n  if (list.length === 0) return 0;\n  const dims = list.map((a) => measured.get(a)!);\n  const gapTotal = (list.length - 1) * theme.annotationStackGap;\n  if (side === 'left' || side === 'right') {\n    return dims.reduce((acc, d) => acc + d.height, 0) + gapTotal;\n  }\n  return dims.reduce((acc, d) => acc + d.width, 0) + gapTotal;\n}\n\ninterface Rect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\n/**\n * Walk the laid-out tree collecting `id → rect` entries. The first occurrence\n * of each id wins; duplicates are silently ignored. Ids come from the\n * universal `id=\"…\"` attribute on any node.\n */\nfunction buildIdMap(root: LaidOutNode): Map<string, Rect> {\n  const out = new Map<string, Rect>();\n  const stack: LaidOutNode[] = [root];\n  while (stack.length > 0) {\n    const n = stack.pop()!;\n    const id = getAttrString((n.node as { attributes?: Attribute[] }).attributes ?? [], 'id');\n    if (id !== undefined && !out.has(id)) {\n      out.set(id, { x: n.x, y: n.y, width: n.width, height: n.height });\n    }\n    for (const c of n.children) stack.push(c);\n  }\n  return out;\n}\n\n/**\n * Lay out the annotations for one side, producing boxes + leader endpoints.\n * Strategy:\n *   1. Assign each box a preferred center aligned with its target's center\n *      (along the relevant axis — y for left/right, x for top/bottom).\n *   2. Sort by preferred center, then greedily push overlapping boxes along\n *      the axis until the stack is collision-free.\n *   3. Clamp box positions to the canvas bounds so none fall off.\n *   4. Compute leader-line endpoints (target edge midpoint → box edge).\n *\n * Annotations whose target id doesn't resolve are dropped.\n */\nfunction placeAnnotationsOnSide(\n  side: AnnotationSide,\n  list: AnnotationNode[],\n  measured: Map<AnnotationNode, MeasuredAnnotation>,\n  idMap: Map<string, Rect>,\n  windowRect: Rect,\n  canvasWidth: number,\n  canvasHeight: number,\n  theme: Theme,\n): LaidAnnotation[] {\n  if (list.length === 0) return [];\n\n  interface Pending {\n    node: AnnotationNode;\n    dims: MeasuredAnnotation;\n    target: Rect;\n    /** Preferred position along the main axis (top-left coordinate). */\n    pref: number;\n  }\n  const pending: Pending[] = [];\n  for (const a of list) {\n    const target = idMap.get(a.target);\n    if (!target) continue; // Silently drop unresolved — caller can warn.\n    const dims = measured.get(a)!;\n    let pref: number;\n    if (side === 'left' || side === 'right') {\n      pref = target.y + target.height / 2 - dims.height / 2;\n    } else {\n      pref = target.x + target.width / 2 - dims.width / 2;\n    }\n    pending.push({ node: a, dims, target, pref });\n  }\n  if (pending.length === 0) return [];\n\n  pending.sort((a, b) => a.pref - b.pref);\n\n  // Greedy non-overlap push along the main axis.\n  const mainSize = (p: Pending) =>\n    side === 'left' || side === 'right' ? p.dims.height : p.dims.width;\n  const axisMin = side === 'left' || side === 'right' ? 0 : 0;\n  const axisMax =\n    side === 'left' || side === 'right' ? canvasHeight : canvasWidth;\n\n  let cursor = -Infinity;\n  for (const p of pending) {\n    const minStart = cursor === -Infinity ? axisMin : cursor + theme.annotationStackGap;\n    const start = Math.max(p.pref, minStart);\n    cursor = start + mainSize(p);\n    p.pref = start; // repurpose as final start coordinate\n  }\n\n  // If the stack overflows the bottom of the axis, shift the whole group up.\n  if (cursor > axisMax) {\n    const overflow = cursor - axisMax;\n    for (const p of pending) p.pref -= overflow;\n  }\n\n  const out: LaidAnnotation[] = [];\n  for (const p of pending) {\n    const { node, dims, target } = p;\n    let boxX: number;\n    let boxY: number;\n    let boxAnchor: { x: number; y: number };\n    let targetAnchor: { x: number; y: number };\n\n    if (side === 'right') {\n      boxX = windowRect.x + windowRect.width + theme.annotationGap;\n      boxY = p.pref;\n      boxAnchor = { x: boxX, y: boxY + dims.height / 2 };\n      targetAnchor = {\n        x: target.x + target.width,\n        y: target.y + target.height / 2,\n      };\n    } else if (side === 'left') {\n      boxX = windowRect.x - theme.annotationGap - dims.width;\n      boxY = p.pref;\n      boxAnchor = { x: boxX + dims.width, y: boxY + dims.height / 2 };\n      targetAnchor = { x: target.x, y: target.y + target.height / 2 };\n    } else if (side === 'top') {\n      boxX = p.pref;\n      boxY = windowRect.y - theme.annotationGap - dims.height;\n      boxAnchor = { x: boxX + dims.width / 2, y: boxY + dims.height };\n      targetAnchor = { x: target.x + target.width / 2, y: target.y };\n    } else {\n      // bottom\n      boxX = p.pref;\n      boxY = windowRect.y + windowRect.height + theme.annotationGap;\n      boxAnchor = { x: boxX + dims.width / 2, y: boxY };\n      targetAnchor = {\n        x: target.x + target.width / 2,\n        y: target.y + target.height,\n      };\n    }\n\n    out.push({\n      node,\n      x: boxX,\n      y: boxY,\n      width: dims.width,\n      height: dims.height,\n      lines: dims.lines,\n      boxAnchor,\n      targetAnchor,\n    });\n  }\n\n  return out;\n}\n","/**\n * Named icon registry. Each glyph is drawn in a 16×16 logical box with a\n * single-stroke / single-fill style, then emitted as a `<g>` translated and\n * scaled into the caller's target rect. Unknown names fall back to a boxed\n * first-letter placeholder (the v0.3 behavior), so older mockups keep rendering.\n *\n * Adding a new icon: append an entry to `ICON_PATHS` keyed by its short name.\n * Keep shapes minimal — wireframes, not production iconography.\n */\n\n/**\n * SVG markup fragments drawn inside a 16×16 viewBox with `currentColor` for\n * stroke/fill. The caller wraps each one in a colored `<g transform>`.\n */\nconst ICON_PATHS: Record<string, string> = {\n  // Economy / wealth\n  credits:\n    '<circle cx=\"8\" cy=\"8\" r=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" />' +\n    '<text x=\"8\" y=\"11.3\" text-anchor=\"middle\" font-family=\"system-ui, sans-serif\" font-size=\"9\" font-weight=\"700\" fill=\"currentColor\">$</text>',\n\n  // Research / science\n  research:\n    '<path d=\"M 6 2 L 6 6 L 3 13 Q 3 14 4 14 L 12 14 Q 13 14 13 13 L 10 6 L 10 2 Z\" ' +\n    'fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />' +\n    '<line x1=\"5.5\" y1=\"2\" x2=\"10.5\" y2=\"2\" stroke=\"currentColor\" stroke-width=\"1.4\" />',\n\n  // Military / combat\n  military:\n    '<path d=\"M 8 2 L 13 4 L 13 8 Q 13 12 8 14 Q 3 12 3 8 L 3 4 Z\" ' +\n    'fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />',\n\n  // Industry / production\n  industry:\n    '<path d=\"M 2 14 L 2 8 L 7 10 L 7 7 L 12 10 L 12 4 L 14 4 L 14 14 Z\" ' +\n    'fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />',\n\n  // Influence / speech\n  influence:\n    '<path d=\"M 3 4 L 13 4 Q 14 4 14 5 L 14 10 Q 14 11 13 11 L 8 11 L 5 14 L 5 11 L 3 11 Q 2 11 2 10 L 2 5 Q 2 4 3 4 Z\" ' +\n    'fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />',\n\n  // Approval / loyalty (simple heart)\n  approval:\n    '<path d=\"M 8 14 Q 2 10 2 6 Q 2 3 5 3 Q 7 3 8 5 Q 9 3 11 3 Q 14 3 14 6 Q 14 10 8 14 Z\" ' +\n    'fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />',\n\n  // Faith / ideology\n  faith:\n    '<path d=\"M 8 2 L 9.6 6.5 L 14 6.5 L 10.5 9.2 L 11.8 14 L 8 11.2 L 4.2 14 L 5.5 9.2 L 2 6.5 L 6.4 6.5 Z\" ' +\n    'fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\" />',\n\n  // Authority / admin\n  authority:\n    '<path d=\"M 3 14 L 3 5 L 5 5 L 5 3 L 11 3 L 11 5 L 13 5 L 13 14 Z\" ' +\n    'fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />' +\n    '<line x1=\"8\" y1=\"5\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1\" />',\n\n  // Computation / AI compute\n  computation:\n    '<rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" />' +\n    '<line x1=\"2\" y1=\"6\" x2=\"4\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1\" />' +\n    '<line x1=\"2\" y1=\"10\" x2=\"4\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1\" />' +\n    '<line x1=\"12\" y1=\"6\" x2=\"14\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1\" />' +\n    '<line x1=\"12\" y1=\"10\" x2=\"14\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1\" />' +\n    '<line x1=\"6\" y1=\"2\" x2=\"6\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1\" />' +\n    '<line x1=\"10\" y1=\"2\" x2=\"10\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1\" />' +\n    '<line x1=\"6\" y1=\"12\" x2=\"6\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1\" />' +\n    '<line x1=\"10\" y1=\"12\" x2=\"10\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1\" />',\n\n  // Tech / research tree node\n  tech:\n    '<polygon points=\"8,2 14,6 14,10 8,14 2,10 2,6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />' +\n    '<circle cx=\"8\" cy=\"8\" r=\"2\" fill=\"currentColor\" />',\n\n  // Policy / document\n  policy:\n    '<path d=\"M 4 2 L 11 2 L 13 4 L 13 14 L 4 14 Z\" ' +\n    'fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />' +\n    '<line x1=\"6\" y1=\"7\" x2=\"11\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1\" />' +\n    '<line x1=\"6\" y1=\"10\" x2=\"11\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1\" />',\n\n  // Ship\n  ship:\n    '<path d=\"M 2 10 L 14 10 L 12 14 L 4 14 Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />' +\n    '<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.4\" />' +\n    '<path d=\"M 8 3 L 12 7 L 8 7 Z\" fill=\"currentColor\" />',\n\n  // Planet\n  planet:\n    '<circle cx=\"8\" cy=\"8\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" />' +\n    '<ellipse cx=\"8\" cy=\"8\" rx=\"7\" ry=\"2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\" transform=\"rotate(-20 8 8)\" />',\n\n  // Leader / person\n  leader:\n    '<circle cx=\"8\" cy=\"6\" r=\"2.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" />' +\n    '<path d=\"M 3 14 Q 3 9 8 9 Q 13 9 13 14 Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />',\n\n  // Gear\n  gear:\n    '<path d=\"M 8 2 L 9 3.5 L 11 3 L 11.5 5 L 13 6 L 12.5 8 L 13 10 L 11.5 11 L 11 13 L 9 12.5 L 8 14 L 7 12.5 L 5 13 L 4.5 11 L 3 10 L 3.5 8 L 3 6 L 4.5 5 L 5 3 L 7 3.5 Z\" ' +\n    'fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linejoin=\"round\" />' +\n    '<circle cx=\"8\" cy=\"8\" r=\"2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />',\n\n  // Warning\n  warning:\n    '<path d=\"M 8 2 L 14 13 L 2 13 Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />' +\n    '<line x1=\"8\" y1=\"6\" x2=\"8\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" />' +\n    '<circle cx=\"8\" cy=\"11\" r=\"0.8\" fill=\"currentColor\" />',\n\n  // Lock\n  lock:\n    '<rect x=\"3.5\" y=\"7\" width=\"9\" height=\"7\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" />' +\n    '<path d=\"M 5.5 7 L 5.5 5 Q 5.5 2.5 8 2.5 Q 10.5 2.5 10.5 5 L 10.5 7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" />',\n\n  // Check\n  check:\n    '<path d=\"M 3 8 L 7 12 L 13 4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />',\n\n  // Star\n  star:\n    '<path d=\"M 8 2 L 9.6 6.5 L 14 6.5 L 10.5 9.2 L 11.8 14 L 8 11.2 L 4.2 14 L 5.5 9.2 L 2 6.5 L 6.4 6.5 Z\" ' +\n    'fill=\"currentColor\" stroke=\"none\" />',\n\n  // Plus / minus (handy extras for UI chrome)\n  plus:\n    '<line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />' +\n    '<line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />',\n  minus:\n    '<line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />',\n};\n\nexport function hasIcon(name: string): boolean {\n  return Object.prototype.hasOwnProperty.call(ICON_PATHS, name);\n}\n\n/**\n * Emit a named icon as SVG markup, painted in `color`, fit into a box at\n * (x, y) of `size` pixels square. Returns `undefined` when the name is\n * unknown so the caller can fall back to its previous rendering.\n */\nexport function emitIconByName(\n  name: string,\n  x: number,\n  y: number,\n  size: number,\n  color: string,\n): string | undefined {\n  const body = ICON_PATHS[name];\n  if (body === undefined) return undefined;\n  const scale = size / 16;\n  return (\n    `<g transform=\"translate(${x} ${y}) scale(${scale})\" color=\"${color}\">` +\n    body +\n    `</g>`\n  );\n}\n\n/** Returns the list of all named icons the library knows about. */\nexport function listIcons(): string[] {\n  return Object.keys(ICON_PATHS).sort();\n}\n","/**\n * SVG emitter — walks a LaidOutNode tree and produces an SVG string.\n *\n * Output is self-contained: inline attributes only, no external CSS or\n * font references. Consumers can drop the SVG straight into innerHTML\n * or save it to a file. Any SVG-compatible viewer (browsers, GitHub,\n * Obsidian, Notion) can render it without additional setup.\n */\n\nimport type {\n  Attribute,\n  AttributeFlag,\n  AttributePair,\n  AttributeValue,\n  AvatarNode,\n  BackButtonNode,\n  ButtonNode,\n  CellNode,\n  TabItemNode,\n  ChartNode,\n  CheckboxNode,\n  ChipNode,\n  ComboNode,\n  CrumbNode,\n  IconNode,\n  ImageNode,\n  InputNode,\n  ItemNode,\n  KvNode,\n  MenuItemNode,\n  MenuNode,\n  ProgressNode,\n  RadioNode,\n  ResourceNode,\n  SectionNode,\n  SegmentNode,\n  SheetNode,\n  SliderNode,\n  SlotNode,\n  SpinnerNode,\n  StatNode,\n  StatusNode,\n  TabNode,\n  TextNode,\n  ToggleNode,\n  TreeItemNode,\n  WindowNode,\n} from '../parser/ast.js';\nimport type { LaidAnnotation, LaidDocument, LaidOutNode } from './layout.js';\nimport type { AccentName, StateName, Theme } from './themes.js';\nimport { emitIconByName, hasIcon } from './icons.js';\n\nexport interface EmitOptions {\n  id?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nexport function emitSvg(\n  doc: LaidDocument,\n  theme: Theme,\n  options: EmitOptions = {},\n): string {\n  const parts: string[] = [];\n  const width = doc.canvasWidth;\n  const height = doc.canvasHeight;\n\n  const svgAttrs = [\n    'xmlns=\"http://www.w3.org/2000/svg\"',\n    `width=\"${width}\"`,\n    `height=\"${height}\"`,\n    `viewBox=\"0 0 ${width} ${height}\"`,\n    `font-family=\"${escapeAttr(theme.fontFamily)}\"`,\n    `font-size=\"${theme.fontSize}\"`,\n  ];\n  if (options.id !== undefined) {\n    svgAttrs.push(`id=\"${escapeAttr(options.id)}\"`);\n  }\n\n  parts.push(`<svg ${svgAttrs.join(' ')}>`);\n  parts.push(\n    `<rect x=\"0\" y=\"0\" width=\"${width}\" height=\"${height}\" fill=\"${theme.background}\" />`,\n  );\n\n  emitNode(doc.root, theme, parts);\n\n  for (const a of doc.annotations) {\n    emitAnnotation(a, theme, parts);\n  }\n\n  parts.push('</svg>');\n  return parts.join('');\n}\n\nfunction emitAnnotation(a: LaidAnnotation, theme: Theme, out: string[]): void {\n  // Leader line + target dot rendered first so the box paints over them\n  // where they cross the box edge.\n  out.push(\n    `<line x1=\"${a.targetAnchor.x}\" y1=\"${a.targetAnchor.y}\" x2=\"${a.boxAnchor.x}\" y2=\"${a.boxAnchor.y}\" stroke=\"${theme.annotationLineColor}\" stroke-width=\"${theme.annotationStrokeWidth}\" />`,\n  );\n  out.push(\n    `<circle cx=\"${a.targetAnchor.x}\" cy=\"${a.targetAnchor.y}\" r=\"${theme.annotationDotRadius}\" fill=\"${theme.annotationDotColor}\" />`,\n  );\n  out.push(\n    `<rect x=\"${a.x}\" y=\"${a.y}\" width=\"${a.width}\" height=\"${a.height}\" rx=\"${theme.annotationCornerRadius}\" ry=\"${theme.annotationCornerRadius}\" fill=\"${theme.annotationBg}\" stroke=\"${theme.annotationBorder}\" stroke-width=\"${theme.annotationStrokeWidth}\" />`,\n  );\n  const textX = a.x + theme.annotationPaddingX;\n  // Baseline for the first line; subsequent lines advance by lineHeight.\n  let baseline = a.y + theme.annotationPaddingY + theme.fontSize;\n  for (const line of a.lines) {\n    out.push(\n      `<text x=\"${textX}\" y=\"${baseline}\" fill=\"${theme.annotationText}\">${escapeText(line)}</text>`,\n    );\n    baseline += theme.lineHeight;\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch\n// ---------------------------------------------------------------------------\n\nfunction emitNode(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const kind = laid.node.kind;\n  switch (kind) {\n    case 'window':\n      emitWindow(laid, theme, out);\n      break;\n    case 'header':\n    case 'footer':\n      emitChromeBand(laid, kind, theme, out);\n      break;\n    case 'navbar':\n      emitNavbar(laid, theme, out);\n      break;\n    case 'navbarLeading':\n    case 'navbarCenter':\n    case 'navbarTrailing':\n      // Slot wrapper paints nothing of its own; children carry the visuals.\n      for (const c of laid.children) emitNode(c, theme, out);\n      break;\n    case 'panel':\n      emitPanel(laid, theme, out);\n      break;\n    case 'section':\n      emitSection(laid, theme, out);\n      break;\n    case 'tabs':\n      emitTabs(laid, theme, out);\n      break;\n    case 'tab':\n      emitTab(laid, theme, out);\n      break;\n    case 'tabbar':\n      emitTabBar(laid, theme, out);\n      break;\n    case 'tabitem':\n      emitTabItem(laid, theme, out);\n      break;\n    case 'row':\n    case 'col':\n      for (const c of laid.children) emitNode(c, theme, out);\n      break;\n    case 'list':\n      emitList(laid, theme, out);\n      break;\n    case 'item':\n      emitItem(laid, theme, out);\n      break;\n    case 'slot':\n      emitSlot(laid, theme, out);\n      break;\n    case 'text':\n      emitText(laid, theme, out);\n      break;\n    case 'button':\n      emitButton(laid, theme, out);\n      break;\n    case 'backbutton':\n      emitBackButton(laid, theme, out);\n      break;\n    case 'input':\n      emitInput(laid, theme, out);\n      break;\n    case 'combo':\n      emitCombo(laid, theme, out);\n      break;\n    case 'slider':\n      emitSlider(laid, theme, out);\n      break;\n    case 'kv':\n      emitKv(laid, theme, out);\n      break;\n    case 'image':\n      emitImage(laid, theme, out);\n      break;\n    case 'icon':\n      emitIcon(laid, theme, out);\n      break;\n    case 'divider':\n      emitDivider(laid, theme, out);\n      break;\n    case 'spacer':\n      // Nothing to paint — spacer's only job is to consume row slack during\n      // layout so its siblings anchor to the correct edges.\n      break;\n    case 'grid':\n      emitGrid(laid, theme, out);\n      break;\n    case 'cell':\n      emitCell(laid, theme, out);\n      break;\n    case 'resourcebar':\n      emitResourceBar(laid, theme, out);\n      break;\n    case 'resource':\n      emitResource(laid, theme, out);\n      break;\n    case 'stats':\n      emitStats(laid, theme, out);\n      break;\n    case 'stat':\n      emitStat(laid, theme, out);\n      break;\n    case 'progress':\n      emitProgress(laid, theme, out);\n      break;\n    case 'chart':\n      emitChart(laid, theme, out);\n      break;\n    case 'slotFooter':\n      for (const c of laid.children) emitNode(c, theme, out);\n      break;\n    case 'tree':\n      emitTree(laid, theme, out);\n      break;\n    case 'treeNode':\n      emitTreeNode(laid, theme, out);\n      break;\n    case 'menubar':\n      emitMenubar(laid, theme, out);\n      break;\n    case 'menu':\n      emitMenu(laid, theme, out);\n      break;\n    case 'menuitem':\n      emitMenuItem(laid, theme, out);\n      break;\n    case 'separator':\n      emitMenuSeparator(laid, theme, out);\n      break;\n    case 'breadcrumb':\n      emitBreadcrumb(laid, theme, out);\n      break;\n    case 'crumb':\n      // Crumbs paint themselves via emitBreadcrumb (renders separator + label\n      // per row in one pass to ensure chevron alignment).\n      break;\n    case 'checkbox':\n      emitCheckbox(laid, theme, out);\n      break;\n    case 'radio':\n      emitRadio(laid, theme, out);\n      break;\n    case 'toggle':\n      emitToggle(laid, theme, out);\n      break;\n    case 'chip':\n      emitChip(laid, theme, out);\n      break;\n    case 'avatar':\n      emitAvatar(laid, theme, out);\n      break;\n    case 'spinner':\n      emitSpinner(laid, theme, out);\n      break;\n    case 'status':\n      emitStatus(laid, theme, out);\n      break;\n    case 'sheet':\n      emitSheet(laid, theme, out);\n      break;\n    case 'segmented':\n      emitSegmented(laid, theme, out);\n      break;\n    case 'segment':\n      // Segments paint themselves via emitSegmented so dividers and the\n      // selected fill align with the outer pill border.\n      break;\n  }\n}\n\nfunction emitSheet(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  // Outer sheet LaidOutNode is the scrim; its single child is the panel\n  // (also kinded 'sheet'). See positionSheet in layout.ts for the structure.\n  const node = laid.node as SheetNode;\n  out.push(\n    `<rect x=\"${laid.x}\" y=\"${laid.y}\" width=\"${laid.width}\" height=\"${laid.height}\" ` +\n      `fill=\"${theme.sheetScrimColor}\" opacity=\"${theme.sheetScrimOpacity}\" />`,\n  );\n  const panel = laid.children[0];\n  if (panel === undefined) return;\n  emitSheetPanel(panel, node, theme, out);\n}\n\nfunction emitSheetPanel(\n  panel: LaidOutNode,\n  node: SheetNode,\n  theme: Theme,\n  out: string[],\n): void {\n  const r = theme.sheetCornerRadius;\n  if (node.placement === 'bottom') {\n    // Rounded top corners only — bottom edge flush with window bottom.\n    const path = roundedTopRectPath(panel.x, panel.y, panel.width, panel.height, r);\n    out.push(\n      `<path d=\"${path}\" fill=\"${theme.sheetBg}\" stroke=\"${theme.sheetBorder}\" stroke-width=\"${theme.sheetStrokeWidth}\" />`,\n    );\n    // Grabber pill centered near the top.\n    const gw = theme.sheetGrabberWidth;\n    const gh = theme.sheetGrabberHeight;\n    const gx = panel.x + (panel.width - gw) / 2;\n    const gy = panel.y + theme.sheetPadding / 2 + theme.sheetGrabberGap / 2;\n    out.push(\n      `<rect x=\"${gx}\" y=\"${gy}\" width=\"${gw}\" height=\"${gh}\" rx=\"${gh / 2}\" fill=\"${theme.sheetGrabberColor}\" />`,\n    );\n  } else {\n    // Center sheet — fully rounded floating rect.\n    out.push(\n      `<rect x=\"${panel.x + 0.5}\" y=\"${panel.y + 0.5}\" width=\"${panel.width - 1}\" height=\"${panel.height - 1}\" ` +\n        `rx=\"${r}\" ry=\"${r}\" fill=\"${theme.sheetBg}\" stroke=\"${theme.sheetBorder}\" stroke-width=\"${theme.sheetStrokeWidth}\" />`,\n    );\n  }\n\n  if (node.title !== undefined) {\n    const titleY =\n      node.placement === 'bottom'\n        ? panel.y + theme.sheetPadding + theme.sheetGrabberHeight + theme.sheetGrabberGap + theme.sheetTitleHeight * 0.7\n        : panel.y + theme.sheetPadding + theme.sheetTitleHeight * 0.7;\n    out.push(\n      `<text x=\"${panel.x + panel.width / 2}\" y=\"${titleY}\" text-anchor=\"middle\" ` +\n        `font-size=\"${theme.sheetTitleFontSize}\" font-weight=\"600\" fill=\"${theme.textColor}\">${escapeText(node.title)}</text>`,\n    );\n  }\n\n  for (const c of panel.children) emitNode(c, theme, out);\n}\n\n/**\n * SVG path for a rectangle with rounded TOP corners only. Used for bottom\n * sheets, where the bottom edge should meet the window edge cleanly.\n */\nfunction roundedTopRectPath(\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  radius: number,\n): string {\n  const r = Math.min(radius, width / 2, height);\n  return (\n    `M ${x} ${y + r} ` +\n    `Q ${x} ${y} ${x + r} ${y} ` +\n    `L ${x + width - r} ${y} ` +\n    `Q ${x + width} ${y} ${x + width} ${y + r} ` +\n    `L ${x + width} ${y + height} ` +\n    `L ${x} ${y + height} Z`\n  );\n}\n\n// ---------------------------------------------------------------------------\n// v0.4.5 emitters\n// ---------------------------------------------------------------------------\n\nfunction emitTree(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  // Indent guides: one vertical line per nesting level covering the rows.\n  // Derived from the row x-offsets (depth = (row.x - laid.x) / treeIndent).\n  for (const row of laid.children) {\n    emitNode(row, theme, out);\n  }\n}\n\nfunction emitTreeNode(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as TreeItemNode;\n  const isSelected = hasFlag(node.attributes, 'selected');\n  const isCollapsed = hasFlag(node.attributes, 'collapsed');\n  const hasChildren = node.children.length > 0;\n  const iconName = getAttrString(node.attributes, 'icon');\n\n  if (isSelected) {\n    out.push(\n      `<rect x=\"${laid.x}\" y=\"${laid.y}\" width=\"${laid.width}\" height=\"${laid.height}\" fill=\"${theme.treeSelectedBg}\" rx=\"2\" />`,\n    );\n  }\n\n  let cursorX = laid.x + 4;\n  const midY = laid.y + laid.height / 2;\n  // Disclosure glyph (▸ / ▾) or 10px empty space for leaves.\n  if (hasChildren) {\n    const glyph = isCollapsed ? '▸' : '▾';\n    out.push(\n      `<text x=\"${cursorX}\" y=\"${midY + theme.fontSize / 3}\" font-size=\"${theme.smallFontSize}\" fill=\"${theme.treeGlyphColor}\">${glyph}</text>`,\n    );\n  }\n  cursorX += 12;\n\n  if (iconName && hasIcon(iconName)) {\n    const iconSize = 14;\n    const iconMarkup = emitIconByName(\n      iconName,\n      cursorX,\n      midY - iconSize / 2,\n      iconSize,\n      theme.iconStrokeColor,\n    );\n    if (iconMarkup) out.push(iconMarkup);\n    cursorX += iconSize + 4;\n  }\n\n  const textFill = isSelected ? theme.treeSelectedText : theme.textColor;\n  out.push(\n    `<text x=\"${cursorX}\" y=\"${midY + theme.fontSize / 3}\" fill=\"${textFill}\">${escapeText(node.label)}</text>`,\n  );\n}\n\nfunction emitMenubar(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  out.push(\n    `<rect x=\"${laid.x}\" y=\"${laid.y}\" width=\"${laid.width}\" height=\"${laid.height}\" fill=\"${theme.menubarBgColor}\" stroke=\"${theme.menubarBorderColor}\" stroke-width=\"1\" />`,\n  );\n  for (const m of laid.children) {\n    const menu = m.node as MenuNode;\n    out.push(\n      `<text x=\"${m.x + theme.menubarItemPaddingX}\" y=\"${m.y + m.height / 2 + theme.fontSize / 3}\" fill=\"${theme.textColor}\">${escapeText(menu.label)}</text>`,\n    );\n  }\n}\n\nfunction emitMenu(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" fill=\"${theme.menuBgColor}\" stroke=\"${theme.menuBorderColor}\" stroke-width=\"1\" rx=\"3\" />`,\n  );\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitMenuItem(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as MenuItemNode;\n  const isDisabled = hasFlag(node.attributes, 'disabled');\n  const opacity = isDisabled ? '0.5' : '1';\n  const midY = laid.y + laid.height / 2 + theme.fontSize / 3;\n  out.push(\n    `<text x=\"${laid.x + theme.menuItemPaddingX}\" y=\"${midY}\" opacity=\"${opacity}\" fill=\"${theme.textColor}\">${escapeText(node.label)}</text>`,\n  );\n  const shortcut = getAttrString(node.attributes, 'shortcut');\n  if (shortcut !== undefined) {\n    out.push(\n      `<text x=\"${laid.x + laid.width - theme.menuItemPaddingX}\" y=\"${midY}\" text-anchor=\"end\" opacity=\"${opacity}\" font-size=\"${theme.smallFontSize}\" fill=\"${theme.menuShortcutColor}\">${escapeText(shortcut)}</text>`,\n    );\n  }\n}\n\nfunction emitMenuSeparator(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const midY = laid.y + laid.height / 2;\n  out.push(\n    `<line x1=\"${laid.x + 4}\" y1=\"${midY}\" x2=\"${laid.x + laid.width - 4}\" y2=\"${midY}\" stroke=\"${theme.menuSeparatorColor}\" stroke-width=\"1\" />`,\n  );\n}\n\nfunction emitBreadcrumb(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const crumbs = laid.children;\n  for (let i = 0; i < crumbs.length; i++) {\n    const c = crumbs[i]!;\n    const isLast = i === crumbs.length - 1;\n    const node = c.node as CrumbNode;\n    const iconName = getAttrString(node.attributes, 'icon');\n    let labelX = c.x;\n    const midY = c.y + c.height / 2 + theme.fontSize / 3;\n    if (iconName && hasIcon(iconName)) {\n      const iconSize = 14;\n      const iconMarkup = emitIconByName(\n        iconName,\n        c.x,\n        c.y + (c.height - iconSize) / 2,\n        iconSize,\n        theme.iconStrokeColor,\n      );\n      if (iconMarkup) out.push(iconMarkup);\n      labelX += iconSize + 4;\n    }\n    const fill = isLast ? theme.breadcrumbCurrentColor : theme.mutedTextColor;\n    const weight = isLast ? '600' : '400';\n    out.push(\n      `<text x=\"${labelX}\" y=\"${midY}\" font-weight=\"${weight}\" fill=\"${fill}\">${escapeText(node.label)}</text>`,\n    );\n    if (!isLast) {\n      const chevX = c.x + c.width + theme.breadcrumbGap;\n      out.push(\n        `<text x=\"${chevX}\" y=\"${midY}\" fill=\"${theme.breadcrumbSeparatorColor}\">›</text>`,\n      );\n    }\n  }\n}\n\nfunction emitSegmented(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const segs = laid.children;\n  const n = segs.length;\n  const radius = theme.segmentedCornerRadius;\n\n  // Outer rounded-pill container.\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `rx=\"${radius}\" ry=\"${radius}\" fill=\"${theme.segmentedBg}\" stroke=\"${theme.segmentedBorder}\" stroke-width=\"1\" />`,\n  );\n\n  if (n === 0) return;\n\n  // Selected fill — painted before dividers so divider lines still read on top.\n  // The pill corner radius only applies to the outermost segments; inner\n  // ones get square corners so the fill meets the divider cleanly.\n  for (let i = 0; i < n; i++) {\n    const seg = segs[i]!;\n    const node = seg.node as SegmentNode;\n    const selected = hasFlag(node.attributes, 'selected');\n    if (!selected) continue;\n    const isFirst = i === 0;\n    const isLast = i === n - 1;\n    if (isFirst && isLast) {\n      out.push(\n        `<rect x=\"${seg.x + 0.5}\" y=\"${seg.y + 0.5}\" width=\"${seg.width - 1}\" height=\"${seg.height - 1}\" ` +\n          `rx=\"${radius}\" ry=\"${radius}\" fill=\"${theme.segmentedSelectedBg}\" />`,\n      );\n    } else if (isFirst) {\n      // Left pill end: rounded on the left, square on the right where it meets the divider.\n      out.push(\n        `<path d=\"M ${seg.x + radius} ${seg.y + 0.5} ` +\n          `L ${seg.x + seg.width} ${seg.y + 0.5} ` +\n          `L ${seg.x + seg.width} ${seg.y + seg.height - 0.5} ` +\n          `L ${seg.x + radius} ${seg.y + seg.height - 0.5} ` +\n          `A ${radius} ${radius} 0 0 1 ${seg.x + 0.5} ${seg.y + seg.height - 0.5 - radius} ` +\n          `L ${seg.x + 0.5} ${seg.y + 0.5 + radius} ` +\n          `A ${radius} ${radius} 0 0 1 ${seg.x + radius} ${seg.y + 0.5} Z\" ` +\n          `fill=\"${theme.segmentedSelectedBg}\" />`,\n      );\n    } else if (isLast) {\n      // Right pill end: square on the left, rounded on the right.\n      out.push(\n        `<path d=\"M ${seg.x} ${seg.y + 0.5} ` +\n          `L ${seg.x + seg.width - radius} ${seg.y + 0.5} ` +\n          `A ${radius} ${radius} 0 0 1 ${seg.x + seg.width - 0.5} ${seg.y + 0.5 + radius} ` +\n          `L ${seg.x + seg.width - 0.5} ${seg.y + seg.height - 0.5 - radius} ` +\n          `A ${radius} ${radius} 0 0 1 ${seg.x + seg.width - radius} ${seg.y + seg.height - 0.5} ` +\n          `L ${seg.x} ${seg.y + seg.height - 0.5} Z\" ` +\n          `fill=\"${theme.segmentedSelectedBg}\" />`,\n      );\n    } else {\n      // Middle segment: fully square fill, sits flush against dividers on both sides.\n      out.push(\n        `<rect x=\"${seg.x}\" y=\"${seg.y + 0.5}\" width=\"${seg.width}\" height=\"${seg.height - 1}\" ` +\n          `fill=\"${theme.segmentedSelectedBg}\" />`,\n      );\n    }\n  }\n\n  // Vertical dividers between adjacent segments. Skip the divider when the\n  // segment immediately before OR after is selected, since the selected fill\n  // paints over the divider line anyway and an uncovered line looks wrong.\n  for (let i = 1; i < n; i++) {\n    const prev = segs[i - 1]!;\n    const curr = segs[i]!;\n    const prevSelected = hasFlag((prev.node as SegmentNode).attributes, 'selected');\n    const currSelected = hasFlag((curr.node as SegmentNode).attributes, 'selected');\n    if (prevSelected || currSelected) continue;\n    const dx = curr.x;\n    out.push(\n      `<line x1=\"${dx}\" y1=\"${laid.y + 4}\" x2=\"${dx}\" y2=\"${laid.y + laid.height - 4}\" ` +\n        `stroke=\"${theme.segmentedDividerColor}\" stroke-width=\"1\" />`,\n    );\n  }\n\n  // Labels (centered per segment). Disabled segments dim both label and cell.\n  for (const seg of segs) {\n    const node = seg.node as SegmentNode;\n    const selected = hasFlag(node.attributes, 'selected');\n    const disabled = hasFlag(node.attributes, 'disabled');\n    const fill = selected ? theme.segmentedSelectedText : theme.segmentedText;\n    const weight = selected ? '600' : '500';\n    const opacity = disabled ? '0.45' : '1';\n    const cx = seg.x + seg.width / 2;\n    const midY = seg.y + seg.height / 2 + theme.fontSize / 3;\n    out.push(\n      `<text x=\"${cx}\" y=\"${midY}\" text-anchor=\"middle\" font-size=\"${theme.smallFontSize}\" ` +\n        `font-weight=\"${weight}\" opacity=\"${opacity}\" fill=\"${fill}\">${escapeText(node.label)}</text>`,\n    );\n  }\n}\n\nfunction emitCheckbox(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as CheckboxNode;\n  const checked = hasFlag(node.attributes, 'checked');\n  const disabled = hasFlag(node.attributes, 'disabled');\n  const labelRight = !hasFlag(node.attributes, 'label-right')\n    ? false\n    : true;\n  // Default: label on left, control on right. `label-right` flips to common\n  // form layout (control on left, label on right). This is a readability-in-\n  // wireframes choice — form designers can flip per-row.\n  const opacity = disabled ? '0.5' : '1';\n  const size = theme.checkboxSize;\n  const cy = laid.y + laid.height / 2 - size / 2;\n\n  let controlX: number;\n  let labelX: number;\n  if (labelRight) {\n    controlX = laid.x;\n    labelX = controlX + size + theme.checkboxRowGap;\n  } else {\n    labelX = laid.x;\n    controlX = laid.x + laid.width - size;\n  }\n\n  out.push(`<g opacity=\"${opacity}\">`);\n  out.push(\n    `<rect x=\"${controlX + 0.5}\" y=\"${cy + 0.5}\" width=\"${size - 1}\" height=\"${size - 1}\" rx=\"2\" fill=\"${theme.checkboxFillColor}\" stroke=\"${theme.checkboxBorderColor}\" stroke-width=\"1.2\" />`,\n  );\n  if (checked) {\n    out.push(\n      `<path d=\"M ${controlX + size * 0.22} ${cy + size * 0.52} L ${controlX + size * 0.45} ${cy + size * 0.74} L ${controlX + size * 0.8} ${cy + size * 0.28}\" fill=\"none\" stroke=\"${theme.checkboxCheckColor}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />`,\n    );\n  }\n  const midY = laid.y + laid.height / 2 + theme.fontSize / 3;\n  out.push(\n    `<text x=\"${labelX}\" y=\"${midY}\" fill=\"${theme.textColor}\">${escapeText(node.label)}</text>`,\n  );\n  out.push(`</g>`);\n}\n\nfunction emitRadio(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as RadioNode;\n  const selected = hasFlag(node.attributes, 'selected');\n  const disabled = hasFlag(node.attributes, 'disabled');\n  const labelRight = hasFlag(node.attributes, 'label-right');\n  const opacity = disabled ? '0.5' : '1';\n  const size = theme.radioSize;\n  const cy = laid.y + laid.height / 2;\n  let controlCx: number;\n  let labelX: number;\n  if (labelRight) {\n    controlCx = laid.x + size / 2;\n    labelX = laid.x + size + theme.checkboxRowGap;\n  } else {\n    labelX = laid.x;\n    controlCx = laid.x + laid.width - size / 2;\n  }\n\n  out.push(`<g opacity=\"${opacity}\">`);\n  out.push(\n    `<circle cx=\"${controlCx}\" cy=\"${cy}\" r=\"${size / 2 - 0.5}\" fill=\"${theme.checkboxFillColor}\" stroke=\"${theme.checkboxBorderColor}\" stroke-width=\"1.2\" />`,\n  );\n  if (selected) {\n    out.push(\n      `<circle cx=\"${controlCx}\" cy=\"${cy}\" r=\"${size / 4}\" fill=\"${theme.checkboxCheckColor}\" />`,\n    );\n  }\n  const midY = laid.y + laid.height / 2 + theme.fontSize / 3;\n  out.push(\n    `<text x=\"${labelX}\" y=\"${midY}\" fill=\"${theme.textColor}\">${escapeText(node.label)}</text>`,\n  );\n  out.push(`</g>`);\n}\n\nfunction emitToggle(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as ToggleNode;\n  const on = hasFlag(node.attributes, 'on') && !hasFlag(node.attributes, 'off');\n  const disabled = hasFlag(node.attributes, 'disabled');\n  const labelRight = hasFlag(node.attributes, 'label-right');\n  const opacity = disabled ? '0.5' : '1';\n  const w = theme.toggleWidth;\n  const h = theme.toggleHeight;\n  const cy = laid.y + laid.height / 2 - h / 2;\n  let controlX: number;\n  let labelX: number;\n  if (labelRight) {\n    controlX = laid.x;\n    labelX = laid.x + w + theme.checkboxRowGap;\n  } else {\n    labelX = laid.x;\n    controlX = laid.x + laid.width - w;\n  }\n\n  const fill = on ? theme.toggleOnColor : theme.toggleOffColor;\n  const knobR = h / 2 - 2;\n  const knobCx = on ? controlX + w - knobR - 2 : controlX + knobR + 2;\n\n  out.push(`<g opacity=\"${opacity}\">`);\n  out.push(\n    `<rect x=\"${controlX}\" y=\"${cy}\" width=\"${w}\" height=\"${h}\" rx=\"${h / 2}\" fill=\"${fill}\" />`,\n  );\n  out.push(\n    `<circle cx=\"${knobCx}\" cy=\"${cy + h / 2}\" r=\"${knobR}\" fill=\"${theme.toggleKnobColor}\" />`,\n  );\n  const midY = laid.y + laid.height / 2 + theme.fontSize / 3;\n  out.push(\n    `<text x=\"${labelX}\" y=\"${midY}\" fill=\"${theme.textColor}\">${escapeText(node.label)}</text>`,\n  );\n  out.push(`</g>`);\n}\n\nfunction emitChip(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as ChipNode;\n  const selected = hasFlag(node.attributes, 'selected');\n  const closable = hasFlag(node.attributes, 'closable');\n  const accent = getAccent(node.attributes, theme);\n  const iconName = getAttrString(node.attributes, 'icon');\n\n  let bg: string;\n  let border: string;\n  let textColor: string;\n  if (selected) {\n    bg = accent ?? theme.chipSelectedBg;\n    border = accent ?? theme.chipSelectedBorder;\n    textColor = theme.chipSelectedText;\n  } else {\n    bg = theme.chipBg;\n    border = accent ?? theme.chipBorder;\n    textColor = accent ?? theme.chipText;\n  }\n\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" rx=\"${laid.height / 2}\" fill=\"${bg}\" stroke=\"${border}\" stroke-width=\"1\" />`,\n  );\n\n  let cursorX = laid.x + theme.chipPaddingX;\n  const midY = laid.y + laid.height / 2;\n\n  if (iconName && hasIcon(iconName)) {\n    const iconSize = 12;\n    const iconMarkup = emitIconByName(\n      iconName,\n      cursorX,\n      midY - iconSize / 2,\n      iconSize,\n      textColor,\n    );\n    if (iconMarkup) out.push(iconMarkup);\n    cursorX += iconSize + 4;\n  }\n\n  out.push(\n    `<text x=\"${cursorX}\" y=\"${midY + theme.fontSize / 3}\" font-size=\"${theme.smallFontSize}\" fill=\"${textColor}\">${escapeText(node.label)}</text>`,\n  );\n\n  if (closable) {\n    const cx = laid.x + laid.width - theme.chipPaddingX - 4;\n    out.push(\n      `<line x1=\"${cx - 4}\" y1=\"${midY - 4}\" x2=\"${cx + 4}\" y2=\"${midY + 4}\" stroke=\"${textColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\" />`,\n      `<line x1=\"${cx + 4}\" y1=\"${midY - 4}\" x2=\"${cx - 4}\" y2=\"${midY + 4}\" stroke=\"${textColor}\" stroke-width=\"1.2\" stroke-linecap=\"round\" />`,\n    );\n  }\n}\n\nfunction emitAvatar(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as AvatarNode;\n  const accent = getAccent(node.attributes, theme);\n  const bg = accent ?? theme.avatarBg;\n  const border = accent ?? theme.avatarBorder;\n  const text = accent ? '#ffffff' : theme.avatarText;\n  const cx = laid.x + laid.width / 2;\n  const cy = laid.y + laid.height / 2;\n  const r = laid.width / 2 - 0.5;\n\n  out.push(\n    `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"${bg}\" stroke=\"${border}\" stroke-width=\"1\" />`,\n  );\n  const initials = (node.initials || '?').slice(0, 2).toUpperCase();\n  const fontSize = Math.max(10, Math.round(laid.width * 0.42));\n  out.push(\n    `<text x=\"${cx}\" y=\"${cy + fontSize / 3}\" text-anchor=\"middle\" font-size=\"${fontSize}\" font-weight=\"600\" fill=\"${text}\">${escapeText(initials)}</text>`,\n  );\n}\n\nfunction emitSpinner(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as SpinnerNode;\n  const cx = laid.x + theme.spinnerSize / 2;\n  const cy = laid.y + laid.height / 2;\n  const r = theme.spinnerSize / 2 - 2;\n  // Dashed ring — implies motion without actually animating.\n  out.push(\n    `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"none\" stroke=\"${theme.spinnerColor}\" stroke-width=\"1.6\" stroke-dasharray=\"${r * 1.3} ${r * 0.9}\" stroke-linecap=\"round\" />`,\n  );\n  if (node.label !== undefined) {\n    out.push(\n      `<text x=\"${laid.x + theme.spinnerSize + theme.rowGap}\" y=\"${cy + theme.fontSize / 3}\" font-size=\"${theme.smallFontSize}\" fill=\"${theme.mutedTextColor}\">${escapeText(node.label)}</text>`,\n    );\n  }\n}\n\nfunction emitStatus(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as StatusNode;\n  const kindRaw = getAttrIdent(node.attributes, 'kind') ?? 'info';\n  const kind = (['success', 'info', 'warning', 'error'] as const).includes(\n    kindRaw as 'success',\n  )\n    ? (kindRaw as 'success' | 'info' | 'warning' | 'error')\n    : 'info';\n  const style = theme.statusColors[kind];\n\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" rx=\"${laid.height / 2}\" fill=\"${style.bg}\" stroke=\"${style.border}\" stroke-width=\"1\" />`,\n  );\n\n  const glyphX = laid.x + theme.statusPaddingX;\n  const midY = laid.y + laid.height / 2;\n  // Kind-specific glyph: check (success), info i (info), ! (warning), × (error).\n  if (kind === 'success') {\n    out.push(\n      `<path d=\"M ${glyphX} ${midY} L ${glyphX + 4} ${midY + 4} L ${glyphX + 10} ${midY - 4}\" fill=\"none\" stroke=\"${style.border}\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />`,\n    );\n  } else if (kind === 'warning') {\n    out.push(\n      `<path d=\"M ${glyphX + 5} ${midY - 5} L ${glyphX + 10} ${midY + 4} L ${glyphX} ${midY + 4} Z\" fill=\"none\" stroke=\"${style.border}\" stroke-width=\"1.4\" stroke-linejoin=\"round\" />`,\n      `<line x1=\"${glyphX + 5}\" y1=\"${midY - 1}\" x2=\"${glyphX + 5}\" y2=\"${midY + 2}\" stroke=\"${style.border}\" stroke-width=\"1.4\" stroke-linecap=\"round\" />`,\n    );\n  } else if (kind === 'error') {\n    out.push(\n      `<line x1=\"${glyphX}\" y1=\"${midY - 4}\" x2=\"${glyphX + 10}\" y2=\"${midY + 4}\" stroke=\"${style.border}\" stroke-width=\"1.8\" stroke-linecap=\"round\" />`,\n      `<line x1=\"${glyphX + 10}\" y1=\"${midY - 4}\" x2=\"${glyphX}\" y2=\"${midY + 4}\" stroke=\"${style.border}\" stroke-width=\"1.8\" stroke-linecap=\"round\" />`,\n    );\n  } else {\n    // info — small i glyph\n    out.push(\n      `<circle cx=\"${glyphX + 5}\" cy=\"${midY - 4}\" r=\"1.2\" fill=\"${style.border}\" />`,\n      `<line x1=\"${glyphX + 5}\" y1=\"${midY - 1}\" x2=\"${glyphX + 5}\" y2=\"${midY + 4}\" stroke=\"${style.border}\" stroke-width=\"1.6\" stroke-linecap=\"round\" />`,\n    );\n  }\n\n  out.push(\n    `<text x=\"${glyphX + 16}\" y=\"${midY + theme.fontSize / 3}\" font-size=\"${theme.smallFontSize}\" font-weight=\"500\" fill=\"${style.fg}\">${escapeText(node.label)}</text>`,\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Structural containers\n// ---------------------------------------------------------------------------\n\nfunction emitWindow(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as WindowNode;\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"none\" stroke=\"${theme.windowBorderColor}\" stroke-width=\"${theme.windowStrokeWidth}\" />`,\n  );\n  if (node.title !== undefined) {\n    const titleBarY = laid.y + theme.titleBarHeight;\n    out.push(\n      `<line x1=\"${laid.x}\" y1=\"${titleBarY}\" x2=\"${laid.x + laid.width}\" y2=\"${titleBarY}\" ` +\n        `stroke=\"${theme.chromeLineColor}\" stroke-width=\"${theme.chromeStrokeWidth}\" />`,\n    );\n    const titleY = laid.y + theme.titleBarHeight / 2 + theme.titleFontSize / 3;\n    out.push(\n      `<text x=\"${laid.x + laid.width / 2}\" y=\"${titleY}\" ` +\n        `text-anchor=\"middle\" font-size=\"${theme.titleFontSize}\" font-weight=\"600\" ` +\n        `fill=\"${theme.textColor}\">${escapeText(node.title)}</text>`,\n    );\n  }\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitChromeBand(\n  laid: LaidOutNode,\n  kind: 'header' | 'footer',\n  theme: Theme,\n  out: string[],\n): void {\n  if (kind === 'header') {\n    out.push(\n      `<line x1=\"${laid.x}\" y1=\"${laid.y + laid.height}\" x2=\"${laid.x + laid.width}\" y2=\"${laid.y + laid.height}\" ` +\n        `stroke=\"${theme.chromeLineColor}\" stroke-width=\"${theme.chromeStrokeWidth}\" />`,\n    );\n  } else {\n    out.push(\n      `<line x1=\"${laid.x}\" y1=\"${laid.y}\" x2=\"${laid.x + laid.width}\" y2=\"${laid.y}\" ` +\n        `stroke=\"${theme.chromeLineColor}\" stroke-width=\"${theme.chromeStrokeWidth}\" />`,\n    );\n  }\n  const headerNode = laid.node as { attributes: readonly Attribute[] };\n  const isLarge = kind === 'header' && hasFlag(headerNode.attributes, 'large');\n  for (const c of laid.children) {\n    if (isLarge && c.node.kind === 'text') {\n      emitLargeHeaderTitle(c, theme, out);\n    } else {\n      emitNode(c, theme, out);\n    }\n  }\n}\n\nfunction emitLargeHeaderTitle(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as TextNode;\n  const baseline = laid.y + laid.height * 0.75;\n  out.push(\n    `<text x=\"${laid.x}\" y=\"${baseline}\" font-size=\"${theme.largeFontSize}\" font-weight=\"700\" fill=\"${theme.textColor}\">${escapeText(node.content)}</text>`,\n  );\n}\n\n/**\n * Navbar shares header's chrome-band styling: a divider line below the band\n * separating it from the body. Leading/trailing slot wrappers paint nothing\n * directly — their children (laid out by `positionNavbar`) carry the visuals.\n */\nfunction emitNavbar(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  out.push(\n    `<line x1=\"${laid.x}\" y1=\"${laid.y + laid.height}\" x2=\"${laid.x + laid.width}\" y2=\"${laid.y + laid.height}\" ` +\n      `stroke=\"${theme.chromeLineColor}\" stroke-width=\"${theme.chromeStrokeWidth}\" />`,\n  );\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitPanel(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"none\" stroke=\"${theme.panelBorderColor}\" stroke-width=\"${theme.panelStrokeWidth}\" ` +\n      `stroke-dasharray=\"${theme.panelStrokeDasharray}\" rx=\"2\" />`,\n  );\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitSection(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as SectionNode;\n  const titleY = laid.y + theme.sectionTitleHeight - 4;\n  const accent = getAccent(node.attributes, theme);\n  const titleColor = accent ?? theme.sectionTitleColor;\n\n  // Section title in small caps-like muted style.\n  out.push(\n    `<text x=\"${laid.x}\" y=\"${titleY}\" ` +\n      `font-size=\"${theme.sectionTitleFontSize}\" font-weight=\"700\" letter-spacing=\"0.8\" ` +\n      `fill=\"${titleColor}\">${escapeText(node.title.toUpperCase())}</text>`,\n  );\n\n  // Optional badge pill aligned right.\n  const badge = getAttrString(node.attributes, 'badge');\n  if (badge !== undefined) {\n    const badgeW = badgeRenderWidth(badge, theme);\n    renderBadgePill(\n      laid.x + laid.width - badgeW,\n      laid.y + (theme.sectionTitleHeight - theme.badgeHeight) / 2,\n      badge,\n      theme,\n      out,\n      accent,\n    );\n  }\n\n  // Subtle divider line under the title.\n  const lineY = laid.y + theme.sectionTitleHeight;\n  out.push(\n    `<line x1=\"${laid.x}\" y1=\"${lineY}\" x2=\"${laid.x + laid.width}\" y2=\"${lineY}\" ` +\n      `stroke=\"${accent ?? theme.dividerColor}\" stroke-width=\"${theme.dividerStrokeWidth}\" opacity=\"${accent ? '0.8' : '0.6'}\" />`,\n  );\n\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitTabs(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  // Baseline divider under the tab row.\n  const baselineY = laid.y + laid.height - 0.5;\n  out.push(\n    `<line x1=\"${laid.x}\" y1=\"${baselineY}\" x2=\"${laid.x + laid.width}\" y2=\"${baselineY}\" ` +\n      `stroke=\"${theme.chromeLineColor}\" stroke-width=\"${theme.chromeStrokeWidth}\" />`,\n  );\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitTab(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as TabNode;\n  const isActive = hasFlag(node.attributes, 'active');\n  const badge = getAttrString(node.attributes, 'badge');\n  const fill = isActive ? theme.tabActiveColor : theme.tabInactiveColor;\n  const weight = isActive ? '600' : '400';\n\n  // Label\n  const labelX = laid.x + theme.tabPaddingX;\n  const labelY = laid.y + laid.height / 2 + theme.fontSize / 3;\n  out.push(\n    `<text x=\"${labelX}\" y=\"${labelY}\" font-weight=\"${weight}\" fill=\"${fill}\">${escapeText(node.label)}</text>`,\n  );\n\n  // Inline badge after label\n  if (badge !== undefined) {\n    const labelWidth = node.label.length * theme.averageCharWidth;\n    renderBadgePill(\n      labelX + labelWidth + 6,\n      laid.y + (laid.height - theme.badgeHeight) / 2,\n      badge,\n      theme,\n      out,\n    );\n  }\n\n  // Active underline\n  if (isActive) {\n    const underlineY = laid.y + laid.height - 2;\n    out.push(\n      `<line x1=\"${laid.x + 4}\" y1=\"${underlineY}\" x2=\"${laid.x + laid.width - 4}\" y2=\"${underlineY}\" ` +\n        `stroke=\"${theme.tabUnderlineColor}\" stroke-width=\"2\" />`,\n    );\n  }\n}\n\nfunction emitTabBar(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  // Top edge of the band draws the chrome separator, matching footer.\n  out.push(\n    `<line x1=\"${laid.x}\" y1=\"${laid.y}\" x2=\"${laid.x + laid.width}\" y2=\"${laid.y}\" ` +\n      `stroke=\"${theme.chromeLineColor}\" stroke-width=\"${theme.chromeStrokeWidth}\" />`,\n  );\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitTabItem(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as TabItemNode;\n  const isSelected = hasFlag(node.attributes, 'selected');\n  const isDisabled = hasFlag(node.attributes, 'disabled');\n  const iconName = getAttrString(node.attributes, 'icon');\n  const badge = getAttrString(node.attributes, 'badge');\n\n  const color = isDisabled\n    ? theme.disabledColor\n    : isSelected\n      ? theme.tabbarSelectedColor\n      : theme.tabbarInactiveColor;\n  const opacity = isDisabled ? '0.55' : '1';\n\n  // Icon + label stack, centered horizontally within the tab's column.\n  const stackHeight =\n    theme.tabbarIconSize + theme.tabbarIconLabelGap + theme.tabbarLabelFontSize;\n  const stackTop = laid.y + (laid.height - stackHeight) / 2;\n  const iconX = laid.x + (laid.width - theme.tabbarIconSize) / 2;\n  const iconY = stackTop;\n\n  out.push(`<g opacity=\"${opacity}\">`);\n\n  if (iconName && hasIcon(iconName)) {\n    const markup = emitIconByName(iconName, iconX, iconY, theme.tabbarIconSize, color);\n    if (markup) out.push(markup);\n  } else {\n    // Fallback: boxed first letter (matches v0.3 icon-unknown behavior).\n    const letter = (iconName ?? node.label.charAt(0) ?? '?').charAt(0).toUpperCase();\n    out.push(\n      `<rect x=\"${iconX + 0.5}\" y=\"${iconY + 0.5}\" width=\"${theme.tabbarIconSize - 1}\" height=\"${theme.tabbarIconSize - 1}\" ` +\n        `fill=\"none\" stroke=\"${color}\" stroke-width=\"1\" rx=\"2\" />`,\n      `<text x=\"${iconX + theme.tabbarIconSize / 2}\" y=\"${iconY + theme.tabbarIconSize / 2 + theme.smallFontSize / 3}\" ` +\n        `text-anchor=\"middle\" font-size=\"${theme.smallFontSize}\" font-weight=\"600\" fill=\"${color}\">${escapeText(letter)}</text>`,\n    );\n  }\n\n  // Label under the icon, centered.\n  const labelY = iconY + theme.tabbarIconSize + theme.tabbarIconLabelGap + theme.tabbarLabelFontSize;\n  out.push(\n    `<text x=\"${laid.x + laid.width / 2}\" y=\"${labelY}\" ` +\n      `text-anchor=\"middle\" font-size=\"${theme.tabbarLabelFontSize}\" font-weight=\"${isSelected ? '600' : '400'}\" ` +\n      `fill=\"${color}\">${escapeText(node.label)}</text>`,\n  );\n\n  out.push(`</g>`);\n\n  // Badge pill clipped to the icon's top-right, consistent with tab badge.\n  if (badge !== undefined) {\n    const badgeW = badgeRenderWidth(badge, theme);\n    renderBadgePill(\n      iconX + theme.tabbarIconSize - badgeW / 2,\n      iconY - theme.badgeHeight / 3,\n      badge,\n      theme,\n      out,\n    );\n  }\n}\n\nfunction emitList(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitItem(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as ItemNode;\n  const bulletX = laid.x + 4;\n  const bulletY = laid.y + laid.height / 2 + 1;\n  out.push(\n    `<circle cx=\"${bulletX + 2}\" cy=\"${bulletY}\" r=\"2\" fill=\"${theme.bulletColor}\" />`,\n  );\n  const textX = laid.x + theme.bulletWidth;\n  const textY = laid.y + laid.height * 0.7;\n  out.push(\n    `<text x=\"${textX}\" y=\"${textY}\" fill=\"${theme.textColor}\">${escapeText(node.text)}</text>`,\n  );\n  if (hasFlag(node.attributes, 'chevron')) {\n    emitDisclosureChevron(\n      laid.x + laid.width - theme.chevronGlyphGutter / 2,\n      laid.y + laid.height / 2,\n      theme,\n      out,\n    );\n  }\n}\n\nfunction emitSlot(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as SlotNode;\n  const isActive = hasFlag(node.attributes, 'active');\n  const state = getState(node.attributes);\n  const accent = getAccent(node.attributes, theme);\n\n  let stroke: string;\n  let strokeWidth: number;\n  let fill: string;\n  let textColor: string;\n  let badgeIcon: string | undefined;\n\n  if (state !== undefined) {\n    const s = theme.states[state];\n    stroke = accent ?? s.border;\n    fill = s.fill;\n    textColor = s.text;\n    strokeWidth = state === 'active' ? theme.slotActiveStrokeWidth : theme.slotStrokeWidth;\n    badgeIcon = s.badge;\n  } else if (isActive) {\n    stroke = accent ?? theme.slotActiveBorderColor;\n    fill = theme.slotFillColor;\n    textColor = theme.textColor;\n    strokeWidth = theme.slotActiveStrokeWidth;\n  } else {\n    stroke = accent ?? theme.slotBorderColor;\n    fill = theme.slotFillColor;\n    textColor = theme.textColor;\n    strokeWidth = theme.slotStrokeWidth;\n  }\n\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\" rx=\"4\" />`,\n  );\n\n  // Title\n  const titleX = laid.x + theme.slotPadding;\n  const titleY = laid.y + theme.slotPadding + theme.slotTitleHeight * 0.7;\n  out.push(\n    `<text x=\"${titleX}\" y=\"${titleY}\" font-weight=\"600\" fill=\"${textColor}\">${escapeText(node.title)}</text>`,\n  );\n\n  const hasChevron = hasFlag(node.attributes, 'chevron');\n\n  // State badge in the top-right corner (lock/check/star, if the state supplies one).\n  // When a chevron is also present, slide the badge inward so both are visible.\n  if (badgeIcon !== undefined) {\n    const sz = 14;\n    const chevronShift = hasChevron ? theme.chevronGlyphGutter : 0;\n    const bx = laid.x + laid.width - theme.slotPadding - sz - chevronShift;\n    const by = laid.y + theme.slotPadding + (theme.slotTitleHeight - sz) / 2;\n    const iconMarkup = emitIconByName(badgeIcon, bx, by, sz, stroke);\n    if (iconMarkup) out.push(iconMarkup);\n  }\n\n  if (hasChevron) {\n    emitDisclosureChevron(\n      laid.x + laid.width - theme.slotPadding - theme.chevronGlyphSize,\n      laid.y + theme.slotPadding + theme.slotTitleHeight / 2,\n      theme,\n      out,\n    );\n  }\n\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\n/**\n * Trailing right-chevron glyph. Rendered as a path (rather than the unicode\n * `›` character) so it looks identical across browsers, fonts, and rasterizers.\n * Centered at (cx, cy); two diagonals meet at the right tip.\n */\nfunction emitDisclosureChevron(\n  cx: number,\n  cy: number,\n  theme: Theme,\n  out: string[],\n): void {\n  const s = theme.chevronGlyphSize;\n  out.push(\n    `<path d=\"M ${cx - s} ${cy - s} L ${cx} ${cy} L ${cx - s} ${cy + s}\" ` +\n      `fill=\"none\" stroke=\"${theme.chevronGlyphColor}\" stroke-width=\"${theme.chevronGlyphStrokeWidth}\" ` +\n      `stroke-linecap=\"round\" stroke-linejoin=\"round\" />`,\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Leaves\n// ---------------------------------------------------------------------------\n\nfunction emitText(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as TextNode;\n  const style = textStyle(node.attributes, theme);\n  const baseline = laid.y + laid.height * 0.75;\n  out.push(\n    `<text x=\"${laid.x}\" y=\"${baseline}\"${style}>${escapeText(node.content)}</text>`,\n  );\n}\n\nfunction emitButton(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as ButtonNode;\n  const isPrimary = hasFlag(node.attributes, 'primary');\n  const isDisabled = hasFlag(node.attributes, 'disabled');\n  const accent = getAccent(node.attributes, theme);\n  let fill = isPrimary ? theme.primaryButtonFill : theme.buttonFill;\n  let textFill = isPrimary ? theme.primaryButtonText : theme.buttonText;\n  let stroke = isDisabled ? theme.disabledColor : theme.buttonBorderColor;\n  if (accent !== undefined && !isDisabled) {\n    if (isPrimary) {\n      fill = accent;\n      textFill = '#ffffff';\n      stroke = accent;\n    } else {\n      stroke = accent;\n      textFill = accent;\n    }\n  }\n  const opacity = isDisabled ? '0.55' : '1';\n  const badge = getAttrString(node.attributes, 'badge');\n  const iconName = getAttrString(node.attributes, 'icon');\n  const labelFill = isDisabled ? theme.disabledColor : textFill;\n\n  // Fast path: no icon. Emit the historical markup form (text-anchor=middle\n  // around the button center) so existing renders stay byte-identical.\n  if (iconName === undefined) {\n    out.push(\n      `<g opacity=\"${opacity}\">`,\n      `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n        `fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"${theme.buttonStrokeWidth}\" rx=\"3\" />`,\n      `<text x=\"${laid.x + laid.width / 2 - (badge ? badgeRenderWidth(badge, theme) / 2 : 0)}\" ` +\n        `y=\"${laid.y + laid.height / 2 + theme.fontSize / 3}\" ` +\n        `text-anchor=\"middle\" font-weight=\"500\" fill=\"${labelFill}\">${escapeText(node.label)}</text>`,\n      `</g>`,\n    );\n\n    if (badge !== undefined) {\n      renderBadgePill(\n        laid.x + laid.width - badgeRenderWidth(badge, theme) - 8,\n        laid.y + (laid.height - theme.badgeHeight) / 2,\n        badge,\n        theme,\n        out,\n      );\n    }\n    return;\n  }\n\n  // Icon present (icon-only or icon+label). Lay icon and label out as a\n  // group, centered horizontally and offset left by half the badge width\n  // so the visual centerline matches the no-badge case.\n  const labelW = node.label.length * theme.averageCharWidth;\n  const iconBlockW =\n    theme.inlineIconSize + (node.label.length > 0 ? theme.inlineIconLabelGap : 0);\n  const groupW = iconBlockW + labelW;\n  const badgeShift = badge !== undefined ? badgeRenderWidth(badge, theme) / 2 : 0;\n  const groupX = laid.x + (laid.width - groupW) / 2 - badgeShift;\n  const iconY = laid.y + (laid.height - theme.inlineIconSize) / 2;\n\n  out.push(\n    `<g opacity=\"${opacity}\">`,\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"${theme.buttonStrokeWidth}\" rx=\"3\" />`,\n  );\n\n  const iconMarkup = emitIconByName(iconName, groupX, iconY, theme.inlineIconSize, labelFill);\n  if (iconMarkup) {\n    out.push(iconMarkup);\n  } else {\n    // Unknown icon — boxed first-letter fallback, same convention as the\n    // standalone `icon` primitive.\n    const glyph = (iconName.charAt(0) || '?').toUpperCase();\n    out.push(\n      `<rect x=\"${groupX + 0.5}\" y=\"${iconY + 0.5}\" width=\"${theme.inlineIconSize - 1}\" ` +\n        `height=\"${theme.inlineIconSize - 1}\" fill=\"none\" stroke=\"${labelFill}\" stroke-width=\"1\" rx=\"2\" />`,\n      `<text x=\"${groupX + theme.inlineIconSize / 2}\" y=\"${iconY + theme.inlineIconSize / 2 + theme.smallFontSize / 3}\" ` +\n        `text-anchor=\"middle\" font-size=\"${theme.smallFontSize}\" font-weight=\"600\" fill=\"${labelFill}\">${escapeText(glyph)}</text>`,\n    );\n  }\n\n  if (node.label.length > 0) {\n    const labelX = groupX + iconBlockW;\n    out.push(\n      `<text x=\"${labelX}\" y=\"${laid.y + laid.height / 2 + theme.fontSize / 3}\" ` +\n        `font-weight=\"500\" fill=\"${labelFill}\">${escapeText(node.label)}</text>`,\n    );\n  }\n\n  out.push(`</g>`);\n\n  if (badge !== undefined) {\n    renderBadgePill(\n      laid.x + laid.width - badgeRenderWidth(badge, theme) - 8,\n      laid.y + (laid.height - theme.badgeHeight) / 2,\n      badge,\n      theme,\n      out,\n    );\n  }\n}\n\nfunction emitBackButton(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as BackButtonNode;\n  const isDisabled = hasFlag(node.attributes, 'disabled');\n  const color = isDisabled ? theme.disabledColor : theme.backButtonChevronColor;\n  const opacity = isDisabled ? '0.55' : '1';\n  const chevronGlyphHeight = 12;\n  const chevronX = laid.x + theme.buttonPaddingX;\n  const chevronCenterY = laid.y + laid.height / 2;\n  // Path chevron: two strokes forming `<`. Drawn as a path (not unicode char)\n  // so the glyph doesn't depend on the viewer's font substitution.\n  const top = chevronCenterY - chevronGlyphHeight / 2;\n  const bottom = chevronCenterY + chevronGlyphHeight / 2;\n  const tip = chevronX;\n  const right = chevronX + theme.backButtonChevronWidth;\n  out.push(\n    `<g opacity=\"${opacity}\">`,\n    `<path d=\"M ${right} ${top} L ${tip} ${chevronCenterY} L ${right} ${bottom}\" ` +\n      `fill=\"none\" stroke=\"${color}\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />`,\n    `<text x=\"${right + theme.backButtonChevronGap}\" y=\"${chevronCenterY + theme.fontSize / 3}\" ` +\n      `fill=\"${color}\">${escapeText(node.label)}</text>`,\n    `</g>`,\n  );\n}\n\nfunction emitInput(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as InputNode;\n  const placeholder = getAttrString(node.attributes, 'placeholder') ?? '';\n  const isDisabled = hasFlag(node.attributes, 'disabled');\n  const opacity = isDisabled ? '0.55' : '1';\n\n  out.push(\n    `<g opacity=\"${opacity}\">`,\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"${theme.background}\" stroke=\"${theme.panelBorderColor}\" stroke-width=\"${theme.inputStrokeWidth}\" rx=\"2\" />`,\n    `<text x=\"${laid.x + theme.inputPaddingX}\" y=\"${laid.y + laid.height / 2 + theme.fontSize / 3}\" ` +\n      `fill=\"${theme.placeholderColor}\">${escapeText(placeholder)}</text>`,\n    `</g>`,\n  );\n}\n\nfunction emitCombo(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as ComboNode;\n  const value = getAttrString(node.attributes, 'value') ?? node.label ?? '';\n  const isDisabled = hasFlag(node.attributes, 'disabled');\n  const opacity = isDisabled ? '0.55' : '1';\n  const chevronX = laid.x + laid.width - theme.comboChevronWidth + 4;\n  const midY = laid.y + laid.height / 2;\n\n  out.push(\n    `<g opacity=\"${opacity}\">`,\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"${theme.background}\" stroke=\"${theme.panelBorderColor}\" stroke-width=\"${theme.inputStrokeWidth}\" rx=\"2\" />`,\n    `<text x=\"${laid.x + theme.inputPaddingX}\" y=\"${midY + theme.fontSize / 3}\" fill=\"${theme.textColor}\">${escapeText(value)}</text>`,\n    // Chevron ▾\n    `<path d=\"M ${chevronX} ${midY - 3} L ${chevronX + 10} ${midY - 3} L ${chevronX + 5} ${midY + 3} Z\" fill=\"${theme.comboChevronColor}\" />`,\n    `</g>`,\n  );\n}\n\nfunction emitSlider(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as SliderNode;\n  const range = getAttrRange(node.attributes, 'range') ?? { min: 0, max: 100 };\n  const value = getAttrNumber(node.attributes, 'value') ?? range.min;\n  const label = getAttrString(node.attributes, 'label');\n\n  const trackX = laid.x;\n  const trackY = laid.y + laid.height / 2 - theme.sliderTrackHeight / 2;\n  const trackW = laid.width;\n  const thumbT = clamp01((value - range.min) / (range.max - range.min));\n  const thumbX = trackX + trackW * thumbT;\n  const thumbY = laid.y + laid.height / 2;\n\n  // Optional label above the track\n  if (label !== undefined) {\n    out.push(\n      `<text x=\"${laid.x}\" y=\"${laid.y + theme.fontSize * 0.9}\" ` +\n        `font-size=\"${theme.smallFontSize}\" fill=\"${theme.mutedTextColor}\">${escapeText(label)}</text>`,\n    );\n  }\n\n  // Track base\n  out.push(\n    `<rect x=\"${trackX}\" y=\"${trackY}\" width=\"${trackW}\" height=\"${theme.sliderTrackHeight}\" ` +\n      `fill=\"${theme.sliderTrackColor}\" rx=\"${theme.sliderTrackHeight / 2}\" />`,\n  );\n  // Filled portion\n  out.push(\n    `<rect x=\"${trackX}\" y=\"${trackY}\" width=\"${thumbX - trackX}\" height=\"${theme.sliderTrackHeight}\" ` +\n      `fill=\"${theme.sliderFillColor}\" rx=\"${theme.sliderTrackHeight / 2}\" />`,\n  );\n  // Thumb\n  out.push(\n    `<circle cx=\"${thumbX}\" cy=\"${thumbY}\" r=\"${theme.sliderThumbRadius}\" ` +\n      `fill=\"${theme.sliderThumbColor}\" stroke=\"${theme.background}\" stroke-width=\"1.5\" />`,\n  );\n}\n\nfunction emitKv(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as KvNode;\n  const valueStyle = textStyle(node.attributes, theme);\n  const baseline = laid.y + laid.height * 0.75;\n\n  // Optional leading icon (v0.5.2). Painted in default text color so the\n  // glyph reads as a label affordance, not a polarity signal — that role\n  // is reserved for accent= on the value side.\n  const iconName = getAttrString(node.attributes, 'icon');\n  let labelX = laid.x;\n  if (iconName !== undefined) {\n    const iconY = laid.y + (laid.height - theme.inlineIconSize) / 2;\n    const markup = emitIconByName(\n      iconName,\n      laid.x,\n      iconY,\n      theme.inlineIconSize,\n      theme.textColor,\n    );\n    if (markup) {\n      out.push(markup);\n    } else {\n      const glyph = (iconName.charAt(0) || '?').toUpperCase();\n      out.push(\n        `<rect x=\"${laid.x + 0.5}\" y=\"${iconY + 0.5}\" width=\"${theme.inlineIconSize - 1}\" ` +\n          `height=\"${theme.inlineIconSize - 1}\" fill=\"none\" stroke=\"${theme.textColor}\" stroke-width=\"1\" rx=\"2\" />`,\n        `<text x=\"${laid.x + theme.inlineIconSize / 2}\" y=\"${iconY + theme.inlineIconSize / 2 + theme.smallFontSize / 3}\" ` +\n          `text-anchor=\"middle\" font-size=\"${theme.smallFontSize}\" font-weight=\"600\" fill=\"${theme.textColor}\">${escapeText(glyph)}</text>`,\n      );\n    }\n    labelX = laid.x + theme.inlineIconSize + theme.inlineIconLabelGap;\n  }\n\n  // Label (always default body text)\n  out.push(\n    `<text x=\"${labelX}\" y=\"${baseline}\" fill=\"${theme.textColor}\">${escapeText(node.label)}</text>`,\n  );\n  // Value — right-aligned at laid.x + laid.width\n  out.push(\n    `<text x=\"${laid.x + laid.width}\" y=\"${baseline}\" text-anchor=\"end\"${valueStyle}>${escapeText(node.value)}</text>`,\n  );\n}\n\nfunction emitImage(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as ImageNode;\n  const label = getAttrString(node.attributes, 'label') ?? 'image';\n\n  // Bordered rect with dashed stroke\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"${theme.slotFillColor}\" stroke=\"${theme.panelBorderColor}\" stroke-width=\"${theme.panelStrokeWidth}\" ` +\n      `stroke-dasharray=\"${theme.panelStrokeDasharray}\" rx=\"2\" />`,\n  );\n  // Diagonal lines (corner to corner) for \"placeholder image\" feel\n  out.push(\n    `<line x1=\"${laid.x}\" y1=\"${laid.y}\" x2=\"${laid.x + laid.width}\" y2=\"${laid.y + laid.height}\" ` +\n      `stroke=\"${theme.panelBorderColor}\" stroke-width=\"0.5\" opacity=\"0.4\" />`,\n    `<line x1=\"${laid.x + laid.width}\" y1=\"${laid.y}\" x2=\"${laid.x}\" y2=\"${laid.y + laid.height}\" ` +\n      `stroke=\"${theme.panelBorderColor}\" stroke-width=\"0.5\" opacity=\"0.4\" />`,\n  );\n  // Center label\n  out.push(\n    `<text x=\"${laid.x + laid.width / 2}\" y=\"${laid.y + laid.height / 2 + theme.fontSize / 3}\" ` +\n      `text-anchor=\"middle\" font-size=\"${theme.smallFontSize}\" fill=\"${theme.mutedTextColor}\">${escapeText(label)}</text>`,\n  );\n}\n\nfunction emitIcon(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as IconNode;\n  const name = getAttrString(node.attributes, 'name') ?? '';\n  const accent = getAccent(node.attributes, theme);\n  const color = accent ?? theme.iconStrokeColor;\n\n  if (name && hasIcon(name)) {\n    const markup = emitIconByName(name, laid.x, laid.y, laid.width, color);\n    if (markup !== undefined) {\n      out.push(markup);\n      return;\n    }\n  }\n\n  // Fallback: boxed first-letter placeholder (preserves v0.3 behavior for unknown names).\n  const fallback = name || '?';\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"none\" stroke=\"${color}\" stroke-width=\"1\" rx=\"3\" />`,\n  );\n  const glyph = fallback.charAt(0).toUpperCase();\n  out.push(\n    `<text x=\"${laid.x + laid.width / 2}\" y=\"${laid.y + laid.height / 2 + theme.fontSize / 3}\" ` +\n      `text-anchor=\"middle\" font-size=\"${theme.smallFontSize}\" fill=\"${color}\">${escapeText(glyph)}</text>`,\n  );\n}\n\nfunction emitDivider(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const y = laid.y + laid.height / 2;\n  out.push(\n    `<line x1=\"${laid.x}\" y1=\"${y}\" x2=\"${laid.x + laid.width}\" y2=\"${y}\" ` +\n      `stroke=\"${theme.dividerColor}\" stroke-width=\"${theme.dividerStrokeWidth}\" />`,\n  );\n}\n\nfunction emitGrid(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  // The grid itself is a transparent container; children (cells) paint themselves.\n  void theme;\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitCell(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as CellNode;\n  const state = getState(node.attributes);\n  const accent = getAccent(node.attributes, theme);\n  let stroke: string;\n  let fill: string;\n  let textColor: string;\n  let badgeIcon: string | undefined;\n  let strokeWidth = theme.slotStrokeWidth;\n\n  if (state !== undefined) {\n    const s = theme.states[state];\n    stroke = accent ?? s.border;\n    fill = s.fill;\n    textColor = s.text;\n    badgeIcon = s.badge;\n    if (state === 'active' || state === 'purchased' || state === 'ripe' || state === 'maxed') {\n      strokeWidth = theme.slotActiveStrokeWidth;\n    }\n  } else {\n    stroke = accent ?? theme.slotBorderColor;\n    fill = theme.slotFillColor;\n    textColor = theme.textColor;\n  }\n\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\" rx=\"3\" />`,\n  );\n\n  if (node.label !== undefined) {\n    out.push(\n      `<text x=\"${laid.x + theme.cellPadding}\" y=\"${laid.y + theme.cellPadding + theme.fontSize}\" ` +\n        `font-weight=\"600\" font-size=\"${theme.smallFontSize}\" fill=\"${textColor}\">${escapeText(node.label)}</text>`,\n    );\n  }\n\n  if (badgeIcon !== undefined) {\n    const sz = 12;\n    const bx = laid.x + laid.width - theme.cellPadding - sz;\n    const by = laid.y + theme.cellPadding;\n    const iconMarkup = emitIconByName(badgeIcon, bx, by, sz, stroke);\n    if (iconMarkup) out.push(iconMarkup);\n  }\n\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitResourceBar(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  // Subtle background band so the bar reads as a unit.\n  out.push(\n    `<rect x=\"${laid.x - 4}\" y=\"${laid.y - 4}\" width=\"${laid.width + 8}\" height=\"${laid.height + 8}\" ` +\n      `fill=\"${theme.slotFillColor}\" stroke=\"${theme.panelBorderColor}\" stroke-width=\"0.5\" rx=\"3\" opacity=\"0.6\" />`,\n  );\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitResource(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as ResourceNode;\n  const iconName = getAttrString(node.attributes, 'icon') ?? inferResourceIcon(node.name);\n  const iconColor = theme.iconStrokeColor;\n  if (iconName && hasIcon(iconName)) {\n    const markup = emitIconByName(\n      iconName,\n      laid.x,\n      laid.y + (laid.height - theme.resourceBarIconSize) / 2,\n      theme.resourceBarIconSize,\n      iconColor,\n    );\n    if (markup) out.push(markup);\n  } else {\n    // Small boxed fallback\n    out.push(\n      `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + (laid.height - theme.resourceBarIconSize) / 2 + 0.5}\" ` +\n        `width=\"${theme.resourceBarIconSize - 1}\" height=\"${theme.resourceBarIconSize - 1}\" ` +\n        `fill=\"none\" stroke=\"${iconColor}\" stroke-width=\"1\" rx=\"2\" />`,\n    );\n  }\n  const textX = laid.x + theme.resourceBarIconSize + 6;\n  const textY = laid.y + laid.height / 2 + theme.fontSize / 3;\n  out.push(\n    `<text x=\"${textX}\" y=\"${textY}\" font-size=\"${theme.smallFontSize}\" fill=\"${theme.mutedTextColor}\">` +\n      `${escapeText(node.name)}: </text>` +\n      `<text x=\"${textX + (node.name.length + 2) * theme.averageCharWidth * (theme.smallFontSize / theme.fontSize)}\" y=\"${textY}\" ` +\n      `font-size=\"${theme.smallFontSize}\" font-weight=\"600\" fill=\"${theme.textColor}\">${escapeText(node.value)}</text>`,\n  );\n}\n\nfunction inferResourceIcon(name: string): string | undefined {\n  const lower = name.toLowerCase();\n  if (hasIcon(lower)) return lower;\n  // Lightweight heuristics so authors get sensible glyphs without specifying `icon=`.\n  if (/credit|coin|money|gold|cash/.test(lower)) return 'credits';\n  if (/research|science|lab/.test(lower)) return 'research';\n  if (/military|army|fleet|defense/.test(lower)) return 'military';\n  if (/industry|production|manufactur|factory/.test(lower)) return 'industry';\n  if (/influence|diplo/.test(lower)) return 'influence';\n  if (/approval|happy|morale/.test(lower)) return 'approval';\n  if (/faith|ideology|religion/.test(lower)) return 'faith';\n  if (/admin|authority|governance/.test(lower)) return 'authority';\n  if (/compute|computation|ai/.test(lower)) return 'computation';\n  if (/tech/.test(lower)) return 'tech';\n  if (/policy|law/.test(lower)) return 'policy';\n  return undefined;\n}\n\nfunction emitStats(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  void theme;\n  for (const c of laid.children) emitNode(c, theme, out);\n}\n\nfunction emitStat(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as StatNode;\n  const isBold = hasFlag(node.attributes, 'bold');\n  const isMuted = hasFlag(node.attributes, 'muted');\n  const accent = getAccent(node.attributes, theme);\n  const labelColor = theme.mutedTextColor;\n  const valueColor = accent ?? (isMuted ? theme.mutedTextColor : theme.textColor);\n  const valueWeight = isBold ? '700' : '500';\n  const baseline = laid.y + laid.height * 0.75;\n  const labelW =\n    node.label.length * theme.averageCharWidth * (theme.smallFontSize / theme.fontSize);\n\n  // Optional leading icon (v0.5.2). Slightly smaller than the inline glyph\n  // used by `button`/`kv` so it sits cleanly next to the small-caps label\n  // without dominating the value beside it.\n  const iconName = getAttrString(node.attributes, 'icon');\n  const statIconSize = theme.smallFontSize + 2;\n  let textX = laid.x;\n  if (iconName !== undefined) {\n    const iconY = laid.y + (laid.height - statIconSize) / 2;\n    const markup = emitIconByName(iconName, laid.x, iconY, statIconSize, labelColor);\n    if (markup) {\n      out.push(markup);\n    } else {\n      const glyph = (iconName.charAt(0) || '?').toUpperCase();\n      out.push(\n        `<rect x=\"${laid.x + 0.5}\" y=\"${iconY + 0.5}\" width=\"${statIconSize - 1}\" ` +\n          `height=\"${statIconSize - 1}\" fill=\"none\" stroke=\"${labelColor}\" stroke-width=\"1\" rx=\"2\" />`,\n        `<text x=\"${laid.x + statIconSize / 2}\" y=\"${iconY + statIconSize / 2 + theme.smallFontSize / 3}\" ` +\n          `text-anchor=\"middle\" font-size=\"${theme.smallFontSize}\" font-weight=\"600\" fill=\"${labelColor}\">${escapeText(glyph)}</text>`,\n      );\n    }\n    textX = laid.x + statIconSize + 4;\n  }\n\n  out.push(\n    `<text x=\"${textX}\" y=\"${baseline}\" font-size=\"${theme.smallFontSize}\" ` +\n      `letter-spacing=\"0.5\" fill=\"${labelColor}\">${escapeText(node.label.toUpperCase())}</text>`,\n  );\n  out.push(\n    `<text x=\"${textX + labelW + 6}\" y=\"${baseline}\" font-weight=\"${valueWeight}\" fill=\"${valueColor}\">${escapeText(node.value)}</text>`,\n  );\n}\n\nfunction emitProgress(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as ProgressNode;\n  const label = getAttrString(node.attributes, 'label');\n  const accent = getAccent(node.attributes, theme);\n  const value = getAttrNumber(node.attributes, 'value') ?? 0;\n  const max = Math.max(1, getAttrNumber(node.attributes, 'max') ?? 100);\n  const frac = clamp01(value / max);\n\n  const barY = label !== undefined ? laid.y + theme.smallFontSize + 4 : laid.y;\n  const barHeight = theme.progressHeight;\n\n  if (label !== undefined) {\n    // Label on the left, \"value / max\" on the right, both small.\n    out.push(\n      `<text x=\"${laid.x}\" y=\"${laid.y + theme.smallFontSize}\" ` +\n        `font-size=\"${theme.smallFontSize}\" fill=\"${theme.mutedTextColor}\">${escapeText(label)}</text>`,\n    );\n    const right = `${value} / ${max}`;\n    out.push(\n      `<text x=\"${laid.x + laid.width}\" y=\"${laid.y + theme.smallFontSize}\" ` +\n        `text-anchor=\"end\" font-size=\"${theme.smallFontSize}\" font-weight=\"600\" fill=\"${theme.textColor}\">${escapeText(right)}</text>`,\n    );\n  }\n\n  // Track\n  out.push(\n    `<rect x=\"${laid.x}\" y=\"${barY}\" width=\"${laid.width}\" height=\"${barHeight}\" ` +\n      `fill=\"${theme.sliderTrackColor}\" rx=\"${barHeight / 2}\" />`,\n  );\n  // Fill\n  const fillColor = accent ?? theme.sliderFillColor;\n  out.push(\n    `<rect x=\"${laid.x}\" y=\"${barY}\" width=\"${laid.width * frac}\" height=\"${barHeight}\" ` +\n      `fill=\"${fillColor}\" rx=\"${barHeight / 2}\" />`,\n  );\n}\n\nfunction emitChart(laid: LaidOutNode, theme: Theme, out: string[]): void {\n  const node = laid.node as ChartNode;\n  const kindAttr = getAttrIdent(node.attributes, 'kind');\n  const kind: 'bar' | 'line' | 'pie' =\n    kindAttr === 'line' || kindAttr === 'pie' ? kindAttr : 'bar';\n  const label = getAttrString(node.attributes, 'label');\n  const accent = getAccent(node.attributes, theme);\n  const stroke = accent ?? theme.panelBorderColor;\n  const fill = theme.slotFillColor;\n\n  // Dashed bordered rect — this is a placeholder, not a real chart.\n  out.push(\n    `<rect x=\"${laid.x + 0.5}\" y=\"${laid.y + 0.5}\" width=\"${laid.width - 1}\" height=\"${laid.height - 1}\" ` +\n      `fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"${theme.panelStrokeWidth}\" ` +\n      `stroke-dasharray=\"${theme.panelStrokeDasharray}\" rx=\"3\" />`,\n  );\n\n  // Glyph that signals the chart kind.\n  const inset = 12;\n  const gx = laid.x + inset;\n  const gy = laid.y + inset;\n  const gw = laid.width - inset * 2;\n  const gh = laid.height - inset * 2 - (label !== undefined ? theme.smallFontSize + 4 : 0);\n  const glyphStroke = accent ?? theme.mutedTextColor;\n\n  if (kind === 'bar') {\n    const bars = 4;\n    const barW = gw / (bars * 2);\n    const heights = [0.4, 0.75, 0.55, 0.9];\n    for (let i = 0; i < bars; i++) {\n      const bh = gh * (heights[i] ?? 0.5);\n      const bx = gx + i * barW * 2 + barW * 0.5;\n      const by = gy + gh - bh;\n      out.push(\n        `<rect x=\"${bx}\" y=\"${by}\" width=\"${barW}\" height=\"${bh}\" fill=\"${glyphStroke}\" opacity=\"0.75\" />`,\n      );\n    }\n  } else if (kind === 'line') {\n    const points = [\n      { x: 0, y: 0.7 },\n      { x: 0.25, y: 0.45 },\n      { x: 0.5, y: 0.55 },\n      { x: 0.75, y: 0.2 },\n      { x: 1, y: 0.3 },\n    ];\n    const path = points\n      .map((p, i) => `${i === 0 ? 'M' : 'L'} ${gx + p.x * gw} ${gy + p.y * gh}`)\n      .join(' ');\n    out.push(\n      `<path d=\"${path}\" fill=\"none\" stroke=\"${glyphStroke}\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />`,\n    );\n    for (const p of points) {\n      out.push(\n        `<circle cx=\"${gx + p.x * gw}\" cy=\"${gy + p.y * gh}\" r=\"2\" fill=\"${glyphStroke}\" />`,\n      );\n    }\n  } else {\n    // pie\n    const cx = gx + gw / 2;\n    const cy = gy + gh / 2;\n    const r = Math.min(gw, gh) / 2;\n    out.push(`<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"${glyphStroke}\" opacity=\"0.75\" />`);\n    // Slice indicator — a wedge from 12 o'clock sweeping ~120°\n    const endX = cx + r * Math.cos(-Math.PI / 2 + (2 * Math.PI) / 3);\n    const endY = cy + r * Math.sin(-Math.PI / 2 + (2 * Math.PI) / 3);\n    out.push(\n      `<path d=\"M ${cx} ${cy} L ${cx} ${cy - r} A ${r} ${r} 0 0 1 ${endX} ${endY} Z\" ` +\n        `fill=\"${theme.background}\" opacity=\"0.7\" />`,\n    );\n  }\n\n  // Optional label beneath the glyph.\n  if (label !== undefined) {\n    out.push(\n      `<text x=\"${laid.x + laid.width / 2}\" y=\"${laid.y + laid.height - 8}\" ` +\n        `text-anchor=\"middle\" font-size=\"${theme.smallFontSize}\" fill=\"${theme.mutedTextColor}\">${escapeText(label)}</text>`,\n    );\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Typography + badge helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build the typography-related SVG attributes for a text/kv value from its\n * bare flags and explicit weight/size attributes. Returns a prefixed\n * attribute string (e.g., ` font-weight=\"700\" fill=\"#2d2d2d\"`) ready to\n * interpolate directly into an element open tag.\n */\nfunction textStyle(attrs: readonly Attribute[], theme: Theme): string {\n  const isBold = hasFlag(attrs, 'bold');\n  const isItalic = hasFlag(attrs, 'italic');\n  const isMuted = hasFlag(attrs, 'muted');\n  const weight = getAttrIdent(attrs, 'weight');\n  const size = getAttrIdent(attrs, 'size');\n  const accentColor = getAccent(attrs, theme);\n\n  const parts: string[] = [];\n  let fontWeight: string | null = null;\n  if (weight === 'light') fontWeight = '300';\n  else if (weight === 'semibold') fontWeight = '600';\n  else if (weight === 'bold') fontWeight = '700';\n  else if (weight === 'regular') fontWeight = '400';\n  else if (isBold) fontWeight = '700';\n\n  if (fontWeight) parts.push(`font-weight=\"${fontWeight}\"`);\n\n  let fontSize: number | null = null;\n  if (size === 'small') fontSize = theme.smallFontSize;\n  else if (size === 'large') fontSize = theme.largeFontSize;\n  if (fontSize !== null) parts.push(`font-size=\"${fontSize}\"`);\n\n  if (isItalic) parts.push(`font-style=\"italic\"`);\n\n  // accent= overrides the muted/default text fill. Lets authors mark\n  // polarity (\"good\" / \"bad\" / \"warn\") on stat values, kv values, and\n  // standalone text using the existing accent palette.\n  const fill = accentColor ?? (isMuted ? theme.mutedTextColor : theme.textColor);\n  parts.push(`fill=\"${fill}\"`);\n\n  return ' ' + parts.join(' ');\n}\n\nfunction renderBadgePill(\n  x: number,\n  y: number,\n  text: string,\n  theme: Theme,\n  out: string[],\n  accent?: string,\n): void {\n  const w = badgeRenderWidth(text, theme);\n  const h = theme.badgeHeight;\n  const fill = accent ?? theme.badgeFill;\n  const textFill = accent ? '#ffffff' : theme.badgeText;\n  out.push(\n    `<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\" rx=\"${h / 2}\" fill=\"${fill}\" />`,\n    `<text x=\"${x + w / 2}\" y=\"${y + h / 2 + theme.badgeFontSize / 3}\" ` +\n      `text-anchor=\"middle\" font-size=\"${theme.badgeFontSize}\" font-weight=\"600\" ` +\n      `fill=\"${textFill}\">${escapeText(text)}</text>`,\n  );\n}\n\nfunction getAccent(attrs: readonly Attribute[], theme: Theme): string | undefined {\n  const v = getAttrIdent(attrs, 'accent');\n  if (v === undefined) return undefined;\n  return theme.accents[v as AccentName];\n}\n\nfunction getState(attrs: readonly Attribute[]): StateName | undefined {\n  const v = getAttrIdent(attrs, 'state');\n  if (v === undefined) return undefined;\n  return v as StateName;\n}\n\nfunction badgeRenderWidth(text: string, theme: Theme): number {\n  const charW = theme.averageCharWidth * (theme.badgeFontSize / theme.fontSize);\n  return text.length * charW + theme.badgePaddingX * 2;\n}\n\n// ---------------------------------------------------------------------------\n// Attribute accessors\n// ---------------------------------------------------------------------------\n\nfunction hasFlag(attrs: readonly Attribute[], name: string): boolean {\n  return attrs.some((a) => a.kind === 'flag' && (a as AttributeFlag).flag === name);\n}\n\nfunction getAttr(attrs: readonly Attribute[], key: string): AttributeValue | undefined {\n  for (const a of attrs) {\n    if (a.kind === 'pair' && (a as AttributePair).key === key) {\n      return (a as AttributePair).value;\n    }\n  }\n  return undefined;\n}\n\nfunction getAttrString(attrs: readonly Attribute[], key: string): string | undefined {\n  const v = getAttr(attrs, key);\n  return v?.kind === 'string' ? v.value : undefined;\n}\n\nfunction getAttrNumber(attrs: readonly Attribute[], key: string): number | undefined {\n  const v = getAttr(attrs, key);\n  return v?.kind === 'number' ? v.value : undefined;\n}\n\nfunction getAttrIdent(attrs: readonly Attribute[], key: string): string | undefined {\n  const v = getAttr(attrs, key);\n  return v?.kind === 'identifier' ? v.value : undefined;\n}\n\nfunction getAttrRange(\n  attrs: readonly Attribute[],\n  key: string,\n): { min: number; max: number } | undefined {\n  const v = getAttr(attrs, key);\n  return v?.kind === 'range' ? { min: v.min, max: v.max } : undefined;\n}\n\nfunction clamp01(v: number): number {\n  if (!Number.isFinite(v)) return 0;\n  if (v < 0) return 0;\n  if (v > 1) return 1;\n  return v;\n}\n\n// ---------------------------------------------------------------------------\n// XML escaping\n// ---------------------------------------------------------------------------\n\nfunction escapeText(text: string): string {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\nfunction escapeAttr(value: string): string {\n  return value\n    .replace(/&/g, '&amp;')\n    .replace(/\"/g, '&quot;')\n    .replace(/</g, '&lt;');\n}\n","import { parse } from '../parser/parser.js';\nimport { getTheme, type Theme } from './themes.js';\nimport { layout } from './layout.js';\nimport { emitSvg } from './svg.js';\nimport { getConfig } from '../config.js';\n\nexport interface RenderWireframeOptions {\n  id?: string;\n  theme?: 'default' | 'dark';\n}\n\nexport function renderWireframe(\n  source: string,\n  options: RenderWireframeOptions = {},\n): string {\n  const doc = parse(source);\n  if (!doc.root) {\n    return emptySvg();\n  }\n  const themeName = options.theme ?? getConfig().theme;\n  const theme: Theme = getTheme(themeName);\n  const laid = layout(doc, theme);\n  const emitOpts = options.id !== undefined ? { id: options.id } : {};\n  return emitSvg(laid, theme, emitOpts);\n}\n\nfunction emptySvg(): string {\n  return '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0\" height=\"0\"></svg>';\n}\n\nexport { getTheme, DEFAULT_THEME, DARK_THEME, type Theme } from './themes.js';\n","/**\n * Wireloom — UI wireframe mockups from a Markdown-embedded DSL,\n * rendered as inline SVG.\n *\n * Public API, shaped like other text-to-diagram libraries:\n *\n *   import wireloom from 'wireloom';\n *   wireloom.initialize({ theme: 'default' });\n *   const doc = wireloom.parse(source);\n *   const { svg } = await wireloom.render('id', source);\n *   const canonical = wireloom.serialize(doc);\n */\n\nimport { mergeConfig, type WireloomConfig } from './config.js';\nimport type { Document } from './parser/ast.js';\nimport { parse as parseSource } from './parser/parser.js';\nimport { serialize as serializeDoc } from './parser/serializer.js';\nimport { renderWireframe } from './renderer/index.js';\n\nexport type { WireloomConfig, WireloomTheme, WireloomSecurityLevel } from './config.js';\nexport type * from './parser/ast.js';\nexport { WireloomError } from './parser/errors.js';\nexport { DEFAULT_THEME, DARK_THEME, type Theme } from './renderer/themes.js';\n\nexport interface RenderResult {\n  svg: string;\n}\n\n/**\n * Merges a partial configuration into the global Wireloom config.\n * Theme, security level, and future global options are set here.\n */\nexport function initialize(config: Partial<WireloomConfig>): void {\n  mergeConfig(config);\n}\n\n/**\n * Parses a Wireloom source string into an AST.\n * Throws {@link WireloomError} with line/column info on parse failure.\n */\nexport function parse(source: string): Document {\n  return parseSource(source);\n}\n\n/**\n * Serializes a parsed {@link Document} back to canonical Wireloom source.\n * Useful for formatting, tooling, and roundtrip verification. Comments and\n * non-canonical whitespace in the original source are not preserved; the\n * re-parsed AST of the serialized output equals the input AST.\n */\nexport function serialize(doc: Document): string {\n  return serializeDoc(doc);\n}\n\nexport interface RenderOptions {\n  /** Override the theme for this render without touching the global config. */\n  theme?: 'default' | 'dark';\n}\n\n/**\n * Parses and renders a Wireloom source string to an SVG string.\n * Throws {@link WireloomError} with line/column info on parse failure.\n * If `options.theme` is omitted the global theme from `initialize()` is used.\n */\nexport async function render(\n  id: string,\n  source: string,\n  options?: RenderOptions,\n): Promise<RenderResult> {\n  const rwOpts: { id: string; theme?: 'default' | 'dark' } = { id };\n  if (options?.theme !== undefined) rwOpts.theme = options.theme;\n  const svg = renderWireframe(source, rwOpts);\n  return { svg };\n}\n\nconst wireloom = { initialize, parse, serialize, render };\nexport default wireloom;\n"]}