@dashai/cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/config.ts","../src/lib/output.ts","../src/commands/dev.ts","../src/lib/api-client.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/profile.ts","../src/commands/workspace.ts","../src/lib/scaffold.ts","../src/commands/module/clone.ts","../src/commands/module/connect-git.ts","../src/commands/module/generate.ts","../src/commands/module/dev.ts","../src/commands/module/diff.ts","../src/commands/module/init.ts","../src/commands/module/list.ts","../src/lib/tarball.ts","../src/commands/module/publish.ts","../src/commands/module/pull-data.ts","../src/commands/module/validate.ts","../src/lib/manifest-io.ts","../src/commands/deps/add.ts","../src/commands/deps/check.ts","../src/commands/deps/list.ts","../src/commands/deps/remove.ts","../src/commands/query.ts","../src/commands/module/query-log.ts","../src/commands/module/action-log.ts","../src/bin.ts"],"names":["c","resolvePath","manifestPath","existsSync","exitCode","readFileSync","text","code","out","resolve","mkdirSync","writeFileSync","join","rmSync","fsWatch","intro","isCancel","readdirSync","outro","statSync","select","formatBytes","pathResolve","sleep","POLL_INTERVAL_MS","runTail","runOnce","msg"],"mappings":";;;;;;;;;;;;AAqDA,IAAM,SAAA,GAAY,WAAA;AAClB,IAAM,QAAA,GAAW,UAAA;AAYV,SAAS,SAAA,GAAoB;AAClC,EAAA,IAAI,OAAA,CAAQ,IAAI,eAAA,EAAiB;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,QAAQ,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,QAAA,EAAS,KAAM,OAAA,IAAW,OAAA,CAAQ,IAAI,OAAA,EAAS;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,IAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,QAAQ,CAAA;AAC5C;AAEO,SAAS,UAAA,GAAqB;AACnC,EAAA,OAAO,IAAA,CAAK,SAAA,EAAU,EAAG,SAAS,CAAA;AACpC;AAOO,SAAS,UAAA,GAA+B;AAC7C,EAAA,MAAM,OAAO,UAAA,EAAW;AACxB,EAAA,IAAI,CAAC,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AACtC,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACzB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,gBAAA,EAAmB,IAAI,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,wCAAA;AAAA,KACpD;AAAA,EACF;AACA,EAAA,IAAI,CAAC,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,aAAa,IAAI,CAAA,mEAAA;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,YAAY,MAAA,EAAyB;AACnD,EAAA,MAAM,MAAM,SAAA,EAAU;AACtB,EAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EACpC;AACA,EAAA,MAAM,OAAO,UAAA,EAAW;AACxB,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,CAAA;AACtC,EAAA,aAAA,CAAc,GAAA,EAAK,KAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA,GAAI,MAAM,OAAO,CAAA;AAClE,EAAA,IAAI;AACF,IAAA,SAAA,CAAU,KAAK,GAAK,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AACtB;AAMO,SAAS,YAAA,GAAqB;AACnC,EAAA,MAAM,OAAO,UAAA,EAAW;AACxB,EAAA,IAAI,CAAC,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,EAAA,MAAA,CAAO,IAAI,CAAA;AACb;AAMO,SAAS,aAAA,GAAwB;AACtC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,IAAA,EAAK;AACnD,EAAA,IAAI,OAAA,EAAS,OAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC9C,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,IAAI,KAAK,MAAA,EAAQ,OAAO,IAAI,MAAA,CAAO,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACrD,EAAA,OAAO,uBAAA;AACT;AAMO,SAAS,cAAA,GAAgC;AAC9C,EAAA,MAAM,MAAM,cAAA,EAAe;AAC3B,EAAA,OAAO,KAAK,KAAA,IAAS,IAAA;AACvB;AAEA,SAAS,cAAA,GAAmC;AAC1C,EAAA,IAAI;AACF,IAAA,OAAO,UAAA,EAAW;AAAA,EACpB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,CAAA,EAA4B;AACrD,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,UAAU,OAAO,KAAA;AACxC,EAAA,MAAMA,EAAAA,GAAI,CAAA;AACV,EAAA,IAAI,OAAOA,EAAAA,CAAE,MAAA,KAAW,QAAA,EAAU,OAAO,KAAA;AACzC,EAAA,IAAI,OAAOA,EAAAA,CAAE,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACxC,EAAA,IAAI,OAAOA,EAAAA,CAAE,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AAC1C,EAAA,IAAI,CAACA,EAAAA,CAAE,IAAA,IAAQ,OAAOA,EAAAA,CAAE,IAAA,KAAS,UAAU,OAAO,KAAA;AAClD,EAAA,MAAM,IAAIA,EAAAA,CAAE,IAAA;AACZ,EAAA,IAAI,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,EAAU,OAAO,KAAA;AACrC,EAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACxC,EAAA,OAAO,IAAA;AACT;ACxKO,SAAS,QAAQ,GAAA,EAAmB;AACzC,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,EAAA,CAAG,MAAM,QAAG,CAAC,IAAI,GAAG;AAAA,CAAI,CAAA;AAClD;AAEO,SAAS,KAAK,GAAA,EAAmB;AACtC,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,EAAA,CAAG,KAAK,QAAG,CAAC,IAAI,GAAG;AAAA,CAAI,CAAA;AACjD;AAEO,SAAS,KAAK,GAAA,EAAmB;AACtC,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,EAAA,CAAG,OAAO,QAAG,CAAC,IAAI,GAAG;AAAA,CAAI,CAAA;AACnD;AAEO,SAAS,KAAK,GAAA,EAAmB;AACtC,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,EAAA,CAAG,IAAI,QAAG,CAAC,IAAI,GAAG;AAAA,CAAI,CAAA;AAChD;AAGO,SAAS,IAAI,GAAA,EAAmB;AACrC,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,CAAI,CAAA;AACjC;AAGO,SAAS,EAAA,CAAG,GAAA,EAAa,KAAA,EAAe,KAAA,GAAQ,EAAA,EAAU;AAC/D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAC/B,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,EAAA,CAAG,KAAK,MAAM,CAAC,IAAI,KAAK;AAAA,CAAI,CAAA;AACtD;AAGO,SAAS,KAAK,CAAA,EAAmB;AACtC,EAAA,OAAO,EAAA,CAAG,KAAK,CAAC,CAAA;AAClB;AAGO,SAAS,IAAI,CAAA,EAAmB;AACrC,EAAA,OAAO,EAAA,CAAG,IAAI,CAAC,CAAA;AACjB;;;ACoCA,IAAM,UAAA,GAAa,CAAA,qBAAA,CAAA;AACnB,IAAM,WAAA,GAAc,CAAA,sBAAA,CAAA;AAEpB,eAAsB,WACpB,OAAA,EACiB;AACjB,EAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AACvC,IAAA,IAAA;AAAA,MACE,oBAAoB,IAAA,CAAK,YAAY,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,aAAa,CAAC,CAAA,mCAAA;AAAA,KACnE;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAcC,OAAA,CAAY,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AAC5D,EAAA,MAAMC,aAAAA,GAAe,GAAG,WAAW,CAAA,YAAA,CAAA;AACnC,EAAA,IAAI,CAACC,UAAAA,CAAWD,aAAY,CAAA,EAAG;AAC7B,IAAA,IAAA,CAAK,CAAA,GAAA,EAAM,KAAK,aAAa,CAAC,aAAa,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,CAAG,CAAA;AAC/D,IAAA,IAAA,CAAK,CAAA,IAAA,EAAO,IAAA,CAAK,6BAA6B,CAAC,CAAA,gCAAA,CAAkC,CAAA;AACjF,IAAA,OAAO,CAAA;AAAA,EACT;AAMA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI;AACF,MAAA,OAAO,UAAA,EAAW;AAAA,IACpB,CAAA,CAAA,MAAQ;AAGN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,kBAAA,IAAsB,WAAA,EAAa,KAAA;AAChE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,IAAA,CAAK,CAAA,uBAAA,EAA0B,IAAA,CAAK,gBAAgB,CAAC,CAAA,OAAA,CAAS,CAAA;AAC9D,IAAA,IAAA;AAAA,MACE;AAAA,KAGF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,SACJ,OAAA,CAAQ,MAAA,IACR,QAAQ,GAAA,CAAI,gBAAA,IACZ,aAAa,MAAA,IACb,uBAAA;AACF,EAAA,MAAM,cAAA,GACJ,OAAA,CAAQ,cAAA,IACR,OAAA,CAAQ,IAAI,wBAAA,IACZ,OAAA;AAOF,EAAA,MAAM,QAAA,GAA+C;AAAA,IACnD,GAAG,OAAA,CAAQ,GAAA;AAAA,IACX,gBAAA,EAAkB,MAAA;AAAA,IAClB,kBAAA,EAAoB,QAAA;AAAA,IACpB,wBAAA,EAA0B;AAAA,GAC5B;AAGA,EAAA,IAAA,CAAK,CAAA,wCAAA,CAAqC,CAAA;AAC1C,EAAA,IAAA,CAAK,KAAK,GAAA,CAAI,KAAK,CAAC,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AACvC,EAAA,IAAA,CAAK,KAAK,GAAA,CAAI,cAAc,CAAC,CAAA,CAAA,EAAI,cAAc,CAAA,CAAE,CAAA;AACjD,EAAA,IAAA,CAAK,KAAK,GAAA,CAAI,OAAO,CAAC,CAAA,MAAA,EAAS,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,MAAA,EAAS,aAAa,WAAA,EAAa,KAAA,GAAQ,iCAAiC,qBAAqB,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAA;AACnK,EAAA,IAAA,CAAK,EAAE,CAAA;AAGP,EAAA,MAAM,WAAoE,EAAC;AAE3E,EAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,WAAA,EAAa,QAAQ,CAAA;AACtD,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,WAAA,EAAa,QAAA,EAAU,QAAQ,IAAI,CAAA;AAClE,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA,EAAW,MAAA,EAAQ,aAAa,CAAA;AAAA,EACvE;AAGA,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,MAAA,EAAO,IAAK,QAAA,EAAU;AACxC,IAAA,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AACnD,IAAA,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,EACrD;AAGA,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAwB;AAC7C,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAA,CAAK;AAAA,SAAA,EAAc,GAAG,CAAA,yBAAA,CAAsB,CAAA;AAC5C,IAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,QAAA,EAAU;AAChC,MAAA,IAAI,KAAA,CAAM,QAAA,KAAa,IAAA,IAAQ,KAAA,CAAM,eAAe,IAAA,EAAM;AACxD,QAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAA;AACA,EAAA,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,MAAM,aAAA,CAAc,QAAQ,CAAC,CAAA;AAClD,EAAA,OAAA,CAAQ,EAAA,CAAG,SAAA,EAAW,MAAM,aAAA,CAAc,SAAS,CAAC,CAAA;AAKpD,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC5B,QAAA,CAAS,GAAA;AAAA,MACP,CAAC,EAAE,IAAA,EAAM,KAAA,OACP,IAAI,OAAA;AAAA,QACF,CAAC,WAAA,KAAgB;AACf,UAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAACE,SAAAA,EAAU,MAAA,KAAW;AACrC,YAAA,MAAM,SAAS,MAAA,KAAW,IAAA;AAC1B,YAAA,MAAM,SAAA,GACJA,SAAAA,KAAa,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA;AAC5B,YAAA,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA;AAAA,UAC/C,CAAC,CAAA;AAAA,QACH;AAAA;AACF;AACJ,GACF;AAIA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,CAAC,CAAA;AAC7D,EAAA,IAAI,OAAA,IAAW,CAAC,YAAA,EAAc;AAC5B,IAAA,IAAA,CAAK,IAAI,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsB,OAAA,CAAQ,IAAI,CAAA,wBAAA,CAAqB,CAAA;AAC5E,IAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,QAAA,EAAU;AAChC,MAAA,IAAI,KAAA,CAAM,QAAA,KAAa,IAAA,IAAQ,KAAA,CAAM,eAAe,IAAA,EAAM;AACxD,QAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAC1D,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,OAAA,CAAQ,2BAA2B,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,QAAA;AACT;AAeA,SAAS,eAAA,CACP,aACA,GAAA,EACc;AACd,EAAA,MAAM,KAAA,GAAQ,KAAA;AAAA,IACZ,OAAA,CAAQ,QAAA;AAAA,IACR,CAAC,QAAQ,IAAA,CAAK,CAAC,GAAI,QAAA,EAAU,KAAA,EAAO,SAAS,WAAW,CAAA;AAAA,IACxD;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MACL,GAAA;AAAA,MACA,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA;AAClC,GACF;AACA,EAAA,OAAO,KAAA;AACT;AAYA,SAAS,YAAA,CACP,WAAA,EACA,GAAA,EACA,IAAA,EACc;AACd,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,MAAA,GAAY,CAAC,IAAA,EAAM,UAAU,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,EAAC;AACxE,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,WAAA,EAAa,UAAU,CAAA;AAI7D,EAAA,MAAM,CAAC,GAAA,EAAK,IAAI,CAAA,GAAI,gBAAA,GAChB,CAAC,KAAA,EAAO,CAAC,KAAA,EAAO,UAAA,EAAY,GAAG,QAAQ,CAAC,CAAA,GACxC,CAAC,KAAA,EAAO,CAAC,MAAA,EAAQ,KAAA,EAAO,GAAI,IAAA,KAAS,MAAA,GAAY,CAAC,QAAA,EAAU,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,EAAG,CAAC,CAAA;AAEpF,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM;AAAA,IAC7B,GAAA,EAAK,WAAA;AAAA,IACL,GAAA;AAAA,IACA,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAAA;AAAA;AAAA,IAGhC,KAAA,EAAO,QAAQ,QAAA,KAAa;AAAA,GAC7B,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAOA,SAAS,YAAA,CAAa,aAAqB,UAAA,EAA6B;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,GAAG,WAAW,CAAA,aAAA,CAAA;AAC9B,IAAA,IAAI,CAACD,UAAAA,CAAW,OAAO,CAAA,EAAG,OAAO,KAAA;AACjC,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAME,YAAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAGrD,IAAA,OAAO,OAAO,GAAA,CAAI,OAAA,GAAU,UAAU,CAAA,KAAM,QAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAcA,SAAS,cAAA,CACP,GAAA,EACA,GAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,CAAC,GAAA,EAAK;AACV,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAA2B;AACzC,IAAA,MAAMC,QAAO,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,KAAA,CAAM,SAAS,OAAO,CAAA;AACvE,IAAA,MAAM,WAAW,QAAA,GAAWA,KAAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,QAAA,GAAW,KAAA,CAAM,KAAI,IAAK,EAAA;AAC1B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI;AAAA,CAAI,CAAA;AAAA,IAChC;AAAA,EACF,CAAC,CAAA;AACD,EAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ;AAAA,CAAI,CAAA;AAAA,IACpC;AAAA,EACF,CAAC,CAAA;AACH;AAQA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,EAAA,EAAI,OAAO,MAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA;AAC3B,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,MAAA,EAAI,IAAI,CAAA,CAAA;AAC1B;;;ACxUO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EACzB,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EAET,WAAA,CAAY,MAAA,EAAgB,QAAA,EAAmC,eAAA,EAAyB;AACtF,IAAA,MAAMC,KAAAA,GAAO,QAAA,EAAU,IAAA,IAAQ,cAAA,CAAe,MAAM,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,UAAU,OAAA,IAAW,eAAA;AACrC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAOA,KAAAA;AACZ,IAAA,IAAA,CAAK,UAAU,QAAA,EAAU,OAAA;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA,EAAU,SAAA,IAAa,MAAA,IAAU,GAAA;AAAA,EACpD;AACF,CAAA;AAyBA,eAAsB,WACpB,MAAA,EACA,IAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACf;AACZ,EAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,IAAW,eAAc,EAAG,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACvE,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,CAAA;AAEjE,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,MAAA,EAAQ,kBAAA;AAAA,IACR,GAAI,OAAA,CAAQ,OAAA,IAAW;AAAC,GAC1B;AACA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAAA,EAC5B;AACA,EAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,IAAQ,MAAA;AACjC,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,eAAe,CAAA,GAAI,UAAU,KAAK,CAAA,CAAA;AAAA,EACvD,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,IAAY,SAAS,KAAA,EAAO;AACzD,IAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,QAAA,CAAS,KAAK,CAAA,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,MAAM,GAAA,EAAK;AAAA,MACrB,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAM,IAAA,KAAS,KAAA,CAAA,GAAY,KAAA,CAAA,GAAY,IAAA,CAAK,UAAU,IAAI;AAAA,KAC3D,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AAGZ,IAAA,MAAM,IAAI,QAAA,CAAS,CAAA,EAAG,EAAE,IAAA,EAAM,iBAAiB,OAAA,EAAU,GAAA,CAAc,OAAA,EAAQ,EAAG,eAAe,CAAA;AAAA,EACnG;AAEA,EAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AACvD,EAAA,IAAI,MAAA,GAAkB,IAAA;AACtB,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC5C,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,IAAI,IAAA,EAAK;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAAA,EACF,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,IAAU,GAAA,EAAK;AAE5B,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,EAAE,OAAA,EAAS,MAAM,GAAA,CAAI,MAAK,EAAE;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,UAAA,CAAW,MAAM,CAAA,EAAG,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,CAAA,EAAqC;AACvD,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,UAAU,OAAO,IAAA;AACxC,EAAA,MAAM,GAAA,GAAM,CAAA;AACZ,EAAA,MAAMC,OAAwB,EAAC;AAC/B,EAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,UAAUA,IAAAA,CAAI,OAAO,GAAA,CAAI,IAAA;AACjD,EAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,UAAUA,IAAAA,CAAI,UAAU,GAAA,CAAI,OAAA;AACvD,EAAA,IAAI,OAAO,GAAA,CAAI,SAAA,KAAc,WAAWA,IAAAA,CAAI,YAAY,GAAA,CAAI,SAAA;AAC5D,EAAA,IAAI,GAAA,CAAI,OAAA,IAAW,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU;AAClD,IAAAA,IAAAA,CAAI,UAAU,GAAA,CAAI,OAAA;AAAA,EACpB;AACA,EAAA,OAAOA,IAAAA;AACT;AAEA,SAAS,eAAe,MAAA,EAAwB;AAC9C,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,iBAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,WAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,WAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,GAAG,OAAO,eAAA;AACzB,EAAA,IAAI,MAAA,IAAU,KAAK,OAAO,gBAAA;AAC1B,EAAA,OAAO,YAAA;AACT;;;ACjHA,IAAM,kBAAA,GAAqB,cAAA;AAE3B,eAAsB,aAAa,OAAA,EAAwC;AACzE,EAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,IAAU,eAAc,EAAG,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACrE,EAAA,KAAA,CAAM,CAAA,aAAA,EAAgB,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA;AAGpC,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI;AACF,IAAA,EAAA,GAAK,MAAM,UAAA;AAAA,MACT,MAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAQ,IAAA,IAAQ;AAAA,OACxB;AAAA,MACA,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA;AAAO,KACpC;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,cAAA,CAAe,4BAAA,EAA8B,GAAG,CAAC,CAAA;AACtD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,GAAA,CAAI,OAAA;AAAA,IACF;AAAA,MACE,CAAA,+CAAA,CAAA;AAAA,MACA,CAAA,CAAA;AAAA,MACA,CAAA,QAAA,EAAW,IAAA,CAAK,EAAA,CAAG,uBAAuB,CAAC,CAAA,CAAA;AAAA,MAC3C,CAAA,QAAA,EAAW,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAC,CAAA,CAAA;AAAA,MAC5B,CAAA,CAAA;AAAA,MACA,GAAA;AAAA,QACE,CAAA,gBAAA,EAAmB,aAAA,CAAc,EAAA,CAAG,SAAS,CAAC,CAAA,8CAAA;AAAA;AAChD,KACF,CAAE,KAAK,IAAI;AAAA,GACb;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,OAAO,KAAA,EAAO;AAC7C,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO;AAAA,MAC1B,OAAA,EAAS,4CAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAW;AAAA,QACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,4BAAA;AAAwB,OAClD;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,kBAAkB,CAAA;AACzB,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,GAAG,uBAAuB,CAAA;AAAA,MACvC,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,CAAA,sCAAA,EAA0C,GAAA,CAAc,OAAO,CAAA,+BAAA,CAAiC,CAAA;AAAA,MACvG;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,EAAA,EAAA,CAAG,MAAM,sBAAsB,CAAA;AAC/B,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,GAAG,SAAA,GAAY,GAAA;AACpD,EAAA,IAAI,OAAA,GAAkC,IAAA;AAItC,EAAA,MAAM,iBAAiB,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,EAAA,CAAG,WAAW,GAAI,CAAA;AAExD,EAAA,QAAA,EAAU,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,eAAA,EAAiB;AAC7C,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,UAAA;AAAA,QACV,MAAA;AAAA,QACA,oBAAA;AAAA,QACA,EAAE,UAAA,EAAY,EAAA,CAAG,UAAA,EAAW;AAAA,QAC5B,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA;AAAO,OACpC;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,EAAA,CAAG,IAAA,CAAK,CAAA,aAAA,EAAiB,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAChD,MAAA,IAAA,CAAK,mEAAmE,CAAA;AACxE,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,QAAQ,IAAI,MAAA;AAAQ,MAClB,KAAK,SAAA;AAAA,MACL,KAAK,WAAA;AACH,QAAA,MAAM,MAAM,cAAc,CAAA;AAC1B,QAAA,SAAS,QAAA;AAAA,MACX,KAAK,QAAA;AACH,QAAA,EAAA,CAAG,KAAK,uBAAuB,CAAA;AAC/B,QAAA,MAAA,CAAO,UAAU,CAAA;AACjB,QAAA,OAAO,CAAA;AAAA,MACT,KAAK,SAAA;AACH,QAAA,EAAA,CAAG,KAAK,qBAAqB,CAAA;AAC7B,QAAA,IAAA,CAAK,+DAA+D,CAAA;AACpE,QAAA,OAAO,CAAA;AAAA,MACT,KAAK,UAAA;AACH,QAAA,OAAA,GAAU,GAAA;AACV,QAAA,MAAM,QAAA;AAAA;AACV,EACF;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,EAAA,CAAG,KAAK,iCAAiC,CAAA;AACzC,IAAA,IAAA,CAAK,iEAAiE,CAAA;AACtE,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,QAAQ,OAAA,EAAS;AAEtC,IAAA,EAAA,CAAG,KAAK,oDAAoD,CAAA;AAC5D,IAAA,IAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI;AACF,IAAA,EAAA,GAAK,MAAM,UAAA,CAA2B,KAAA,EAAO,cAAA,EAAgB,KAAA,CAAA,EAAW;AAAA,MACtE,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAAA,MAC7B,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,EAAA,CAAG,KAAK,6CAA6C,CAAA;AACrD,IAAA,IAAA,CAAK,cAAA,CAAe,6BAAA,EAA+B,GAAG,CAAC,CAAA;AACvD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAiB;AAAA,IACrB,MAAA;AAAA,IACA,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,IAAA,EAAM;AAAA,MACJ,IAAI,EAAA,CAAG,EAAA;AAAA,MACP,OAAO,EAAA,CAAG,KAAA;AAAA,MACV,UAAU,EAAA,CAAG,QAAA;AAAA,MACb,WAAW,EAAA,CAAG,UAAA;AAAA,MACd,UAAU,EAAA,CAAG;AAAA;AACf,GACF;AACA,EAAA,WAAA,CAAY,GAAG,CAAA;AACf,EAAA,EAAA,CAAG,KAAK,WAAW,CAAA;AACnB,EAAA,OAAA,CAAQ,CAAA,aAAA,EAAgB,IAAA,CAAK,EAAA,CAAG,KAAK,CAAC,CAAA,CAAE,CAAA;AACxC,EAAA,KAAA,CAAM,qEAAqE,CAAA;AAC3E,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACC,cAAY,UAAA,CAAWA,SAAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,IAAI,OAAA,GAAU,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,OAAO,GAAG,OAAO,CAAA,CAAA,CAAA;AACnB;AAEA,SAAS,cAAA,CAAe,QAAgB,GAAA,EAAsB;AAC5D,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,WAAW,GAAA,CAAI,IAAI,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAA,CAAA,CAAA;AAAA,EAC5E;AACA,EAAA,IAAI,eAAe,KAAA,EAAO,OAAO,GAAG,MAAM,CAAA,EAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAC1D,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAClC;;;ACvLA,eAAsB,aAAA,GAAiC;AACrD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,UAAA,EAAW;AAAA,EACnB,CAAA,CAAA,MAAQ;AAEN,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,CAAQ,4CAA4C,CAAA;AACpD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,UAAA;AAAA,MACJ,QAAA;AAAA,MACA,CAAA,qBAAA,EAAwB,IAAI,OAAO,CAAA,CAAA;AAAA,MACnC,KAAA,CAAA;AAAA,MACA,EAAE,MAAM,EAAE,KAAA,EAAO,IAAI,KAAA,EAAM,EAAG,OAAA,EAAS,GAAA,CAAI,MAAA;AAAO,KACpD;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA;AAAA,MACE,CAAA,wCAAA,EAA4C,IAAc,OAAO,CAAA,oCAAA;AAAA,KACnE;AAAA,EACF;AAEA,EAAA,YAAA,EAAa;AACb,EAAA,OAAA,CAAQ,cAAc,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAC5C,EAAA,OAAO,CAAA;AACT;;;AC3BA,eAAsB,cAAA,CAAe,OAAA,GAA0B,EAAC,EAAoB;AAClF,EAAA,MAAM,MAAM,UAAA,EAAW;AACvB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,6BAAA,EAA8B,EAAG,CAAC,CAAA;AAAA,IAC7G,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,4CAA4C,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,EAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,EAAA,IAAI;AACF,IAAA,EAAA,GAAK,MAAM,UAAA,CAA2B,KAAA,EAAO,cAAc,CAAA;AAAA,EAC7D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,iCAAA,EAAkC,EAAG,CAAC,CAAA;AAAA,MACjH,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,6DAA6D,CAAA;AAAA,MACpE;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,YAAA,GAAgB,GAAA,CAAc,OAAA;AAC9B,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,MAAA,IAAA;AAAA,QACE,8CAA8C,YAAY,CAAA,yBAAA;AAAA,OAC5D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,EAAA,EAAI;AAEN,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,GAAG,GAAA;AAAA,MACH,IAAA,EAAM;AAAA,QACJ,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,WAAW,EAAA,CAAG,UAAA;AAAA,QACd,UAAU,EAAA,CAAG;AAAA;AACf,KACF;AACA,IAAA,WAAA,CAAY,SAAS,CAAA;AAAA,EACvB;AACA,EAAA,MAAM,CAAA,GAAK,EAAA,IAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAG9B,EAAA,IAAI,aAAkC,EAAC;AACvC,EAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,MAAM,UAAA;AAAA,MACpB,KAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,UAAU,EAAC;AAAA,EACnD,SAAS,GAAA,EAAK;AACZ,IAAA,cAAA,GAAkB,GAAA,CAAc,OAAA;AAAA,EAClC;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,GAAA;AAAA,MACE,KAAK,SAAA,CAAU;AAAA,QACb,EAAA,EAAI,IAAA;AAAA,QACJ,IAAA,EAAM;AAAA,UACJ,IAAI,CAAA,CAAE,EAAA;AAAA,UACN,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,WAAW,CAAA,CAAE;AAAA,SACf;AAAA,QACA,iBAAA,EAAmB,IAAI,aAAA,IAAiB,IAAA;AAAA,QACxC,UAAA;AAAA,QACA,SAAS,GAAA,CAAI,MAAA;AAAA,QACb,GAAI,YAAA,GAAe,EAAE,qBAAA,EAAuB,YAAA,KAAiB,EAAC;AAAA,QAC9D,GAAI,cAAA,GAAiB,EAAE,gBAAA,EAAkB,cAAA,KAAmB;AAAC,OAC9D;AAAA,KACH;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,EAAA,CAAG,SAAA,EAAW,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AACvB,EAAA,EAAA,CAAG,UAAA,EAAY,EAAE,QAAQ,CAAA;AACzB,EAAA,EAAA,CAAG,OAAA,EAAS,EAAE,KAAK,CAAA;AACnB,EAAA,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK,IAAK,GAAA,CAAI,WAAW,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,IAAA;AAAA,MACE,8BAA8B,cAAc,CAAA,mCAAA;AAAA,KAC9C;AAAA,EACF,CAAA,MAAA,IAAW,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,IAAA,CAAK,oBAAoB,CAAA;AAAA,EAC3B,CAAA,MAAO;AACL,IAAA,EAAA,CAAG,YAAA,EAAc,CAAA,EAAG,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AACvC,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,IAAQ,CAAA,GAAA,EAAM,EAAE,EAAE,CAAA,CAAA;AACjC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,WAAA,IAAe,EAAA;AACxC,MAAA,MAAM,OAAO,GAAA,CAAI,aAAA,KAAkB,IAAA,GAAO,IAAA,CAAK,YAAY,CAAA,GAAI,EAAA;AAC/D,MAAA,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,IAAA,GAAO,GAAA,CAAI,KAAK,IAAI,CAAA,CAAA,CAAG,CAAA,GAAI,EAAE,GAAG,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1E;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,EAAA,CAAG,SAAA,EAAW,IAAI,MAAM,CAAA;AACxB,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,KAAK,MAAA,EAA8G;AAC1H,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,CAAO,EAAA;AAAA,IACX,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,YAAY,MAAA,CAAO,SAAA;AAAA,IACnB,WAAW,MAAA,CAAO,QAAA;AAAA,IAClB,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AACF;;;AC7HA,eAAsB,oBAAA,CAAqB,OAAA,GAAgC,EAAC,EAAoB;AAC9F,EAAA,MAAM,MAAM,UAAA,EAAW;AACvB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,6BAAA,EAA8B,EAAG,CAAC,CAAA;AAAA,IAC7G,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,4CAA4C,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAM,UAAA,CAAgC,KAAA,EAAO,iBAAiB,CAAA;AAAA,EAC7E,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,iCAAA,EAAkC,EAAG,CAAC,CAAA;AAAA,MACjH,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,6DAA6D,CAAA;AAAA,MACpE;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAU,GAAA,CAAc,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,IACrG,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,CAAA,2BAAA,EAA+B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,GAAA;AAAA,MACE,KAAK,SAAA,CAAU;AAAA,QACb,EAAA,EAAI,IAAA;AAAA,QACJ,iBAAA,EAAmB,IAAI,aAAA,IAAiB,IAAA;AAAA,QACxC,YAAY,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,aAAa;AAAC,OACvD;AAAA,KACH;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AACzD,IAAA,IAAA,CAAK,oBAAoB,CAAA;AACzB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,IAAQ,CAAA,GAAA,EAAM,EAAE,EAAE,CAAA,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,WAAA,IAAe,EAAA;AACxC,IAAA,MAAM,SAAA,GAAY,IAAI,aAAA,KAAkB,IAAA;AACxC,IAAA,MAAM,MAAA,GAAS,SAAA,GAAY,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACxC,IAAA,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,EAAE,CAAC,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,OAAO,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAG,CAAA,GAAI,EAAE,CAAA,CAAE,CAAA;AAAA,EACnF;AACA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,IAAI,IAAI,aAAA,EAAe;AACrB,IAAA,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAA,CAAK,GAAA,CAAI,aAAa,CAAC,CAAA,CAAE,CAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,2EAA2E,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,CAAA;AACT;AAEA,eAAsB,oBAAoB,IAAA,EAA+B;AACvE,EAAA,MAAM,MAAM,UAAA,EAAW;AACvB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,WAAW,CAAA,EAAG;AACjD,IAAA,IAAA,CAAK,wCAAwC,CAAA;AAC7C,IAAA,OAAO,CAAA;AAAA,EACT;AAIA,EAAA,IAAI,aAAkC,EAAC;AACvC,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAM,UAAA,CAAgC,KAAA,EAAO,iBAAiB,CAAA;AAAA,EAC7E,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,CAAA,kCAAA,EAAsC,GAAA,CAAc,OAAO,CAAA,EAAA,CAAI,CAAA;AACpE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAQ,UAAA,CAAW,IAAA;AAAA,IACvB,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAA,IAAQ,CAAA,GAAA,EAAM,CAAA,CAAE,EAAE,CAAA,CAAA,KAAO,IAAA,IAAQ,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,KAAM;AAAA,GACtE;AACA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAA,CAAK,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAC,CAAA,yCAAA,CAA2C,CAAA;AACvE,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,IAAA,CAAK,2DAA2D,CAAA;AAChE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,IAAQ,CAAA,GAAA,EAAM,MAAM,EAAE,CAAA,CAAA;AAChD,EAAA,WAAA,CAAY,EAAE,GAAG,GAAA,EAAK,aAAA,EAAe,aAAa,CAAA;AAClD,EAAA,OAAA,CAAQ,CAAA,yBAAA,EAA4B,IAAA,CAAK,WAAW,CAAC,CAAA,CAAE,CAAA;AACvD,EAAA,EAAA,CAAG,MAAA,EAAQ,MAAM,IAAI,CAAA;AACrB,EAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,WAAA,EAAa;AACnC,IAAA,EAAA,CAAG,QAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,CAAA;AACT;;;AC9FO,SAAS,aAAa,IAAA,EAA+B;AAC1D,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,eAAA;AAC1B,EAAA,MAAM,QAAA,GAAoC;AAAA,IACxC,cAAA,EAAgB,CAAA;AAAA,IAChB,MAAA,EAAQ;AAAA,MACN,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX;AAAA,IACA,WAAA,EAAa,IAAA;AAAA,IACb,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,SAAS,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM;AAAA;AAC1D;AACF;AACF,GACF;AACA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,QAAA,CAAS,OAAA,GAAU;AAAA,MACjB,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,YAAA,EAAc,eAAA;AAAA,MACd,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AACA,EAAA,IAAI,KAAK,aAAA,EAAe;AACtB,IAAA,QAAA,CAAS,aAAa,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,KAAK,aAAA,EAAc;AAAA,EAC/D;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;AAC7C;AAEO,SAAS,YAAY,IAAA,EAA+B;AACzD,EAAA,OACE,IAAA,CAAK,SAAA;AAAA,IACH;AAAA,MACE,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,GAAA,EAAK,qBAAA;AAAA,QACL,UAAA,EAAY,sBAAA;AAAA,QACZ,mBAAA,EAAqB,0BAAA;AAAA,QACrB,KAAA,EAAO,YAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,aAAA,EAAe,QAAA;AAAA,QACf,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACf;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,aAAA,EAAe,SAAA;AAAA,QACf,cAAA,EAAgB,SAAA;AAAA,QAChB,kBAAA,EAAoB,SAAA;AAAA,QACpB,UAAA,EAAY;AAAA;AACd,KACF;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AAER;AAEO,SAAS,YAAA,GAAuB;AACrC,EAAA,OACE,IAAA,CAAK,SAAA;AAAA,IACH;AAAA,MACE,eAAA,EAAiB;AAAA,QACf,MAAA,EAAQ,QAAA;AAAA,QACR,GAAA,EAAK,CAAC,KAAA,EAAO,cAAA,EAAgB,QAAQ,CAAA;AAAA,QACrC,MAAA,EAAQ,QAAA;AAAA,QACR,gBAAA,EAAkB,SAAA;AAAA,QAClB,GAAA,EAAK,UAAA;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAc,IAAA;AAAA,QACd,iBAAA,EAAmB,IAAA;AAAA,QACnB,eAAA,EAAiB,IAAA;AAAA,QACjB,eAAA,EAAiB,IAAA;AAAA,QACjB,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,IAAA;AAAA,QACR,WAAA,EAAa,IAAA;AAAA,QACb,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,QAC1B,KAAA,EAAO,EAAE,KAAA,EAAO,CAAC,KAAK,CAAA;AAAE,OAC1B;AAAA,MACA,OAAA,EAAS,CAAC,eAAA,EAAiB,SAAA,EAAW,YAAY,qBAAqB,CAAA;AAAA,MACvE,OAAA,EAAS,CAAC,cAAc;AAAA,KAC1B;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AAER;AAEO,SAAS,UAAA,GAAqB;AACnC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAOT;AAEO,SAAS,UAAA,GAAqB;AACnC,EAAA,OAAO,CAAA;AAAA;AAAA,CAAA;AAGT;AAEO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,EAAA;AAAA,IACA,wBAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,EAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,EAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,EAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,EAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,EAAA;AAAA,IACA,iEAAA;AAAA,IACA,oEAAA;AAAA,IACA,kCAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO;AAAA,IACL,6CAAA;AAAA,IACA,yEAAA;AAAA,IACA,+EAAA;AAAA,IACA,4EAAA;AAAA,IACA,wCAAA;AAAA,IACA,qBAAA;AAAA,IACA,gCAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAEO,SAAS,aAAa,IAAA,EAA+B;AAC1D,EAAA,OAAO,CAAA;AAAA,SAAA,EACE,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,eAAA,EACnB,KAAK,SAAA,CAAU,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAI,EAAE,CAAC,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWhE;AAEO,SAAS,WAAW,IAAA,EAA+B;AACxD,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,sDAAA,EAI+C,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA;AAAA,6BAAA,EAE9C,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAapD;AAEO,SAAS,OAAO,IAAA,EAA+B;AACpD,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,eAAA;AAC1B,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,OAAO,aAAa,IAAI,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,mBAAmB,IAAI,CAAA;AAChC;AAEA,SAAS,mBAAmB,IAAA,EAA+B;AACzD,EAAA,OAAO,CAAA,EAAA,EAAK,KAAK,IAAI;;AAAA,2CAAA,EAEsB,KAAK,IAAI,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAqCtD;AAEA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,OAAO,CAAA,EAAA,EAAK,KAAK,IAAI;;AAAA;AAAA;AAAA;;AAAA,QAAA,EAMb,KAAK,IAAI,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAgGnB;AAIO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAiBT;AAEO,SAAS,mBAAmB,IAAA,EAA+B;AAChE,EAAA,OAAO,CAAA;AAAA;AAAA;;AAAA;AAAA,SAAA,EAKE,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,eAAA,EACnB,KAAK,SAAA,CAAU,CAAA,wBAAA,EAA2B,IAAA,CAAK,IAAI,EAAE,CAAC,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoBvE;AAEO,SAAS,iBAAiB,IAAA,EAA+B;AAC9D,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EA2BG,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqDjC;AAEO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAgHT;AAEO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA8BT;AAEO,SAAS,oBAAA,GAA+B;AAC7C,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAyCT;AAEO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,OAAO,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAST;AAEO,SAAS,kBAAkB,IAAA,EAA+B;AAC/D,EAAA,OACE,IAAA,CAAK,SAAA;AAAA,IACH;AAAA,MACE,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,GAAA,EAAK,qBAAA;AAAA,QACL,UAAA,EAAY,sBAAA;AAAA,QACZ,mBAAA,EAAqB,0BAAA;AAAA,QACrB,KAAA,EAAO,YAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,aAAA,EAAe,QAAA;AAAA,QACf,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKb,WAAA,EAAa,IAAA;AAAA,QACb,sBAAA,EAAwB,IAAA;AAAA,QACxB,gBAAA,EAAkB,QAAA;AAAA,QAClB,MAAA,EAAQ,QAAA;AAAA,QACR,UAAA,EAAY,QAAA;AAAA,QACZ,0BAAA,EAA4B,QAAA;AAAA,QAC5B,IAAA,EAAM,QAAA;AAAA,QACN,gBAAA,EAAkB,QAAA;AAAA,QAClB,cAAA,EAAgB,UAAA;AAAA,QAChB,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,aAAA,EAAe,SAAA;AAAA,QACf,cAAA,EAAgB,SAAA;AAAA,QAChB,kBAAA,EAAoB,SAAA;AAAA,QACpB,UAAA,EAAY;AAAA;AACd,KACF;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AAER;AAsBO,SAAS,cAAA,GAAyB;AACvC,EAAA,OACE,IAAA,CAAK,SAAA;AAAA,IACH;AAAA,MACE,OAAA,EAAS,mCAAA;AAAA,MACT,KAAA,EAAO,UAAA;AAAA,MACP,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,QAAA,EAAU;AAAA,QACR,MAAA,EAAQ,EAAA;AAAA,QACR,GAAA,EAAK,iBAAA;AAAA,QACL,SAAA,EAAW,SAAA;AAAA,QACX,YAAA,EAAc,IAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,WAAA,EAAa,QAAA;AAAA,MACb,GAAA,EAAK,KAAA;AAAA,MACL,OAAA,EAAS;AAAA,QACP,UAAA,EAAY,cAAA;AAAA,QACZ,KAAA,EAAO,aAAA;AAAA,QACP,EAAA,EAAI,iBAAA;AAAA,QACJ,GAAA,EAAK,OAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACT;AAAA,MACA,UAAA,EAAY;AAAA,QACV,gBAAA,EAAkB,wCAAA;AAAA,QAClB,gBAAA,EAAkB;AAAA,UAChB,GAAA,EAAK,mDAAA;AAAA,UACL,MAAA,EAAQ;AAAA,YACN,KAAA,EAAO,UAAA;AAAA,YACP,WAAA,EAAa;AAAA;AACf;AACF;AACF,KACF;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AAER;AAMO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAQT;AAWO,SAAS,UAAA,GAAqB;AACnC,EAAA,OAAO,CAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAkET;AAQO,SAAS,UAAA,GAAqB;AACnC,EAAA,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAOT;AAQO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO,CAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AA0DT;AAMO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAwET;AAQO,SAAS,0BAAA,GAAqC;AACnD,EAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWT;AAaO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqFT;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,EACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;AAGO,SAAS,YAAY,IAAA,EAAuB;AACjD,EAAA,OAAO,oBAAA,CAAqB,KAAK,IAAI,CAAA;AACvC;;;ACzoCA,eAAsB,kBAAA,CACpB,MACA,OAAA,EACiB;AACjB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,CAAK,uCAAuC,CAAA;AAC5C,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,UAAA;AAAA,MACX,KAAA;AAAA,MACA,CAAA,aAAA,EAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,eAAA;AAAA,KAC1C;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAC,CAAA,WAAA,CAAa,CAAA;AACtC,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,CAAA,oBAAA,EAAuB,IAAA,CAAK,IAAI,CAAC,CAAA,8CAAA,CAAgD,CAAA;AACtF,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,CAAA,iCAAA,EAAqC,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACjE,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,IAAI,CAAA;AAG1C,EAAA,IAAIN,UAAAA,CAAW,MAAM,CAAA,EAAG;AACtB,IAAA,MAAM,OAAA,GAAU,YAAY,MAAM,CAAA;AAClC,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,CAAC,QAAQ,KAAA,EAAO;AACxC,MAAA,IAAA;AAAA,QACE,aAAa,IAAA,CAAK,MAAM,CAAC,CAAA,oBAAA,EAAuB,IAAA,CAAK,SAAS,CAAC,CAAA,iBAAA;AAAA,OACjE;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,OAAA,CAAQ,KAAA,IAAS,KAAK,cAAA,KAAmB,IAAA;AAC1D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,WAAA,CAAY,MAAM,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,IAAA,IAAQ,OAAA,CAAQ,KAAA,EAAO;AACjD,IAAA,IAAA,CAAK,CAAA,iCAAA,EAAoC,IAAA,CAAK,IAAA,CAAK,cAAc,CAAC,CAAA,iCAAA,CAAmC,CAAA;AAAA,EACvG,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,KAAK,IAAI,CAAC,WAAW,IAAA,CAAK,gBAAgB,CAAC,CAAA,iCAAA,CAAmC,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,gBAAA,CAAiB,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC5C;AAOA,SAAS,WAAA,CAAY,MAA8B,MAAA,EAAwB;AACzE,EAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,EAAA,IAAA,CAAK,CAAA,QAAA,EAAW,KAAK,OAAO,CAAC,SAAS,IAAA,CAAK,MAAM,CAAC,CAAA,GAAA,CAAK,CAAA;AACvD,EAAA,MAAM,SAAS,SAAA,CAAU,KAAA,EAAO,CAAC,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA,EAAG;AAAA,IAC1D,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,IAAA,CAAK,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACpD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,IAAA,CAAK,CAAA,6BAAA,EAAgC,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG,CAAA;AACrD,IAAA,OAAO,OAAO,MAAA,IAAU,CAAA;AAAA,EAC1B;AACA,EAAA,OAAA,CAAQ,CAAA,OAAA,EAAU,KAAK,IAAA,CAAK,WAAW,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AACjE,EAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,IAAA,IAAA,CAAK,8BAA8B,IAAA,CAAK,CAAA,CAAA,EAAI,KAAK,eAAe,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,CAAA;AACT;AAQA,SAAS,gBAAA,CACP,IAAA,EACA,IAAA,EACA,MAAA,EACQ;AACR,EAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,IAAA,IAAA;AAAA,MACE,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAC,CAAA,oEAAA;AAAA,KACtB;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAAO,SAAAA,CAAU,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAGrC,EAAA,MAAM,cAAc,IAAA,CAAK,QAAA;AACzB,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,WAAA,KAAgB,QAAA,GAAW,QAAA,GAAW,eAAA;AACrE,EAAA,MAAM,KAAA,GAAQ,UAAA,KAAe,QAAA,GAAW,iBAAA,GAAoB,WAAA;AAE5D,EAAAC,aAAAA;AAAA,IACEC,IAAAA,CAAK,QAAQ,aAAa,CAAA;AAAA,IAC1B,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;AAAA,IACvC;AAAA,GACF;AACA,EAAAD,aAAAA;AAAA,IACEC,IAAAA,CAAK,QAAQ,cAAc,CAAA;AAAA,IAC3B,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,CAAK,WAAA,EAAa,MAAM,IAAA,CAAK,WAA8B,CAAC,CAAA;AAAA,IAC1E;AAAA,GACF;AACA,EAAAD,cAAcC,IAAAA,CAAK,MAAA,EAAQ,YAAY,CAAA,EAAG,SAAA,IAAa,OAAO,CAAA;AAC9D,EAAAD,aAAAA;AAAA,IACEC,IAAAA,CAAK,QAAQ,WAAW,CAAA;AAAA,IACxB,cAAA,CAAe,MAAM,UAAU,CAAA;AAAA,IAC/B;AAAA,GACF;AAEA,EAAA,OAAA,CAAQ,CAAA,MAAA,EAAS,UAAU,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAA,CAAK,WAAW,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA;AACzF,EAAA,IAAA,CAAK,CAAA,WAAA,CAAa,CAAA;AAClB,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,GAAA,CAAI,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,MAAM,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AAC5C,EAAA,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,IAAI,CAAC,IAAI,IAAA,CAAK,aAAa,CAAC,CAAA,CAAE,CAAA;AAC3C,EAAA,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,IAAI,CAAC,IAAI,IAAA,CAAK,0BAA0B,CAAC,CAAA,CAAE,CAAA;AACxD,EAAA,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,IAAI,CAAC,kBAAkB,IAAA,CAAK,MAAM,CAAC,CAAA,uDAAA,CAAoD,CAAA;AACpG,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,IAAA,IAAA;AAAA,MACE,CAAA,2BAAA,EAA8B,IAAA,CAAK,IAAA,CAAK,cAAc,CAAC,CAAA,+BAAA,EAAkC,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAE,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,UAAU,CAAC,CAAA,wBAAA;AAAA,KAC5J;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA;AAAA,MACE,CAAA,4DAAA,EACsB,IAAA,CAAK,CAAA,sCAAA,CAAwC,CAAC,CAAA,yBAAA;AAAA,KAEtE;AAAA,EACF;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,cAAA,CACP,MACA,IAAA,EACQ;AACR,EAAA,OAAO,CAAA,EAAA,EAAK,KAAK,WAAW;;AAAA,yBAAA,EAEH,KAAK,WAAW,CAAA,IAAA,EAAO,IAAI,CAAA,eAAA,EAAkB,IAAA,CAAK,mBAAmB,aAAa,CAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAc7G;AC5LA,eAAsB,uBAAA,CACpB,SACA,OAAA,EACiB;AACjB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,IAAA,CAAK,iDAAiD,CAAA;AACtD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAChC,IAAA,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,CAAC,CAAA,mDAAA,CAAqD,CAAA;AACnF,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAcH,OAAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AACxD,EAAA,MAAMP,aAAAA,GAAeU,IAAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AACpD,EAAA,IAAI,CAACT,UAAAA,CAAWD,aAAY,CAAA,EAAG;AAC7B,IAAA,IAAA;AAAA,MACE,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,WAAW,CAAC,CAAA,qCAAA;AAAA,KACzD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAMG,YAAAA,CAAaH,aAAAA,EAAc,OAAO,CAAC,CAAA;AAAA,EAC3D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAKA,aAAY,CAAC,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAY,QAAA,CAAS,UAAA,IAAsD,EAAC;AAClF,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,GAAG,QAAA;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,EACxB,CAAA,MAAA,IAAW,OAAO,QAAA,CAAS,MAAA,KAAW,QAAA,EAAU;AAE9C,IAAA,IAAA,CAAK,SAAS,QAAA,CAAS,MAAA;AAAA,EACzB;AACA,EAAA,QAAA,CAAS,UAAA,GAAa,IAAA;AAEtB,EAAAS,aAAAA,CAAcT,eAAc,IAAA,CAAK,SAAA,CAAU,UAAU,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA;AAC7E,EAAA,OAAA,CAAQ,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AACvC,EAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,OAAO,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA,CAAE,CAAA;AAC5D,EAAA,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,CAAG,CAAA;AACtC,EAAA,OAAO,CAAA;AACT;AAWA,SAAS,mBAAmB,GAAA,EAAsB;AAChD,EAAA,IAAI,IAAI,UAAA,CAAW,UAAU,KAAK,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3D,IAAA,IAAI;AACF,MAAA,IAAI,IAAI,GAAG,CAAA;AACX,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,sBAAA,CAAuB,KAAK,GAAG,CAAA;AACxC;AC1DA,SAAS,UAAU,WAAA,EAA6B;AAC9C,EAAA,OAAOU,IAAAA,CAAK,WAAA,EAAa,cAAA,EAAgB,SAAA,EAAW,WAAW,CAAA;AACjE;AAEA,eAAsB,sBACpB,OAAA,EACiB;AACjB,EAAA,MAAM,cAAcH,OAAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AACxD,EAAA,MAAMP,aAAAA,GAAeU,IAAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AACpD,EAAA,IAAI,CAACT,UAAAA,CAAWD,aAAY,CAAA,EAAG;AAC7B,IAAA,IAAA;AAAA,MACE,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,WAAW,CAAC,CAAA,4CAAA;AAAA,KACzD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAMG,YAAAA,CAAaH,aAAAA,EAAc,OAAO,CAAC,CAAA;AAAA,EAC3D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAKA,aAAY,CAAC,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,UAAA;AAAA,MACV,MAAA;AAAA,MACA,iCAAA;AAAA,MACA;AAAA,QACE,QAAA;AAAA,QACA,UAAA,EAAY,QAAQ,UAAA,IAAc;AAAA;AACpC,KACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,CAAA,4BAAA,EAA+B,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACjD,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,GAAI,IAAI,CAAA;AAAA,MAClE;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,CAAA,wBAAA,EAA4B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACxD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,IAAA,CAAK,IAAI,KAAK,CAAA,CAAE,MAAM,CAAA,MAAA,CAAQ,CAAA;AACtD,IAAA,IAAA,CAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,CAAI,WAAW,CAAC,CAAA,CAAE,CAAA;AACrC,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAMM,IAAAA,GAAM,UAAU,WAAW,CAAA;AAIjC,EAAA,IAAIL,UAAAA,CAAWK,IAAG,CAAA,EAAG;AACnB,IAAAK,OAAOL,IAAAA,EAAK,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EAC9C;AACA,EAAAE,SAAAA,CAAUF,IAAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAClC,EAAA,KAAA,MAAW,CAAC,SAAS,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1D,IAAA,MAAM,OAAA,GAAUI,IAAAA,CAAKJ,IAAAA,EAAK,OAAO,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,QAAQ,OAAO,CAAA;AAC9B,IAAA,IAAI,CAACL,UAAAA,CAAW,MAAM,CAAA,EAAG;AACvB,MAAAO,SAAAA,CAAU,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACvC;AACA,IAAAC,aAAAA,CAAc,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EACzC;AAEA,EAAA,OAAA;AAAA,IACE,CAAA,UAAA,EAAa,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,EAAE,MAAM,CAAA,YAAA,EAAe,IAAA,CAAK,iCAAiC,CAAC,CAAA;AAAA,GAClG;AACA,EAAA,IAAA,CAAK,CAAA,MAAA,EAAS,GAAA,CAAI,GAAA,CAAI,WAAW,CAAC,CAAA,CAAE,CAAA;AACpC,EAAA,OAAO,CAAA;AACT;;;AClFA,IAAM,mBAAA,GAAsB,GAAA;AAE5B,eAAsB,iBAAiB,OAAA,EAAsC;AAC3E,EAAA,MAAM,cAAcF,OAAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AACxD,EAAA,MAAMP,aAAAA,GAAeU,IAAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AACpD,EAAA,IAAI,CAACT,UAAAA,CAAWD,aAAY,CAAA,EAAG;AAC7B,IAAA,IAAA,CAAK,CAAA,GAAA,EAAM,KAAK,aAAa,CAAC,aAAa,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,CAAG,CAAA;AAC/D,IAAA,IAAA,CAAK,6DAA6D,CAAA;AAClE,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAKA,aAAY,CAAC,CAAA,uBAAA,CAAoB,CAAA;AAGvD,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,CAAsB;AAAA,IAC1C,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,IACxD;AAAA,GACD,CAAA;AACD,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,IAAA,CAAK,8DAA8D,CAAA;AAAA,EACrE;AACA,EAAA,UAAA,IAAc,CAAA;AAMd,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,mBAAA;AACzC,EAAA,IAAI,KAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,eAAe,OAAA,GAAU;AACvB,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,YAAA,GAAe,IAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,MAAA,MAAM,IAAA,GAAO,MAAM,qBAAA,CAAsB;AAAA,QACvC,GAAI,QAAQ,GAAA,KAAQ,KAAA,CAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,QACxD;AAAA,OACD,CAAA;AACD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC/B,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,OAAA,CAAQ,CAAA,gBAAA,EAAmB,SAAS,CAAA,QAAA,EAAW,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,MAC9D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAI,CAAA,MAAA,EAAS,UAAU,CAAA,mCAAA,CAAgC,CAAA;AAAA,MACpF;AACA,MAAA,UAAA,IAAc,CAAA;AAAA,IAChB,CAAA,SAAE;AACA,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,GAAe,KAAA;AAGf,QAAA,YAAA,CAAa,OAAO,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAUY,KAAA,CAAQZ,aAAAA,EAAc,CAAC,SAAA,KAAc;AACnD,IAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,IAAA,IAAI,KAAA,KAAU,IAAA,EAAM,YAAA,CAAa,KAAK,CAAA;AACtC,IAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,KAAK,OAAA,EAAQ;AAAA,IACf,GAAG,UAAU,CAAA;AAAA,EACf,CAAC,CAAA;AAGD,EAAA,OAAO,IAAI,OAAA,CAAgB,CAAC,WAAA,KAAgB;AAC1C,IAAA,MAAM,IAAA,GAAO,CAAC,MAAA,KAAwC;AACpD,MAAA,IAAI,KAAA,KAAU,IAAA,EAAM,YAAA,CAAa,KAAK,CAAA;AACtC,MAAA,OAAA,CAAQ,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,mBAAmB,MAAA,KAAW,UAAA,GAAa,KAAK,CAAA,EAAA,EAAK,MAAM,GAAG,CAAA,CAAA,CAAG,CAAA;AAGtE,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,YAAY,CAAC,CAAA;AACtC,MAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IACf,CAAA;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,MAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,MAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAC/C,CAAC,CAAA;AACH;ACvEA,eAAsB,kBACpB,OAAA,EACiB;AACjB,EAAA,MAAM,cAAcO,OAAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AACxD,EAAA,MAAMP,aAAAA,GAAeU,IAAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AACpD,EAAA,IAAI,CAACT,UAAAA,CAAWD,aAAY,CAAA,EAAG;AAC7B,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,aAAA,EAAe,SAAS,CAAA,wBAAA,EAA2B,WAAW,CAAA,CAAA,CAAA,EAAI,EAAG,CAAC,CAAA;AAAA,IACvH,CAAA,MAAO;AACL,MAAA,IAAA;AAAA,QACE,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,WAAW,CAAC,CAAA,4CAAA;AAAA,OACzD;AAAA,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAMG,YAAAA,CAAaH,aAAAA,EAAc,OAAO,CAAC,CAAA;AAAA,EAC3D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,uBAAA,EAAyB,OAAA,EAAU,GAAA,CAAc,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,IAC9G,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,mBAAmB,IAAA,CAAKA,aAAY,CAAC,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACzE;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,SAAS,MAAA,EAAQ,IAAA;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,uBAAA,EAAyB,OAAA,EAAS,qCAAA,EAAsC,EAAG,CAAC,CAAA;AAAA,IAC7H,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,CAAA,EAAG,KAAK,aAAa,CAAC,eAAe,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,UAAA;AAAA,MACV,KAAA;AAAA,MACA,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,KAClD;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,kBAAA,EAAoB,SAAS,CAAA,OAAA,EAAU,IAAI,CAAA,0BAAA,CAAA,EAA6B,EAAG,CAAC,CAAA;AAAA,MAC7H,CAAA,MAAO;AACL,QAAA,IAAA;AAAA,UACE,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAC,CAAA,qGAAA;AAAA,SAEtB;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,6BAAA,EAA8B,EAAG,CAAC,CAAA;AAAA,MAC7G,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,4CAA4C,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAU,GAAA,CAAc,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,IACvG,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,CAAA,0BAAA,EAA8B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,UAAA;AAAA,MACX,MAAA;AAAA,MACA,CAAA,aAAA,EAAgB,IAAI,EAAE,CAAA,WAAA,CAAA;AAAA,MACtB,EAAE,QAAA;AAAS,KACb;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,KAAK,SAAA,CAAU,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,mBAAA,EAAqB,OAAA,EAAS,GAAA,CAAI,SAAS,OAAA,EAAS,GAAA,CAAI,WAAW,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MAC7H,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,CAAA,4BAAA,EAA+B,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACjD,QAAA,IAAI,IAAI,OAAA,EAAS;AACf,UAAA,GAAA,CAAI,KAAK,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,QAC1C;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAU,GAAA,CAAc,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,IACrG,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,CAAA,wBAAA,EAA4B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,GAAA,CAAI,IAAA,CAAK,UAAU,EAAE,EAAA,EAAI,MAAM,GAAG,IAAA,EAAM,CAAC,CAAA;AACzC,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,OAAA;AAAA,MACE,CAAA,cAAA,EAAiB,KAAK,IAAA,CAAK,eAAA,GAAkB,IAAI,IAAA,CAAK,eAAe,CAAA,CAAA,GAAK,eAAe,CAAC,CAAA,4BAAA;AAAA,KAC5F;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,IAAA;AAAA,IACE,IAAA,CAAK,eAAA,GACD,CAAA,QAAA,EAAW,IAAA,CAAK,CAAA,CAAA,EAAI,IAAA,CAAK,eAAe,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,GAC3C,UAAA,GAAa,IAAA,CAAK,oCAA+B,CAAA,GAAI;AAAA,GAC3D;AAEA,EAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAChC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,IAAA,CAAK,OAAO,CAAC,CAAA;AACjB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,YAAA,EAAc;AACjC,MAAA,GAAA,CAAI,KAAK,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,SAAA,CAAU,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA,QAAA,EAAM,IAAA,CAAK,UAAU,CAAA,CAAE,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACnF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAChC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,KAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,YAAA,CAAa,MAAM,IAAI,CAAC,CAAA;AACvD,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,YAAA,EAAc,GAAA,CAAI,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAClC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,KAAK,CAAA,gBAAA,EAAmB,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAC,CAAA;AAC3D,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,cAAA,EAAgB,GAAA,CAAI,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAClC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,KAAK,CAAA,gBAAA,EAAmB,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAC,CAAA;AAC3D,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,cAAA,EAAgB;AACnC,MAAA,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,QAAG,CAAC,IAAI,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAE,CAAA;AACpC,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,YAAA,EAAc;AAC9B,QAAA,GAAA,CAAI,iBAAiB,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MAC3C;AACA,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,cAAA,EAAgB;AAChC,QAAA,GAAA,CAAI,iBAAiB,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MAC3C;AACA,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,cAAA,EAAgB;AAChC,QAAA,MAAM,aAAA,GAAgB,OAAO,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,CAC3C,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAA,EAAG,CAAC,IAAI,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAA,CAC3C,IAAA,CAAK,GAAG,CAAA;AACX,QAAA,GAAA,CAAI,iBAAiB,CAAA,CAAE,KAAK,KAAK,GAAA,CAAI,aAAa,CAAC,CAAA,CAAE,CAAA;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC9B,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,KAAK,CAAA,oBAAA,EAAuB,IAAA,CAAK,UAAA,CAAW,MAAM,IAAI,CAAC,CAAA;AAC3D,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,UAAA,EAAY;AAC/B,MAAA,GAAA,CAAI,OAAO,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAChC,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,KAAK,CAAA,sBAAA,EAAyB,IAAA,CAAK,YAAA,CAAa,MAAM,IAAI,CAAC,CAAA;AAC/D,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,YAAA,EAAc;AACjC,MAAA,GAAA,CAAI,OAAO,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,IAAA,CAAK,sEAAsE,CAAA;AAC3E,EAAA,OAAO,CAAA;AACT;ACpHA,eAAsB,iBAAA,CACpB,SACA,OAAA,EACiB;AACjB,EAAAa,MAAM,mCAAmC,CAAA;AAGzC,EAAA,IAAI,IAAA,GAAO,OAAA;AACX,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK;AAAA,MACxB,OAAA,EAAS,cAAA;AAAA,MACT,WAAA,EAAa,OAAA;AAAA,MACb,UAAU,CAAC,CAAA,KACT,WAAA,CAAY,CAAC,IAAI,MAAA,GAAY;AAAA,KAChC,CAAA;AACD,IAAA,IAAIC,QAAAA,CAAS,MAAM,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,UAAU,CAAA;AACf,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,IAAA,GAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,CAAK,sCAAsC,CAAA;AAC3C,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,WAAA,CAAY,IAAI,CAAA,EAAG;AACtB,IAAA,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,uCAAA,CAAoC,CAAA;AACnE,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,YAAA,CAAa,IAAI,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAMP,OAAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,IAAI,CAAA;AAEvC,EAAA,IAAIN,UAAAA,CAAW,GAAG,CAAA,EAAG;AACnB,IAAA,MAAM,OAAA,GAAUc,YAAY,GAAG,CAAA;AAC/B,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,CAAC,QAAQ,KAAA,EAAO;AACxC,MAAA,IAAA;AAAA,QACE,aAAa,IAAA,CAAK,GAAG,CAAC,CAAA,oBAAA,EAAuB,IAAA,CAAK,SAAS,CAAC,CAAA,yDAAA;AAAA,OAC9D;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AASA,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,EAAQ;AACpC,IAAA,IAAA;AAAA,MACE,CAAA,iBAAA,EAAoB,IAAA,CAAK,UAAU,CAAC,QAAQ,IAAA,CAAK,UAAU,CAAC,CAAA,oCAAA,EAAkC,KAAK,UAAU,CAAC,CAAA,mGAAA,EAAsG,IAAA,CAAK,UAAU,CAAC,CAAA,EAAA;AAAA,KACtO;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAqB,OAAA,CAAQ,MAAA,GAAS,eAAA,GAAkB,QAAA;AAC9D,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,aAAA,EAAe,OAAA,CAAQ,GAAA,EAAI,GAAI;AAAC,GACpE;AAGA,EAAA,MAAM,KAAA,GAAiC;AAAA,IACrC,CAAC,aAAA,EAAe,YAAA,CAAa,YAAY,CAAC,CAAA;AAAA,IAC1C,CAAC,eAAA,EAAiB,YAAA,EAAc,CAAA;AAAA,IAChC,CAAC,iBAAA,EAAmB,UAAA,EAAY,CAAA;AAAA,IAChC,CAAC,eAAA,EAAiB,UAAA,EAAY,CAAA;AAAA,IAC9B,CAAC,YAAA,EAAc,SAAA,EAAW,CAAA;AAAA,IAC1B,CAAC,oBAAA,EAAsB,eAAA,EAAiB,CAAA;AAAA,IACxC,CAAC,WAAA,EAAa,MAAA,CAAO,YAAY,CAAC;AAAA,GACpC;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU;AAKrB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAC,cAAA,EAAgB,iBAAA,CAAkB,YAAY,CAAC,CAAA;AAAA,MAChD,CAAC,eAAA,EAAiB,YAAA,EAAc,CAAA;AAAA,MAChC,CAAC,iBAAA,EAAmB,cAAA,EAAgB,CAAA;AAAA,MACpC,CAAC,oBAAA,EAAsB,gBAAA,EAAkB,CAAA;AAAA,MACzC,CAAC,iBAAA,EAAmB,UAAA,EAAY,CAAA;AAAA,MAChC,CAAC,cAAA,EAAgB,UAAA,EAAY,CAAA;AAAA,MAC7B,CAAC,+BAAA,EAAiC,0BAAA,EAA4B,CAAA;AAAA,MAC9D,CAAC,0BAAA,EAA4B,qBAAA,EAAuB,CAAA;AAAA,MACpD,CAAC,wBAAA,EAA0B,mBAAA,EAAqB,CAAA;AAAA,MAChD,CAAC,gBAAA,EAAkB,kBAAA,CAAmB,YAAY,CAAC,CAAA;AAAA,MACnD,CAAC,cAAA,EAAgB,gBAAA,CAAiB,YAAY,CAAC,CAAA;AAAA,MAC/C,CAAC,wBAAA,EAA0B,mBAAA,EAAqB,CAAA;AAAA,MAChD,CAAC,4BAAA,EAA8B,qBAAA,EAAuB,CAAA;AAAA,MACtD,CAAC,+BAAA,EAAiC,kBAAA,EAAoB,CAAA;AAAA,MACtD,CAAC,gCAAA,EAAkC,oBAAA,EAAsB,CAAA;AAAA,MACzD,CAAC,gCAAA,EAAkC,mBAAA,EAAqB;AAAA,KAC1D;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAC,cAAA,EAAgB,WAAA,CAAY,YAAY,CAAC,CAAA;AAAA,MAC1C,CAAC,gBAAA,EAAkB,YAAA,CAAa,YAAY,CAAC,CAAA;AAAA,MAC7C,CAAC,cAAA,EAAgB,UAAA,CAAW,YAAY,CAAC;AAAA,KAC3C;AAAA,EACF;AAKA,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,CAAA,IAAK,KAAA,EAAO;AACtC,IAAA,MAAM,OAAA,GAAUL,IAAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACjC,IAAA,MAAM,SAAA,GAAYA,IAAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACpC,IAAA,IAAI,CAACT,UAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAAO,SAAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC1C;AACA,IAAAC,aAAAA,CAAc,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EACzC;AAEA,EAAA,OAAA;AAAA,IACE,CAAA,WAAA,EAAc,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,IAAA,KAAS,QAAA,GAAW,gBAAA,GAAmB,eAAe,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,GACtG;AACA,EAAA,IAAA,CAAK,CAAA,WAAA,CAAa,CAAA;AAClB,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,EAAA,EACnB,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,GAAG,EAAE,CAAC;AAAA,EAAA,EAC9B,IAAI,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,aAAa,CAAC;AAAA,EAAA,EAChC,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,cAAc,CAAC,CAAA,iBAAA,EAAoB,GAAA,CAAI,uDAAuD,CAAC;;AAAA,EAAA,EAEjH,GAAA,CAAI,oCAAoC,CAAC;AAAA,EAAA,EACzC,IAAI,+BAA+B,CAAC,CAAA,cAAA,EAAiB,GAAA,CAAI,8BAA8B,CAAC;AAAA,EAAA,EACxF,IAAI,0BAA0B,CAAC,CAAA,mBAAA,EAAsB,GAAA,CAAI,2BAA2B,CAAC;AAAA,EAAA,EACrF,GAAA,CAAI,mEAAmE,CAAC;;AAAA,CAE3E,CAAA;AACC,EAAAO,MAAM,kBAAkB,CAAA;AACxB,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,GAAG,EAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACpE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AACzD,EAAA,OAAO,CAAC,KAAK,GAAG,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1C;;;AC3NA,eAAsB,kBACpB,OAAA,EACiB;AACjB,EAAA,MAAM,MAAM,UAAA,EAAW;AACvB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,6BAAA,EAA8B,EAAG,CAAC,CAAA;AAAA,IAC7G,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,4CAA4C,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA;AACJ,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,SAAA,IAAa,GAAA,CAAI,aAAA;AAC5C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI;AACF,MAAA,MAAM,aAAa,MAAM,UAAA;AAAA,QACvB,KAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,QAAQ,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAC1D,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,UAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,qBAAA,EAAuB,SAAS,CAAA,UAAA,EAAa,UAAU,CAAA,WAAA,CAAA,EAAc,EAAG,CAAC,CAAA;AAAA,QAC1H,CAAA,MAAO;AACL,UAAA,IAAA;AAAA,YACE,CAAA,UAAA,EAAa,IAAA,CAAK,UAAU,CAAC,CAAA,6FAAA;AAAA,WAC/B;AAAA,QACF;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,WAAA,GAAc,KAAA,CAAM,EAAA;AAAA,IACtB,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAU,GAAA,CAAc,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,MACrG,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,CAAA,2BAAA,EAA+B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,MAC7D;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,cAAc,MAAM,CAAA;AACjD,EAAA,IAAI,gBAAgB,MAAA,EAAW,MAAA,CAAO,IAAI,aAAA,EAAe,MAAA,CAAO,WAAW,CAAC,CAAA;AAC5E,EAAA,MAAM,IAAA,GAAO,CAAA,YAAA,EAAe,MAAA,CAAO,QAAA,EAAS,GAAI,IAAI,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAE5E,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,UAAA,CAA4B,KAAA,EAAO,IAAI,CAAA;AAAA,EACzD,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,6BAAA,EAA8B,EAAG,CAAC,CAAA;AAAA,MAC7G,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,4CAA4C,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAU,GAAA,CAAc,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,IACrG,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,CAAA,wBAAA,EAA4B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,GAAA;AAAA,MACE,KAAK,SAAA,CAAU;AAAA,QACb,EAAA,EAAI,IAAA;AAAA,QACJ,SAAS,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,UAAU,EAAC;AAAA,QAC7C,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,QAAQ,MAAA,GAAS;AAAA,OAClD;AAAA,KACH;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACnD,IAAA,IAAA;AAAA,MACE,OAAA,CAAQ,MACJ,mBAAA,GACA;AAAA,KACN;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAA;AAClE,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA;AAAA,IACxB,GAAG,QAAQ,GAAA,CAAI,CAAC,OAAO,CAAA,CAAE,eAAA,IAAmB,WAAW,MAAM,CAAA;AAAA,IAC7D;AAAA,GACF;AACA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,GAAA;AAAA,IACE,CAAA,EAAG,OAAO,MAAA,CAAO,SAAS,CAAC,CAAA,EAAA,EAAK,SAAA,CAAU,MAAA,CAAO,YAAY,CAAC,CAAA,MAAA;AAAA,GAChE;AACA,EAAA,GAAA;AAAA,IACE,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,GAC1E;AACA,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,OAAA,GAAU,EAAE,eAAA,IAAmB,SAAA;AACrC,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,CAAA,CAAE,QAAA,GAAW,IAAA,CAAK,QAAG,CAAA,GAAI,EAAA;AAAA,MACzB,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,QAAQ,CAAA,GAAI;AAAA,KAC7B,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,IAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK,EAAA;AACxC,IAAA,GAAA,CAAI,GAAG,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC1F;AACA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,IAAA,CAAK,CAAA,EAAG,QAAQ,MAAM,CAAA,OAAA,EAAU,QAAQ,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAClE,EAAA,OAAO,CAAA;AACT;AC/HO,IAAM,wBAAA,GAA2B;AAAA,EACtC,cAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,wBAAA;AAAA,EACA,iBAAA;AAAA,EACA,uBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAGA,IAAM,mBAAA,GAAsB,KAAK,IAAA,GAAO,IAAA;AAEjC,IAAM,iBAAA,GAAoB,MAAM,IAAA,GAAO,IAAA;AAsB9C,eAAsB,YAAY,IAAA,EAGP;AACzB,EAAA,IAAI,CAACf,UAAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EAC7D;AACA,EAAA,MAAM,UAAA,uBAAiB,GAAA,CAAY;AAAA,IACjC,GAAG,wBAAA;AAAA,IACH,GAAI,IAAA,CAAK,YAAA,IAAgB;AAAC,GAC3B,CAAA;AACD,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,UAAU,CAAA;AAC5C,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAClC,IAAA,MAAM,IAAA,GAAOgB,QAAAA,CAAS,GAAG,CAAA,CAAE,IAAA;AAC3B,IAAA,IAAI,OAAO,mBAAA,EAAqB;AAC9B,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,CAAA,EAAG,GAAG,CAAA,gBAAA,EAAc,WAAA,CAAY,IAAI,CAAC,CAAA,SAAA,EAAY,WAAA,CAAY,mBAAmB,CAAC,CAAA,aAAA;AAAA,OACnF;AACA,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AAAA,EACxB;AACA,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,gCAAA,EAAmC,KAAK,GAAG,CAAA,8BAAA;AAAA,KAC7C;AAAA,EACF;AACA,EAAA,aAAA,CAAc,IAAA,EAAK;AAKnB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,WAAA,EAAa,UAAA,KAAe;AACnD,IAAA,MAAM,MAAA,GAAa,GAAA,CAAA,CAAA;AAAA,MACjB;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,QACN,KAAK,IAAA,CAAK,GAAA;AAAA;AAAA,QAEV,MAAA,EAAQ,KAAA;AAAA;AAAA;AAAA,QAGR,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAA,CAAO,GAAG,MAAA,EAAQ,CAAC,UAAkB,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACvD,IAAA,MAAA,CAAO,EAAA,CAAG,SAAS,UAAU,CAAA;AAC7B,IAAA,MAAA,CAAO,EAAA,CAAG,OAAO,WAAW,CAAA;AAAA,EAC9B,CAAC,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAClC,EAAA,IAAI,KAAA,CAAM,aAAa,iBAAA,EAAmB;AACxC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,wBAAA,EAA2B,YAAY,KAAA,CAAM,UAAU,CAAC,CAAA,UAAA,EAAa,WAAA,CAAY,iBAAiB,CAAC,CAAA,IAAA;AAAA,KACrG;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,QAAA,EAAS;AAC1C;AAIA,SAAS,IAAA,CAAK,MAAc,UAAA,EAAmC;AAC7D,EAAA,MAAMX,OAAgB,EAAC;AACvB,EAAA,MAAM,KAAA,GAAkB,CAAC,IAAI,CAAA;AAC7B,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,EAAI;AACtB,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAUS,WAAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAChC,MAAA,MAAM,GAAA,GAAML,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAChC,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MAChB,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,EAAG;AACzB,QAAAJ,IAAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MACd;AAAA,IAEF;AAAA,EACF;AACA,EAAA,OAAOA,IAAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA;AACzB,EAAA,IAAI,CAAA,GAAI,OAAO,IAAA,EAAM,OAAO,IAAI,CAAA,GAAI,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACpD,EAAA,OAAO,IAAI,CAAA,GAAI,IAAA,GAAO,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACxC;;;AC1GA,IAAM,6BAAa,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO,CAAC,CAAA;AAEtD,eAAsB,qBACpB,OAAA,EACiB;AACjB,EAAA,MAAM,cAAcC,OAAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AACxD,EAAA,MAAMP,aAAAA,GAAeU,IAAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AACpD,EAAA,IAAI,CAACT,UAAAA,CAAWD,aAAY,CAAA,EAAG;AAC7B,IAAA,IAAA;AAAA,MACE,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,WAAW,CAAC,CAAA,4CAAA;AAAA,KACzD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAMG,YAAAA,CAAaH,aAAAA,EAAc,OAAO,CAAC,CAAA;AAAA,EAC3D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAKA,aAAY,CAAC,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,SAAS,MAAA,EAAQ,IAAA;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,CAAK,CAAA,EAAG,KAAK,aAAa,CAAC,eAAe,IAAA,CAAK,aAAa,CAAC,CAAA,iBAAA,CAAmB,CAAA;AAChF,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAW,EAAG;AACjB,IAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,OAAA,CAAQ,IAAA;AACnB,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO;AACjC,IAAAa,KAAAA,CAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAMK,MAAAA,CAAO;AAAA,MAC1B,OAAA,EAAS,iBAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,6DAAA,EAAyD;AAAA,QAClF,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,wDAAA,EAAoD;AAAA,QAC7E,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,+BAAA;AAA2B,OACtD;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAIJ,QAAAA,CAAS,MAAM,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,UAAU,CAAA;AACf,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,IAAA,GAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAClC,IAAA,IAAA,CAAK,sDAAsD,CAAA;AAC3D,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,UAAA;AAAA,MACV,KAAA;AAAA,MACA,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,KAClD;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA;AAAA,QACE,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAC,CAAA,iFAAA;AAAA,OACtB;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,CAAA,0BAAA,EAA8B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAC1D,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAA;AAAA,IACE,CAAA,QAAA,EAAW,KAAK,GAAA,CAAI,IAAI,CAAC,CAAA,KAAA,EAAQ,GAAA,CAAI,EAAE,CAAA,CAAA,EACrC,GAAA,CAAI,kBAAkB,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,GAAA,CAAI,eAAe,EAAE,CAAC,CAAA,CAAA,GAAK,GAAA,CAAI,4BAA4B,CACzG,CAAA;AAAA,GACF;AAGA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,WAAA,CAAY;AAAA,MAC1B,GAAA,EAAK,WAAA;AAAA,MACL,GAAI,QAAQ,OAAA,KAAY,KAAA,CAAA,GAAY,EAAE,YAAA,EAAc,OAAA,CAAQ,OAAA,EAAQ,GAAI;AAAC,KAC1E,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,CAAA,wBAAA,EAA4B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACxD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAA;AAAA,IACE,CAAA,OAAA,EAAU,QAAQ,aAAA,CAAc,MAAM,QAAQ,OAAA,CAAQ,aAAA,CAAc,WAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,MAAA,EAASK,YAAAA,CAAY,QAAQ,KAAA,CAAM,UAAU,CAAC,CAAA,MAAA,EAASA,YAAAA,CAAY,iBAAiB,CAAC,CAAA,EAAA;AAAA,GAClL;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA;AAGxC,EAAA,IAAI,CAAC,QAAQ,GAAA,IAAO,OAAA,CAAQ,OAAO,KAAA,IAAS,CAAC,QAAQ,MAAA,EAAQ;AAC3D,IAAA,MAAM,MAAA,GAAS,MAAMD,MAAAA,CAAO;AAAA,MAC1B,SAAS,CAAA,iBAAA,EAAoB,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAI,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,MACjD,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,iBAAA,EAAkB;AAAA,QACxC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,WAAA;AAAY,OACxC;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAIJ,QAAAA,CAAS,MAAM,CAAA,IAAK,MAAA,KAAW,QAAA,EAAU;AAC3C,MAAA,IAAA,CAAK,UAAU,CAAA;AACf,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,MAAM,UAAA,EAAW;AACvB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,IAAA,CAAK,8DAAyD,CAAA;AAC9D,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAM,CAAA,EAAG,aAAA,EAAe,CAAA,aAAA,EAAgB,IAAI,EAAE,CAAA,YAAA,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAG1B,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAI,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,oBAAoB,CAAA;AACnF,EAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,eAAe,CAAA;AACtC,EAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAI,CAAA;AACrB,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,WAAW,MAAM,CAAA;AAE9C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,MAAM,GAAA,EAAK;AAAA,MACrB,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,kBAAA;AAAA,QACR,aAAA,EAAe,CAAA,OAAA,EAAU,GAAA,CAAI,KAAK,CAAA;AAAA,OACpC;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,CAAA,6BAAA,EAAiC,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAC7D,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAQ,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC/C,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,GAAA,GAAM,IAAA,IAAQ,OAAO,IAAA,KAAS,WAAY,IAAA,GAAmC,IAAA;AACnF,IAAA,IAAA;AAAA,MACE,CAAA,gBAAA,EAAmB,GAAA,CAAI,MAAM,CAAA,EAAG,KAAK,IAAA,GAAO,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,GAAA,EAAM,GAAA,EAAK,WAAW,cAAc,CAAA;AAAA,KACrG;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,GAAA,CAAI,KAAK,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,IAAA,CAAK,iEAAiE,CAAA;AACtE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,mCAA8B,IAAA,CAAK,CAAA,CAAA,EAAI,OAAO,OAAO,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACrE;AACA,EAAA,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,CAAA;AACzC,EAAA,IAAA,CAAK,CAAA,QAAA,EAAW,GAAA,CAAI,MAAA,CAAO,WAAW,CAAC,CAAA,CAAE,CAAA;AACzC,EAAA,IAAA,CAAK,CAAA,QAAA,EAAWK,YAAAA,CAAY,MAAA,CAAO,cAAc,CAAC,CAAA,CAAE,CAAA;AACpD,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC9B,IAAA,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,QAAA,EAAW,MAAA,CAAO,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AACnF,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,QAAA,EAAU;AAC/B,MAAA,GAAA,CAAI,KAAK,GAAA,CAAI,QAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1B;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,OAAO,KAAA,IAAS,CAAC,QAAQ,MAAA,EAAQH,MAAM,OAAO,CAAA;AAC1D,EAAA,OAAO,CAAA;AACT;AAEA,SAASG,aAAY,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA;AACzB,EAAA,IAAI,CAAA,GAAI,OAAO,IAAA,EAAM,OAAO,IAAI,CAAA,GAAI,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACpD,EAAA,OAAO,IAAI,CAAA,GAAI,IAAA,GAAO,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACxC;ACnNA,eAAsB,sBACpB,OAAA,EACiB;AACjB,EAAA,MAAM,cAAcZ,OAAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AACxD,EAAA,MAAMP,aAAAA,GAAeU,IAAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AACpD,EAAA,IAAI,CAACT,UAAAA,CAAWD,aAAY,CAAA,EAAG;AAC7B,IAAA,IAAA;AAAA,MACE,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,WAAW,CAAC,CAAA,4CAAA;AAAA,KACzD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAMG,YAAAA,CAAaH,aAAAA,EAAc,OAAO,CAAC,CAAA;AAAA,EAC3D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAKA,aAAY,CAAC,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,SAAS,MAAA,EAAQ,IAAA;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,CAAK,CAAA,EAAG,KAAK,aAAa,CAAC,eAAe,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,CAAG,CAAA;AAChE,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,UAAA;AAAA,MACV,KAAA;AAAA,MACA,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,KAClD;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAC,CAAA,0BAAA,CAA4B,CAAA;AACrD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,CAAA,0BAAA,EAA8B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAC1D,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAC/B,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,UAAA;AAAA,MACV,KAAA;AAAA,MACA,CAAA,aAAA,EAAgB,GAAA,CAAI,EAAE,CAAA,gBAAA,EAAmB,KAAK,CAAA;AAAA,KAChD;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,CAAA,iBAAA,EAAoB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACtC,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,CAAA,qBAAA,EAAyB,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACrD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,GACpBO,OAAAA,CAAQ,QAAQ,GAAG,CAAA,GACnBG,IAAAA,CAAK,WAAA,EAAa,oBAAoB,CAAA;AAC1C,EAAAD,aAAAA,CAAc,SAAS,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA;AAEnE,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,MAAA,EAAQ,SAAA,IAAa,EAAE,IAAA,CAAK,MAAA;AAChD,EAAA,OAAA,CAAQ,CAAA,MAAA,EAAS,SAAS,CAAA,IAAA,EAAO,SAAA,KAAc,IAAI,EAAA,GAAK,GAAG,CAAA,QAAA,EAAW,GAAA,CAAI,MAAA,CAAO,MAAM,SAAS,GAAA,CAAI,MAAA,CAAO,WAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,IAAA,EAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAIxJ,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ;AAChC,MAAA,IAAA;AAAA,QACE,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA,YAAA,EAAe,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,IAAA,EAAO,CAAA,CAAE,UAAU,CAAA,WAAA,EAAc,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,CAAI,EAAE,UAAA,EAAY,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,eAAA;AAAA,OACnI;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,kFAAkF,CAAC,CAAA;AAAA,EAC9F;AACA,EAAA,OAAO,CAAA;AACT;ACrFA,eAAsB,sBACpB,OAAA,EACiB;AACjB,EAAA,MAAM,cAAcF,OAAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AACxD,EAAA,MAAMP,aAAAA,GAAeU,IAAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AACpD,EAAA,IAAI,CAACT,UAAAA,CAAWD,aAAY,CAAA,EAAG;AAC7B,IAAA,IAAA;AAAA,MACE,MAAM,IAAA,CAAK,aAAa,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,WAAW,CAAC,CAAA,4CAAA;AAAA,KACzD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAMG,YAAAA,CAAaH,aAAAA,EAAc,OAAO,CAAC,CAAA;AAAA,EAC3D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAKA,aAAY,CAAC,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,UAAA;AAAA,MAChB,MAAA;AAAA,MACA,gCAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,IAAI,EAAA,EAAI;AACV,MAAA,OAAA,CAAQ,oBAAoB,CAAA;AAC5B,MAAA,OAAO,CAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,CAAA,2BAAA,EAA8B,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAE,CAAA;AACxD,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AACrC,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,IAAA,CAAK,CAAA,qBAAA,EAAwB,OAAO,MAAM,CAAA,MAAA,EAAS,OAAO,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,EAAA,CAAI,CAAA;AACrF,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,QAAA;AAC3B,UAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,cAAA;AACjC,UAAA,GAAA,CAAI,CAAA,EAAA,EAAK,GAAA,CAAI,QAAG,CAAC,CAAA,CAAA,EAAI,KAAK,IAAI,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,QAC/C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,CAAA,qBAAA,EAAwB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,CAAA,6BAAA,EAAiC,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAC7D,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,OAAA,EAA+D;AACjF,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,MAAM,CAAA,GAAI,QAAQ,QAAQ,CAAA;AAC1B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,SAAU,EAAC;AAC/B,EAAA,OAAO,CAAA,CACJ,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AAChD,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,MAAM,QAAuB,EAAC;AAC9B,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA;AAC/C,IAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU,KAAA,CAAM,UAAU,CAAA,CAAE,OAAA;AACrD,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAA0B,MAAM,IAAI,CAAA;AACjD;AC5CO,SAAS,aAAa,GAAA,EAAsB;AACjD,EAAA,OAAOU,KAAKH,OAAAA,CAAQ,GAAA,IAAO,QAAQ,GAAA,EAAK,GAAG,aAAa,CAAA;AAC1D;AAOO,SAAS,aAAsD,GAAA,EAAwB;AAC5F,EAAA,MAAM,IAAA,GAAO,aAAa,GAAG,CAAA;AAC7B,EAAA,IAAI,CAACN,UAAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,MAAM,GAAA,GAAME,YAAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,gBAAA,EAAmB,IAAI,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,oCAAA;AAAA,KACpD;AAAA,EACF;AACF;AAQO,SAAS,aAAA,CAAc,UAAyB,GAAA,EAAoB;AACzE,EAAA,MAAM,IAAA,GAAO,aAAa,GAAG,CAAA;AAC7B,EAAAM,aAAAA,CAAc,MAAM,IAAA,CAAK,SAAA,CAAU,UAAU,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA;AACvE;AAOO,SAAS,oBAA6D,GAAA,EAAiB;AAC5F,EAAA,MAAM,QAAA,GAAW,aAAgB,GAAG,CAAA;AACpC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,2BAA2BF,OAAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,8DAAA;AAAA,KAC1D;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;;;ACnDA,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,eAAA,GAAkB,GAAA;AA+BxB,eAAsB,cAAA,CACpB,cACA,OAAA,EACiB;AACjB,EAAA,IAAI,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA,EAAU;AACrD,IAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,2BAAA,CAA4B,IAAA,CAAK,YAAY,CAAA,EAAG;AACnD,IAAA,IAAA;AAAA,MACE,iBAAiB,IAAA,CAAK,YAAY,CAAC,CAAA,+CAAA,EAAkD,IAAA,CAAK,SAAS,CAAC,CAAA,EAAA;AAAA,KACtG;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,mBAAA,CAAoB,QAAQ,GAAG,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAM,IAAc,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,IAAA,KAAS,YAAA,EAAc;AAC1C,IAAA,IAAA,CAAK,mCAAmC,CAAA;AACxC,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,KAAA;AACrC,EAAA,MAAM,oBAAA,GACJ,QAAQ,KAAA,KAAU,MAAA,IAClB,QAAQ,MAAA,KAAW,MAAA,IACnB,QAAQ,OAAA,KAAY,MAAA;AAEtB,EAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,oBAAA,EAAsB;AAC3C,IAAA,IAAA;AAAA,MACE,CAAA,8BAAA,EAAiC,IAAA,CAAK,SAAS,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,UAAU,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA;AAAA,KACjG;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,eAAA,GAAkD,IAAA;AACtD,EAAA,IAAI,eAAA,GAAiC,IAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,UAAA;AAAA,MAChB,KAAA;AAAA,MACA,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,YAAY,CAAC,CAAA;AAAA,KAC1D;AACA,IAAA,IAAI,IAAI,eAAA,EAAiB;AACvB,MAAA,MAAM,WAAW,MAAM,UAAA;AAAA,QACrB,KAAA;AAAA,QACA,CAAA,aAAA,EAAgB,IAAI,EAAE,CAAA,SAAA;AAAA,OACxB;AAIA,MAAA,MAAM,OAAA,GACJ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,GAAA,CAAI,eAAe,CAAA,IACtD,QAAA,CAAS,CAAC,CAAA;AACZ,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,eAAA,GAAkB,OAAA,CAAQ,cAAA;AAC1B,QAAA,eAAA,GAAkB,OAAA,CAAQ,OAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,IAAA;AAAA,UACE,CAAA,SAAA,EAAY,IAAA,CAAK,YAAY,CAAC,CAAA,8DAAA;AAAA,SAChC;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,IAAA;AAAA,QACE,CAAA,SAAA,EAAY,IAAA,CAAK,YAAY,CAAC,CAAA,wEAAA;AAAA,OAChC;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,WAAW,GAAA,EAAK;AACxD,MAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,MAAA,OAAO,CAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,CAAA,kCAAA,EAAsC,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACpE;AAAA,EACF;AAGA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,aAAA,EAAe;AACjB,IAAAM,KAAAA,CAAM,CAAA,qBAAA,EAAwB,IAAA,CAAK,YAAY,CAAC,CAAA,CAAE,CAAA;AAClD,IAAA,MAAM,QAAQ,MAAM,kBAAA;AAAA,MAClB,YAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAAG,MAAM,YAAY,CAAA;AAClB,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,KAAA,GAAQ,KAAA;AAAA,EACV,CAAA,MAAO;AAIL,IAAA,MAAM,SAAA,GAAA,CAAa,OAAA,CAAQ,MAAA,IAAU,EAAA,EAClC,MAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,UAAU,CAAC,CAAA,mCAAA,CAAqC,CAAA;AAC7D,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,OAAA,CAAQ,OAAQ,CAAA;AACnD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,UAAU,CAAA;AACf,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,KAAA,GAAQ;AAAA,MACN,MAAA,EAAQ,YAAA;AAAA,MACR,SAAS,OAAA,CAAQ,OAAA,KAAY,eAAA,GAAkB,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA,GAAK,QAAA,CAAA;AAAA,MACvE,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,MACpD,SAAS,OAAA,CAAQ;AAAA,KACnB;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAA6B,QAAA,CAAS,YAAA,IAAgB,EAAC;AAC7D,EAAA,MAAM,cAAc,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,YAAY,CAAA;AACnE,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,IAAO,aAAA,EAAe;AACjC,MAAA,MAAM,MAAA,GAAS,MAAME,MAAAA,CAAO;AAAA,QAC1B,OAAA,EAAS,UAAU,YAAY,CAAA,4BAAA,CAAA;AAAA,QAC/B,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,oCAAA,EAAqC;AAAA,UAChE,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS,SACrC;AAAA,QACA,YAAA,EAAc;AAAA,OACf,CAAA;AACD,MAAA,IAAIJ,QAAAA,CAAS,MAAM,CAAA,IAAK,MAAA,KAAW,QAAA,EAAU;AAC3C,QAAAE,MAAM,YAAY,CAAA;AAClB,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,IAAA,CAAK,WAAW,CAAA,GAAI,KAAA;AAAA,EACtB,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACjB;AACA,EAAA,QAAA,CAAS,YAAA,GAAe,IAAA;AAExB,EAAA,IAAI;AACF,IAAA,aAAA,CAAc,QAAA,EAA2B,QAAQ,GAAG,CAAA;AAAA,EACtD,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,CAAA,0BAAA,EAA8B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAC1D,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAA;AAAA,IACE,CAAA,EAAG,WAAA,IAAe,CAAA,GAAI,UAAA,GAAa,OAAO,CAAA,eAAA,EAAkB,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,GACjG;AACA,EAAA,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,KAAK,CAAA,CAAE,MAAA,CAAO,KAAK,IAAI,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC/F,EAAA,IAAA,CAAK,CAAA,IAAA,EAAO,IAAA,CAAK,0BAA0B,CAAC,CAAA,2BAAA,CAA6B,CAAA;AACzE,EAAA,IAAI,aAAA,EAAeA,KAAAA,CAAM,OAAO,CAAA;AAChC,EAAA,OAAO,CAAA;AACT;AASA,eAAe,kBAAA,CACb,YAAA,EACA,OAAA,EACA,eAAA,EACA,OAAA,EACoC;AACpC,EAAA,MAAM,QAA+B,EAAC;AAEtC,EAAA,IAAI,WAAW,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AAE5D,IAAA,IAAA;AAAA,MACE,CAAA,iBAAA,EAAoB,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,MAAA,EAAS,QAAQ,OAAA,CAAQ,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA;AAAA,KAC5F;AAGA,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AACnD,MAAA,MAAM,MAAM,CAAA,CAAE,UAAA;AACd,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,MAAA,OAAO,IAAI,IAAA,EAAM,OAAA,KAAY,IAAA,IAAQ,GAAA,CAAI,KAAK,OAAA,KAAY,IAAA;AAAA,IAC5D,CAAC,CAAA;AACD,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,MAAA,IAAA;AAAA,QACE,CAAA,SAAA,EAAY,IAAA,CAAK,YAAY,CAAC,CAAA,0EAAA;AAAA,OAChC;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY;AAAA,MAC/B,OAAA,EAAS,wCAAA;AAAA,MACT,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAClC,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,OAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,MAAA,EAAS,EAAE,MAAA,CAAO,MAAA,KAAW,IAAI,EAAA,GAAK,GAAG,GAAG,CAAC,CAAA;AAAA,OAC3F,CAAE,CAAA;AAAA,MACF,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAIF,QAAAA,CAAS,MAAM,CAAA,EAAG,OAAO,IAAA;AAE7B,IAAA,KAAA,MAAW,aAAa,MAAA,EAAoB;AAC1C,MAAA,MAAM,cAAc,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,SAAS,CAAA;AACpE,MAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY;AAAA,QACrC,OAAA,EAAS,CAAA,oBAAA,EAAuB,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,QAC/C,OAAA,EAAS,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,QAC/D,QAAA,EAAU,IAAA;AAAA,QACV,eAAe,WAAA,CAAY;AAAA;AAAA,OAC5B,CAAA;AACD,MAAA,IAAIA,QAAAA,CAAS,YAAY,CAAA,EAAG,OAAO,IAAA;AACnC,MAAA,KAAA,CAAM,KAAK,EAAE,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,cAA0B,CAAA;AAAA,IACnE;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,IAAA,CAAK,qEAAgE,CAAA;AACrE,IAAA,MAAM,SAAA,GAAY,MAAMV,IAAAA,CAAK;AAAA,MAC3B,OAAA,EAAS,mCAAA;AAAA,MACT,WAAA,EAAa,UAAA;AAAA,MACb,UAAU,CAAC,CAAA,KACT,4BAA4B,IAAA,CAAK,CAAC,IAAI,MAAA,GAAY;AAAA,KACrD,CAAA;AACD,IAAA,IAAIU,QAAAA,CAAS,SAAS,CAAA,EAAG,OAAO,IAAA;AAChC,IAAA,MAAM,SAAA,GAAY,MAAMV,IAAAA,CAAK;AAAA,MAC3B,OAAA,EAAS,8BAAA;AAAA,MACT,WAAA,EAAa,sBAAA;AAAA,MACb,UAAU,CAAC,CAAA,KACT,EAAE,KAAA,CAAM,GAAG,EAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA,GAAS,IACvD,MAAA,GACA;AAAA,KACP,CAAA;AACD,IAAA,IAAIU,QAAAA,CAAS,SAAS,CAAA,EAAG,OAAO,IAAA;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAS,SAAA,CACN,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO;AAAA,KAClB,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,cAAA,GAAiB,QAAQ,OAAA,IAAW,EAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAMV,IAAAA,CAAK;AAAA,IACzB,OAAA,EAAS,8CAA8C,GAAA,CAAI,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA,EAAI,eAAe,uDAAuD,CAAC,CAAA,CAAA;AAAA,IACzJ,WAAA,EAAa,qDAAA;AAAA,IACb,YAAA,EAAc,cAAA;AAAA,IACd,QAAA,EAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAC,CAAA,IAAK;AAAA,GACxC,CAAA;AACD,EAAA,IAAIU,QAAAA,CAAS,OAAO,CAAA,EAAG,OAAO,IAAA;AAG9B,EAAA,MAAM,iBACJ,OAAA,CAAQ,OAAA,KAAY,eAAA,GAAkB,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA,GAAK,QAAA,CAAA;AAChE,EAAA,MAAM,OAAA,GAAU,MAAMV,IAAAA,CAAK;AAAA,IACzB,OAAA,EAAS,CAAA,qBAAA,EAAwB,GAAA,CAAI,2CAA2C,CAAC,CAAA,CAAA;AAAA,IACjF,WAAA,EAAa,cAAA;AAAA,IACb,YAAA,EAAc,cAAA;AAAA,IACd,QAAA,EAAU,CAAC,CAAA,KACT,kDAAA,CAAmD,IAAA,CAAK,CAAC,CAAA,IACzD,0DAAA,CAA2D,IAAA,CAAK,CAAC,CAAA,GAC7D,MAAA,GACA;AAAA,GACP,CAAA;AACD,EAAA,IAAIU,QAAAA,CAAS,OAAO,CAAA,EAAG,OAAO,IAAA;AAE9B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,YAAA;AAAA,IACR,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,gBAAgB,OAAA,EAAgC;AACvD,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,2BAAA;AACxC,EAAA,IAAI,OAAA,CAAQ,SAAS,eAAA,EAAiB;AACpC,IAAA,OAAO,CAAA,yBAAA,EAA4B,eAAe,CAAA,iBAAA,EAAoB,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA;AAAA,EACtF;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,eAAA,EAAiB;AACpC,IAAA,OAAO,CAAA,wBAAA,EAA2B,eAAe,CAAA,iBAAA,EAAoB,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,IAAA;AACT;;;AChTA,eAAsB,iBAAiB,OAAA,EAA4C;AACjF,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,mBAAA,CAAoB,QAAQ,GAAG,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAM,IAAc,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAA6B,QAAA,CAAS,YAAA,IAAgB,EAAC;AAC7D,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,MAAM,IAAA,EAAM,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACjE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,6CAA6C,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,MAAM,eAAwF,EAAC;AAE/F,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,UAAA;AAAA,QACV,KAAA;AAAA,QACA,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,OACxD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,oBAAA;AAAA,UACN,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,OAAA,EAAS,CAAA,SAAA,EAAY,GAAA,CAAI,MAAM,CAAA,+DAAA;AAAA,SAChC,CAAA;AACD,QAAA,YAAA,CAAa,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAkB,IAAA,EAAM,CAAA;AAC3E,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,QAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,QAAA,OAAO,CAAA;AAAA,MACT;AAGA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,qBAAA;AAAA,QACN,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA,EAAS,CAAA,6BAAA,EAAiC,GAAA,CAAc,OAAO,CAAA;AAAA,OAChE,CAAA;AACD,MAAA,YAAA,CAAa,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAkB,IAAA,EAAM,CAAA;AAC3E,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,UAAA;AAAA,QACf,KAAA;AAAA,QACA,CAAA,aAAA,EAAgB,IAAI,EAAE,CAAA,SAAA;AAAA,OACxB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,qBAAA;AAAA,QACN,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA,EAAS,CAAA,yBAAA,EAA6B,GAAA,CAAc,OAAO,CAAA;AAAA,OAC5D,CAAA;AACD,MAAA,YAAA,CAAa,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAkB,IAAA,EAAM,CAAA;AAC3E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,GAAA,CAAI,OAAO,CAAA;AACnD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,qBAAA;AAAA,QACN,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA,EAAS,CAAA,+BAAA,EAAkC,GAAA,CAAI,OAAO,gBAAgB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,KAAK,QAAQ,CAAA,CAAA,CAAA;AAAA,QAC3H,OAAA,EAAS,EAAE,KAAA,EAAO,GAAA,CAAI,OAAA,EAAS,SAAA,EAAW,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA;AAAE,OAC1E,CAAA;AACD,MAAA,YAAA,CAAa,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAkB,IAAA,EAAM,CAAA;AAC3E,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,OAAA,IAAW,EAAC;AACpD,IAAA,IAAI,UAAA,GAAa,IAAA;AAEjB,IAAA,KAAA,MAAW,SAAA,IAAa,IAAI,KAAA,EAAO;AACjC,MAAA,MAAM,WAAA,GAAc,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,UAAU,KAAK,CAAA;AACnE,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,mBAAA;AAAA,UACN,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,yBAAA,EAA4B,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,OAAO,CAAA,CAAA,CAAA;AAAA,UACjG,SAAS,EAAE,KAAA,EAAO,UAAU,KAAA,EAAO,gBAAA,EAAkB,SAAS,OAAA;AAAQ,SACvE,CAAA;AACD,QAAA,UAAA,GAAa,KAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,WAAA,CAAY,MAAM,CAAA;AAChD,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,CAAA;AACpE,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,mBAAA;AAAA,UACN,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,OAAA,EAAS,UAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,6BAA6B,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,OAAO,CAAA,CAAA,CAAA;AAAA,UAChJ,OAAA,EAAS;AAAA,YACP,OAAO,SAAA,CAAU,KAAA;AAAA,YACjB,OAAA;AAAA,YACA,kBAAkB,QAAA,CAAS;AAAA;AAC7B,SACD,CAAA;AACD,QAAA,UAAA,GAAa,KAAA;AAAA,MACf;AAGA,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,UAAA,EAAY,IAAA,EAAM,OAAA,KAAY,KAAA;AAC9D,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,UAAA,EAAY,GAAA,EAAK,OAAA,KAAY,KAAA;AAC5D,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,gBAAA;AAAA,UACN,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,OAAA,EAAS,CAAA,SAAA,EAAY,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,OAAO,CAAA,gCAAA,EAAmC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,0BAAA,CAAA;AAAA,UAC3G,SAAS,EAAE,KAAA,EAAO,UAAU,KAAA,EAAO,gBAAA,EAAkB,SAAS,OAAA;AAAQ,SACvE,CAAA;AACD,QAAA,UAAA,GAAa,KAAA;AAAA,MACf;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,UAAA,IAAc,GAAA,CAAI,MAAA,IAAU,EAAC,EAAG;AACzC,MAAA,MAAM,WAAA,GAAc,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,WAAW,KAAK,CAAA;AACpE,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,KAAA,MAAW,EAAA,IAAM,WAAW,UAAA,EAAY;AACtC,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,UAAA,GAAa,EAAoC,CAAA;AAC1E,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,OAAA,KAAY,IAAA,EAAM;AAClC,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,IAAA,EAAM,gBAAA;AAAA,YACN,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,OAAA,EAAS,CAAA,gBAAA,EAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,SAAS,OAAO,CAAA,CAAA,CAAA;AAAA,YACrH,OAAA,EAAS;AAAA,cACP,OAAO,UAAA,CAAW,KAAA;AAAA,cAClB,SAAA,EAAW,EAAA;AAAA,cACX,kBAAkB,QAAA,CAAS;AAAA;AAC7B,WACD,CAAA;AACD,UAAA,UAAA,GAAa,KAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,EAAA,EAAI,UAAA;AAAA,MACJ,kBAAkB,QAAA,CAAS;AAAA,KAC5B,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,EAAA,GAAK,OAAO,MAAA,KAAW,CAAA;AAE7B,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,GAAA;AAAA,MACE,IAAA,CAAK,SAAA;AAAA,QACH,EAAE,EAAA,EAAI,IAAA,EAAM,YAAA,EAAc,MAAA,EAAO;AAAA,QACjC,IAAA;AAAA,QACA;AAAA;AACF,KACF;AACA,IAAA,OAAO,KAAK,CAAA,GAAI,CAAA;AAAA,EAClB;AAGA,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,IAAI,IAAI,EAAA,EAAI;AACV,MAAA,OAAA;AAAA,QACE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,QAAA,EAAM,GAAA,CAAI,gBAAA,GAAmB,CAAA,CAAA,EAAI,GAAA,CAAI,gBAAgB,CAAA,CAAA,GAAK,GAAA,CAAI,cAAc,CAAC,CAAA;AAAA,OAClG;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,CAAA,EAAG,KAAK,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,kBAAkB,CAAC,CAAA,CAAE,CAAA;AAAA,IACvD;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,IAAA,CAAK,CAAA,EAAG,OAAO,MAAM,CAAA,MAAA,EAAS,OAAO,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAC/D,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,GAAA,CAAI,CAAA,EAAA,EAAK,GAAA,CAAI,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IACpD;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,IAAA;AAAA,MACE,qCAAqC,IAAA,CAAK,6BAA6B,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,0BAA0B,CAAC,CAAA,8BAAA;AAAA,KACnH;AAAA,EACF,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,OAAA,CAAQ,CAAA,IAAA,EAAO,aAAa,MAAM,CAAA,UAAA,EAAa,aAAa,MAAA,KAAW,CAAA,GAAI,MAAA,GAAS,SAAS,CAAA,SAAA,CAAW,CAAA;AAAA,EAC1G;AACA,EAAA,OAAO,KAAK,CAAA,GAAI,CAAA;AAClB;AAaA,SAAS,YAAA,CACP,UACA,KAAA,EACwB;AACxB,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,cAAA,CAAe,CAAA,CAAE,OAAA,EAAS,KAAK,GAAG,OAAO,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAA,CAAe,SAAiB,KAAA,EAAwB;AAC/D,EAAA,MAAM,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,2BAA2B,CAAA;AACzD,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,CAAC,CAAA,IAAK,GAAA;AACzB,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA;AACrC,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,MAAA,EAAQ,MAAM,CAAA;AACxC,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,GAAA;AACH,MAAA,OAAO,GAAA,KAAQ,CAAA;AAAA,IACjB,KAAK,GAAA;AACH,MAAA,OAAO,GAAA,GAAM,CAAA;AAAA,IACf,KAAK,GAAA;AACH,MAAA,OAAO,GAAA,GAAM,CAAA;AAAA,IACf,KAAK,IAAA;AACH,MAAA,OAAO,GAAA,IAAO,CAAA;AAAA,IAChB,KAAK,IAAA;AACH,MAAA,OAAO,GAAA,IAAO,CAAA;AAAA,IAChB,KAAK,GAAA;AAEH,MAAA,IAAI,GAAA,GAAM,GAAG,OAAO,KAAA;AACpB,MAAA,IAAI,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,SAAU,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA;AAChD,MAAA,IAAI,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,EAAG,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA;AACnE,MAAA,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA;AAAA,IACrE,KAAK,GAAA;AAEH,MAAA,IAAI,GAAA,GAAM,GAAG,OAAO,KAAA;AACpB,MAAA,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,KAAK,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA;AAAA,IAC1D;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAEA,SAAS,YAAY,CAAA,EAA4C;AAC/D,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,IAAA,EAAK,CAAE,MAAM,2CAA2C,CAAA;AACpE,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,OAAO,CAAC,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAClD;AAEA,SAAS,aAAA,CAAc,GAA6B,CAAA,EAAqC;AACvF,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,CAAA;AACT;;;AC3TA,eAAsB,gBAAgB,OAAA,EAA2C;AAC/E,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,mBAAA,CAAoB,QAAQ,GAAG,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAM,IAAc,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAA6B,QAAA,CAAS,YAAA,IAAgB,EAAC;AAE7D,EAAA,IAAI,QAAQ,IAAA,EAAM;AAGhB,IAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AACjC,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,IAAA,CAAK,0CAA0C,CAAA;AAC/C,IAAA,IAAA,CAAK,CAAA,IAAA,EAAO,IAAA,CAAK,mCAAmC,CAAC,CAAA,YAAA,CAAc,CAAA;AACnE,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,GAAA,CAAI,CAAA,EAAG,KAAK,MAAM,CAAA,UAAA,EAAa,KAAK,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,KAAK,CAAA,UAAA,CAAY,CAAA;AAC1E,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,GAAA,CAAI,CAAA,EAAA,EAAK,KAAK,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAC1C,IAAA,GAAA,CAAI,OAAO,GAAA,CAAI,UAAU,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAC3C,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACxB,MAAA,GAAA,CAAI,CAAA,IAAA,EAAO,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,CAAA;AAC1B,MAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,QAAA,GAAA,CAAI,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA,QAAA,EAAM,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACvD;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACvC,MAAA,GAAA,CAAI,CAAA,IAAA,EAAO,GAAA,CAAI,SAAS,CAAC,CAAA,CAAE,CAAA;AAC3B,MAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,QAAA,GAAA;AAAA,UACE,SAAS,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,WAAM,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,SAC5E;AAAA,MACF;AAAA,IACF;AACA,IAAA,GAAA,CAAI,EAAE,CAAA;AAAA,EACR;AACA,EAAA,OAAO,CAAA;AACT;AC1CA,eAAsB,iBAAA,CACpB,cACA,OAAA,EACiB;AACjB,EAAA,IAAI,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA,EAAU;AACrD,IAAA,IAAA,CAAK,+CAA+C,CAAA;AACpD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,mBAAA,CAAoB,QAAQ,GAAG,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAM,IAAc,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAA6B,QAAA,CAAS,YAAA,IAAgB,EAAC;AAC7D,EAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,YAAY,CAAA;AACzD,EAAA,IAAI,CAAC,MAAA,EAAQ;AAGX,IAAA,IAAA,CAAK,CAAA,iBAAA,EAAoB,IAAA,CAAK,YAAY,CAAC,CAAA,6BAAA,CAA+B,CAAA;AAC1E,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,OAAO,KAAA,EAAO;AACxC,IAAA,MAAM,MAAA,GAAS,MAAMI,MAAAA,CAAO;AAAA,MAC1B,OAAA,EAAS,wBAAwB,YAAY,CAAA,CAAA,CAAA;AAAA,MAC7C,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,gBAAA,EAAiB;AAAA,QACvC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,aAAA;AAAc,OAC1C;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAIJ,QAAAA,CAAS,MAAM,CAAA,IAAK,MAAA,KAAW,QAAA,EAAU;AAC3C,MAAA,IAAA,CAAK,UAAU,CAAA;AACf,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,eAAe,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,YAAY,CAAA;AAIpE,EAAA,IAAK,QAAA,CAAS,YAAA,CAAsC,MAAA,KAAW,CAAA,EAAG;AAChE,IAAA,OAAO,QAAA,CAAS,YAAA;AAAA,EAClB;AAEA,EAAA,IAAI;AACF,IAAA,aAAA,CAAc,QAAA,EAAU,QAAQ,GAAG,CAAA;AAAA,EACrC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,CAAA,0BAAA,EAA8B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAC1D,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAA,CAAQ,CAAA,sBAAA,EAAyB,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,CAAG,CAAA;AACtD,EAAA,IAAA,CAAK,CAAA,IAAA,EAAO,IAAA,CAAK,0BAA0B,CAAC,CAAA,2BAAA,CAA6B,CAAA;AACzE,EAAA,OAAO,CAAA;AACT;ACZA,eAAsB,aAAa,OAAA,EAA+C;AAChF,EAAA,MAAM,cAAcM,OAAA,CAAY,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AAG5D,EAAA,IAAI;AACF,IAAA,mBAAA,CAAoB,WAAW,CAAA;AAAA,EACjC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAM,IAAc,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAA;AAAA,EACT;AAIA,EAAA,MAAM,aAAA,GAAgBV,IAAAA;AAAA,IACpB,WAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,CAACT,UAAAA,CAAW,aAAa,CAAA,EAAG;AAC9B,IAAA,IAAA;AAAA,MACE,CAAA,GAAA,EAAM,IAAA,CAAK,mBAAmB,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,cAAc,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,0BAA0B,CAAC,CAAA,OAAA;AAAA,KACrG;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAOA,EAAA,yBAAA,CAA0B,WAAW,CAAA;AAGrC,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,OAAA,CAAQ,MAAA,KAAW,MAAA,GAAY,QAAA,GAAW,IAAA;AAAA,IAC1C,OAAA,CAAQ,IAAA,KAAS,MAAA,GAAY,MAAA,GAAS,IAAA;AAAA,IACtC,OAAA,CAAQ,IAAA,KAAS,IAAA,GAAO,MAAA,GAAS;AAAA,GACnC,CAAE,OAAO,OAAO,CAAA;AAChB,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,IAAA,CAAK,+DAA+D,CAAA;AACpE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,IAAA,CAAK,CAAA,wDAAA,EAA2D,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA;AACpF,IAAA,OAAO,CAAA;AAAA,EACT;AAKA,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,IAAA,IAAQ,OAAA,CAAQ,SAAS,IAAA,EAAM;AACrD,IAAA,IAAA,CAAK,+FAA+F,CAAA;AACpG,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,IAAA,IAAQ,OAAA,CAAQ,SAAS,IAAA,EAAM;AACpD,IAAA,IAAA,CAAK,+FAA+F,CAAA;AACpG,IAAA,OAAO,CAAA;AAAA,EACT;AAIA,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,IAAA,IAAQ,OAAA,CAAQ,WAAW,IAAA,EAAM;AACvD,IAAA,IAAA,CAAK,4HAAuH,CAAA;AAC5H,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,KAAY,IAAA;AACpC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,KAAW,IAAA;AAElC,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,OAAA,CAAQ,aAAa,CAAA;AAC9C,EAAA,IAAI,QAAQ,IAAA,KAAS,MAAA;AACnB,IAAA,OAAO,OAAA,CAAQ,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,IAAA,KAAS,IAAA,EAAM,SAAS,MAAM,CAAA;AAClF,EAAA,IAAI,QAAQ,MAAA,KAAW,MAAA;AACrB,IAAA,OAAO,SAAA;AAAA,MACL,OAAA,CAAQ,MAAA;AAAA,MACR,WAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAQ,IAAA,KAAS,IAAA;AAAA,MACjB,OAAA;AAAA,MACA;AAAA,KACF;AAEF,EAAA,OAAO,CAAA;AACT;AAgBA,eAAe,UACb,UAAA,EACA,WAAA,EACA,cAAA,EACA,WAAA,EACA,SACA,MAAA,EACiB;AACjB,EAAA,MAAM,SAAS,WAAA,CAAYS,IAAAA,CAAK,MAAA,EAAO,EAAG,iBAAiB,CAAC,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,MAAA,EAAQ,YAAY,CAAA;AAGzC,EAAA,MAAM,cAAc,UAAA,CAAW,IAAA,EAAK,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AACzD,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,mDAAA;AAAA,IACA,gCAAgC,WAAW,CAAA,KAAA,CAAA;AAAA,IAC3C;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACX,EAAAD,aAAAA,CAAc,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,cAAA,CAAe,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,SAAS,MAAM,CAAA;AAAA,EAChF,CAAA,SAAE;AACA,IAAA,IAAI;AACF,MAAAE,OAAO,MAAA,EAAQ,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACjD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAYA,eAAe,OAAA,CACb,IAAA,EACA,WAAA,EACA,WAAA,EACA,SACA,MAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAMS,OAAA,CAAY,WAAA,EAAa,IAAI,CAAA;AACzC,EAAA,IAAI,CAACnB,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAA,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AACnC,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,EAAG;AAC5B,IAAA,IAAA;AAAA,MACE,CAAA,8DAAA,EAAiE,IAAA,CAAK,gBAAgB,CAAC,CAAA,wDAAA;AAAA,KACzF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,cAAA,CAAe,GAAA,EAAK,WAAA,EAAa,WAAA,EAAa,SAAS,MAAM,CAAA;AACtE;AAeA,eAAe,QAAQ,aAAA,EAAwC;AAC7D,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,SAAA,GAAY,MAAM,sBAAsB,aAAa,CAAA;AAAA,EACvD,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA;AAAA,MACE,oBAAoB,IAAA,CAAK,mBAAmB,CAAC,CAAA,EAAA,EAAM,IAAc,OAAO,CAAA;AAAA,KAC1E;AACA,IAAA,IAAA;AAAA,MACE,CAAA,YAAA,EAAe,IAAA,CAAK,0BAA0B,CAAC,CAAA,+BAAA;AAAA,KACjD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,uBAAuB,CAAC,CAAA,gDAAA,CAA6C,CAAA;AAClF,EAAA,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,4BAA4B,CAAC,CAAA,mBAAA,CAAqB,CAAA;AACpE,EAAA,GAAA,CAAI,EAAE,CAAA;AAIN,EAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAW,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM;AAAA,IACxB,MAAA,EAAQ,GAAG,IAAA,CAAK,UAAU,CAAC,CAAA,EAAG,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IACtC,SAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,MAAA,CAAO,cAAA,CAAe,MAAA,CAAO,OAAA,EAAS,GAAA,EAAK;AAAA,MACzC,YAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAY,IAAA;AAAA,MACZ,QAAA,EAAU,KAAA;AAAA,MACV;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAI,OAAA,CAAgB,CAAC,WAAA,KAAgB;AAC1C,IAAA,MAAA,CAAO,EAAA,CAAG,QAAQ,MAAM;AACtB,MAAA,GAAA,CAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AACnB,MAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IACf,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AASA,eAAe,cAAA,CACb,IAAA,EACA,WAAA,EACA,WAAA,EACA,SACA,MAAA,EACiB;AAKjB,EAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,EAAI;AAChC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,MAAM,WAAW,CAAA;AACzB,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAI,CAAA,CAAE,QAAA,EAAS;AAEzC,IAAA,MAAM,GAAA,GAAW,MAAM,OAAO,GAAA,CAAA;AAC9B,IAAA,IAAI,SAAS,GAAA,CAAI,OAAA;AAMjB,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,MAAA,MAAA,GAAS,MAAM,MAAA;AAAA,IACjB;AACA,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,KAAA,KAAU,UAAA,EAAY;AAMhD,MAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AAEjD,QAAA,MAAM,QAAA,GAAW,OAAO,MAAA,EAAO;AAC/B,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,WAAA,MAAiB,OAAO,QAAA,EAAU;AAChC,UAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AACvB,UAAA,QAAA,EAAA;AAAA,QACF;AAIA,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,IAAA,EAAO,aAAa,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,QAC9D;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AAKA,MAAA,IAAI,OAAA,IAAW,OAAO,MAAA,CAAO,OAAA,KAAY,UAAA,EAAY;AACnD,QAAA,MAAA,GAAS,MAAM,OAAO,OAAA,EAAQ;AAAA,MAChC,CAAA,MAAA,IAAW,OAAO,MAAA,CAAO,OAAA,KAAY,UAAA,EAAY;AAC/C,QAAA,MAAA,GAAS,MAAM,OAAO,OAAA,EAAQ;AAAA,MAChC;AAAA,IACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,CAAA,cAAA,EAAkB,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAI,OAAA,CAAQ,IAAI,cAAA,EAAgB;AAE9B,MAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,MAAM,WAAW,CAAA;AAAA,EAC3B;AACF;AAMA,eAAe,sBACb,YAAA,EACkC;AAIlC,EAAA,MAAM,KAAA,GAAQS,IAAAA,CAAK,YAAA,EAAc,UAAU,CAAA;AAC3C,EAAA,IAAI,CAACT,UAAAA,CAAW,KAAK,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,KAAK,CAAA,8CAAA,CAAgD,CAAA;AAAA,EACnF;AACA,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,KAAK,CAAA,CAAE,QAAA,EAAS;AAC1C,EAAA,OAAQ,MAAM,OAAO,GAAA,CAAA;AACvB;AAQA,SAAS,0BAA0B,WAAA,EAA2B;AAC5D,EAAA,MAAM,OAAA,GAAUS,IAAAA,CAAK,WAAA,EAAa,YAAY,CAAA;AAC9C,EAAA,IAAI,CAACT,UAAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,EAAA,MAAM,GAAA,GAAME,YAAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AACzC,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACrD,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,MAAM,CAAA,EAAG;AACb,IAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACtC,IAAA,IAAI,QAAQ,OAAA,CAAQ,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AAEvC,IAAA,IACG,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,MAAM,QAAA,CAAS,GAAG,CAAA,IAC3C,KAAA,CAAM,WAAW,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAC5C;AACA,MAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,KAAM,MAAA,EAAW;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACrB;AAAA,EACF;AACF;;;AC7UA,IAAM,gBAAA,GAAmB,GAAA;AAEzB,eAAsB,sBACpB,OAAA,EACiB;AAGjB,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,eAAA,CAAgB,OAAA,CAAQ,MAAA,EAAQ,QAAQ,GAAG,CAAA;AAAA,EAC9D,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAM,IAAc,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,OAAA,CAAQ,UAAU,OAAO,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,OAAA,CAAQ,UAAU,OAAO,CAAA;AAClC;AAIA,eAAe,OAAA,CACb,UACA,OAAA,EACiB;AACjB,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,MAAA;AAChC,EAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAC1C,EAAA,IAAI,OAAO,QAAQ,KAAA,KAAU,QAAA,SAAiB,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAK,CAAA;AAC1E,EAAA,MAAM,EAAA,GAAK,IAAI,eAAA,CAAgB,MAAM,EAAE,QAAA,EAAS;AAChD,EAAA,MAAM,IAAA,GAAO,gBAAgB,QAAQ,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,EAAI,EAAE,KAAK,EAAE,CAAA,CAAA;AAEpE,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,UAAA,CAA6B,KAAA,EAAO,IAAI,CAAA;AAAA,EACvD,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,eAAe,GAAG,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AACxB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC7B,IAAA,IAAA;AAAA,MACE,OAAA,CAAQ,OACJ,0CAAA,GACA;AAAA,KACN;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,WAAA,CAAY,KAAK,OAAO,CAAA;AACxB,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,IAAA,CAAK,CAAA,EAAG,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,KAAA,KAAU,CAAA,GAAI,OAAA,GAAU,SAAS,CAAA,CAAA,CAAG,CAAA;AAC/D,EAAA,OAAO,CAAA;AACT;AAIA,eAAe,OAAA,CACb,UACA,OAAA,EACiB;AAGjB,EAAA,MAAM,gBAAwC,EAAC;AAC/C,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,aAAA,CAAc,IAAA,GAAO,MAAA;AACvC,EAAA,aAAA,CAAc,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AACvC,EAAA,IAAI,OAAO,QAAQ,KAAA,KAAU,QAAA,gBAAwB,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAK,CAAA;AACjF,EAAA,MAAM,SAAA,GAAY,IAAI,eAAA,CAAgB,aAAa,EAAE,QAAA,EAAS;AAE9D,EAAA,IAAA,CAAK,CAAA,6BAAA,EAAgC,QAAQ,CAAA,iBAAA,CAAmB,CAAA;AAChE,EAAA,GAAA,CAAI,EAAE,CAAA;AAON,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,IAAI,SAAA,GAAY,IAAA;AAIhB,EAAA,gBAAA,EAAiB;AAIjB,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,gBAAgB,QAAQ,CAAA,WAAA,EAAc,YAAY,SAAA,GAAY,eAAA,CAAgB,OAAO,CAAC,CAAA,CAAA;AACnG,MAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAA6B,KAAA,EAAO,IAAI,CAAA;AAI3D,MAAA,MAAM,UAAyB,EAAC;AAChC,MAAA,KAAA,MAAW,OAAO,CAAC,GAAG,KAAK,OAAO,CAAA,CAAE,SAAQ,EAAG;AAC7C,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,UAAU,CAAA;AAC1B,QAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,MAClB;AACA,MAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,QAAA,GAAA,CAAI,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,MACpB;AACA,MAAA,SAAA,GAAY,KAAA;AAAA,IACd,SAAS,GAAA,EAAK;AAEZ,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,kBAAA,EAAsB,GAAA,CAAc,OAAO,GAAG,CAAC,CAAA;AAAA,IAC1D;AACA,IAAA,MAAMkB,OAAM,gBAAgB,CAAA;AAAA,EAC9B;AACF;AAEA,SAAS,gBAAgB,OAAA,EAAwC;AAC/D,EAAA,MAAM,MAAA,GAAiC,EAAE,KAAA,EAAO,IAAA,EAAK;AACrD,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,MAAA;AAChC,EAAA,IAAI,OAAO,QAAQ,KAAA,KAAU,QAAA,SAAiB,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAK,CAAA;AAC1E,EAAA,OAAO,IAAI,eAAA,CAAgB,MAAM,CAAA,CAAE,QAAA,EAAS;AAC9C;AAIA,eAAe,eAAA,CACb,WACA,GAAA,EACiB;AAEjB,EAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACrC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AAC3C,IAAA,IAAI,OAAO,QAAA,CAAS,KAAK,KAAK,MAAA,CAAO,KAAK,MAAM,SAAA,EAAW;AACzD,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,qBAAqB,SAAS,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,WAAA,GAAc,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACvC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,oBAAoB,WAAW,CAAA;AAChD,IAAA,IAAI,QAAA,EAAU,QAAQ,IAAA,EAAM;AAC1B,MAAA,OAAO,oBAAA,CAAqB,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAAA,IAClD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,gHAAA;AAAA,GACF;AACF;AAEA,eAAe,qBAAqB,IAAA,EAA+B;AACjE,EAAA,MAAM,QAAQ,MAAM,UAAA;AAAA,IAClB,KAAA;AAAA,IACA,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,GAClD;AACA,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,CAAM,OAAO,QAAA,EAAU;AAC1C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAC,CAAA,WAAA,CAAa,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,KAAA,CAAM,EAAA;AACf;AAIA,SAAS,eAAe,GAAA,EAAsB;AAC5C,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,MAAA,IAAA,CAAK,4CAA4C,CAAA;AACjD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,MAAA,IAAA;AAAA,QACE,CAAA,uIAAA;AAAA,OAEF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,MAAA,IAAA,CAAK,CAAA,iBAAA,CAAmB,CAAA;AACxB,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAA,CAAK,CAAA,0BAAA,EAA8B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAC1D,EAAA,OAAO,CAAA;AACT;AAUA,IAAM,UAAA,GAAa;AAAA,EACjB,IAAA,EAAM,EAAA;AAAA;AAAA,EACN,QAAA,EAAU,CAAA;AAAA;AAAA,EACV,EAAA,EAAI,CAAA;AAAA;AAAA,EACJ,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,EAAA;AAAA,EACN,OAAA,EAAS;AAAA;AACX,CAAA;AAEA,SAAS,YAAY,OAAA,EAA8B;AACjD,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,gBAAA,EAAiB;AAGjB,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,GAAA,CAAI,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EACpB;AACF;AAEA,SAAS,gBAAA,GAAyB;AAChC,EAAA,GAAA;AAAA,IACE;AAAA,MACE,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAAA,MAC7B,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA;AAAA,MAClC,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,EAAE,CAAA;AAAA,MAC3B,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAAA,MAC/B,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAAA,MAC7B;AAAA,KACF,CAAE,KAAK,IAAI;AAAA,GACb;AACA,EAAA,GAAA;AAAA,IACE;AAAA,MACE,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAAA,MAC1B,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA;AAAA,MAC9B,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AAAA,MACxB,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAAA,MAC1B,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAAA,MAC1B,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,OAAO;AAAA,KAC/B,CAAE,KAAK,IAAI;AAAA,GACb;AACF;AAEA,SAAS,UAAU,GAAA,EAA0B;AAC3C,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,GAAA,CAAI,UAAU,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,WAAW,QAAQ,CAAA;AACxD,EAAA,MAAM,KAAK,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,CAAE,QAAA,CAAS,WAAW,EAAE,CAAA;AACzD,EAAA,MAAM,IAAA,GACJ,GAAA,CAAI,SAAA,KAAc,IAAA,GAAO,SAAI,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,GAAI,OAAO,GAAA,CAAI,SAAS,CAAA,CAAE,QAAA,CAAS,WAAW,IAAI,CAAA;AACzG,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,IAAc,EAAA;AAClC,EAAA,MAAM,UAAU,OAAA,GACZ,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,CAAO,WAAW,IAAA,IAAQ,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,OAAA,CAAQ,MAAA,CAAO,IAC9E,IAAA,CAAK,MAAA,CAAO,WAAW,IAAI,CAAA;AAC/B,EAAA,MAAM,MAAM,GAAA,CAAI,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,WAAW,OAAO,CAAA;AACtD,EAAA,OAAO,CAAC,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,GAAA,CAAI,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAChE;AAEA,SAAS,gBAAgB,GAAA,EAAqB;AAK5C,EAAA,OAAO,IAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC1C;AAIA,SAASA,OAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACd,cAAY,UAAA,CAAWA,SAAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACjQA,IAAMe,iBAAAA,GAAmB,GAAA;AAEzB,eAAsB,uBACpB,OAAA,EACiB;AAEjB,EAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,MAAA,IAAa,OAAA,CAAQ,WAAW,MAAA,EAAW;AACtE,IAAA,IAAA,CAAK,8DAA8D,CAAA;AACnE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,MAAA,IAAa,OAAA,CAAQ,WAAW,MAAA,EAAW;AACtE,IAAA,IAAA,CAAK,sFAAiF,CAAA;AACtF,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,iBAAiB,OAAA,CAAQ,YAAA;AAC7B,EAAA,IAAI,cAAA,KAAmB,MAAA,IAAa,OAAA,CAAQ,MAAA,KAAW,MAAA,EAAW;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,UAAA;AAAA,QACrB,KAAA;AAAA,QACA,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,OAAA,CAAQ,MAAM,CAAC,CAAA,gBAAA;AAAA,OAC5D;AACA,MAAA,cAAA,GAAiB,QAAA,CAAS,eAAA;AAAA,IAC5B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,gBAAA,CAAiB,GAAA,EAAK,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAOC,QAAAA,CAAQ,gBAA0B,OAAO,CAAA;AAAA,EAClD;AACA,EAAA,OAAOC,QAAAA,CAAQ,gBAA0B,OAAO,CAAA;AAClD;AAIA,eAAeA,QAAAA,CAAQ,gBAAwB,OAAA,EAAkD;AAC/F,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA;AACtD,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,MAAA;AAChC,EAAA,IAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,CAAO,iBAAA,GAAoB,MAAA;AACxD,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACxD,EAAA,IAAI,QAAQ,KAAA,KAAU,MAAA,SAAkB,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAK,CAAA;AAEpE,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,UAAA;AAAA,MACf,KAAA;AAAA,MACA,CAAA,mCAAA,EAAsC,cAAc,CAAA,YAAA,EAAe,IAAI,gBAAgB,MAAM,CAAA,CAAE,UAAU,CAAA;AAAA,KAC3G;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,gBAAA,CAAiB,GAAA,EAAK,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAC5B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,UAAA,CAAW,SAAS,OAAO,CAAA;AAC3B,EAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,IAAA,CAAK,aAAa,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,CAAA;AACT;AAIA,eAAeD,QAAAA,CAAQ,gBAAwB,OAAA,EAAkD;AAC/F,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,IAAA,CAAK,+CAA+C,CAAA;AACpD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAA,CAAK,uCAAuC,IAAA,CAAK,MAAA,CAAO,cAAc,CAAC,CAAC,CAAA,0BAAA,CAA4B,CAAA;AAEpG,EAAA,IAAI,QAAA;AACJ,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA;AACtD,IAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,MAAA;AAChC,IAAA,IAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,CAAO,iBAAA,GAAoB,MAAA;AACxD,IAAA,IAAI,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,QAAA;AAAA,SAAA,IAClC,OAAA,CAAQ,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AAC7D,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,KAAA,IAAS,GAAG,CAAA;AAE1C,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,UAAA;AAAA,QACrB,KAAA;AAAA,QACA,CAAA,mCAAA,EAAsC,cAAc,CAAA,YAAA,EAAe,IAAI,gBAAgB,MAAM,CAAA,CAAE,UAAU,CAAA;AAAA,OAC3G;AAGA,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,EAAE,OAAA,EAAQ;AACzE,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,UAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AACpB,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB;AAEA,QAAA,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,UAAA;AAAA,MACrC;AAAA,IACF,SAAS,GAAA,EAAK;AAGZ,MAAA,IAAI,eAAe,QAAA,KAAa,GAAA,CAAI,WAAW,GAAA,IAAO,GAAA,CAAI,WAAW,GAAA,CAAA,EAAM;AACzE,QAAA,OAAO,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,MACpC;AACA,MAAA,GAAA,CAAI,CAAA,8BAAA,EAA6B,GAAA,CAAc,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3D;AACA,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAChB,cAAY,UAAA,CAAWA,SAAAA,EAASe,iBAAgB,CAAC,CAAA;AAAA,EACtE;AACF;AAIA,SAAS,WAAW,IAAA,EAA4B;AAC9C,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA,GAAA,CAAI,gBAAgB,CAAA;AACpB,IAAA,GAAA,CAAI,EAAE,CAAA;AACN,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,IAAA,EAAM,EAAA;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,MAAA,EAAQ,EAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AACA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,GAAA;AAAA,IACE,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,EAAA,EAAK,SAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,KAAK,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,GACvM;AACA,EAAA,GAAA;AAAA,IACE,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,OAAO,OAAO,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,EAAA,EAAK,IAAI,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,KAAK,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,GAChL;AACA,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,QAAA,CAAS,CAAC,CAAA;AAAA,EACZ;AACA,EAAA,GAAA,CAAI,EAAE,CAAA;AACN,EAAA,IAAA,CAAK,CAAA,EAAG,KAAK,MAAM,CAAA,KAAA,EAAQ,KAAK,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAC/D;AAEA,SAAS,SAAS,CAAA,EAAuB;AACvC,EAAA,MAAM,IAAA,GAAO,EAAE,UAAA,CAAW,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AACvD,EAAA,MAAM,QAAQ,CAAA,CAAE,YAAA,GAAe,KAAK,KAAK,CAAA,GAAI,IAAI,KAAK,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,EAAE,EAAA,GAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,UAAA,IAAc,OAAO,CAAA;AAC9D,EAAA,GAAA;AAAA,IACE,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,EAAE,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,kBAAA,CAAmB,OAAO,EAAE,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,WAAA,CAAY,MAAA,CAAO,EAAE,CAAC,KAAK,OAAO,CAAA;AAAA,GAC1J;AACF;AAEA,SAAS,gBAAA,CAAiB,KAAc,IAAA,EAAmC;AACzE,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,MAAA,MAAMG,IAAAA,GAAM,4CAAA;AACZ,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,MAAM,eAAA,EAAiB,OAAA,EAASA,IAAAA,EAAI,EAAG,CAAC,CAAA;AAAA,gBACjFA,IAAG,CAAA;AACb,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,MAAA,MAAMA,IAAAA,GAAM,yDAAA;AACZ,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,MAAM,WAAA,EAAa,OAAA,EAASA,IAAAA,EAAI,EAAG,CAAC,CAAA;AAAA,gBAC7EA,IAAG,CAAA;AACb,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,MAAA,MAAMA,IAAAA,GAAM,yBAAA;AACZ,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,MAAM,wBAAA,EAA0B,OAAA,EAASA,IAAAA,EAAI,EAAG,CAAC,CAAA;AAAA,gBAC1FA,IAAG,CAAA;AACb,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,CAAA,4BAAA,EAAgC,GAAA,CAAc,OAAO,CAAA,CAAA;AACjE,EAAA,IAAI,MAAM,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,gBAAgB,OAAA,EAAU,GAAA,CAAc,OAAA,EAAQ,EAAG,CAAC,CAAA;AAAA,YACnG,GAAG,CAAA;AACb,EAAA,OAAO,CAAA;AACT;;;ACpPA,IAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAE5B,OAAA,CACG,IAAA,CAAK,UAAU,CAAA,CACf,WAAA,CAAY,yEAAoE,CAAA,CAChF,OAAA,CAAQ,UAAA,EAAW,EAAG,eAAA,EAAiB,6BAA6B,CAAA,CACpE,MAAA;AAAA,EACC,iBAAA;AAAA,EACA;AACF,CAAA;AAEF,OAAA,CACG,QAAQ,OAAO,CAAA,CACf,WAAA,CAAY,mCAAmC,EAC/C,MAAA,CAAO,aAAA,EAAe,qDAAqD,CAAA,CAC3E,OAAO,eAAA,EAAiB,8DAA8D,CAAA,CACtF,MAAA,CAAO,OAAO,OAAA,KAAiD;AAC9D,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,EAA0B,CAAE,MAAA;AACnD,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa;AAAA,IAC9B,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,IACzC,QAAA,EAAU,QAAQ,MAAA,KAAW,KAAA;AAAA,IAC7B,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,GAC5D,CAAA;AACD,EAAA,OAAA,CAAQ,QAAA,GAAW,IAAA;AACrB,CAAC,CAAA;AAEH,OAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,+DAA+D,CAAA,CAC3E,OAAO,YAAY;AAClB,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,aAAA,EAAc;AACzC,CAAC,CAAA;AAEH,OAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,sEAAsE,CAAA,CAClF,MAAA,CAAO,QAAA,EAAU,yDAAyD,CAAA,CAC1E,MAAA,CAAO,OAAO,OAAA,KAAgC;AAC7C,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,cAAA,CAAe;AAAA,IACtC,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,GAC5D,CAAA;AACH,CAAC,CAAA;AAEH,IAAM,YAAY,OAAA,CACf,OAAA,CAAQ,WAAW,CAAA,CACnB,YAAY,6BAA6B,CAAA;AAE5C,SAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,6BAA6B,CAAA,CACzC,MAAA,CAAO,QAAA,EAAU,wDAAwD,CAAA,CACzE,MAAA,CAAO,OAAO,OAAA,KAAgC;AAC7C,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,oBAAA,CAAqB;AAAA,IAC5C,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,GAC5D,CAAA;AACH,CAAC,CAAA;AAEH,SAAA,CACG,OAAA,CAAQ,YAAY,CAAA,CACpB,WAAA,CAAY,oDAAoD,CAAA,CAChE,MAAA,CAAO,OAAO,IAAA,KAAiB;AAC9B,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,mBAAA,CAAoB,IAAI,CAAA;AACnD,CAAC,CAAA;AAQH,OAAA,CACG,OAAA,CAAQ,KAAK,CAAA,CACb,WAAA;AAAA,EACC;AAGF,CAAA,CACC,MAAA,CAAO,cAAA,EAAgB,qEAAqE,CAAA,CAC5F,MAAA;AAAA,EACC,wBAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,iBAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA,CAAO,iBAAA,EAAmB,gEAAA,EAAkE,cAAc,CAAA,CAC1G,MAAA,CAAO,YAAA,EAAc,iDAAiD,CAAA,CACtE,MAAA,CAAO,aAAA,EAAe,iDAAiD,CAAA,CACvE,MAAA;AAAA,EACC,OAAO,OAAA,KAOD;AACJ,IAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,UAAA,CAAW;AAAA,MAClC,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,MACxD,GAAI,QAAQ,cAAA,KAAmB,MAAA,GAAY,EAAE,cAAA,EAAgB,OAAA,CAAQ,cAAA,EAAe,GAAI,EAAC;AAAA,MACzF,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,MACjE,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI,EAAC;AAAA,MACpE,GAAI,QAAQ,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAS,GAAI;AAAC,KACxE,CAAA;AAAA,EACH;AACF,CAAA;AAEF,IAAM,YAAY,OAAA,CACf,OAAA,CAAQ,QAAQ,CAAA,CAChB,YAAY,4BAA4B,CAAA;AAE3C,SAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA;AAAA,EACC;AACF,CAAA,CACC,MAAA,CAAO,cAAA,EAAgB,oDAAoD,CAAA,CAC3E,MAAA,CAAO,eAAA,EAAiB,0DAA0D,CAAA,CAClF,MAAA,CAAO,SAAA,EAAW,4CAA4C,CAAA,CAC9D,MAAA;AAAA,EACC,UAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,UAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA,CAAO,aAAA,EAAe,0EAAqE,CAAA,CAC3F,MAAA;AAAA,EACC,OACE,SACA,OAAA,KAQG;AACH,IAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,iBAAA,CAAkB,OAAA,EAAS;AAAA,MAClD,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,MACxD,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MAC9D,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,MACjE,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,MACjE,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI;AAAC,KACzD,CAAA;AAAA,EACH;AACF,CAAA;AAEF,SAAA,CACG,OAAA,CAAQ,wBAAwB,CAAA,CAChC,WAAA,CAAY,4EAA4E,CAAA,CACxF,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,iBAAA,EAAmB,+CAA+C,CAAA,CACzE,MAAA;AAAA,EACC,OAAO,SAAiB,OAAA,KAA+C;AACrE,IAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,uBAAA,CAAwB,OAAA,EAAS;AAAA,MACxD,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,MACxD,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI;AAAC,KAClE,CAAA;AAAA,EACH;AACF,CAAA;AAEF,SAAA,CACG,QAAQ,UAAU,CAAA,CAClB,WAAA,CAAY,4FAA4F,EACxG,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,OAAO,WAAA,EAAa,sCAAsC,CAAA,CAC1D,MAAA,CAAO,OAAO,OAAA,KAAgD;AAC7D,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,qBAAA,CAAsB;AAAA,IAC7C,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,IACxD,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI;AAAC,GAClE,CAAA;AACH,CAAC,CAAA;AAEH,SAAA,CACG,QAAQ,KAAK,CAAA,CACb,WAAA,CAAY,8EAA8E,EAC1F,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,OAAO,mBAAA,EAAqB,qDAAA,EAAuD,cAAc,CAAA,CACjG,MAAA,CAAO,OAAO,OAAA,KAAmD;AAChE,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,gBAAA,CAAiB;AAAA,IACxC,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,IACxD,GAAI,QAAQ,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAW,GAAI;AAAC,GAC9E,CAAA;AACH,CAAC,CAAA;AAEH,SAAA,CACG,OAAA,CAAQ,UAAU,CAAA,CAClB,WAAA,CAAY,wEAAwE,CAAA,CACpF,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA,CAAO,OAAO,OAAA,KAA8B;AAC3C,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,qBAAA,CAAsB;AAAA,IAC7C,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI;AAAC,GACzD,CAAA;AACH,CAAC,CAAA;AAEH,SAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,uDAAuD,CAAA,CACnE,MAAA,CAAO,SAAS,wDAAwD,CAAA,CACxE,OAAO,oBAAA,EAAsB,8DAA8D,EAC3F,MAAA,CAAO,QAAA,EAAU,qDAAqD,CAAA,CACtE,MAAA,CAAO,OAAO,OAAA,KAAmE;AAChF,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,iBAAA,CAAkB;AAAA,IACzC,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,IACxD,GAAI,QAAQ,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU,GAAI,EAAC;AAAA,IAC1E,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,GAC5D,CAAA;AACH,CAAC,CAAA;AAEH,SAAA,CACG,QAAQ,MAAM,CAAA,CACd,WAAA,CAAY,gFAAgF,EAC5F,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,OAAO,QAAA,EAAU,yEAAyE,CAAA,CAC1F,MAAA,CAAO,OAAO,OAAA,KAA8C;AAC3D,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,iBAAA,CAAkB;AAAA,IACzC,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,IACxD,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,GAC5D,CAAA;AACH,CAAC,CAAA;AAEH,SAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,4FAA4F,CAAA,CACxG,MAAA,CAAO,gBAAgB,4CAA4C,CAAA,CACnE,OAAO,aAAA,EAAe,2CAAA,EAA6C,cAAc,CAAA,CACjF,MAAA,CAAO,gBAAgB,mDAAmD,CAAA,CAC1E,MAAA,CAAO,OAAO,OAAA,KAA4D;AACzE,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,qBAAA,CAAsB;AAAA,IAC7C,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,IACxD,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,IAC9D,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI;AAAC,GACzD,CAAA;AACH,CAAC,CAAA;AAEH,SAAA,CACG,QAAQ,cAAc,CAAA,CACtB,WAAA,CAAY,4GAA4G,EACxH,MAAA,CAAO,cAAA,EAAgB,uCAAuC,CAAA,CAC9D,OAAO,SAAA,EAAW,4CAA4C,EAC9D,MAAA,CAAO,UAAA,EAAY,iFAAiF,CAAA,CACpG,MAAA;AAAA,EACC,OACE,MACA,OAAA,KACG;AAEH,IAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,kBAAA,CAAmB,IAAA,EAAM;AAAA,MAChD,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,MACxD,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MAC9D,GAAI,QAAQ,GAAA,KAAQ,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAA,KAAS;AAAC,KAChD,CAAA;AAAA,EACH;AACF,CAAA;AAEF,IAAM,UAAU,OAAA,CACb,OAAA,CAAQ,MAAM,CAAA,CACd,YAAY,yEAAyE,CAAA;AAExF,OAAA,CACG,QAAQ,MAAM,CAAA,CACd,WAAA,CAAY,0CAA0C,EACtD,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,OAAO,QAAA,EAAU,wDAAwD,CAAA,CACzE,MAAA,CAAO,OAAO,OAAA,KAA8C;AAC3D,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,eAAA,CAAgB;AAAA,IACvC,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,IACxD,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,GAC5D,CAAA;AACH,CAAC,CAAA;AAEH,OAAA,CACG,OAAA,CAAQ,qBAAqB,CAAA,CAC7B,WAAA;AAAA,EACC;AACF,CAAA,CACC,MAAA,CAAO,gBAAgB,4CAA4C,CAAA,CACnE,OAAO,gBAAA,EAAkB,0DAA0D,CAAA,CACnF,MAAA,CAAO,iBAAA,EAAmB,iEAAiE,EAC3F,MAAA,CAAO,kBAAA,EAAoB,sEAAsE,CAAA,CACjG,MAAA,CAAO,mBAAA,EAAqB,6DAA6D,CAAA,CACzF,MAAA,CAAO,WAAA,EAAa,gDAAgD,CAAA,CACpE,MAAA;AAAA,EACC,OACE,cACA,OAAA,KAQG;AACH,IAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,cAAA,CAAe,YAAA,EAAc;AAAA,MACpD,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,MACxD,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MAC9D,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,MACjE,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI,EAAC;AAAA,MACpE,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI,EAAC;AAAA,MACpE,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI;AAAC,KACzD,CAAA;AAAA,EACH;AACF,CAAA;AAEF,OAAA,CACG,QAAQ,wBAAwB,CAAA,CAChC,WAAA,CAAY,4CAA4C,EACxD,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,OAAO,WAAA,EAAa,+BAA+B,EACnD,MAAA,CAAO,OAAO,cAAsB,OAAA,KAA6C;AAChF,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,iBAAA,CAAkB,YAAA,EAAc;AAAA,IACvD,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,IACxD,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI;AAAC,GACzD,CAAA;AACH,CAAC,CAAA;AAEH,OAAA,CACG,QAAQ,OAAO,CAAA,CACf,WAAA,CAAY,2HAA2H,EACvI,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,OAAO,QAAA,EAAU,qCAAqC,CAAA,CACtD,MAAA,CAAO,OAAO,OAAA,KAA8C;AAC3D,EAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,gBAAA,CAAiB;AAAA,IACxC,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,IACxD,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,GAC5D,CAAA;AACH,CAAC,CAAA;AAEH,OAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA;AAAA,EACC;AAGF,CAAA,CACC,OAAO,cAAA,EAAgB,qEAAqE,EAC5F,MAAA,CAAO,uBAAA,EAAyB,qEAAqE,CAAA,CACrG,MAAA,CAAO,iBAAiB,sFAAsF,CAAA,CAC9G,OAAO,QAAA,EAAU,4FAA4F,EAC7G,MAAA,CAAO,QAAA,EAAU,8CAA8C,CAAA,CAC/D,MAAA;AAAA,EACC,WAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,UAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,OAAO,OAAA,KAQD;AACJ,IAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,YAAA,CAAa;AAAA,MACpC,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,MACxD,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,MACjE,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI,EAAC;AAAA,MACpE,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI;AAAC,KAClE,CAAA;AAAA,EACH;AACF,CAAA;AAEF,SAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,iEAAiE,CAAA,CAC7E,MAAA,CAAO,gBAAgB,4CAA4C,CAAA,CACnE,OAAO,oBAAA,EAAsB,qCAAqC,EAClE,MAAA,CAAO,WAAA,EAAa,uDAAuD,CAAA,CAC3E,MAAA,CAAO,WAAA,EAAa,uDAAuD,CAAA,CAC3E,MAAA;AAAA,EACC,wBAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,OAAO,OAAA,KAMD;AACJ,IAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,oBAAA,CAAqB;AAAA,MAC5C,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,MACxD,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,MACjE,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA,MACxD,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,GAAI;AAAC,KACrE,CAAA;AAAA,EACH;AACF,CAAA;AAIF,SAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA;AAAA,EACC;AAGF,CAAA,CACC,MAAA;AAAA,EACC,uBAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA,CAAO,QAAA,EAAU,kDAAkD,CAAA,CACnE,MAAA;AAAA,EACC,oBAAA;AAAA,EACA;AACF,CAAA,CACC,OAAO,aAAA,EAAe,yCAAA,EAA2C,cAAc,CAAA,CAC/E,OAAO,QAAA,EAAU,gDAAgD,CAAA,CACjE,MAAA,CAAO,UAAU,8DAA8D,CAAA,CAC/E,MAAA,CAAO,cAAA,EAAgB,oDAAoD,CAAA,CAC3E,MAAA;AAAA,EACC,OAAO,OAAA,KAQD;AACJ,IAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,qBAAA,CAAsB;AAAA,MAC7C,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,MACjE,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MAC9D,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MAC9D,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,GAAI;AAAC,KACzD,CAAA;AAAA,EACH;AACF,CAAA;AAIF,SAAA,CACG,OAAA,CAAQ,YAAY,CAAA,CACpB,WAAA;AAAA,EACC;AAKF,CAAA,CACC,MAAA;AAAA,EACC,qBAAA;AAAA,EACA,iEAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA;AAAA,EACC,iBAAA;AAAA,EACA;AAEF,CAAA,CACC,MAAA;AAAA,EACC,0BAAA;AAAA,EACA;AAEF,CAAA,CACC,OAAO,QAAA,EAAU,iDAAiD,EAClE,MAAA,CAAO,qBAAA,EAAuB,uDAAuD,CAAA,CACrF,MAAA;AAAA,EACC,oBAAA;AAAA,EACA;AACF,CAAA,CACC,MAAA,CAAO,aAAA,EAAe,yCAAA,EAA2C,cAAc,CAAA,CAC/E,MAAA,CAAO,QAAA,EAAU,gDAAgD,CAAA,CACjE,MAAA,CAAO,QAAA,EAAU,8DAA8D,CAAA,CAC/E,MAAA;AAAA,EACC,OAAO,OAAA,KAUD;AACJ,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,IAAa,OAAA,CAAQ,SAAS,QAAA,IAAY,OAAA,CAAQ,SAAS,UAAA,EAAY;AAC1F,MAAA,IAAA,CAAK,CAAA,4CAAA,EAA+C,OAAA,CAAQ,IAAI,CAAA,GAAA,CAAK,CAAA;AACrE,MAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,QAAA,GAAW,MAAM,sBAAA,CAAuB;AAAA,MAC9C,GAAI,QAAQ,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAa,GAAI,EAAC;AAAA,MACnF,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,MACjE,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAA8B,GAAI,EAAC;AAAA,MACpF,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,eAAA,KAAoB,MAAA,GAAY,EAAE,eAAA,EAAiB,OAAA,CAAQ,eAAA,EAAgB,GAAI,EAAC;AAAA,MAC5F,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MAC9D,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MAC9D,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,MAC3D,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,KAC5D,CAAA;AAAA,EACH;AACF,CAAA;AAAA,CAGD,YAAY;AACX,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AAAA,EACvC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,oBAAqB,GAAA,CAAc,OAAA,IAAW,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAChE,IAAA,IAAI,OAAA,CAAQ,IAAI,cAAA,EAAgB;AAI9B,MAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,IACnB;AACA,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA,EACrB;AACF,CAAA,GAAG;AAQH,SAAS,UAAA,GAAqB;AAK5B,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACnC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,CAAA;AACT","file":"bin.js","sourcesContent":["/**\n * Local CLI configuration — persisted to\n * `$XDG_CONFIG_HOME/dashwise/auth.json` (defaults to\n * `~/.config/dashwise/auth.json` on Linux/macOS and the equivalent\n * `%APPDATA%\\dashwise\\auth.json` on Windows).\n *\n * Contents:\n * - `apiUrl` — backend root, e.g. `http://localhost:3000`\n * - `token` — raw `dwc_*` CLI token (the secret)\n * - `tokenId` — DB id of the `cli_tokens` row (so `dashwise\n * logout` can call DELETE precisely)\n * - `user` — cached profile for fast `dashwise profile`\n * (refreshed on `dashwise login` + on demand)\n * - `workspaceSlug` — default workspace selected via\n * `dashwise workspace use <slug>`\n *\n * Permissions: chmod 0600 on write — the file holds a long-lived\n * bearer credential. Best-effort on Windows (the API tolerates\n * `EPERM` on the chmod call there).\n */\n\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport { homedir, platform } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface CliConfig {\n /** Backend base URL — e.g. `http://localhost:3000`. */\n apiUrl: string;\n /** Raw CLI token (`dwc_<...>`). */\n token: string;\n /** DB id of the matching `cli_tokens` row. Used by `logout`. */\n tokenId: number;\n /** Cached user identity. */\n user: {\n id: number;\n email: string;\n username: string;\n firstName: string;\n lastName: string;\n };\n /** Optional default workspace slug. */\n workspaceSlug?: string;\n}\n\nconst FILE_NAME = 'auth.json';\nconst DIR_NAME = 'dashwise';\n\n/**\n * Resolve the config directory using XDG conventions.\n *\n * 1. `$XDG_CONFIG_HOME/dashwise/` if set\n * 2. `~/.config/dashwise/` on Linux/macOS\n * 3. `%APPDATA%\\dashwise\\` on Windows (via env)\n *\n * Mirrors `dashwise` projects on common platforms; matches what\n * users would expect from other CLIs (gh, npm, etc.).\n */\nexport function configDir(): string {\n if (process.env.XDG_CONFIG_HOME) {\n return join(process.env.XDG_CONFIG_HOME, DIR_NAME);\n }\n if (platform() === 'win32' && process.env.APPDATA) {\n return join(process.env.APPDATA, DIR_NAME);\n }\n return join(homedir(), '.config', DIR_NAME);\n}\n\nexport function configPath(): string {\n return join(configDir(), FILE_NAME);\n}\n\n/**\n * Read the saved config, or `null` if no file exists. Throws if the\n * file exists but is malformed JSON — the caller decides whether to\n * surface as \"run `dashwise login` again\" or as a hard error.\n */\nexport function readConfig(): CliConfig | null {\n const path = configPath();\n if (!existsSync(path)) return null;\n const raw = readFileSync(path, 'utf-8');\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new Error(\n `Failed to parse ${path}: ${(err as Error).message}. Run \\`dashwise login\\` to recreate it.`,\n );\n }\n if (!isPlausibleConfig(parsed)) {\n throw new Error(\n `Config at ${path} is missing required fields. Run \\`dashwise login\\` to recreate it.`,\n );\n }\n return parsed;\n}\n\n/**\n * Write the config atomically (via temp + rename) with 0600 perms.\n * Creates the parent dir if missing.\n */\nexport function writeConfig(config: CliConfig): void {\n const dir = configDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n const path = configPath();\n const tmp = `${path}.tmp.${process.pid}`;\n writeFileSync(tmp, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n try {\n chmodSync(tmp, 0o600);\n } catch {\n // Windows + some FUSE FS don't support chmod; best-effort.\n }\n // Atomic rename — readers see either the old config or the new\n // one, never a partial write.\n renameSync(tmp, path);\n}\n\n/**\n * Remove the config file (`dashwise logout`). Idempotent — no error\n * if the file already doesn't exist.\n */\nexport function deleteConfig(): void {\n const path = configPath();\n if (!existsSync(path)) return;\n rmSync(path);\n}\n\n/**\n * Resolve the API URL the CLI should talk to.\n * Priority: explicit `DASHWISE_API_URL` env → saved config → default.\n */\nexport function resolveApiUrl(): string {\n const fromEnv = process.env.DASHWISE_API_URL?.trim();\n if (fromEnv) return fromEnv.replace(/\\/+$/, '');\n const cfg = safeReadConfig();\n if (cfg?.apiUrl) return cfg.apiUrl.replace(/\\/+$/, '');\n return 'http://localhost:3000';\n}\n\n/**\n * Convenience: read the saved token if the file exists + is valid.\n * Returns `null` if the user isn't logged in.\n */\nexport function readSavedToken(): string | null {\n const cfg = safeReadConfig();\n return cfg?.token ?? null;\n}\n\nfunction safeReadConfig(): CliConfig | null {\n try {\n return readConfig();\n } catch {\n return null;\n }\n}\n\nfunction isPlausibleConfig(v: unknown): v is CliConfig {\n if (!v || typeof v !== 'object') return false;\n const c = v as Record<string, unknown>;\n if (typeof c.apiUrl !== 'string') return false;\n if (typeof c.token !== 'string') return false;\n if (typeof c.tokenId !== 'number') return false;\n if (!c.user || typeof c.user !== 'object') return false;\n const u = c.user as Record<string, unknown>;\n if (typeof u.id !== 'number') return false;\n if (typeof u.email !== 'string') return false;\n return true;\n}\n\n/**\n * Return current file mode bits (for diagnostics). Returns `null`\n * on any failure (file missing, permission denied, etc.).\n */\nexport function configFileMode(): number | null {\n try {\n const s = statSync(configPath());\n return s.mode & 0o777;\n } catch {\n return null;\n }\n}\n\n/** Confirm a saved config exists (for `whoami` short-circuit). */\nexport function isLoggedIn(): boolean {\n return readSavedToken() !== null;\n}\n\n/** Convenience helper used by tests + diagnostic commands. */\nexport function configSummary(): {\n path: string;\n exists: boolean;\n mode: number | null;\n} {\n return {\n path: configPath(),\n exists: existsSync(configPath()),\n mode: configFileMode(),\n };\n}\n\n// Helpers above intentionally exported individually — no default\n// export so tree-shake at the `bin.ts` level remains effective.\n","/**\n * Output formatting helpers — colors via picocolors (zero deps,\n * tiny). All output goes through these so the CLI has a consistent\n * voice + we can later add `--no-color` / `--json` modes by editing\n * one file.\n */\n\nimport pc from 'picocolors';\n\nexport function success(msg: string): void {\n process.stderr.write(`${pc.green('✓')} ${msg}\\n`);\n}\n\nexport function info(msg: string): void {\n process.stderr.write(`${pc.cyan('ℹ')} ${msg}\\n`);\n}\n\nexport function warn(msg: string): void {\n process.stderr.write(`${pc.yellow('⚠')} ${msg}\\n`);\n}\n\nexport function fail(msg: string): void {\n process.stderr.write(`${pc.red('✗')} ${msg}\\n`);\n}\n\n/** Plain text to stdout — for command output that should be pipe-able. */\nexport function out(msg: string): void {\n process.stdout.write(`${msg}\\n`);\n}\n\n/** Print a `key: value` pair, key bold and right-padded. */\nexport function kv(key: string, value: string, padTo = 14): void {\n const padded = key.padEnd(padTo);\n process.stdout.write(`${pc.bold(padded)} ${value}\\n`);\n}\n\n/** Highlight CLI commands or paths in inline text. */\nexport function code(s: string): string {\n return pc.cyan(s);\n}\n\n/** Dim secondary info (timestamps, helper hints). */\nexport function dim(s: string): string {\n return pc.dim(s);\n}\n\nexport { pc };\n","/**\n * `dashwise dev` — the one-command local dev loop.\n *\n * What it does:\n * 1. Verifies the developer has run `dashwise login` (i.e. the auth.json\n * config file exists). Bails with a clear pointer otherwise.\n * 2. Resolves `DASHWISE_API_URL`, `DASHWISE_API_TOKEN`,\n * `DASHWISE_INSTALLATION_ID` from (a) explicit flags, (b) existing\n * env vars, (c) the saved CLI config — and injects them into BOTH\n * child processes' env so the SDK can authenticate without the\n * developer ever touching `.env.local`.\n * 3. Spawns two children:\n * - `dashwise module dev` — manifest watcher + SDK regen loop\n * - `next dev` — Next.js dev server\n * Both stdout/stderr streams are line-prefixed with `[sdk]` and\n * `[next]` so a single terminal can show both subsystems' output\n * without confusion.\n * 4. Forwards SIGINT/SIGTERM to both children, waits for them to exit,\n * then exits itself with the worst child's exit code (so CI catches\n * a crash on either side).\n *\n * Why two child processes rather than running `module dev` in-process:\n * - Symmetric output prefixing — same code path handles both.\n * - Signal isolation — Ctrl-C is forwarded cleanly to both, neither\n * can interfere with the other's shutdown by throwing async.\n * - Failure isolation — a crash in `module dev`'s generator can't\n * take down `next dev` or vice versa; users see a clear \"[sdk]\n * exited with code 1, [next] still running\" line.\n *\n * The Next.js process gets spawned via `npx next dev` (or the project's\n * own `dev:next` script if present), which avoids hard-coding a path\n * to the user's local node_modules.\n */\n\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve as resolvePath } from 'node:path';\nimport { readConfig } from '../lib/config.js';\nimport { code, dim, fail, info, success, warn } from '../lib/output.js';\n\nexport interface DevCommandOptions {\n /** Project directory containing `module.json`. Defaults to cwd. */\n dir?: string;\n /**\n * Override the `DASHWISE_INSTALLATION_ID` env var passed to children.\n * Defaults to the literal `\"local\"` (the dev-mode contract: a stub\n * installation that resolves to the token's owning workspace).\n */\n installationId?: string;\n /**\n * Override the `DASHWISE_API_URL` env var passed to children.\n * Defaults to the saved CLI config's `apiUrl`.\n */\n apiUrl?: string;\n /**\n * Port for `next dev`. Defaults to Next's own default (3001 inside\n * a module project — Next picks the next free port if 3000 is taken\n * by the backend).\n */\n port?: number;\n /**\n * Skip the Next.js dev server — only run the manifest watcher.\n * Useful if the developer is running `next dev` separately for\n * some reason (e.g. they want a debugger attached to it).\n */\n sdkOnly?: boolean;\n /**\n * Skip the manifest watcher — only run `next dev`. Symmetric escape\n * hatch to `--sdk-only`.\n */\n nextOnly?: boolean;\n}\n\n/**\n * ANSI-styled prefix prepended to every line of a child's output.\n * Colors are kept faint so a long dev session doesn't strain the eye.\n *\n * `[sdk]` is cyan-ish, `[next]` is magenta-ish — they map cleanly to\n * the two subsystems and stay distinguishable on dark + light terminals.\n */\nconst PREFIX_SDK = `\\x1b[36m[sdk]\\x1b[0m `;\nconst PREFIX_NEXT = `\\x1b[35m[next]\\x1b[0m `;\n\nexport async function devCommand(\n options: DevCommandOptions,\n): Promise<number> {\n if (options.sdkOnly && options.nextOnly) {\n fail(\n `Cannot pass both ${code('--sdk-only')} and ${code('--next-only')} — they're mutually exclusive.`,\n );\n return 1;\n }\n\n const projectRoot = resolvePath(options.dir ?? process.cwd());\n const manifestPath = `${projectRoot}/module.json`;\n if (!existsSync(manifestPath)) {\n fail(`No ${code('module.json')} found in ${code(projectRoot)}.`);\n info(`Run ${code('dashwise module init <slug>')} to scaffold a new module first.`);\n return 1;\n }\n\n // ── 1. Auth resolution ───────────────────────────────────────────────\n // Saved config is the source of truth; --api-url / env can override\n // individual fields. Refuse to start if no auth at all — the dev\n // server would just 401 on every request.\n const savedConfig = (() => {\n try {\n return readConfig();\n } catch {\n // Corrupt config — treat as if not logged in. The login command\n // will surface the real error if re-run.\n return null;\n }\n })();\n\n const apiToken = process.env.DASHWISE_API_TOKEN ?? savedConfig?.token;\n if (!apiToken) {\n fail(`Not authenticated. Run ${code('dashwise login')} first.`);\n info(\n 'The unified dev loop reads your CLI token from ~/.config/dashwise/auth.json ' +\n 'and injects it into both child processes so the SDK can authenticate ' +\n 'without you editing .env.local.',\n );\n return 1;\n }\n const apiUrl =\n options.apiUrl ??\n process.env.DASHWISE_API_URL ??\n savedConfig?.apiUrl ??\n 'http://localhost:3000';\n const installationId =\n options.installationId ??\n process.env.DASHWISE_INSTALLATION_ID ??\n 'local';\n\n // ── 2. Build child env ───────────────────────────────────────────────\n // Inherit the parent's env so user-set vars (e.g. NEXT_TELEMETRY_DISABLED,\n // NODE_OPTIONS) flow through unchanged. Overlay the three DASHWISE_*\n // vars so the SDK can read them — these win over anything the user\n // set in .env.local because Next.js loads .env.local AFTER process.env.\n const childEnv: Record<string, string | undefined> = {\n ...process.env,\n DASHWISE_API_URL: apiUrl,\n DASHWISE_API_TOKEN: apiToken,\n DASHWISE_INSTALLATION_ID: installationId,\n };\n\n // ── 3. Pre-flight banner ─────────────────────────────────────────────\n info(`Dev loop starting — Ctrl-C to stop.`);\n info(` ${dim('api')} ${apiUrl}`);\n info(` ${dim('installation')} ${installationId}`);\n info(` ${dim('token')} ${maskedToken(apiToken)} ${dim(`(from ${apiToken === savedConfig?.token ? '~/.config/dashwise/auth.json' : '$DASHWISE_API_TOKEN'})`)}`);\n info('');\n\n // ── 4. Spawn children ────────────────────────────────────────────────\n const children: { name: string; child: ChildProcess; prefix: string }[] = [];\n\n if (!options.nextOnly) {\n const sdkChild = spawnSdkWatcher(projectRoot, childEnv);\n children.push({ name: 'sdk', child: sdkChild, prefix: PREFIX_SDK });\n }\n if (!options.sdkOnly) {\n const nextChild = spawnNextDev(projectRoot, childEnv, options.port);\n children.push({ name: 'next', child: nextChild, prefix: PREFIX_NEXT });\n }\n\n // ── 5. Wire output multiplexing ──────────────────────────────────────\n for (const { child, prefix } of children) {\n pipeWithPrefix(child.stdout, process.stdout, prefix);\n pipeWithPrefix(child.stderr, process.stderr, prefix);\n }\n\n // ── 6. Signal forwarding + exit aggregation ─────────────────────────\n let shuttingDown = false;\n const forwardSignal = (sig: NodeJS.Signals) => {\n if (shuttingDown) return;\n shuttingDown = true;\n info(`\\nReceived ${sig}, stopping children…`);\n for (const { child } of children) {\n if (child.exitCode === null && child.signalCode === null) {\n child.kill(sig);\n }\n }\n };\n process.on('SIGINT', () => forwardSignal('SIGINT'));\n process.on('SIGTERM', () => forwardSignal('SIGTERM'));\n\n // Wait for each child's exit. Aggregate exit codes — if either fails\n // non-zero (and we didn't kill it intentionally), surface the worst\n // code so CI catches a crash.\n const results = await Promise.all(\n children.map(\n ({ name, child }) =>\n new Promise<{ name: string; code: number; killed: boolean }>(\n (resolveExit) => {\n child.on('exit', (exitCode, signal) => {\n const killed = signal !== null;\n const finalCode =\n exitCode ?? (killed ? 0 : 1); // signal-only exit treated as clean\n resolveExit({ name, code: finalCode, killed });\n });\n },\n ),\n ),\n );\n\n // If ANY child exits non-zero AND wasn't killed by our signal forward,\n // kill the others so we don't leave orphans. Then aggregate.\n const crashed = results.find((r) => !r.killed && r.code !== 0);\n if (crashed && !shuttingDown) {\n warn(`[${crashed.name}] exited with code ${crashed.code} — stopping others.`);\n for (const { child } of children) {\n if (child.exitCode === null && child.signalCode === null) {\n child.kill('SIGTERM');\n }\n }\n }\n\n const exitCode = Math.max(0, ...results.map((r) => r.code));\n if (exitCode === 0) {\n success('Dev loop stopped cleanly.');\n }\n return exitCode;\n}\n\n// ── Internals ───────────────────────────────────────────────────────────\n\n/**\n * Spawn `dashwise module dev` as a child. We re-exec the same CLI binary\n * via `process.execPath` + `process.argv[1]` so we never depend on the\n * binary being on $PATH (npm-install-globally is common but not\n * universal; pnpm workspace setups can put the bin in a non-PATH\n * directory).\n *\n * The child inherits stdio for stdin (so a future interactive-prompt\n * inside `module dev` could still work), but stdout/stderr are piped so\n * we can prefix the lines.\n */\nfunction spawnSdkWatcher(\n projectRoot: string,\n env: Record<string, string | undefined>,\n): ChildProcess {\n const child = spawn(\n process.execPath,\n [process.argv[1]!, 'module', 'dev', '--dir', projectRoot],\n {\n cwd: projectRoot,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n },\n );\n return child;\n}\n\n/**\n * Spawn `next dev`. We prefer the project's `dev:next` npm script (which\n * the scaffold writes out) so the dev experience stays consistent with\n * what a user gets when running `npm run dev:next` directly. Falls back\n * to `npx next dev` if no script is defined.\n *\n * Pass `--port` explicitly if the caller asked, otherwise let Next pick\n * its default (3000 by default; Next falls forward to 3001/3002/...\n * when the port is taken — our local backend usually owns 3000).\n */\nfunction spawnNextDev(\n projectRoot: string,\n env: Record<string, string | undefined>,\n port: number | undefined,\n): ChildProcess {\n const portArgs = port !== undefined ? ['--', '--port', String(port)] : [];\n const hasDevNextScript = hasNpmScript(projectRoot, 'dev:next');\n // npm/yarn/pnpm differ on how they locate `next` — the safest cross-tool\n // path is to delegate to the project's own package manager via `npm run\n // dev:next`. If the script is missing, fall back to `npx next dev`.\n const [cmd, args] = hasDevNextScript\n ? ['npm', ['run', 'dev:next', ...portArgs]]\n : ['npx', ['next', 'dev', ...(port !== undefined ? ['--port', String(port)] : [])]];\n\n const child = spawn(cmd, args, {\n cwd: projectRoot,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n // Windows requires `shell: true` for `npm` / `npx` because they're\n // `.cmd` shims, not real binaries.\n shell: process.platform === 'win32',\n });\n return child;\n}\n\n/**\n * Read the project's `package.json` and check whether the named script\n * exists. Returns false on any error (missing package.json, malformed\n * JSON, etc.) — the caller falls back to npx in that case.\n */\nfunction hasNpmScript(projectRoot: string, scriptName: string): boolean {\n try {\n const pkgPath = `${projectRoot}/package.json`;\n if (!existsSync(pkgPath)) return false;\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n scripts?: Record<string, string>;\n };\n return typeof pkg.scripts?.[scriptName] === 'string';\n } catch {\n return false;\n }\n}\n\n/**\n * Pipe a child's readable stream into our output stream, prefixing each\n * line with the given prefix. Uses line-buffered prefixing: partial\n * lines (no trailing newline) get prefixed too so e.g. spinner output\n * still surfaces — but if a child emits a stream of \\r-overwrites for a\n * fancy progress bar, the prefix collapses correctly because we re-emit\n * the partial line as-is.\n *\n * Edge case: if the stream is null (child was spawned without piping),\n * silently no-op. Real spawn calls above always pipe both, so this is\n * defence-in-depth.\n */\nfunction pipeWithPrefix(\n src: NodeJS.ReadableStream | null,\n dst: NodeJS.WritableStream,\n prefix: string,\n): void {\n if (!src) return;\n let leftover = '';\n src.on('data', (chunk: Buffer | string) => {\n const text = typeof chunk === 'string' ? chunk : chunk.toString('utf-8');\n const combined = leftover + text;\n const lines = combined.split('\\n');\n leftover = lines.pop() ?? '';\n for (const line of lines) {\n dst.write(`${prefix}${line}\\n`);\n }\n });\n src.on('end', () => {\n if (leftover.length > 0) {\n dst.write(`${prefix}${leftover}\\n`);\n }\n });\n}\n\n/**\n * Mask a bearer token for log display. Shows the prefix (so users can\n * recognize WHICH token is being used — `dwc_*` vs JWT etc.) and a\n * 4-char tail (for distinguishing between two tokens at a glance) but\n * never the middle.\n */\nfunction maskedToken(token: string): string {\n if (token.length <= 12) return '****';\n const prefix = token.slice(0, 4);\n const tail = token.slice(-4);\n return `${prefix}…${tail}`;\n}\n","/**\n * Thin HTTP client for the DashWise backend, tailored for the CLI's\n * call patterns.\n *\n * Three shapes of authenticated request emerge in the CLI:\n * 1. **Public** — `dashwise login` device-code start/poll (no token yet)\n * 2. **CLI token (`Bearer dwc_*`)** — every command after login\n * 3. **One-off Bearer** — internal use during the login flow\n * (we don't have a saved token while polling)\n *\n * The class is intentionally small + dependency-free (uses\n * `globalThis.fetch`). Error envelopes from the backend\n * (`{ code, message, retriable, context }`) are surfaced as typed\n * `ApiError`s so command code can branch on `err.code`.\n */\n\nimport { resolveApiUrl, readSavedToken } from './config.js';\n\nexport interface ApiErrorEnvelope {\n code?: string;\n message?: string;\n retriable?: boolean;\n context?: Record<string, unknown>;\n}\n\nexport class ApiError extends Error {\n readonly status: number;\n readonly code: string;\n readonly context: Record<string, unknown> | undefined;\n readonly retriable: boolean;\n\n constructor(status: number, envelope: ApiErrorEnvelope | null, fallbackMessage: string) {\n const code = envelope?.code ?? codeFromStatus(status);\n const message = envelope?.message ?? fallbackMessage;\n super(message);\n this.name = 'ApiError';\n this.status = status;\n this.code = code;\n this.context = envelope?.context;\n this.retriable = envelope?.retriable ?? status >= 500;\n }\n}\n\nexport interface RequestOptions {\n /**\n * Auth mode:\n * - `'auto'` (default) — `Bearer <saved-token>` if one exists,\n * else no header.\n * - `'public'` — no Authorization header (used by the device-code\n * endpoints which authenticate via the device_code itself).\n * - `{ token: 'dwc_...' }` — explicit token (used during login\n * polling before we save the file).\n */\n auth?: 'auto' | 'public' | { token: string };\n\n /** Override the base URL (testing / `--api-url` flag). */\n baseUrl?: string;\n\n /** Extra request headers (rare — diagnostic plumbing). */\n headers?: Record<string, string>;\n}\n\n/**\n * Make a JSON request. Returns the parsed body (`T`) or throws an\n * `ApiError`. 204 responses return `undefined`.\n */\nexport async function apiRequest<T = unknown>(\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {},\n): Promise<T> {\n const baseUrl = (options.baseUrl ?? resolveApiUrl()).replace(/\\/+$/, '');\n const url = `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n\n const headers: Record<string, string> = {\n Accept: 'application/json',\n ...(options.headers ?? {}),\n };\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n const authMode = options.auth ?? 'auto';\n if (authMode === 'auto') {\n const saved = readSavedToken();\n if (saved) headers['Authorization'] = `Bearer ${saved}`;\n } else if (typeof authMode === 'object' && authMode.token) {\n headers['Authorization'] = `Bearer ${authMode.token}`;\n }\n\n let res: Response;\n try {\n res = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n } catch (err) {\n // Network-level failure — DNS, ECONNREFUSED, TLS, etc. Surface\n // as an ApiError with a stable code so callers can branch.\n throw new ApiError(0, { code: 'NETWORK_ERROR', message: (err as Error).message }, 'Network error');\n }\n\n if (res.status === 204) {\n return undefined as T;\n }\n\n const contentType = res.headers.get('content-type') ?? '';\n let parsed: unknown = null;\n if (contentType.includes('application/json')) {\n try {\n parsed = await res.json();\n } catch {\n parsed = null;\n }\n } else if (res.status >= 400) {\n // Non-JSON error body — still want a stable error shape.\n try {\n parsed = { message: await res.text() };\n } catch {\n parsed = null;\n }\n }\n\n if (!res.ok) {\n throw new ApiError(res.status, asEnvelope(parsed), `HTTP ${res.status}`);\n }\n return parsed as T;\n}\n\nfunction asEnvelope(v: unknown): ApiErrorEnvelope | null {\n if (!v || typeof v !== 'object') return null;\n const env = v as Record<string, unknown>;\n const out: ApiErrorEnvelope = {};\n if (typeof env.code === 'string') out.code = env.code;\n if (typeof env.message === 'string') out.message = env.message;\n if (typeof env.retriable === 'boolean') out.retriable = env.retriable;\n if (env.context && typeof env.context === 'object') {\n out.context = env.context as Record<string, unknown>;\n }\n return out;\n}\n\nfunction codeFromStatus(status: number): string {\n if (status === 401) return 'UNAUTHENTICATED';\n if (status === 403) return 'FORBIDDEN';\n if (status === 404) return 'NOT_FOUND';\n if (status === 0) return 'NETWORK_ERROR';\n if (status >= 500) return 'INTERNAL_ERROR';\n return 'HTTP_ERROR';\n}\n","/**\n * `dashwise login` — OAuth 2.0 Device Authorization Grant.\n *\n * Flow:\n * 1. POST /api/auth/cli/device-code → get `userCode` + `verificationUri`\n * 2. Display the code + URL; offer to open the browser\n * 3. Poll /api/auth/cli/poll on the published interval until the\n * user approves (or denies / it expires)\n * 4. On `approved`, save the returned token to ~/.config/dashwise/auth.json\n * 5. Fetch /api/auth/me to confirm + cache user identity\n *\n * UX: clack spinner during the poll loop; explicit prompts when\n * something needs the user's attention (e.g. opening the browser).\n * Non-interactive mode (`--no-prompt`) skips browser-open + just\n * prints the URL.\n */\n\nimport { cancel, intro, isCancel, log, outro, select, spinner } from '@clack/prompts';\nimport open from 'open';\nimport { ApiError, apiRequest } from '../lib/api-client.js';\nimport type {\n AuthMeResponse,\n CliDeviceCodeResponse,\n CliPollResponse,\n} from '../lib/backend-types.js';\nimport { resolveApiUrl, writeConfig, type CliConfig } from '../lib/config.js';\nimport { code, dim, fail, info, success } from '../lib/output.js';\n\nexport interface LoginOptions {\n /** Override the backend URL for this login (`--api-url`). */\n apiUrl?: string;\n /** Skip the \"open in browser\" prompt; just print the URL. */\n noPrompt?: boolean;\n /** Token name to suggest to the backend (shown in `me/cli-tokens`). */\n name?: string;\n}\n\nconst DEFAULT_TOKEN_NAME = 'dashwise-cli';\n\nexport async function loginCommand(options: LoginOptions): Promise<number> {\n const apiUrl = (options.apiUrl ?? resolveApiUrl()).replace(/\\/+$/, '');\n intro(`Logging into ${code(apiUrl)}`);\n\n // 1. Kick off the device-code grant.\n let dc: CliDeviceCodeResponse;\n try {\n dc = await apiRequest<CliDeviceCodeResponse>(\n 'POST',\n '/api/auth/cli/device-code',\n {\n name: options.name ?? DEFAULT_TOKEN_NAME,\n },\n { auth: 'public', baseUrl: apiUrl },\n );\n } catch (err) {\n fail(formatApiError('Could not start login flow', err));\n return 1;\n }\n\n log.message(\n [\n `Open the verification URL and confirm the code:`,\n ``,\n ` URL: ${code(dc.verificationUriComplete)}`,\n ` Code: ${code(dc.userCode)}`,\n ``,\n dim(\n `Code expires in ${formatSeconds(dc.expiresIn)}. The CLI will keep polling until you approve.`,\n ),\n ].join('\\n'),\n );\n\n // 2. Offer to open the browser (skipped in non-interactive mode).\n if (!options.noPrompt && process.stdout.isTTY) {\n const choice = await select({\n message: 'Open the verification URL in your browser?',\n options: [\n { value: 'open', label: 'Open now' },\n { value: 'skip', label: 'I’ll open it manually' },\n ],\n initialValue: 'open',\n });\n if (isCancel(choice)) {\n cancel('Login cancelled.');\n return 130; // SIGINT-equivalent exit code\n }\n if (choice === 'open') {\n try {\n await open(dc.verificationUriComplete);\n } catch (err) {\n info(`Could not open browser automatically (${(err as Error).message}). Open the URL above manually.`);\n }\n }\n }\n\n // 3. Poll until approved / denied / expired / overall deadline.\n const sp = spinner();\n sp.start('Waiting for approval');\n const overallDeadline = Date.now() + dc.expiresIn * 1000;\n let outcome: CliPollResponse | null = null;\n // Use 1s sleeps + let the backend's `slow_down` response push us\n // back if we exceed the published interval. Cheap; no need to be\n // clever with the polling cadence.\n const pollIntervalMs = Math.max(1000, dc.interval * 1000);\n\n pollLoop: while (Date.now() < overallDeadline) {\n let res: CliPollResponse;\n try {\n res = await apiRequest<CliPollResponse>(\n 'POST',\n '/api/auth/cli/poll',\n { deviceCode: dc.deviceCode },\n { auth: 'public', baseUrl: apiUrl },\n );\n } catch (err) {\n sp.stop(`Poll failed: ${(err as Error).message}`);\n fail('Poll failed mid-flight; you can re-run `dashwise login` to retry.');\n return 1;\n }\n switch (res.status) {\n case 'pending':\n case 'slow_down':\n await sleep(pollIntervalMs);\n continue pollLoop;\n case 'denied':\n sp.stop('Login denied by user.');\n cancel('Aborted.');\n return 1;\n case 'expired':\n sp.stop('Login code expired.');\n fail('The code expired before approval. Run `dashwise login` again.');\n return 1;\n case 'approved':\n outcome = res;\n break pollLoop;\n }\n }\n\n if (!outcome) {\n sp.stop('Timed out waiting for approval.');\n fail('Login took too long to be approved. Run `dashwise login` again.');\n return 1;\n }\n\n if (!outcome.token || !outcome.tokenId) {\n // Shouldn't happen on a fresh approval — but guard anyway.\n sp.stop('Approval received but token missing from response.');\n fail(\n 'Approval received but the backend did not return a token. Run `dashwise logout` then `dashwise login` to retry.',\n );\n return 1;\n }\n\n // 4. Confirm the token works + cache the profile.\n let me: AuthMeResponse;\n try {\n me = await apiRequest<AuthMeResponse>('GET', '/api/auth/me', undefined, {\n auth: { token: outcome.token },\n baseUrl: apiUrl,\n });\n } catch (err) {\n sp.stop('Approval accepted but profile fetch failed.');\n fail(formatApiError('Could not load user profile', err));\n return 1;\n }\n\n const cfg: CliConfig = {\n apiUrl,\n token: outcome.token,\n tokenId: outcome.tokenId,\n user: {\n id: me.id,\n email: me.email,\n username: me.username,\n firstName: me.first_name,\n lastName: me.last_name,\n },\n };\n writeConfig(cfg);\n sp.stop('Approved.');\n success(`Logged in as ${code(me.email)}`);\n outro('You can now run `dashwise profile`, `dashwise workspace list`, etc.');\n return 0;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction formatSeconds(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.round(seconds / 60);\n return `${minutes}m`;\n}\n\nfunction formatApiError(prefix: string, err: unknown): string {\n if (err instanceof ApiError) {\n return `${prefix}: ${err.message} (code: ${err.code}, status: ${err.status})`;\n }\n if (err instanceof Error) return `${prefix}: ${err.message}`;\n return `${prefix}: ${String(err)}`;\n}\n","/**\n * `dashwise logout` — clear the local credentials and best-effort\n * revoke the server-side token row.\n *\n * Behavior:\n * 1. Read the saved config; if there's no token, exit 0 with an\n * info message (idempotent).\n * 2. Call `DELETE /api/auth/cli-tokens/:id` to revoke the row.\n * 404 / 403 / network errors are tolerated — the local file is\n * cleared regardless. We never want a server-side hiccup to\n * keep stale credentials on disk.\n * 3. Delete the local config file.\n */\n\nimport { apiRequest } from '../lib/api-client.js';\nimport { deleteConfig, readConfig } from '../lib/config.js';\nimport { code, info, success, warn } from '../lib/output.js';\n\nexport async function logoutCommand(): Promise<number> {\n let cfg;\n try {\n cfg = readConfig();\n } catch {\n // Corrupt file — clearing it is precisely what `logout` should do.\n deleteConfig();\n success('Cleared a corrupted local credential file.');\n return 0;\n }\n if (!cfg) {\n info('Already logged out (no saved credentials).');\n return 0;\n }\n\n // Best-effort server-side revocation.\n try {\n await apiRequest(\n 'DELETE',\n `/api/auth/cli-tokens/${cfg.tokenId}`,\n undefined,\n { auth: { token: cfg.token }, baseUrl: cfg.apiUrl },\n );\n } catch (err) {\n warn(\n `Could not revoke the server-side token (${(err as Error).message}). Local credentials cleared anyway.`,\n );\n }\n\n deleteConfig();\n success(`Logged out ${code(cfg.user.email)}`);\n return 0;\n}\n","/**\n * `dashwise profile` — show the current user + (briefly) workspaces.\n *\n * Reads the saved config first so the basic identity prints\n * instantly; then makes a live `/api/auth/me` call to refresh the\n * cached profile (network errors are tolerated — we fall back to\n * the cached values and warn).\n *\n * Output is plain key/value to stdout so the command is pipeable\n * (e.g. `dashwise profile | grep email`). For machine-readable\n * output a future `--json` flag is the right call.\n */\n\nimport { ApiError, apiRequest } from '../lib/api-client.js';\nimport type { AuthMeResponse, WorkspaceListItem } from '../lib/backend-types.js';\nimport { readConfig, writeConfig } from '../lib/config.js';\nimport { code, dim, fail, info, kv, out, warn } from '../lib/output.js';\n\nexport interface ProfileOptions {\n /** Emit the profile + workspaces as a single JSON object instead of human-readable kv pairs. */\n json?: boolean;\n}\n\nexport async function profileCommand(options: ProfileOptions = {}): Promise<number> {\n const cfg = readConfig();\n if (!cfg) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'NOT_LOGGED_IN', message: 'Run `dashwise login` first.' } }));\n } else {\n fail('Not logged in. Run `dashwise login` first.');\n }\n return 1;\n }\n\n // Refresh identity. Tolerate transient network errors.\n let me: AuthMeResponse | null = null;\n let refreshError: string | null = null;\n try {\n me = await apiRequest<AuthMeResponse>('GET', '/api/auth/me');\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'TOKEN_INVALID', message: 'Saved token is no longer valid.' } }));\n } else {\n fail('Saved token is no longer valid. Run `dashwise login` again.');\n }\n return 1;\n }\n refreshError = (err as Error).message;\n if (!options.json) {\n warn(\n `Could not refresh profile from the server (${refreshError}). Showing cached values.`,\n );\n }\n }\n\n if (me) {\n // Persist any drift between cached + server values.\n const refreshed = {\n ...cfg,\n user: {\n id: me.id,\n email: me.email,\n username: me.username,\n firstName: me.first_name,\n lastName: me.last_name,\n },\n };\n writeConfig(refreshed);\n }\n const u = (me ?? toMe(cfg.user));\n\n // Workspace list — best-effort.\n let workspaces: WorkspaceListItem[] = [];\n let workspaceError: string | null = null;\n try {\n const fetched = await apiRequest<WorkspaceListItem[]>(\n 'GET',\n '/api/workspaces',\n );\n workspaces = Array.isArray(fetched) ? fetched : [];\n } catch (err) {\n workspaceError = (err as Error).message;\n }\n\n if (options.json) {\n out(\n JSON.stringify({\n ok: true,\n user: {\n id: u.id,\n username: u.username,\n email: u.email,\n first_name: u.first_name,\n last_name: u.last_name,\n },\n default_workspace: cfg.workspaceSlug ?? null,\n workspaces,\n api_url: cfg.apiUrl,\n ...(refreshError ? { profile_refresh_error: refreshError } : {}),\n ...(workspaceError ? { workspaces_error: workspaceError } : {}),\n }),\n );\n return 0;\n }\n\n out('');\n kv('User ID', `${u.id}`);\n kv('Username', u.username);\n kv('Email', u.email);\n kv('Name', `${u.first_name} ${u.last_name}`.trim() || dim('(not set)'));\n\n out('');\n if (workspaceError) {\n warn(\n `Could not list workspaces (${workspaceError}). Try \\`dashwise workspace list\\`.`,\n );\n } else if (workspaces.length === 0) {\n info('No workspaces yet.');\n } else {\n kv('Workspaces', `${workspaces.length}`);\n for (const w of workspaces) {\n const slug = w.slug ?? `id:${w.id}`;\n const role = w.role ?? w.permissions ?? '';\n const star = cfg.workspaceSlug === slug ? code(' (default)') : '';\n out(` - ${slug}${role ? dim(` [${role}]`) : ''}${star} ${dim(w.name)}`);\n }\n }\n\n out('');\n kv('API URL', cfg.apiUrl);\n return 0;\n}\n\nfunction toMe(cached: { id: number; email: string; username: string; firstName: string; lastName: string }): AuthMeResponse {\n return {\n id: cached.id,\n email: cached.email,\n username: cached.username,\n first_name: cached.firstName,\n last_name: cached.lastName,\n is_staff: false,\n is_active: true,\n date_joined: '',\n };\n}\n","/**\n * `dashwise workspace list` — list workspaces the user belongs to.\n * `dashwise workspace use <slug>` — set the default workspace (saved\n * to ~/.config/dashwise/auth.json).\n *\n * The \"default workspace\" is consumed by subsequent commands\n * (`module init`, `module publish`, etc.) so the user doesn't have\n * to pass `--workspace <slug>` every time. Persists across\n * `dashwise` invocations until `workspace use` is called again.\n */\n\nimport { ApiError, apiRequest } from '../lib/api-client.js';\nimport type { WorkspaceListItem } from '../lib/backend-types.js';\nimport { readConfig, writeConfig } from '../lib/config.js';\nimport { code, dim, fail, info, kv, out, success } from '../lib/output.js';\n\nexport interface WorkspaceListOptions {\n json?: boolean;\n}\n\nexport async function workspaceListCommand(options: WorkspaceListOptions = {}): Promise<number> {\n const cfg = readConfig();\n if (!cfg) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'NOT_LOGGED_IN', message: 'Run `dashwise login` first.' } }));\n } else {\n fail('Not logged in. Run `dashwise login` first.');\n }\n return 1;\n }\n let workspaces: WorkspaceListItem[];\n try {\n workspaces = await apiRequest<WorkspaceListItem[]>('GET', '/api/workspaces');\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'TOKEN_INVALID', message: 'Saved token is no longer valid.' } }));\n } else {\n fail('Saved token is no longer valid. Run `dashwise login` again.');\n }\n return 1;\n }\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'FETCH_FAILED', message: (err as Error).message } }));\n } else {\n fail(`Could not list workspaces: ${(err as Error).message}`);\n }\n return 1;\n }\n if (options.json) {\n out(\n JSON.stringify({\n ok: true,\n default_workspace: cfg.workspaceSlug ?? null,\n workspaces: Array.isArray(workspaces) ? workspaces : [],\n }),\n );\n return 0;\n }\n if (!Array.isArray(workspaces) || workspaces.length === 0) {\n info('No workspaces yet.');\n return 0;\n }\n out('');\n for (const w of workspaces) {\n const slug = w.slug ?? `id:${w.id}`;\n const role = w.role ?? w.permissions ?? '';\n const isDefault = cfg.workspaceSlug === slug;\n const marker = isDefault ? code(' *') : ' ';\n out(`${marker} ${slug.padEnd(28)} ${dim(w.name)}${role ? dim(` [${role}]`) : ''}`);\n }\n out('');\n if (cfg.workspaceSlug) {\n info(`Default workspace: ${code(cfg.workspaceSlug)}`);\n } else {\n info('No default workspace set. Use `dashwise workspace use <slug>` to set one.');\n }\n return 0;\n}\n\nexport async function workspaceUseCommand(slug: string): Promise<number> {\n const cfg = readConfig();\n if (!cfg) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n }\n if (typeof slug !== 'string' || slug.length === 0) {\n fail('Usage: `dashwise workspace use <slug>`');\n return 1;\n }\n // Validate the slug exists + the user has access. Avoids the\n // footgun of setting a default to a workspace the user can't\n // actually use.\n let workspaces: WorkspaceListItem[] = [];\n try {\n workspaces = await apiRequest<WorkspaceListItem[]>('GET', '/api/workspaces');\n } catch (err) {\n fail(`Could not validate the workspace (${(err as Error).message}).`);\n return 1;\n }\n const match = workspaces.find(\n (w) => w.slug === slug || `id:${w.id}` === slug || String(w.id) === slug,\n );\n if (!match) {\n fail(`Workspace ${code(slug)} not found in your accessible workspaces.`);\n out('');\n info('Run `dashwise workspace list` to see what you can choose.');\n return 1;\n }\n const matchedSlug = match.slug ?? `id:${match.id}`;\n writeConfig({ ...cfg, workspaceSlug: matchedSlug });\n success(`Default workspace set to ${code(matchedSlug)}`);\n kv('Name', match.name);\n if (match.role ?? match.permissions) {\n kv('Role', String(match.role ?? match.permissions));\n }\n return 0;\n}\n","/**\n * Inline scaffold for `dashwise module init`. Each function returns\n * the file content for a single file in the target project tree.\n *\n * Kept inline (no template-files dir) because the scaffold is small\n * + benefits from having the runtime values (slug, name) interpolated\n * in TS rather than via a separate templating engine. When the\n * scaffold grows beyond ~10 files OR starts to differ meaningfully\n * between AI-built / hand-authored / custom flavors, splitting to\n * `templates/<flavor>/` becomes worth it.\n */\n\nexport type ScaffoldKind = 'hand_authored' | 'custom';\n\nexport interface ScaffoldOptions {\n slug: string;\n name: string;\n /** Module flavor — `hand_authored` (simple isolate-runtime) or `custom` (full Next.js + machine runtime). */\n kind?: ScaffoldKind;\n /** Optional Git repository URL — populates `module.json#repository.url`. */\n repositoryUrl?: string;\n}\n\nexport function manifestJson(opts: ScaffoldOptions): string {\n const kind = opts.kind ?? 'hand_authored';\n const manifest: Record<string, unknown> = {\n schema_version: 2,\n module: {\n slug: opts.slug,\n name: opts.name,\n version: '0.0.1',\n },\n module_kind: kind,\n owns: {\n tables: [\n {\n slug: 'items',\n fields: [{ slug: 'title', type: 'text', required: true }],\n },\n ],\n },\n };\n if (kind === 'custom') {\n manifest.runtime = {\n type: 'nextjs',\n kind: 'machine',\n machine_size: 'shared-cpu-1x',\n server_actions: true,\n };\n }\n if (opts.repositoryUrl) {\n manifest.repository = { type: 'git', url: opts.repositoryUrl };\n }\n return JSON.stringify(manifest, null, 2) + '\\n';\n}\n\nexport function packageJson(opts: ScaffoldOptions): string {\n return (\n JSON.stringify(\n {\n name: opts.slug,\n version: '0.0.1',\n private: true,\n type: 'module',\n scripts: {\n dev: 'dashwise module dev',\n 'dev:next': 'next dev --port 3000',\n 'dashwise:generate': 'dashwise module generate',\n build: 'next build',\n start: 'next start',\n },\n dependencies: {\n '@dashai/sdk': '^0.2.0',\n next: '^15.0.0',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n },\n devDependencies: {\n '@types/node': '^22.0.0',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n typescript: '^5.5.0',\n },\n },\n null,\n 2,\n ) + '\\n'\n );\n}\n\nexport function tsconfigJson(): string {\n return (\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n lib: ['dom', 'dom.iterable', 'ES2022'],\n module: 'ESNext',\n moduleResolution: 'Bundler',\n jsx: 'preserve',\n strict: true,\n skipLibCheck: true,\n resolveJsonModule: true,\n esModuleInterop: true,\n isolatedModules: true,\n allowJs: false,\n noEmit: true,\n incremental: true,\n plugins: [{ name: 'next' }],\n paths: { '@/*': ['./*'] },\n },\n include: ['next-env.d.ts', '**/*.ts', '**/*.tsx', '.next/types/**/*.ts'],\n exclude: ['node_modules'],\n },\n null,\n 2,\n ) + '\\n'\n );\n}\n\nexport function nextConfig(): string {\n return `/** @type {import(\"next\").NextConfig} */\nconst nextConfig = {\n typescript: { ignoreBuildErrors: true },\n eslint: { ignoreDuringBuilds: true },\n};\nexport default nextConfig;\n`;\n}\n\nexport function nextEnvDts(): string {\n return `/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n`;\n}\n\nexport function gitignore(): string {\n return [\n '# Dependencies',\n '/node_modules',\n '',\n '# Generated by Next.js',\n '/.next',\n '/out',\n '',\n '# Production',\n '/build',\n '',\n '# Misc',\n '.DS_Store',\n '*.log',\n '',\n '# Env',\n '.env',\n '.env.local',\n '.env.*.local',\n '',\n '# Editor',\n '.vscode/',\n '.idea/',\n '',\n '# DashWise-generated SDK output is regenerable from module.json',\n '# (run `dashwise module generate`); keep it out of source control.',\n '/node_modules/@dashai/generated/',\n '',\n ].join('\\n');\n}\n\nexport function envLocalExample(): string {\n return [\n '# Copy to .env.local + fill in real values.',\n '# These vars are auto-injected by `dashwise dev` (the unified dev loop)',\n '# from ~/.config/dashwise/auth.json — you only need to edit this file if',\n '# you want to point at a non-default backend or run `next dev` standalone.',\n 'DASHWISE_API_URL=http://localhost:3000',\n 'DASHWISE_API_TOKEN=',\n 'DASHWISE_INSTALLATION_ID=local',\n '',\n ].join('\\n');\n}\n\nexport function appLayoutTsx(opts: ScaffoldOptions): string {\n return `export const metadata = {\n title: ${JSON.stringify(opts.name)},\n description: ${JSON.stringify(`DashWise module: ${opts.slug}`)},\n};\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <body style={{ margin: 0, fontFamily: 'system-ui, sans-serif' }}>{children}</body>\n </html>\n );\n}\n`;\n}\n\nexport function appPageTsx(opts: ScaffoldOptions): string {\n return `export default function Page() {\n return (\n <main style={{ minHeight: '100dvh', display: 'grid', placeItems: 'center', padding: 32 }}>\n <div style={{ maxWidth: 560, textAlign: 'center' }}>\n <h1 style={{ fontSize: 28, marginBottom: 8 }}>${escapeHtml(opts.name)}</h1>\n <p style={{ color: '#475569' }}>\n Module slug: <code>${escapeHtml(opts.slug)}</code>\n </p>\n <p style={{ marginTop: 24, color: '#64748b', fontSize: 14 }}>\n Run <code>dashwise module dev</code> to start the watch loop.\n <br />\n Edit <code>module.json</code> to add tables; regenerated types\n land in <code>@dashai/generated</code>.\n </p>\n </div>\n </main>\n );\n}\n`;\n}\n\nexport function readme(opts: ScaffoldOptions): string {\n const kind = opts.kind ?? 'hand_authored';\n if (kind === 'custom') {\n return readmeCustom(opts);\n }\n return readmeHandAuthored(opts);\n}\n\nfunction readmeHandAuthored(opts: ScaffoldOptions): string {\n return `# ${opts.name}\n\nA DashWise module (hand-authored). Slug: \\`${opts.slug}\\`.\n\n## Get started\n\n\\`\\`\\`bash\nnpm install\ndashwise dev # one command: watcher + Next.js dev together,\n # auth env vars auto-injected from your CLI config\n\\`\\`\\`\n\nIf you'd rather run the two halves in separate terminals (e.g. to attach a\ndebugger to Next), use the legacy two-terminal flow:\n\n\\`\\`\\`bash\ndashwise module generate # produces node_modules/@dashai/generated/\ndashwise module dev # watch module.json + auto-regenerate\nnpm run dev:next # plain Next.js dev server (in another terminal)\n\\`\\`\\`\n\n## Project layout\n\n| Path | What |\n| --- | --- |\n| \\`module.json\\` | Manifest. Declares tables, dependencies, runtime config. |\n| \\`app/\\` | Next.js App Router. Edit freely. |\n| \\`node_modules/@dashai/generated/\\` | Auto-generated typed wrappers. **Do not edit by hand** — regenerated by \\`dashwise module generate\\`. |\n\n## Imports\n\n\\`\\`\\`ts\nimport { db } from '@dashai/generated';\nimport type { ItemsRow } from '@dashai/generated';\n\n// runtime types + errors\nimport { createClient, type Where } from '@dashai/sdk';\n\\`\\`\\`\n`;\n}\n\nfunction readmeCustom(opts: ScaffoldOptions): string {\n return `# ${opts.name}\n\nA **custom DashWise module** — a full Next.js App Router app that\nruns in a per-installation Fly Machine (P7 substrate). Authenticated\nvia the DashWise NestJS backend through \\`@dashai/sdk/auth\\`.\n\nSlug: \\`${opts.slug}\\`.\n\n## Get started\n\n\\`\\`\\`bash\nnpm install\ndashwise dev # one command: watcher + Next.js dev together,\n # auth env vars auto-injected from your CLI config\n\\`\\`\\`\n\nIf you'd rather run the two halves in separate terminals (e.g. to attach a\ndebugger to Next), use the legacy two-terminal flow:\n\n\\`\\`\\`bash\ndashwise module generate # produces node_modules/@dashai/generated/\ndashwise module dev # watch + regen on module.json save (terminal 1)\nnpm run dev:next # next dev on :3000 (terminal 2)\n\\`\\`\\`\n\n## Architecture\n\n- **\\`module.json\\`** — manifest (\\`module_kind: 'custom'\\`, \\`runtime.kind: 'machine'\\`).\n- **\\`middleware.ts\\`** — \\`withAuth\\` from \\`@dashai/sdk/auth/middleware\\`. Redirects unauthenticated requests through the DashWise SSO flow.\n- **\\`app/layout.tsx\\`** — wraps the tree in \\`<AuthProvider>\\` from \\`@dashai/sdk/auth/client\\`.\n- **\\`app/page.tsx\\`** — public landing (allowlisted in \\`middleware.ts\\`).\n- **\\`app/dashboard/page.tsx\\`** — Server Component requiring a valid session via \\`getServerSession()\\`.\n- **\\`app/api/auth/callback/route.ts\\`** — exchanges the SSO one-time code for a session cookie (uses \\`exchangeCode()\\` from the SDK).\n- **\\`app/api/auth/sign-in/route.ts\\`** — entry point that redirects to the backend's \\`/sso/start\\` with the right \\`return_to\\` + \\`client_id\\`.\n- **\\`app/api/auth/sign-out/route.ts\\`** — clears the session cookie + tells the backend to revoke.\n\n## Imports\n\n\\`\\`\\`ts\n// Data:\nimport { db } from '@dashai/generated';\n\n// Auth (server, e.g. inside a Server Component or route handler):\nimport { getServerSession, exchangeCode, signOut } from '@dashai/sdk/auth/server';\n\n// Auth (client, inside a Client Component):\n'use client';\nimport { useSession, SignOutButton, AuthProvider } from '@dashai/sdk/auth/client';\n\n// Runtime types + errors:\nimport { type Where, RowNotFoundError } from '@dashai/sdk';\n\\`\\`\\`\n\n## Publish\n\n\\`\\`\\`bash\ndashwise module validate # local lint\ndashwise module publish --bump patch\n\\`\\`\\`\n\n## Adding UI blocks\n\nThe scaffold pre-installs two shadcn/ui primitives (\\`Button\\`, \\`Card\\`) plus the\ncanonical Tailwind 4 + theme-tokens setup. To add more components:\n\n\\`\\`\\`bash\n# shadcn/ui base (free):\nnpx shadcn@latest add input badge dialog dropdown-menu\n\n# shadcn-studio blocks (free at https://shadcnstudio.com):\nnpx shadcn@latest add @shadcn-studio/hero-section-01\n\n# shadcn-studio Pro blocks (requires \\$EMAIL + \\$LICENSE_KEY env vars):\nnpx shadcn@latest add @ss-components/dashboard-shell-01\n\\`\\`\\`\n\nIf you're using Claude Code or another IDE that supports the shadcn-studio MCP,\ntrigger \\`/cui\\` (create new UI) or \\`/rui\\` (refine existing UI) to walk through\nthe canonical block-discovery flow.\n\n## Deploying elsewhere (custom domain)\n\nThe scaffolded SSO flow is wired for DashWise's own infrastructure\n(\\`m-<id>.dashwise.net\\`). If you want to host this module on your own\ndomain (e.g. \\`mymodule.example.com\\`), there are two options:\n\n1. **Wait for custom-domain support (in design).** A future \\`--callback-origin\\`\n flag on \\`dashwise module init\\` plus a \\`module_oauth_clients\\` allowlist will\n let modules run at arbitrary domains while still using DashWise SSO. Tracked\n in [\\`modules-author-experience-v1.md\\`](https://github.com/sharmaintuize/dashwise-devops-docs/blob/main/plans/modules-author-experience-v1.md) §3.\n2. **Bypass SSO + use a Workspace API Token today.** Replace the SSO middleware\n with a token-check middleware that reads \\`Authorization: Token <key>\\` from\n each request. Tokens are created at \\`<dashwise-dashboard>/settings/tokens\\`\n and scoped to a workspace. The SDK accepts these via the standard\n \\`DASHWISE_API_TOKEN\\` env var. You'll lose the per-user session model\n (every request runs as the token's owner) but gain the freedom to deploy\n anywhere.\n\nThe CLI's \\`dashwise dev\\` command auto-injects the developer's CLI token (also\na bearer token) into local dev — so local development works regardless of\nwhich path you pick for production.\n`;\n}\n\n// ── Custom-flavor templates ──────────────────────────────────────────\n\nexport function middlewareTs(): string {\n return `// Next.js middleware — gates every route on the DashWise session cookie.\n// Public routes (and /api/auth/*) bypass the redirect; everything else\n// 302s through the SSO flow when no \\`dashwise.session\\` cookie is set.\nimport { withAuth } from '@dashai/sdk/auth/middleware';\n\nexport default withAuth({\n // \\`/sign-in-error\\` is public so unauthenticated visitors can actually\n // see the polished SSO error page — otherwise a sign-in failure would\n // redirect-loop trying to re-authenticate.\n publicPaths: ['/', '/about', '/sign-in-error'],\n loginPath: '/api/auth/sign-in',\n});\n\nexport const config = {\n matcher: ['/((?!_next/static|_next/image|favicon.ico|public/).*)'],\n};\n`;\n}\n\nexport function appLayoutCustomTsx(opts: ScaffoldOptions): string {\n return `import './globals.css';\nimport { AuthProvider } from '@dashai/sdk/auth/client';\nimport { ThemeProvider } from '@/components/theme-provider';\n\nexport const metadata = {\n title: ${JSON.stringify(opts.name)},\n description: ${JSON.stringify(`DashWise custom module: ${opts.slug}`)},\n};\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\" suppressHydrationWarning>\n <body className=\"antialiased\">\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"system\"\n enableSystem\n disableTransitionOnChange\n >\n <AuthProvider>{children}</AuthProvider>\n </ThemeProvider>\n </body>\n </html>\n );\n}\n`;\n}\n\nexport function appPageCustomTsx(opts: ScaffoldOptions): string {\n return `// Public landing page — listed in middleware.ts publicPaths.\n//\n// First-run experience for unauthenticated visitors: hero with the\n// module name + tagline, a \"Sign in with DashWise\" button that kicks\n// off the SSO flow (via /api/auth/sign-in), and a feature card\n// describing what the module does. After signing in, the user lands\n// on /dashboard (Server Component, session-validated).\n//\n// Styling: shadcn/ui primitives (\\`<Button>\\`, \\`<Card>\\`) on Tailwind 4\n// theme tokens. Add more blocks via \\`npx shadcn add @shadcn-studio/...\\`\n// (see README's \"Adding UI blocks\" section).\nimport Link from 'next/link';\nimport { LogIn, LayoutDashboard } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@/components/ui/card';\n\nexport default function Page() {\n return (\n <main className=\"flex min-h-dvh flex-col items-center justify-center gap-12 px-6 py-16\">\n <section className=\"flex max-w-2xl flex-col items-center gap-6 text-center\">\n <h1 className=\"text-balance text-4xl font-semibold tracking-tight sm:text-5xl\">\n ${escapeHtml(opts.name)}\n </h1>\n <p className=\"text-balance text-lg text-muted-foreground\">\n A DashWise module. Sign in with your DashWise account to access the\n dashboard and start using the workspace's data through the typed SDK.\n </p>\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <Button asChild size=\"lg\">\n <Link href=\"/api/auth/sign-in?return_to=/dashboard\">\n <LogIn aria-hidden=\"true\" />\n Sign in with DashWise\n </Link>\n </Button>\n <Button asChild variant=\"ghost\" size=\"lg\">\n <Link href=\"/dashboard\">\n <LayoutDashboard aria-hidden=\"true\" />\n Go to dashboard\n </Link>\n </Button>\n </div>\n </section>\n\n <Card className=\"w-full max-w-2xl\">\n <CardHeader>\n <CardTitle>What you can do here</CardTitle>\n <CardDescription>\n This is a custom DashWise module — a full Next.js app authenticated\n against the DashWise SSO. Edit \\`app/page.tsx\\` to replace this\n landing page; everything else is yours to customize.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"text-sm text-muted-foreground\">\n <ul className=\"space-y-2\">\n <li>\n Edit <code className=\"rounded bg-muted px-1.5 py-0.5\">module.json</code>\n {' '}to declare tables, dependencies, and runtime config.\n </li>\n <li>\n Run <code className=\"rounded bg-muted px-1.5 py-0.5\">dashwise dev</code>\n {' '}for a one-command local loop with auth env vars auto-injected.\n </li>\n <li>\n Import typed table clients from{' '}\n <code className=\"rounded bg-muted px-1.5 py-0.5\">@dashai/generated</code>\n {' '}— the SDK regenerates on every manifest save.\n </li>\n </ul>\n </CardContent>\n </Card>\n </main>\n );\n}\n`;\n}\n\nexport function appDashboardPageTsx(): string {\n return `import { getServerSession } from '@dashai/sdk/auth/server';\nimport { redirect } from 'next/navigation';\nimport { LogOut, ShieldCheck } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@/components/ui/card';\n\n/**\n * Auth-gated Server Component. The middleware ensures the user has\n * a session cookie before this page renders; \\`getServerSession()\\`\n * validates the cookie against the backend's \\`/api/auth/sessions/me\\`\n * endpoint, returning the decoded \\`Session\\` (or \\`null\\` if stale).\n *\n * On a successful render, this is the polished session card — replace\n * the contents with whatever your module actually needs to show.\n */\nexport default async function Dashboard() {\n const session = await getServerSession();\n if (!session) {\n redirect('/api/auth/sign-in?return_to=/dashboard');\n }\n return (\n <main className=\"mx-auto flex min-h-dvh max-w-3xl flex-col gap-6 px-6 py-12\">\n <header className=\"flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Dashboard</h1>\n <p className=\"text-sm text-muted-foreground\">\n You're signed in. This page is rendered as a Server Component and\n validates the session cookie on every request.\n </p>\n </div>\n <form action=\"/api/auth/sign-out\" method=\"POST\">\n <Button variant=\"outline\" size=\"sm\" type=\"submit\">\n <LogOut aria-hidden=\"true\" />\n Sign out\n </Button>\n </form>\n </header>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <ShieldCheck className=\"size-5 text-primary\" aria-hidden=\"true\" />\n Session\n </CardTitle>\n <CardDescription>\n Decoded from the \\`dashwise.session\\` cookie via{' '}\n <code className=\"rounded bg-muted px-1.5 py-0.5\">getServerSession()</code>.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <Row label=\"Email\" value={session.user.email} />\n <Row label=\"User ID\" value={String(session.user.id)} />\n <Row label=\"Workspace\" value={String(session.workspaceId)} />\n <Row label=\"Role\" value={session.role} />\n {session.installationId !== undefined && (\n <Row\n label=\"Installation\"\n value={\n session.moduleSlug\n ? \\`\\${session.installationId} (\\${session.moduleSlug})\\`\n : String(session.installationId)\n }\n />\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Next steps</CardTitle>\n <CardDescription>\n Replace this dashboard with your module's actual UI.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm text-muted-foreground\">\n <p>\n <strong className=\"text-foreground\">1.</strong> Edit{' '}\n <code className=\"rounded bg-muted px-1.5 py-0.5\">module.json</code>{' '}\n to add tables, dependencies, and exposed actions.\n </p>\n <p>\n <strong className=\"text-foreground\">2.</strong> Import typed clients\n from{' '}\n <code className=\"rounded bg-muted px-1.5 py-0.5\">@dashai/generated</code>{' '}\n (regenerated on every manifest save).\n </p>\n <p>\n <strong className=\"text-foreground\">3.</strong> Run{' '}\n <code className=\"rounded bg-muted px-1.5 py-0.5\">dashwise module publish --bump patch</code>{' '}\n when you're ready to ship.\n </p>\n </CardContent>\n </Card>\n </main>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-baseline justify-between gap-4 border-b border-border/50 pb-2 last:border-0 last:pb-0\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-mono text-sm\">{value}</span>\n </div>\n );\n}\n`;\n}\n\nexport function appApiAuthSignInTs(): string {\n return `// /api/auth/sign-in — kick off the SSO flow.\n//\n// Reads \\`?return_to=\\` from the caller (defaults to '/'), looks up\n// the module's installation id from env, redirects the browser to\n// the DashWise backend's \\`/api/auth/sso/start\\`. The backend mints\n// an exchange code + 302s back to \\`/api/auth/callback?code=...\\`\n// where we set the session cookie.\nimport { NextResponse } from 'next/server';\n\nexport function GET(request: Request) {\n const url = new URL(request.url);\n const returnTo = url.searchParams.get('return_to') ?? '/';\n const apiBaseUrl = process.env.DASHWISE_API_URL;\n const installationId = process.env.DASHWISE_INSTALLATION_ID;\n if (!apiBaseUrl || !installationId) {\n return new NextResponse(\n 'DASHWISE_API_URL and DASHWISE_INSTALLATION_ID must be set in .env.local',\n { status: 500 },\n );\n }\n // Absolute URL for return_to so the backend knows which host to\n // bounce back to (the callback path is fixed at /api/auth/callback\n // by SDK convention).\n const moduleOrigin = url.origin;\n const ssoStart = new URL('/api/auth/sso/start', apiBaseUrl);\n ssoStart.searchParams.set('return_to', \\`\\${moduleOrigin}\\${returnTo}\\`);\n ssoStart.searchParams.set('client_id', installationId);\n return NextResponse.redirect(ssoStart);\n}\n`;\n}\n\nexport function appApiAuthCallbackTs(): string {\n return `// /api/auth/callback — receives \\`?code=&return_to=\\` from the\n// DashWise SSO start endpoint OR \\`?error=&error_description=\\` if the\n// SSO flow failed. Two paths:\n//\n// 1. Success path: exchange \\`?code\\` for a session cookie via\n// \\`exchangeCode()\\`, then redirect to \\`return_to\\`.\n// 2. Error path: SSO returned \\`?error=\\` — redirect to the polished\n// sign-in-error page so the user sees a real error UI instead of\n// a raw 4xx page. The error code maps to known SSO error codes\n// (e.g. \\`access_denied\\`, \\`server_error\\`, \\`invalid_request\\`).\nimport { NextResponse } from 'next/server';\nimport { exchangeCode } from '@dashai/sdk/auth/server';\n\nexport async function GET(request: Request) {\n const url = new URL(request.url);\n const error = url.searchParams.get('error');\n if (error) {\n const target = new URL('/sign-in-error', url.origin);\n target.searchParams.set('code', error);\n const description = url.searchParams.get('error_description');\n if (description) target.searchParams.set('description', description);\n return NextResponse.redirect(target);\n }\n const code = url.searchParams.get('code');\n const returnTo = url.searchParams.get('return_to') ?? '/';\n if (!code) {\n const target = new URL('/sign-in-error', url.origin);\n target.searchParams.set('code', 'missing_code');\n return NextResponse.redirect(target);\n }\n try {\n await exchangeCode(code); // sets the dashwise.session cookie\n } catch (err) {\n const target = new URL('/sign-in-error', url.origin);\n target.searchParams.set('code', 'exchange_failed');\n target.searchParams.set('description', (err as Error).message);\n return NextResponse.redirect(target);\n }\n return NextResponse.redirect(new URL(returnTo, url.origin));\n}\n`;\n}\n\nexport function appApiAuthSignOutTs(): string {\n return `// /api/auth/sign-out — best-effort backend revoke + cookie clear.\nimport { NextResponse } from 'next/server';\nimport { signOut } from '@dashai/sdk/auth/server';\n\nexport async function POST() {\n await signOut();\n return new NextResponse(null, { status: 204 });\n}\n`;\n}\n\nexport function packageJsonCustom(opts: ScaffoldOptions): string {\n return (\n JSON.stringify(\n {\n name: opts.slug,\n version: '0.0.1',\n private: true,\n type: 'module',\n scripts: {\n dev: 'dashwise module dev',\n 'dev:next': 'next dev --port 3000',\n 'dashwise:generate': 'dashwise module generate',\n build: 'next build',\n start: 'next start',\n },\n dependencies: {\n '@dashai/sdk': '^0.2.0',\n next: '^15.0.0',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n // Styling system — same shadcn + Tailwind 4 stack as the\n // main DashWise frontend, so look-and-feel stays consistent\n // and module authors can add more blocks via the\n // shadcn-studio MCP (`npx shadcn add @shadcn-studio/...`).\n tailwindcss: '^4',\n '@tailwindcss/postcss': '^4',\n 'tw-animate-css': '^1.4.0',\n shadcn: '^4.0.8',\n 'radix-ui': '^1.4.3',\n 'class-variance-authority': '^0.7.1',\n clsx: '^2.1.1',\n 'tailwind-merge': '^3.5.0',\n 'lucide-react': '^0.577.0',\n 'next-themes': '^0.4.6',\n },\n devDependencies: {\n '@types/node': '^22.0.0',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n typescript: '^5.5.0',\n },\n },\n null,\n 2,\n ) + '\\n'\n );\n}\n\n// ── shadcn + Tailwind 4 stack (custom scaffold) ──────────────────────\n//\n// These templates mirror the configuration the main `dashwise-frontend`\n// uses, so visual + UX consistency is preserved across the dashboard\n// and scaffolded modules. The stack: Tailwind 4 (no config file —\n// config lives in `globals.css` via `@import \"tailwindcss\"`), shadcn\n// New York style, oklch theme tokens, lucide icons, next-themes for\n// the dark-mode toggle.\n//\n// Module authors who want more blocks add them via the shadcn-studio\n// MCP workflow: `/cui` for new blocks, `/rui` for refines (see the\n// scaffold's README for the canonical pointer).\n\n/**\n * `components.json` — shadcn config. Pins the style + base color so\n * `npx shadcn add` produces the same look as the rest of the DashWise\n * ecosystem. The two registries (`@shadcn-studio` free + `@ss-components`\n * Pro) are declared so module authors can pull blocks from either\n * without re-running init.\n */\nexport function componentsJson(): string {\n return (\n JSON.stringify(\n {\n $schema: 'https://ui.shadcn.com/schema.json',\n style: 'new-york',\n rsc: true,\n tsx: true,\n tailwind: {\n config: '',\n css: 'app/globals.css',\n baseColor: 'neutral',\n cssVariables: true,\n prefix: '',\n },\n iconLibrary: 'lucide',\n rtl: false,\n aliases: {\n components: '@/components',\n utils: '@/lib/utils',\n ui: '@/components/ui',\n lib: '@/lib',\n hooks: '@/hooks',\n },\n registries: {\n '@shadcn-studio': 'https://shadcnstudio.com/r/{name}.json',\n '@ss-components': {\n url: 'https://shadcnstudio.com/r/components/{name}.json',\n params: {\n email: '${EMAIL}',\n license_key: '${LICENSE_KEY}',\n },\n },\n },\n },\n null,\n 2,\n ) + '\\n'\n );\n}\n\n/**\n * `postcss.config.mjs` — Tailwind 4's PostCSS plugin entry. No other\n * plugins needed; the rest of the build is Next.js's defaults.\n */\nexport function postcssConfigMjs(): string {\n return `const config = {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n\nexport default config;\n`;\n}\n\n/**\n * `app/globals.css` — Tailwind 4 entry + oklch theme tokens.\n *\n * Tailwind 4 has no `tailwind.config.ts`; config lives here via the\n * `@import \"tailwindcss\"` directive + CSS custom properties. The\n * `:root` block defines the light theme; `.dark` overrides it. Tokens\n * are copied verbatim from the main dashwise-frontend so module authors\n * who later read the frontend code see the same names.\n */\nexport function globalsCss(): string {\n return `@import \"tailwindcss\";\n@import \"tw-animate-css\";\n@import \"shadcn/tailwind.css\";\n\n@custom-variant dark (&:is(.dark *));\n\n:root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.14 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.14 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.14 0 0);\n --primary: oklch(0.2 0 0);\n --primary-foreground: oklch(0.99 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.2 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.56 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.2 0 0);\n --destructive: oklch(0.58 0.24 28.48);\n --border: oklch(0.92 0 0);\n --input: oklch(0.92 0 0);\n --ring: oklch(0.71 0 0);\n --radius: 0.625rem;\n\n --font-sans:\n ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,\n \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n --font-mono:\n ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\n \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n.dark {\n --background: oklch(0.14 0 0);\n --foreground: oklch(0.99 0 0);\n --card: oklch(0.2 0 0);\n --card-foreground: oklch(0.99 0 0);\n --popover: oklch(0.2 0 0);\n --popover-foreground: oklch(0.99 0 0);\n --primary: oklch(0.92 0 0);\n --primary-foreground: oklch(0.2 0 0);\n --secondary: oklch(0.27 0 0);\n --secondary-foreground: oklch(0.99 0 0);\n --muted: oklch(0.27 0 0);\n --muted-foreground: oklch(0.71 0 0);\n --accent: oklch(0.27 0 0);\n --accent-foreground: oklch(0.99 0 0);\n --destructive: oklch(0.7 0.19 22.23);\n --border: oklch(0.27 0 0);\n --input: oklch(0.27 0 0);\n --ring: oklch(0.56 0 0);\n}\n\n* {\n border-color: var(--border);\n}\n\nbody {\n background-color: var(--background);\n color: var(--foreground);\n font-family: var(--font-sans);\n}\n`;\n}\n\n/**\n * `lib/utils.ts` — the canonical \\`cn()\\` helper that shadcn components\n * import. Combines \\`clsx\\` (conditional class composition) with\n * \\`tailwind-merge\\` (resolves conflicting Tailwind utilities, e.g.\n * \\`px-2 px-4\\` → \\`px-4\\`).\n */\nexport function libUtilsTs(): string {\n return `import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n`;\n}\n\n/**\n * \\`components/ui/button.tsx\\` — vendored from the dashwise-frontend's\n * canonical button (which itself came from shadcn New York). Vendored\n * (vs running \\`npx shadcn add\\` in a post-install) so the scaffold\n * doesn't need network access at install time.\n */\nexport function componentsUiButtonTsx(): string {\n return `import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot.Root : \"button\";\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n`;\n}\n\n/**\n * \\`components/ui/card.tsx\\` — vendored from the dashwise-frontend. Same\n * rationale as button.tsx.\n */\nexport function componentsUiCardTsx(): string {\n return `import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6\", className)}\n {...props}\n />\n );\n}\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\n`;\n}\n\n/**\n * \\`components/theme-provider.tsx\\` — thin re-export of the next-themes\n * provider, marked \\`\"use client\"\\`. Layout wraps in this so the\n * \\`.dark\\` class can be applied to \\`<html>\\` based on system preference\n * or explicit user toggle.\n */\nexport function componentsThemeProviderTsx(): string {\n return `\"use client\";\n\nimport { ThemeProvider as NextThemesProvider } from \"next-themes\";\n\nexport function ThemeProvider({\n children,\n ...props\n}: React.ComponentProps<typeof NextThemesProvider>) {\n return <NextThemesProvider {...props}>{children}</NextThemesProvider>;\n}\n`;\n}\n\n/**\n * \\`app/sign-in-error/page.tsx\\` — the SSO error landing.\n *\n * Reached via redirect from /api/auth/callback when the SSO flow\n * returns \\`?error=\\` or when code exchange fails. Renders a polished\n * error UI with the SSO error code (plain-English when known) + a\n * \"Try again\" button that retries the sign-in flow.\n *\n * Listed in middleware.ts publicPaths so unauthenticated visitors can\n * actually reach the error page (otherwise the redirect would loop).\n */\nexport function appSignInErrorPageTsx(): string {\n return `import Link from 'next/link';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@/components/ui/card';\n\nconst ERROR_MESSAGES: Record<string, string> = {\n access_denied:\n \"You declined the sign-in request. To use this module, you'll need to authorize it on the DashWise sign-in page.\",\n server_error:\n 'The DashWise sign-in server returned an internal error. This is usually transient — try again in a moment.',\n invalid_request:\n 'The sign-in request was malformed. This is almost always a configuration bug — check that DASHWISE_API_URL and DASHWISE_INSTALLATION_ID are set correctly.',\n missing_code:\n 'The callback URL was missing the expected exchange code. This usually means the SSO flow was interrupted.',\n exchange_failed:\n \"The exchange code couldn't be redeemed for a session. The code may have expired (they're single-use and short-lived) — try signing in again.\",\n};\n\ninterface SignInErrorPageProps {\n searchParams: Promise<{ code?: string; description?: string }>;\n}\n\nexport default async function SignInErrorPage({ searchParams }: SignInErrorPageProps) {\n const params = await searchParams;\n const errorCode = params.code ?? 'unknown';\n const friendlyMessage = ERROR_MESSAGES[errorCode];\n return (\n <main className=\"flex min-h-dvh items-center justify-center px-6 py-12\">\n <Card className=\"w-full max-w-lg\">\n <CardHeader>\n <div className=\"flex items-start gap-3\">\n <div className=\"rounded-full bg-destructive/10 p-2\">\n <AlertTriangle className=\"size-5 text-destructive\" aria-hidden=\"true\" />\n </div>\n <div className=\"flex-1\">\n <CardTitle>Sign-in failed</CardTitle>\n <CardDescription>\n The DashWise SSO flow couldn't complete.\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-1\">\n <div className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n Error code\n </div>\n <code className=\"block rounded bg-muted px-2 py-1 text-sm\">\n {errorCode}\n </code>\n </div>\n {friendlyMessage && (\n <p className=\"text-sm text-muted-foreground\">{friendlyMessage}</p>\n )}\n {params.description && (\n <div className=\"space-y-1\">\n <div className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n Detail\n </div>\n <p className=\"text-sm text-muted-foreground\">{params.description}</p>\n </div>\n )}\n <div className=\"flex flex-wrap gap-2 pt-2\">\n <Button asChild>\n <Link href=\"/api/auth/sign-in?return_to=/dashboard\">\n <RefreshCw aria-hidden=\"true\" />\n Try again\n </Link>\n </Button>\n <Button asChild variant=\"ghost\">\n <Link href=\"/\">Back to landing</Link>\n </Button>\n </div>\n </CardContent>\n </Card>\n </main>\n );\n}\n`;\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/** Slug validation matching the manifest schema's regex. */\nexport function isValidSlug(slug: string): boolean {\n return /^[a-z][a-z0-9_-]*$/.test(slug);\n}\n","/**\n * `dashwise module clone <slug>` — bring a published module's\n * source into a local directory.\n *\n * Two flavors based on what's available on the backend:\n *\n * 1. **Git mode** — when the module's published manifest carries\n * `repository.url`, we shell out to `git clone` to fetch the\n * source. This is the recommended path: full file history,\n * branch awareness, future `git pull` for updates.\n *\n * 2. **Manifest-only mode** — when no `repository.url` is set,\n * we write the published manifest into a fresh directory plus\n * a minimal scaffold (.gitignore, package.json, README) so the\n * user has a workable starting point. They can then layer\n * their own app code on top + run `dashwise module dev`.\n *\n * Refuses to write into a non-empty directory unless `--force` is\n * passed.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readdirSync, writeFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport { gitignore, packageJson, packageJsonCustom } from '../../lib/scaffold.js';\nimport { code, dim, fail, info, out, success, warn } from '../../lib/output.js';\n\ninterface SourceMetadataResponse {\n module_slug: string;\n module_name: string;\n current_version: string | null;\n repository_url: string | null;\n manifest: Record<string, unknown> | null;\n}\n\nexport interface CloneOptions {\n /** Target directory (default: `./<slug>`). */\n dir?: string;\n /** Overwrite an existing non-empty directory. */\n force?: boolean;\n /** Skip git clone even when repository.url is set (use manifest mode). */\n noGit?: boolean;\n}\n\nexport async function moduleCloneCommand(\n slug: string,\n options: CloneOptions,\n): Promise<number> {\n if (!slug) {\n fail('Usage: `dashwise module clone <slug>`');\n return 1;\n }\n\n let meta: SourceMetadataResponse;\n try {\n meta = await apiRequest<SourceMetadataResponse>(\n 'GET',\n `/api/modules/${encodeURIComponent(slug)}/source-tarball`,\n );\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n fail(`Module ${code(slug)} not found.`);\n return 1;\n }\n if (err instanceof ApiError && err.status === 401) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n }\n if (err instanceof ApiError && err.status === 403) {\n fail(`No access to module ${code(slug)}. You must be a member of its owner workspace.`);\n return 1;\n }\n fail(`Could not fetch module metadata: ${(err as Error).message}`);\n return 1;\n }\n\n const target = resolve(options.dir ?? slug);\n\n // Refuse to overwrite an existing non-empty directory unless --force.\n if (existsSync(target)) {\n const entries = readdirSync(target);\n if (entries.length > 0 && !options.force) {\n fail(\n `Directory ${code(target)} is not empty. Pass ${code('--force')} to clone anyway.`,\n );\n return 1;\n }\n }\n\n // Decide between git mode + manifest-only fallback.\n const wantGit = !options.noGit && meta.repository_url !== null;\n if (wantGit) {\n return cloneViaGit(meta, target);\n }\n\n if (meta.repository_url !== null && options.noGit) {\n info(`--no-git: skipping git clone for ${code(meta.repository_url)}; writing manifest-only scaffold.`);\n } else {\n info(`Module ${code(slug)} has no ${code('repository.url')}; writing manifest-only scaffold.`);\n }\n return cloneViaManifest(slug, meta, target);\n}\n\n/**\n * Shell out to `git clone <url> <target>`. Inherits stdio so the\n * user sees git's progress + error messages directly. Returns 0 on\n * success, propagating git's exit code on failure.\n */\nfunction cloneViaGit(meta: SourceMetadataResponse, target: string): number {\n const repoUrl = meta.repository_url!;\n info(`Cloning ${code(repoUrl)} into ${code(target)}...`);\n const result = spawnSync('git', ['clone', repoUrl, target], {\n stdio: 'inherit',\n });\n if (result.error) {\n fail(`Failed to invoke git: ${result.error.message}`);\n return 1;\n }\n if (result.status !== 0) {\n fail(`git clone exited with status ${result.status}.`);\n return result.status ?? 1;\n }\n success(`Cloned ${code(meta.module_slug)} from ${code(repoUrl)}.`);\n if (meta.current_version) {\n info(`Current published version: ${code(`v${meta.current_version}`)}`);\n }\n return 0;\n}\n\n/**\n * Fallback when no Git URL is available: lay down `module.json` +\n * `.gitignore` + `package.json` + `README.md` so the user has a\n * starting point. The user has to recreate `app/` themselves —\n * we don't have access to the original source (no Git URL).\n */\nfunction cloneViaManifest(\n slug: string,\n meta: SourceMetadataResponse,\n target: string,\n): number {\n if (!meta.manifest) {\n fail(\n `Module ${code(slug)} has no published manifest yet (publish at least one version first).`,\n );\n return 1;\n }\n\n mkdirSync(target, { recursive: true });\n\n // Inspect the manifest to pick the right scaffold flavor.\n const manifestObj = meta.manifest as Record<string, unknown>;\n const moduleKind = manifestObj.module_kind === 'custom' ? 'custom' : 'hand_authored';\n const pkgFn = moduleKind === 'custom' ? packageJsonCustom : packageJson;\n\n writeFileSync(\n join(target, 'module.json'),\n JSON.stringify(manifestObj, null, 2) + '\\n',\n 'utf-8',\n );\n writeFileSync(\n join(target, 'package.json'),\n pkgFn({ slug: meta.module_slug, name: meta.module_name, kind: moduleKind }),\n 'utf-8',\n );\n writeFileSync(join(target, '.gitignore'), gitignore(), 'utf-8');\n writeFileSync(\n join(target, 'README.md'),\n readmeForClone(meta, moduleKind),\n 'utf-8',\n );\n\n success(`Wrote ${moduleKind} scaffold for ${code(meta.module_slug)} into ${code(target)}`);\n info(`Next steps:`);\n out('');\n out(` ${dim('1.')} ${code(`cd ${target}`)}`);\n out(` ${dim('2.')} ${code('npm install')}`);\n out(` ${dim('3.')} ${code('dashwise module generate')}`);\n out(` ${dim('4.')} Recreate your ${code('app/')} (manifest-only clone — no source code available).`);\n out('');\n if (meta.repository_url) {\n warn(\n `Module's manifest declared ${code(meta.repository_url)} as its repo; consider running ${code(`dashwise module clone ${slug}`)} without ${code('--no-git')} to get the full source.`,\n );\n } else {\n info(\n `If you have access to the original source, ` +\n `consider running ${code(`dashwise module connect-git <repo-url>`)} ` +\n `so future clones use it.`,\n );\n }\n return 0;\n}\n\nfunction readmeForClone(\n meta: SourceMetadataResponse,\n kind: 'hand_authored' | 'custom',\n): string {\n return `# ${meta.module_name}\n\nManifest-only clone of \\`${meta.module_slug}\\` (${kind}) at version \\`${meta.current_version ?? 'unpublished'}\\`.\n\nThe original source code wasn't available — this directory contains\nonly the published \\`module.json\\` + a starter scaffold. Recreate\n\\`app/\\` based on the manifest.\n\n## Get started\n\n\\`\\`\\`bash\nnpm install\ndashwise module generate\ndashwise module dev\n\\`\\`\\`\n`;\n}\n","/**\n * `dashwise module connect-git <repo-url>` — write the Git repository\n * URL into the local `module.json#repository.url`.\n *\n * v1 scope: local manifest mutation only. The backend reads\n * `repository` from the manifest on the next `module publish` and\n * captures the URL + the actual `commit` + `branch` from the local\n * git working tree at publish time (P5b for the commit-capture\n * follow-up). For now, this command just sets the URL so the\n * marketplace + `module clone` know where to look.\n *\n * The URL is light-validated: must be a real URL, https:// or git@\n * shorthand also accepted. Branch can be passed via `--branch\n * <name>` to default to a non-`main` branch (rare, but common\n * for monorepos).\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { code, fail, info, success } from '../../lib/output.js';\n\nexport interface ConnectGitOptions {\n dir?: string;\n branch?: string;\n}\n\nexport async function moduleConnectGitCommand(\n repoUrl: string,\n options: ConnectGitOptions,\n): Promise<number> {\n if (!repoUrl || typeof repoUrl !== 'string') {\n fail('Usage: `dashwise module connect-git <repo-url>`');\n return 1;\n }\n if (!isPlausibleRepoUrl(repoUrl)) {\n fail(`Repo URL ${code(repoUrl)} doesn't look like https:// or git@host:owner/repo.`);\n return 1;\n }\n\n const projectRoot = resolve(options.dir ?? process.cwd());\n const manifestPath = join(projectRoot, 'module.json');\n if (!existsSync(manifestPath)) {\n fail(\n `No ${code('module.json')} found in ${code(projectRoot)}. Run \\`dashwise module init\\` first.`,\n );\n return 1;\n }\n let manifest: Record<string, unknown>;\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } catch (err) {\n fail(`Could not parse ${code(manifestPath)}: ${(err as Error).message}`);\n return 1;\n }\n\n const existing = (manifest.repository as Record<string, unknown> | undefined) ?? {};\n const next: Record<string, unknown> = {\n ...existing,\n type: 'git',\n url: repoUrl,\n };\n if (options.branch) {\n next.branch = options.branch;\n } else if (typeof existing.branch === 'string') {\n // Preserve any branch already set.\n next.branch = existing.branch;\n }\n manifest.repository = next;\n\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\\n', 'utf-8');\n success(`Connected to ${code(repoUrl)}`);\n if (next.branch) info(`Branch: ${code(String(next.branch))}`);\n info(`Updated ${code('module.json')}.`);\n return 0;\n}\n\n/**\n * Accept three URL shapes commonly used for Git remotes:\n * - https://github.com/org/repo\n * - https://github.com/org/repo.git\n * - git@github.com:org/repo.git\n *\n * Rejects obvious garbage; the backend (or git itself, at clone\n * time) does the real validation.\n */\nfunction isPlausibleRepoUrl(url: string): boolean {\n if (url.startsWith('https://') || url.startsWith('http://')) {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n }\n // git@host:owner/repo[.git] shorthand\n return /^git@[^:]+:[^/]+\\/.+/.test(url);\n}\n","/**\n * `dashwise module generate` — regenerate the typed wrappers from the\n * local `module.json`.\n *\n * Flow:\n * 1. Read + parse `<cwd>/module.json`.\n * 2. POST it to `/api/modules/draft/generate-sdk`.\n * 3. Write each returned file to `node_modules/@dashai/generated/<path>`.\n * 4. Print summary (file count + content hash).\n *\n * Idempotent: re-running produces bit-identical output for an\n * unchanged manifest (per the generator's content-hash guarantee).\n * Returning a fresh generation counter on each call is reserved for\n * `module dev` — the one-shot CLI path uses generation=0.\n *\n * Requires the user to be logged in (uses the saved CLI token).\n */\n\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport { code, dim, fail, info, success } from '../../lib/output.js';\n\nexport interface GenerateOptions {\n /** Project root containing `module.json` (defaults to `process.cwd()`). */\n dir?: string;\n /** Monotonic counter passed to the generator (default 0). */\n generation?: number;\n /** Skip writing to node_modules — print summary only. */\n dryRun?: boolean;\n}\n\ninterface GenerateResponse {\n files: Record<string, string>;\n contentHash: string;\n}\n\n/** Resolved output directory: `<project>/node_modules/@dashai/generated/`. */\nfunction outputDir(projectRoot: string): string {\n return join(projectRoot, 'node_modules', '@dashai', 'generated');\n}\n\nexport async function moduleGenerateCommand(\n options: GenerateOptions,\n): Promise<number> {\n const projectRoot = resolve(options.dir ?? process.cwd());\n const manifestPath = join(projectRoot, 'module.json');\n if (!existsSync(manifestPath)) {\n fail(\n `No ${code('module.json')} found in ${code(projectRoot)}. Run \\`dashwise module init <slug>\\` first.`,\n );\n return 1;\n }\n let manifest: unknown;\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } catch (err) {\n fail(`Could not parse ${code(manifestPath)}: ${(err as Error).message}`);\n return 1;\n }\n\n let res: GenerateResponse;\n try {\n res = await apiRequest<GenerateResponse>(\n 'POST',\n '/api/modules/draft/generate-sdk',\n {\n manifest,\n generation: options.generation ?? 0,\n },\n );\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n }\n if (err instanceof ApiError && err.status === 400) {\n fail(`Manifest validation failed: ${err.message}`);\n if (err.context) {\n process.stderr.write(JSON.stringify(err.context, null, 2) + '\\n');\n }\n return 1;\n }\n fail(`Could not generate SDK: ${(err as Error).message}`);\n return 1;\n }\n\n if (options.dryRun) {\n info(`Dry run: ${Object.keys(res.files).length} files`);\n info(`Hash: ${code(res.contentHash)}`);\n return 0;\n }\n\n const out = outputDir(projectRoot);\n // Wipe any prior generated content so a renamed/removed table\n // doesn't leave a stale wrapper file behind. The directory itself\n // is gitignored, so a wipe-then-rewrite is safe.\n if (existsSync(out)) {\n rmSync(out, { recursive: true, force: true });\n }\n mkdirSync(out, { recursive: true });\n for (const [relPath, content] of Object.entries(res.files)) {\n const absPath = join(out, relPath);\n const parent = dirname(absPath);\n if (!existsSync(parent)) {\n mkdirSync(parent, { recursive: true });\n }\n writeFileSync(absPath, content, 'utf-8');\n }\n\n success(\n `Generated ${Object.keys(res.files).length} files into ${code('node_modules/@dashai/generated/')}`,\n );\n info(`Hash: ${dim(res.contentHash)}`);\n return 0;\n}\n","/**\n * `dashwise module dev` — watch `module.json` + auto-regenerate the\n * SDK on every change.\n *\n * Behavior:\n * 1. Read `module.json`; run an initial `module generate` so the\n * caller starts in a coherent state.\n * 2. Watch the manifest file for changes (`fs.watch`).\n * 3. On each change event, debounce 250ms (editor saves often\n * fire two events in quick succession), then regenerate.\n * 4. Bumps the `generation` counter per regen so the emitted\n * `package.json#version` shifts (`0.0.1-gen.N`), invalidating\n * any naïve caches keyed off it.\n * 5. Runs until Ctrl-C (clean exit on SIGINT/SIGTERM).\n *\n * Does NOT spawn `next dev` itself — the user runs that in another\n * terminal. Justification: `next dev`'s own output is dense + we\n * don't want to swallow/buffer it. If users want both, an\n * orchestrator like `npm-run-all` works (`npm run dev:next` and\n * `dashwise module dev` in parallel).\n */\n\nimport { existsSync, watch as fsWatch } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { moduleGenerateCommand } from './generate.js';\nimport { code, dim, fail, info, success, warn } from '../../lib/output.js';\n\nexport interface DevOptions {\n dir?: string;\n /** Debounce window in ms for filesystem change coalescing. */\n debounceMs?: number;\n}\n\nconst DEFAULT_DEBOUNCE_MS = 250;\n\nexport async function moduleDevCommand(options: DevOptions): Promise<number> {\n const projectRoot = resolve(options.dir ?? process.cwd());\n const manifestPath = join(projectRoot, 'module.json');\n if (!existsSync(manifestPath)) {\n fail(`No ${code('module.json')} found in ${code(projectRoot)}.`);\n info('Run `dashwise module init <slug>` to scaffold a new module.');\n return 1;\n }\n\n info(`Watching ${code(manifestPath)} — Ctrl-C to stop.`);\n\n // 1. Initial regen.\n let generation = 0;\n const initial = await moduleGenerateCommand({\n ...(options.dir !== undefined ? { dir: options.dir } : {}),\n generation,\n });\n if (initial !== 0) {\n warn('Initial regen failed; watcher will retry on the next change.');\n }\n generation += 1;\n\n // 2. Watch loop with debounce. We deliberately use `fs.watch` (vs\n // chokidar) to keep deps small — chokidar weighs ~1MB packed, fs.watch\n // is built-in. Editor saves on macOS sometimes fire 2 events\n // back-to-back; the debounce coalesces them into one regen call.\n const debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n let timer: NodeJS.Timeout | null = null;\n let isRunning = false;\n let pendingRegen = false;\n\n async function doRegen() {\n if (isRunning) {\n // Another regen is in flight — flag for re-run when it finishes.\n pendingRegen = true;\n return;\n }\n isRunning = true;\n try {\n const start = Date.now();\n const exit = await moduleGenerateCommand({\n ...(options.dir !== undefined ? { dir: options.dir } : {}),\n generation,\n });\n const elapsedMs = Date.now() - start;\n if (exit === 0) {\n success(`Regen complete (${elapsedMs}ms, gen=${generation})`);\n } else {\n warn(`Regen failed (exit ${exit}, gen=${generation}) — will retry on next change.`);\n }\n generation += 1;\n } finally {\n isRunning = false;\n if (pendingRegen) {\n pendingRegen = false;\n // Schedule a follow-up — keeps the loop responsive when\n // the user saves rapidly.\n setImmediate(doRegen);\n }\n }\n }\n\n const watcher = fsWatch(manifestPath, (eventType) => {\n if (eventType !== 'change') return;\n if (timer !== null) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n void doRegen();\n }, debounceMs);\n });\n\n // Clean shutdown.\n return new Promise<number>((resolveExit) => {\n const stop = (signal: NodeJS.Signals | 'shutdown') => {\n if (timer !== null) clearTimeout(timer);\n watcher.close();\n info(`Stopping watcher${signal === 'shutdown' ? '' : ` (${signal})`}.`);\n // Use process.stdout flush hint to ensure the message lands\n // before exit.\n process.stdout.write(dim('Goodbye.\\n'));\n resolveExit(0);\n };\n process.once('SIGINT', () => stop('SIGINT'));\n process.once('SIGTERM', () => stop('SIGTERM'));\n });\n}\n","/**\n * `dashwise module diff` — preview what will change at the next\n * publish vs the currently-published version.\n *\n * Flow:\n * 1. Read local `module.json` for the slug.\n * 2. Resolve `slug → module.id` via `/api/modules/by-slug/:slug`.\n * 3. POST the local manifest to `/api/modules/:id/draft/diff`.\n * 4. Render the structured diff as a readable summary:\n * - \"unchanged\" short-circuit\n * - tables added/removed/changed\n * - dependencies added/removed\n * - top-level meta changes (version, name, module_kind, ...)\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport { code, dim, fail, info, out, success } from '../../lib/output.js';\n\ninterface FieldChange {\n field: string;\n changes: Record<string, unknown>;\n}\n\ninterface TableChange {\n table: string;\n fields_added: Array<{ slug: string; type: string }>;\n fields_removed: Array<{ slug: string; type: string }>;\n fields_changed: FieldChange[];\n}\n\ninterface DiffResponse {\n current_version: string | null;\n unchanged: boolean;\n meta_changes: Array<{ field: string; before: unknown; after: unknown }>;\n tables_added: string[];\n tables_removed: string[];\n tables_changed: TableChange[];\n deps_added: Array<{ module: string; version: string }>;\n deps_removed: Array<{ module: string; version: string }>;\n}\n\nexport interface DiffOptions {\n dir?: string;\n /** Emit the structured diff as JSON instead of the human-readable summary. */\n json?: boolean;\n}\n\nexport async function moduleDiffCommand(\n options: DiffOptions,\n): Promise<number> {\n const projectRoot = resolve(options.dir ?? process.cwd());\n const manifestPath = join(projectRoot, 'module.json');\n if (!existsSync(manifestPath)) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'NO_MANIFEST', message: `No module.json found in ${projectRoot}.` } }));\n } else {\n fail(\n `No ${code('module.json')} found in ${code(projectRoot)}. Run \\`dashwise module init <slug>\\` first.`,\n );\n }\n return 1;\n }\n let manifest: { module?: { slug?: string } };\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } catch (err) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'MANIFEST_PARSE_FAILED', message: (err as Error).message } }));\n } else {\n fail(`Could not parse ${code(manifestPath)}: ${(err as Error).message}`);\n }\n return 1;\n }\n const slug = manifest.module?.slug;\n if (!slug) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'MANIFEST_MISSING_SLUG', message: 'module.json is missing module.slug.' } }));\n } else {\n fail(`${code('module.json')} is missing ${code('module.slug')}.`);\n }\n return 1;\n }\n\n // Resolve slug → moduleId.\n let mod: { id: number; current_version: string | null };\n try {\n mod = await apiRequest<{ id: number; current_version: string | null }>(\n 'GET',\n `/api/modules/by-slug/${encodeURIComponent(slug)}`,\n );\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'MODULE_NOT_FOUND', message: `Module ${slug} not found on the backend.` } }));\n } else {\n fail(\n `Module ${code(slug)} not found on the backend. Create + publish it first; `\n + `diff has nothing to compare against until then.`,\n );\n }\n return 1;\n }\n if (err instanceof ApiError && err.status === 401) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'NOT_LOGGED_IN', message: 'Run `dashwise login` first.' } }));\n } else {\n fail('Not logged in. Run `dashwise login` first.');\n }\n return 1;\n }\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'RESOLVE_FAILED', message: (err as Error).message } }));\n } else {\n fail(`Could not resolve module: ${(err as Error).message}`);\n }\n return 1;\n }\n\n let diff: DiffResponse;\n try {\n diff = await apiRequest<DiffResponse>(\n 'POST',\n `/api/modules/${mod.id}/draft/diff`,\n { manifest },\n );\n } catch (err) {\n if (err instanceof ApiError && err.status === 400) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'VALIDATION_FAILED', message: err.message, context: err.context ?? null } }));\n } else {\n fail(`Manifest validation failed: ${err.message}`);\n if (err.context) {\n out(JSON.stringify(err.context, null, 2));\n }\n }\n return 1;\n }\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'FETCH_FAILED', message: (err as Error).message } }));\n } else {\n fail(`Could not compute diff: ${(err as Error).message}`);\n }\n return 1;\n }\n\n if (options.json) {\n out(JSON.stringify({ ok: true, ...diff }));\n return 0;\n }\n\n if (diff.unchanged) {\n success(\n `No changes vs ${code(diff.current_version ? `v${diff.current_version}` : '(unpublished)')} — manifest is in sync.`,\n );\n return 0;\n }\n\n // Header.\n out('');\n info(\n diff.current_version\n ? `Diff vs ${code(`v${diff.current_version}`)}:`\n : 'Diff vs ' + code('(unpublished — first version)') + ':',\n );\n\n if (diff.meta_changes.length > 0) {\n out('');\n out(code('Meta:'));\n for (const m of diff.meta_changes) {\n out(` ${m.field}: ${dim(JSON.stringify(m.before))} → ${JSON.stringify(m.after)}`);\n }\n }\n\n if (diff.tables_added.length > 0) {\n out('');\n out(code(`Tables added (${diff.tables_added.length}):`));\n for (const t of diff.tables_added) out(` + ${t}`);\n }\n\n if (diff.tables_removed.length > 0) {\n out('');\n out(code(`Tables removed (${diff.tables_removed.length}):`));\n for (const t of diff.tables_removed) out(` - ${t}`);\n }\n\n if (diff.tables_changed.length > 0) {\n out('');\n out(code(`Tables changed (${diff.tables_changed.length}):`));\n for (const t of diff.tables_changed) {\n out(` ${dim('•')} ${code(t.table)}`);\n for (const f of t.fields_added) {\n out(` + field ${f.slug} (${f.type})`);\n }\n for (const f of t.fields_removed) {\n out(` - field ${f.slug} (${f.type})`);\n }\n for (const f of t.fields_changed) {\n const changeSummary = Object.entries(f.changes)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(' ');\n out(` ~ field ${f.field}: ${dim(changeSummary)}`);\n }\n }\n }\n\n if (diff.deps_added.length > 0) {\n out('');\n out(code(`Dependencies added (${diff.deps_added.length}):`));\n for (const d of diff.deps_added) {\n out(` + ${d.module}@${d.version}`);\n }\n }\n\n if (diff.deps_removed.length > 0) {\n out('');\n out(code(`Dependencies removed (${diff.deps_removed.length}):`));\n for (const d of diff.deps_removed) {\n out(` - ${d.module}@${d.version}`);\n }\n }\n\n out('');\n info('Run `dashwise module publish --bump <patch|minor|major>` when ready.');\n return 0;\n}\n","/**\n * `dashwise module init <slug>` — scaffold a new DashWise module\n * project in a fresh directory.\n *\n * As of 2026-05-18, the DEFAULT scaffold is the full Next.js custom-\n * module scaffold — a real Next.js 16 app with `middleware.ts`,\n * `/api/auth/*` routes, an `<AuthProvider>` wrap, and a protected\n * `app/dashboard/page.tsx` example. Authentication + workspace\n * context are wired against the DashWise NestJS backend out of the\n * box (per the v1 plan in\n * `dashwise-devops-docs/plans/module-authoring-platform.md`).\n *\n * Files emitted by the default (`custom` kind):\n *\n * module.json — manifest (schema_version 2)\n * package.json — deps on @dashai/sdk + next + react\n * tsconfig.json\n * next.config.mjs\n * next-env.d.ts\n * .gitignore — ignores node_modules + .next + .dashwise/\n * .env.local.example — DASHWISE_* var template\n * middleware.ts — uses withAuth() from @dashai/sdk/auth/middleware\n * app/layout.tsx — wraps {children} in <AuthProvider>\n * app/page.tsx — public landing\n * app/dashboard/page.tsx — protected route using getServerSession()\n * app/api/auth/sign-in/route.ts — kicks off DashWise SSO redirect\n * app/api/auth/callback/route.ts — exchanges one-time code for cookie\n * app/api/auth/sign-out/route.ts — clears cookie + tells backend\n * README.md — getting-started + auth flow explainer\n *\n * For the legacy minimal scaffold (no Next.js auth wiring — purely\n * hand-authored simple-module runtime), pass `--simple`:\n *\n * dashwise module init my-mod --simple\n *\n * This emits 9 files (no middleware, no /api/auth/*, no dashboard).\n * The `--simple` flag is permanent — some module use cases (public\n * data viewers, demo modules) genuinely don't need auth.\n *\n * `--custom` is kept as a back-compat alias for the default and is\n * silently deprecated. New code should not pass either flag for the\n * full scaffold — just `dashwise module init <slug>`.\n *\n * Refuses to overwrite an existing non-empty directory unless\n * `--force` is passed. Does NOT run `npm install` automatically —\n * surfaces the next-step commands at the end of the run.\n */\n\nimport { existsSync, mkdirSync, readdirSync, writeFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { intro, isCancel, outro, text } from '@clack/prompts';\nimport {\n appApiAuthCallbackTs,\n appApiAuthSignInTs,\n appApiAuthSignOutTs,\n appDashboardPageTsx,\n appLayoutCustomTsx,\n appLayoutTsx,\n appPageCustomTsx,\n appPageTsx,\n appSignInErrorPageTsx,\n componentsJson,\n componentsThemeProviderTsx,\n componentsUiButtonTsx,\n componentsUiCardTsx,\n envLocalExample,\n gitignore,\n globalsCss,\n isValidSlug,\n libUtilsTs,\n manifestJson,\n middlewareTs,\n nextConfig,\n nextEnvDts,\n packageJson,\n packageJsonCustom,\n postcssConfigMjs,\n readme,\n type ScaffoldKind,\n tsconfigJson,\n} from '../../lib/scaffold.js';\nimport { code, dim, fail, info, success } from '../../lib/output.js';\n\nexport interface InitOptions {\n /** Override the target directory (defaults to `./<slug>`). */\n dir?: string;\n /** Overwrite an existing non-empty directory. */\n force?: boolean;\n /** Human-readable module name (default: derive from slug). */\n name?: string;\n /**\n * Use the legacy minimal scaffold (hand-authored simple module —\n * no Next.js auth wiring). Default before 2026-05-18; opt-in now.\n * Mutually exclusive with `custom`; if both are passed, an error\n * is raised before any files are written.\n */\n simple?: boolean;\n /**\n * @deprecated Back-compat alias for the default (full Next.js +\n * auth wiring). New code should call `init` without flags.\n *\n * Kept for back-compat across the v0.x.y series. Will be removed\n * in a future major version. When passed alongside `--simple`,\n * raises an error (mutually exclusive).\n */\n custom?: boolean;\n /** Optional Git repository URL to write into module.json#repository. */\n git?: string;\n}\n\nexport async function moduleInitCommand(\n slugArg: string | undefined,\n options: InitOptions,\n): Promise<number> {\n intro('Scaffolding a new DashWise module');\n\n // Resolve slug — prompt if not provided.\n let slug = slugArg;\n if (!slug && process.stdout.isTTY) {\n const answer = await text({\n message: 'Module slug?',\n placeholder: 'tasks',\n validate: (v) =>\n isValidSlug(v) ? undefined : 'Slug must match /^[a-z][a-z0-9_-]*$/',\n });\n if (isCancel(answer)) {\n fail('Aborted.');\n return 130;\n }\n slug = answer;\n }\n if (!slug) {\n fail('Usage: `dashwise module init <slug>`');\n return 1;\n }\n if (!isValidSlug(slug)) {\n fail(`Invalid slug ${code(slug)} — must match /^[a-z][a-z0-9_-]*$/`);\n return 1;\n }\n\n // Derive a default human name from the slug if --name wasn't given.\n const name = options.name ?? humanizeSlug(slug);\n const dir = resolve(options.dir ?? slug);\n\n if (existsSync(dir)) {\n const entries = readdirSync(dir);\n if (entries.length > 0 && !options.force) {\n fail(\n `Directory ${code(dir)} is not empty. Pass ${code('--force')} to scaffold anyway (existing files will be overwritten).`,\n );\n return 1;\n }\n }\n\n // Resolve scaffold kind. As of 2026-05-18 the default is `'custom'`\n // (the full Next.js + auth scaffold); `--simple` opts back to the\n // legacy minimal scaffold; `--custom` is a back-compat no-op alias.\n //\n // Mutually-exclusive flags are caught here before any files are\n // written so the user gets a clean failure instead of \"scaffolded\n // simple but you also passed --custom, which one wins?\".\n if (options.simple && options.custom) {\n fail(\n `Cannot pass both ${code('--simple')} and ${code('--custom')} — they're mutually exclusive. ${code('--simple')} selects the legacy minimal scaffold; the default (no flag) is the full Next.js scaffold (formerly ${code('--custom')}).`,\n );\n return 1;\n }\n const kind: ScaffoldKind = options.simple ? 'hand_authored' : 'custom';\n const scaffoldOpts = {\n slug,\n name,\n kind,\n ...(options.git !== undefined ? { repositoryUrl: options.git } : {}),\n };\n\n // Common files (both flavors).\n const files: Array<[string, string]> = [\n ['module.json', manifestJson(scaffoldOpts)],\n ['tsconfig.json', tsconfigJson()],\n ['next.config.mjs', nextConfig()],\n ['next-env.d.ts', nextEnvDts()],\n ['.gitignore', gitignore()],\n ['.env.local.example', envLocalExample()],\n ['README.md', readme(scaffoldOpts)],\n ];\n\n // Flavor-specific files.\n if (kind === 'custom') {\n // Custom Next.js app with auth wiring + shadcn/Tailwind 4 stack.\n // The shadcn config + base primitives (button, card) are vendored\n // rather than installed via `npx shadcn add` so the scaffold has\n // no network dependency at first run.\n files.push(\n ['package.json', packageJsonCustom(scaffoldOpts)],\n ['middleware.ts', middlewareTs()],\n ['components.json', componentsJson()],\n ['postcss.config.mjs', postcssConfigMjs()],\n ['app/globals.css', globalsCss()],\n ['lib/utils.ts', libUtilsTs()],\n ['components/theme-provider.tsx', componentsThemeProviderTsx()],\n ['components/ui/button.tsx', componentsUiButtonTsx()],\n ['components/ui/card.tsx', componentsUiCardTsx()],\n ['app/layout.tsx', appLayoutCustomTsx(scaffoldOpts)],\n ['app/page.tsx', appPageCustomTsx(scaffoldOpts)],\n ['app/dashboard/page.tsx', appDashboardPageTsx()],\n ['app/sign-in-error/page.tsx', appSignInErrorPageTsx()],\n ['app/api/auth/sign-in/route.ts', appApiAuthSignInTs()],\n ['app/api/auth/callback/route.ts', appApiAuthCallbackTs()],\n ['app/api/auth/sign-out/route.ts', appApiAuthSignOutTs()],\n );\n } else {\n // Hand-authored simple module (isolate runtime).\n files.push(\n ['package.json', packageJson(scaffoldOpts)],\n ['app/layout.tsx', appLayoutTsx(scaffoldOpts)],\n ['app/page.tsx', appPageTsx(scaffoldOpts)],\n );\n }\n\n // We intentionally don't run `npm install` here — the user might\n // want to inspect what we wrote first OR run it in their own shell\n // with their preferred package manager.\n for (const [relPath, content] of files) {\n const absPath = join(dir, relPath);\n const parentDir = join(absPath, '..');\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n writeFileSync(absPath, content, 'utf-8');\n }\n\n success(\n `Scaffolded ${code(slug)} (${kind === 'custom' ? 'custom Next.js' : 'simple module'}) in ${code(dir)}`,\n );\n info(`Next steps:`);\n process.stdout.write(`\n ${dim('1.')} ${code(`cd ${dir}`)}\n ${dim('2.')} ${code('npm install')}\n ${dim('3.')} ${code('dashwise dev')} ${dim('# one command: watcher + next dev, auth auto-injected')}\n\n ${dim(' (or, for the two-terminal flow:')}\n ${dim(' dashwise module generate')} ${dim('# materialize typed wrappers')}\n ${dim(' dashwise module dev')} ${dim('# watch + auto-regenerate')}\n ${dim(' npm run dev:next # next dev on :3000)')}\n\n`);\n outro('Happy authoring.');\n return 0;\n}\n\n/** Convert `tasks-app` → `Tasks app` for a friendly default name. */\nfunction humanizeSlug(slug: string): string {\n const words = slug.replace(/[-_]/g, ' ').split(/\\s+/).filter(Boolean);\n if (words.length === 0) return slug;\n const first = words[0];\n const cap = first.charAt(0).toUpperCase() + first.slice(1);\n return [cap, ...words.slice(1)].join(' ');\n}\n","/**\n * `dashwise module list` — list modules the current user can author.\n *\n * Hits `GET /api/modules?owned_only=true` so the listing scope is\n * \"modules I own\" by default. Add `--all` to include public modules\n * the user could install but doesn't own. Workspace filter (`--workspace\n * <slug>`) narrows further when the user has multiple workspaces.\n *\n * Output is plain text — column-aligned slug + version + name — so\n * it pipes cleanly into grep / awk.\n */\n\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport { readConfig } from '../../lib/config.js';\nimport { code, dim, fail, info, out } from '../../lib/output.js';\n\nexport interface ModuleListOptions {\n /** Include public modules (default: false — owned only). */\n all?: boolean;\n /**\n * Filter by workspace slug. Falls back to the saved default if\n * omitted, no filter if neither.\n */\n workspace?: string;\n /** Emit JSON to stdout instead of column-aligned text. */\n json?: boolean;\n}\n\ninterface ModuleSummary {\n id: number;\n slug: string;\n name: string;\n owner_workspace_id: number;\n current_version: string | null;\n verified: boolean;\n public: boolean;\n}\n\nexport async function moduleListCommand(\n options: ModuleListOptions,\n): Promise<number> {\n const cfg = readConfig();\n if (!cfg) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'NOT_LOGGED_IN', message: 'Run `dashwise login` first.' } }));\n } else {\n fail('Not logged in. Run `dashwise login` first.');\n }\n return 1;\n }\n\n // Resolve workspaceId from slug if requested.\n let workspaceId: number | undefined;\n const targetSlug = options.workspace ?? cfg.workspaceSlug;\n if (targetSlug) {\n try {\n const workspaces = await apiRequest<Array<{ id: number; slug?: string }>>(\n 'GET',\n '/api/workspaces',\n );\n const match = workspaces.find((w) => w.slug === targetSlug);\n if (!match) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'WORKSPACE_NOT_FOUND', message: `Workspace ${targetSlug} not found.` } }));\n } else {\n fail(\n `Workspace ${code(targetSlug)} not found in your accessible workspaces. Run \\`dashwise workspace list\\` to see the choices.`,\n );\n }\n return 1;\n }\n workspaceId = match.id;\n } catch (err) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'FETCH_FAILED', message: (err as Error).message } }));\n } else {\n fail(`Could not load workspaces: ${(err as Error).message}`);\n }\n return 1;\n }\n }\n\n // Build query.\n const params = new URLSearchParams();\n if (!options.all) params.set('owned_only', 'true');\n if (workspaceId !== undefined) params.set('workspaceId', String(workspaceId));\n const path = `/api/modules${params.toString() ? `?${params.toString()}` : ''}`;\n\n let modules: ModuleSummary[];\n try {\n modules = await apiRequest<ModuleSummary[]>('GET', path);\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) {\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'NOT_LOGGED_IN', message: 'Run `dashwise login` first.' } }));\n } else {\n fail('Not logged in. Run `dashwise login` first.');\n }\n return 1;\n }\n if (options.json) {\n out(JSON.stringify({ ok: false, error: { code: 'FETCH_FAILED', message: (err as Error).message } }));\n } else {\n fail(`Could not list modules: ${(err as Error).message}`);\n }\n return 1;\n }\n\n if (options.json) {\n out(\n JSON.stringify({\n ok: true,\n modules: Array.isArray(modules) ? modules : [],\n total: Array.isArray(modules) ? modules.length : 0,\n }),\n );\n return 0;\n }\n\n if (!Array.isArray(modules) || modules.length === 0) {\n info(\n options.all\n ? 'No modules found.'\n : 'No modules owned by you yet. Use `dashwise module init <slug>` to scaffold one.',\n );\n return 0;\n }\n\n // Column-aligned plain output. Two passes: compute widths, then format.\n const slugWidth = Math.max(...modules.map((m) => m.slug.length), 4);\n const versionWidth = Math.max(\n ...modules.map((m) => (m.current_version ?? '(draft)').length),\n 7,\n );\n out('');\n out(\n `${'SLUG'.padEnd(slugWidth)} ${'VERSION'.padEnd(versionWidth)} NAME`,\n );\n out(\n `${'-'.repeat(slugWidth)} ${'-'.repeat(versionWidth)} ${'-'.repeat(20)}`,\n );\n for (const m of modules) {\n const version = m.current_version ?? '(draft)';\n const flags = [\n m.verified ? code('✓') : '',\n m.public ? dim('public') : '',\n ]\n .filter(Boolean)\n .join(' ');\n const flagsCol = flags ? ` ${flags}` : '';\n out(`${m.slug.padEnd(slugWidth)} ${version.padEnd(versionWidth)} ${m.name}${flagsCol}`);\n }\n out('');\n info(`${modules.length} module${modules.length === 1 ? '' : 's'}.`);\n return 0;\n}\n","/**\n * Tarball helper for `dashwise module publish`.\n *\n * Wraps the `tar` npm package with DashWise-specific defaults:\n * - gzip compression (server expects `.tar.gz`)\n * - sensible exclusion list (node_modules, .next, .git, ...)\n * - allowlist of files that should ALWAYS be included if present\n * (module.json, manifest.yaml, package.json, app/, server/, etc.)\n * - 100MB size cap (matches backend's `BUNDLE_TOO_LARGE` gate)\n *\n * Output is a `Uint8Array` buffer so callers can pipe it straight\n * into a `fetch` multipart upload without a temp file. The trade-off\n * is memory — but 100MB max is fine for any modern CLI host.\n */\n\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport * as tar from 'tar';\n\n/**\n * Patterns that should NEVER be included in the published bundle.\n * Path semantics: a candidate path matches if any segment equals\n * the pattern (e.g. `node_modules` matches `foo/node_modules/bar`).\n *\n * Kept conservative: the backend's per-file policy gate is the\n * security boundary; this list is the UX layer that keeps tarballs\n * tractable and the upload step fast.\n */\nexport const DEFAULT_EXCLUDE_PATTERNS = [\n 'node_modules',\n '.next',\n '.git',\n '.turbo',\n '.dashwise',\n '.DS_Store',\n '.env',\n '.env.local',\n '.env.development.local',\n '.env.test.local',\n '.env.production.local',\n 'coverage',\n '.nyc_output',\n '.vitest-cache',\n '.idea',\n '.vscode',\n 'dist',\n 'build',\n] as const;\n\n/** Per-file size cap. Files larger than this are excluded with a warning. */\nconst PER_FILE_BYTE_LIMIT = 10 * 1024 * 1024; // 10MB\n/** Tarball total cap — matches backend BUNDLE_TOO_LARGE gate. */\nexport const MAX_TARBALL_BYTES = 100 * 1024 * 1024; // 100MB\n\nexport interface TarballResult {\n /** Gzipped tarball bytes ready to upload. */\n bytes: Uint8Array;\n /** Files included (relative paths from `cwd`). Sorted. */\n filesIncluded: string[];\n /** Files skipped + the reason. */\n warnings: string[];\n}\n\n/**\n * Pack `cwd` into a gzipped tarball.\n *\n * The pack walks `cwd` once, applies exclusion rules + per-file size\n * limits, and emits a buffer. We don't stream-to-disk because the\n * 100MB ceiling makes the in-memory path fine + lets the caller\n * `fetch(...)` without a temp file dance.\n *\n * `extraExclude` is appended to the defaults so callers can suppress\n * additional patterns (e.g. local secrets) without forking the list.\n */\nexport async function packTarball(opts: {\n cwd: string;\n extraExclude?: readonly string[];\n}): Promise<TarballResult> {\n if (!existsSync(opts.cwd)) {\n throw new Error(`packTarball: cwd not found at ${opts.cwd}`);\n }\n const excludeSet = new Set<string>([\n ...DEFAULT_EXCLUDE_PATTERNS,\n ...(opts.extraExclude ?? []),\n ]);\n const filesIncluded: string[] = [];\n const warnings: string[] = [];\n const candidates = walk(opts.cwd, excludeSet);\n for (const abs of candidates) {\n const rel = relative(opts.cwd, abs);\n const size = statSync(abs).size;\n if (size > PER_FILE_BYTE_LIMIT) {\n warnings.push(\n `${rel} skipped — ${formatBytes(size)} exceeds ${formatBytes(PER_FILE_BYTE_LIMIT)} per-file cap`,\n );\n continue;\n }\n filesIncluded.push(rel);\n }\n if (filesIncluded.length === 0) {\n throw new Error(\n `packTarball: nothing to pack in ${opts.cwd} (after applying exclude list)`,\n );\n }\n filesIncluded.sort();\n\n // The `tar.c` API streams chunks; collect them into one buffer.\n // We use the lower-level callback form so the result is a single\n // contiguous Uint8Array — the multipart upload step expects that.\n const chunks: Buffer[] = [];\n await new Promise<void>((resolveDone, rejectDone) => {\n const stream = tar.c(\n {\n gzip: true,\n cwd: opts.cwd,\n // Don't follow symlinks — bundle-local content only.\n follow: false,\n // Preserve the exact case of paths; the backend's per-file\n // policy gate keys off these.\n portable: true,\n },\n filesIncluded,\n );\n stream.on('data', (chunk: Buffer) => chunks.push(chunk));\n stream.on('error', rejectDone);\n stream.on('end', resolveDone);\n });\n const bytes = Buffer.concat(chunks);\n if (bytes.byteLength > MAX_TARBALL_BYTES) {\n throw new Error(\n `packTarball: tarball is ${formatBytes(bytes.byteLength)}, exceeds ${formatBytes(MAX_TARBALL_BYTES)} max`,\n );\n }\n return { bytes, filesIncluded, warnings };\n}\n\n// ── helpers ────────────────────────────────────────────────────────────\n\nfunction walk(root: string, excludeSet: Set<string>): string[] {\n const out: string[] = [];\n const stack: string[] = [root];\n while (stack.length > 0) {\n const dir = stack.pop();\n if (!dir) continue;\n let entries: import('node:fs').Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n continue; // unreadable directory — silently skip\n }\n for (const entry of entries) {\n if (excludeSet.has(entry.name)) continue;\n const abs = join(dir, entry.name);\n if (entry.isDirectory()) {\n stack.push(abs);\n } else if (entry.isFile()) {\n out.push(abs);\n }\n // Skip symlinks + sockets + everything else.\n }\n }\n return out;\n}\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n}B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)}KB`;\n return `${(n / 1024 / 1024).toFixed(1)}MB`;\n}\n\n// Test seam: expose internals for unit tests without making them\n// part of the public package surface.\nexport const __forTests = {\n walk,\n formatBytes,\n PER_FILE_BYTE_LIMIT,\n};\n","/**\n * `dashwise module publish` — package the local project + upload it\n * as a new module version.\n *\n * Steps:\n * 1. Read local `module.json` to get the slug + module_kind.\n * 2. Resolve `slug → module_id` via `GET /api/modules/by-slug/:slug`.\n * 3. Pack `cwd` into a gzipped tarball via `packTarball()`. The\n * tarball excludes node_modules / .next / .git / .dashwise +\n * caps per-file at 10MB and total at 100MB (matches backend).\n * 4. POST the tarball as multipart form-data to\n * `/api/modules/:id/publish/cli` with the user's bump + flags.\n * 5. Print the resulting version + bundle hash.\n *\n * Confirms before uploading (in TTY) unless `--yes` is passed —\n * publish is the one command where a typo costs a real version bump.\n *\n * Tarball bytes live in memory (≤100MB) — no temp file. We use\n * the native `FormData` + `Blob` available on Node 18+.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { intro, isCancel, outro, select } from '@clack/prompts';\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport { readConfig, resolveApiUrl } from '../../lib/config.js';\nimport { code, dim, fail, info, out, success, warn } from '../../lib/output.js';\nimport { MAX_TARBALL_BYTES, packTarball } from '../../lib/tarball.js';\n\nexport interface PublishOptions {\n /** Project root containing `module.json` (defaults to `process.cwd()`). */\n dir?: string;\n /** SemVer bump direction; required. */\n bump?: 'patch' | 'minor' | 'major';\n /** Dry run: send `dry_run=true`; backend validates without persisting. */\n dryRun?: boolean;\n /** Skip the confirmation prompt (CI / scripted runs). */\n yes?: boolean;\n /** Additional exclude patterns appended to the defaults. */\n exclude?: string[];\n}\n\ninterface ModuleByslugResponse {\n id: number;\n slug: string;\n name: string;\n current_version: string | null;\n}\n\ninterface PublishResponse {\n module_version_id: number;\n module_slug: string;\n version: string;\n bundle_url: string;\n bundle_hash: string;\n bytes_uploaded: number;\n publisher_type: string;\n verified: boolean;\n warnings: string[];\n pipeline_version: string;\n}\n\nconst VALID_BUMP = new Set(['patch', 'minor', 'major']);\n\nexport async function modulePublishCommand(\n options: PublishOptions,\n): Promise<number> {\n const projectRoot = resolve(options.dir ?? process.cwd());\n const manifestPath = join(projectRoot, 'module.json');\n if (!existsSync(manifestPath)) {\n fail(\n `No ${code('module.json')} found in ${code(projectRoot)}. Run \\`dashwise module init <slug>\\` first.`,\n );\n return 1;\n }\n let manifest: { module?: { slug?: string; name?: string; version?: string } };\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } catch (err) {\n fail(`Could not parse ${code(manifestPath)}: ${(err as Error).message}`);\n return 1;\n }\n const slug = manifest.module?.slug;\n if (!slug) {\n fail(`${code('module.json')} is missing ${code('module.slug')}. Cannot publish.`);\n return 1;\n }\n\n if (!readConfig()) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n }\n\n // Resolve / prompt for bump.\n let bump = options.bump;\n if (!bump && process.stdout.isTTY) {\n intro(`Publishing module ${code(slug)}`);\n const answer = await select({\n message: 'Bump direction?',\n options: [\n { value: 'patch', label: 'patch — bug fixes only (recommended for first publish)' },\n { value: 'minor', label: 'minor — additive changes (new fields, new tables)' },\n { value: 'major', label: 'major — breaking changes' },\n ],\n initialValue: 'patch',\n });\n if (isCancel(answer)) {\n fail('Aborted.');\n return 130;\n }\n bump = answer as 'patch' | 'minor' | 'major';\n }\n if (!bump || !VALID_BUMP.has(bump)) {\n fail('Bump direction required: `--bump patch|minor|major`.');\n return 1;\n }\n\n // Resolve slug → module id.\n let mod: ModuleByslugResponse;\n try {\n mod = await apiRequest<ModuleByslugResponse>(\n 'GET',\n `/api/modules/by-slug/${encodeURIComponent(slug)}`,\n );\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n fail(\n `Module ${code(slug)} not found on the backend. Create it via the UI / API first, then re-run publish.`,\n );\n return 1;\n }\n if (err instanceof ApiError && err.status === 401) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n }\n fail(`Could not resolve module: ${(err as Error).message}`);\n return 1;\n }\n\n info(\n `Module: ${code(mod.slug)} (id ${mod.id})${\n mod.current_version ? `, current ${code(`v${mod.current_version}`)}` : dim(', no published version yet')\n }`,\n );\n\n // Pack tarball.\n let tarball;\n try {\n tarball = await packTarball({\n cwd: projectRoot,\n ...(options.exclude !== undefined ? { extraExclude: options.exclude } : {}),\n });\n } catch (err) {\n fail(`Could not pack tarball: ${(err as Error).message}`);\n return 1;\n }\n info(\n `Packed ${tarball.filesIncluded.length} file${tarball.filesIncluded.length === 1 ? '' : 's'} into ${formatBytes(tarball.bytes.byteLength)} (cap ${formatBytes(MAX_TARBALL_BYTES)}).`,\n );\n for (const w of tarball.warnings) warn(w);\n\n // Confirm.\n if (!options.yes && process.stdout.isTTY && !options.dryRun) {\n const answer = await select({\n message: `Upload + publish ${code(`bump:${bump}`)}?`,\n options: [\n { value: 'go', label: 'Yes, upload now' },\n { value: 'cancel', label: 'No, abort' },\n ],\n initialValue: 'go',\n });\n if (isCancel(answer) || answer === 'cancel') {\n fail('Aborted.');\n return 130;\n }\n }\n\n // Multipart upload.\n const cfg = readConfig();\n if (!cfg) {\n fail('Session vanished mid-publish — re-run `dashwise login`.');\n return 1;\n }\n const url = `${resolveApiUrl()}/api/modules/${mod.id}/publish/cli`;\n const form = new FormData();\n // Native `Blob` works in Node 18+; `Buffer` is array-buffer-like\n // so we wrap it before passing to FormData.\n const blob = new Blob([new Uint8Array(tarball.bytes)], { type: 'application/gzip' });\n form.set('file', blob, 'module.tar.gz');\n form.set('bump', bump);\n if (options.dryRun) form.set('dry_run', 'true');\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n Authorization: `Bearer ${cfg.token}`,\n },\n body: form,\n });\n } catch (err) {\n fail(`Network error during upload: ${(err as Error).message}`);\n return 1;\n }\n\n const body = (await res.json().catch(() => null)) as unknown;\n if (!res.ok) {\n const env = body && typeof body === 'object' ? (body as Record<string, unknown>) : null;\n fail(\n `Publish failed (${res.status}${env?.code ? ` ${env.code}` : ''}): ${env?.message ?? '(no message)'}`,\n );\n if (env?.context) {\n out(JSON.stringify(env.context, null, 2));\n }\n return 1;\n }\n\n const result = body as PublishResponse | null;\n if (!result) {\n fail('Publish succeeded but the response body was empty or malformed.');\n return 1;\n }\n if (options.dryRun) {\n success(`Dry run OK — would publish ${code(`v${result.version}`)}`);\n } else {\n success(`Published ${code(mod.slug)} ${code(`v${result.version}`)}`);\n }\n info(`Bundle: ${code(result.bundle_url)}`);\n info(`Hash: ${dim(result.bundle_hash)}`);\n info(`Size: ${formatBytes(result.bytes_uploaded)}`);\n if (result.warnings.length > 0) {\n warn(`${result.warnings.length} warning${result.warnings.length === 1 ? '' : 's'}:`);\n for (const w of result.warnings) {\n out(` ${dim('•')} ${w}`);\n }\n }\n if (process.stdout.isTTY && !options.dryRun) outro('Done.');\n return 0;\n}\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n}B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)}KB`;\n return `${(n / 1024 / 1024).toFixed(1)}MB`;\n}\n","/**\n * `dashwise module pull-data` — export own-table data from the\n * owner-workspace installation to a local JSON file (default\n * `dashwise-data.json` in the project root).\n *\n * Useful for: seeding local dev with production-shaped data,\n * fixture generation, manual inspection. The output shape matches\n * what `db.<table>.list()` would return through the SDK — manifest\n * slugs as keys, NOT physical `field_<id>` names — so the data\n * can be reused as fixtures for unit tests or local API mocks.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport { code, dim, fail, info, success, warn } from '../../lib/output.js';\n\nexport interface PullDataOptions {\n dir?: string;\n /** Max rows per table (1-1000, default 100). */\n limit?: number;\n /** Output path (default: `dashwise-data.json` in dir). */\n out?: string;\n}\n\ninterface PullDataResponse {\n module_slug: string;\n module_version: string | null;\n tables: Array<{\n slug: string;\n total_rows: number;\n rows: Array<Record<string, unknown>>;\n }>;\n}\n\nexport async function modulePullDataCommand(\n options: PullDataOptions,\n): Promise<number> {\n const projectRoot = resolve(options.dir ?? process.cwd());\n const manifestPath = join(projectRoot, 'module.json');\n if (!existsSync(manifestPath)) {\n fail(\n `No ${code('module.json')} found in ${code(projectRoot)}. Run \\`dashwise module init <slug>\\` first.`,\n );\n return 1;\n }\n let manifest: { module?: { slug?: string } };\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } catch (err) {\n fail(`Could not parse ${code(manifestPath)}: ${(err as Error).message}`);\n return 1;\n }\n const slug = manifest.module?.slug;\n if (!slug) {\n fail(`${code('module.json')} is missing ${code('module.slug')}.`);\n return 1;\n }\n\n // Resolve slug → moduleId.\n let mod: { id: number };\n try {\n mod = await apiRequest<{ id: number }>(\n 'GET',\n `/api/modules/by-slug/${encodeURIComponent(slug)}`,\n );\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n fail(`Module ${code(slug)} not found on the backend.`);\n return 1;\n }\n if (err instanceof ApiError && err.status === 401) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n }\n fail(`Could not resolve module: ${(err as Error).message}`);\n return 1;\n }\n\n const limit = options.limit ?? 100;\n let res: PullDataResponse;\n try {\n res = await apiRequest<PullDataResponse>(\n 'GET',\n `/api/modules/${mod.id}/own-data?limit=${limit}`,\n );\n } catch (err) {\n if (err instanceof ApiError && err.status === 400) {\n fail(`Invalid request: ${err.message}`);\n return 1;\n }\n fail(`Could not pull data: ${(err as Error).message}`);\n return 1;\n }\n\n const outPath = options.out\n ? resolve(options.out)\n : join(projectRoot, 'dashwise-data.json');\n writeFileSync(outPath, JSON.stringify(res, null, 2) + '\\n', 'utf-8');\n\n let totalRows = 0;\n for (const t of res.tables) totalRows += t.rows.length;\n success(`Wrote ${totalRows} row${totalRows === 1 ? '' : 's'} across ${res.tables.length} table${res.tables.length === 1 ? '' : 's'} to ${code(outPath)}`);\n\n // Warn on truncation per table — useful when a table has many\n // more rows than the user grabbed.\n for (const t of res.tables) {\n if (t.total_rows > t.rows.length) {\n warn(\n `Table ${code(t.slug)} truncated: ${t.rows.length} of ${t.total_rows} rows (use ${code(`--limit ${Math.min(t.total_rows, 1000)}`)} to grab more).`,\n );\n }\n }\n if (res.tables.length === 0) {\n info(dim('No owned tables on this module. (Did you publish a manifest with `owns.tables`?)'));\n }\n return 0;\n}\n","/**\n * `dashwise module validate` — run the local `module.json` through\n * the backend's `POST /api/modules/manifest/validate` endpoint.\n *\n * Useful as a pre-publish sanity check: catches structural manifest\n * errors (bad field types, unknown table refs, etc.) before paying\n * the cost of a publish round-trip.\n *\n * Output is structured-by-default: bullet-listed issues on failure,\n * \"Manifest is valid\" on success. Exit code 0 / 1 mirrors the\n * underlying validation result.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport { code, dim, fail, out, success } from '../../lib/output.js';\n\nexport interface ValidateOptions {\n dir?: string;\n}\n\ninterface ValidateOkResponse {\n ok: true;\n manifest: unknown;\n}\n\ninterface ManifestIssue {\n path?: string;\n message?: string;\n}\n\nexport async function moduleValidateCommand(\n options: ValidateOptions,\n): Promise<number> {\n const projectRoot = resolve(options.dir ?? process.cwd());\n const manifestPath = join(projectRoot, 'module.json');\n if (!existsSync(manifestPath)) {\n fail(\n `No ${code('module.json')} found in ${code(projectRoot)}. Run \\`dashwise module init <slug>\\` first.`,\n );\n return 1;\n }\n let manifest: unknown;\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } catch (err) {\n fail(`Could not parse ${code(manifestPath)}: ${(err as Error).message}`);\n return 1;\n }\n\n try {\n const res = await apiRequest<ValidateOkResponse>(\n 'POST',\n '/api/modules/manifest/validate',\n manifest,\n );\n if (res.ok) {\n success('Manifest is valid.');\n return 0;\n }\n // Defensive — the endpoint only returns `ok:true` on success;\n // anything else throws on the API side.\n fail(`Unexpected response shape: ${JSON.stringify(res)}`);\n return 1;\n } catch (err) {\n if (err instanceof ApiError && err.status === 400) {\n const issues = readIssues(err.context);\n if (issues.length > 0) {\n fail(`Manifest is invalid (${issues.length} issue${issues.length === 1 ? '' : 's'}):`);\n for (const issue of issues) {\n const path = issue.path ?? '(root)';\n const message = issue.message ?? '(no message)';\n out(` ${dim('•')} ${code(path)}: ${message}`);\n }\n } else {\n fail(`Manifest is invalid: ${err.message}`);\n }\n return 1;\n }\n if (err instanceof ApiError && err.status === 401) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n }\n fail(`Could not validate manifest: ${(err as Error).message}`);\n return 1;\n }\n}\n\nfunction readIssues(context: Record<string, unknown> | undefined): ManifestIssue[] {\n if (!context) return [];\n const v = context['issues'];\n if (!Array.isArray(v)) return [];\n return v\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null;\n const e = entry as Record<string, unknown>;\n const issue: ManifestIssue = {};\n if (typeof e.path === 'string') issue.path = e.path;\n if (typeof e.message === 'string') issue.message = e.message;\n return issue;\n })\n .filter((x): x is ManifestIssue => x !== null);\n}\n","/**\n * Shared `module.json` I/O for CLI commands.\n *\n * Several commands need to read + mutate the local manifest\n * (`connect-git`, `deps add / remove`, future `module fields add`,\n * etc.). Inlining the read/write/JSON-parse dance in every command\n * leaks formatting choices (2-space indent, trailing newline) and\n * makes file-level invariants harder to enforce. This helper is the\n * single chokepoint.\n *\n * Properties:\n * - Tolerates an absent file with a typed null return.\n * - Throws a typed error (with file path) on parse failure.\n * - Writes are atomic-ish: same write pattern as the rest of the\n * CLI (one `writeFileSync`, no temp file — manifest is small +\n * local; partial writes only matter for ~256-byte regions and\n * fsync ordering on local disk).\n * - Preserves 2-space indent + trailing newline so `git diff` after\n * a CLI mutation shows only the actual change.\n * - Generic over the manifest shape — callers cast to their needed\n * shape since the manifest schema is owned by the backend.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\n/**\n * Reasonably-permissive shape covering what CLI commands care about.\n * The backend validator owns the full schema; we only narrow what we\n * need to read/write here.\n */\nexport interface ManifestShape {\n schema_version?: number;\n module?: {\n slug?: string;\n name?: string;\n version?: string;\n [k: string]: unknown;\n };\n module_kind?: string;\n owns?: { tables?: Array<{ slug?: string; [k: string]: unknown }> };\n dependencies?: ManifestDependency[];\n exposes?: Array<Record<string, unknown>>;\n repository?: Record<string, unknown>;\n [k: string]: unknown;\n}\n\nexport interface ManifestDependency {\n module: string;\n version: string;\n reads: Array<{ table: string; fields: string[] }>;\n writes?: Array<{ table: string; fields: string[]; operations: string[] }>;\n purpose: string;\n}\n\n/**\n * Resolve the manifest path inside `dir` (defaults to `process.cwd()`).\n * Pure path math — does not touch the filesystem.\n */\nexport function manifestPath(dir?: string): string {\n return join(resolve(dir ?? process.cwd()), 'module.json');\n}\n\n/**\n * Read + parse `module.json` from `dir`. Returns `null` when the file\n * doesn't exist (so callers can branch on \"not a module directory\" vs\n * \"broken manifest\"). Throws with a clear message on parse failure.\n */\nexport function readManifest<T extends ManifestShape = ManifestShape>(dir?: string): T | null {\n const path = manifestPath(dir);\n if (!existsSync(path)) return null;\n const raw = readFileSync(path, 'utf-8');\n try {\n return JSON.parse(raw) as T;\n } catch (err) {\n throw new Error(\n `Failed to parse ${path}: ${(err as Error).message}. Fix or delete the file and re-run.`,\n );\n }\n}\n\n/**\n * Write `manifest` back to `module.json` in `dir`. Uses the canonical\n * 2-space indent + trailing newline so subsequent commits show only\n * the intended diff. Caller is responsible for any structural\n * validation — this helper is a dumb serializer.\n */\nexport function writeManifest(manifest: ManifestShape, dir?: string): void {\n const path = manifestPath(dir);\n writeFileSync(path, JSON.stringify(manifest, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Convenience: read the manifest or throw a CLI-friendly error if\n * either the file is missing or unparseable. Use from commands that\n * REQUIRE a manifest to function (most of them).\n */\nexport function readManifestOrThrow<T extends ManifestShape = ManifestShape>(dir?: string): T {\n const manifest = readManifest<T>(dir);\n if (!manifest) {\n throw new Error(\n `No module.json found in ${resolve(dir ?? process.cwd())}. Run \\`dashwise module init\\` first or pass \\`--dir <path>\\`.`,\n );\n }\n return manifest;\n}\n","/**\n * `dashwise deps add <provider-slug>` — declare a cross-module dep in\n * `module.json#dependencies`.\n *\n * Two modes:\n * 1. Interactive (TTY default) — fetches the provider's published\n * `exposes` block from the backend, lets the user pick tables +\n * fields via `@clack/prompts.multiselect`, prompts for the\n * required `purpose` string.\n * 2. Non-interactive (`--table`, `--fields`, `--purpose` provided\n * OR not a TTY) — single-table add with no prompts. Multi-table\n * adds are done by re-running the command per table, OR by\n * hand-editing module.json (which `deps list` then displays\n * verbatim).\n *\n * Backend reachability is best-effort: if the provider can't be\n * found (network down, slug typo, provider deleted), interactive\n * mode falls back to a minimal \"manual\" path that asks the user to\n * type the table + field names verbatim.\n *\n * Spec: dashwise-devops-docs/plans/modules-sdk-query-v1.md §9.\n */\n\nimport {\n intro,\n isCancel,\n multiselect,\n outro,\n select,\n text,\n} from '@clack/prompts';\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport {\n readManifestOrThrow,\n writeManifest,\n type ManifestDependency,\n type ManifestShape,\n} from '../../lib/manifest-io.js';\nimport { code, dim, fail, info, success, warn } from '../../lib/output.js';\n\nexport interface DepsAddOptions {\n dir?: string;\n /** Single-table add: required in non-interactive mode. */\n table?: string;\n /** Comma-separated field slugs for `--table`. */\n fields?: string;\n /** Human-readable purpose (10-500 chars, per manifest schema). */\n purpose?: string;\n /** SemVer range (default: `^<provider-current-version>` if backend reachable, else `^0.0.1`). */\n version?: string;\n /** Skip the confirmation step when replacing an existing dep declaration. */\n yes?: boolean;\n}\n\nconst MIN_PURPOSE_LEN = 10;\nconst MAX_PURPOSE_LEN = 500;\n\n/** Backend manifest_jsonb shape, only the parts the CLI needs. */\ninterface ProviderManifestSummary {\n module?: { slug?: string; name?: string; version?: string };\n exposes?: Array<{\n table: string;\n fields: string[];\n operations?: {\n list?: { allowed?: boolean };\n get?: { allowed?: boolean };\n search?: { allowed?: boolean };\n };\n visibility?: string;\n }>;\n}\n\ninterface ModuleByslugResponse {\n id: number;\n slug: string;\n name: string;\n current_version: string | null;\n}\n\ninterface VersionResponse {\n id: number;\n module_id: number;\n version: string;\n manifest_jsonb: ProviderManifestSummary;\n}\n\nexport async function depsAddCommand(\n providerSlug: string,\n options: DepsAddOptions,\n): Promise<number> {\n if (!providerSlug || typeof providerSlug !== 'string') {\n fail('Usage: `dashwise deps add <provider-slug>`');\n return 1;\n }\n // Module slugs are kebab-case (matches backend MODULE_SLUG_REGEX).\n if (!/^[a-z][a-z0-9-]*[a-z0-9]$/.test(providerSlug)) {\n fail(\n `Provider slug ${code(providerSlug)} is invalid. Module slugs are kebab-case (e.g. ${code('crm-app')}).`,\n );\n return 1;\n }\n\n let manifest;\n try {\n manifest = readManifestOrThrow(options.dir);\n } catch (err) {\n fail((err as Error).message);\n return 1;\n }\n\n // Refuse to self-depend (would be a no-op but confusing).\n if (manifest.module?.slug === providerSlug) {\n fail('A module cannot depend on itself.');\n return 1;\n }\n\n const isInteractive = process.stdout.isTTY;\n const hasAllNonInteractive =\n options.table !== undefined &&\n options.fields !== undefined &&\n options.purpose !== undefined;\n\n if (!isInteractive && !hasAllNonInteractive) {\n fail(\n `Non-interactive mode requires ${code('--table')}, ${code('--fields')}, and ${code('--purpose')}.`,\n );\n return 1;\n }\n\n // Fetch provider summary (best-effort — non-fatal in interactive mode).\n let providerSummary: ProviderManifestSummary | null = null;\n let resolvedVersion: string | null = null;\n try {\n const mod = await apiRequest<ModuleByslugResponse>(\n 'GET',\n `/api/modules/by-slug/${encodeURIComponent(providerSlug)}`,\n );\n if (mod.current_version) {\n const versions = await apiRequest<VersionResponse[]>(\n 'GET',\n `/api/modules/${mod.id}/versions`,\n );\n // Versions are returned newest-first per the controller spec; the\n // first one matching `current_version` is what's actually\n // installable. Fall back to versions[0] if no exact match.\n const current =\n versions.find((v) => v.version === mod.current_version) ??\n versions[0];\n if (current) {\n providerSummary = current.manifest_jsonb;\n resolvedVersion = current.version;\n }\n }\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n if (!isInteractive) {\n fail(\n `Provider ${code(providerSlug)} not found on the backend. Publish it first or check the slug.`,\n );\n return 1;\n }\n warn(\n `Provider ${code(providerSlug)} not found on the backend (404). You can still declare the dep manually.`,\n );\n } else if (err instanceof ApiError && err.status === 401) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n } else {\n warn(`Could not fetch provider summary: ${(err as Error).message}`);\n }\n }\n\n // Resolve the dep entry's fields.\n let entry: ManifestDependency;\n if (isInteractive) {\n intro(`Adding dependency on ${code(providerSlug)}`);\n const built = await collectInteractive(\n providerSlug,\n providerSummary,\n resolvedVersion,\n options,\n );\n if (built === null) {\n outro('Cancelled.');\n return 130;\n }\n entry = built;\n } else {\n // Non-interactive path: all required args are present per the\n // check above; we trust them + let the backend validate semantics\n // on the next publish.\n const fieldList = (options.fields ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (fieldList.length === 0) {\n fail(`${code('--fields')} must list at least one field slug.`);\n return 1;\n }\n const purposeErr = validatePurpose(options.purpose!);\n if (purposeErr) {\n fail(purposeErr);\n return 1;\n }\n entry = {\n module: providerSlug,\n version: options.version ?? (resolvedVersion ? `^${resolvedVersion}` : '^0.0.1'),\n reads: [{ table: options.table!, fields: fieldList }],\n purpose: options.purpose!,\n };\n }\n\n // Merge with existing manifest.dependencies[].\n const deps: ManifestDependency[] = manifest.dependencies ?? [];\n const existingIdx = deps.findIndex((d) => d.module === providerSlug);\n if (existingIdx >= 0) {\n if (!options.yes && isInteractive) {\n const answer = await select({\n message: `Dep on ${providerSlug} already exists. Replace it?`,\n options: [\n { value: 'replace', label: 'Replace (loses prior reads/writes)' },\n { value: 'cancel', label: 'Cancel' },\n ],\n initialValue: 'replace',\n });\n if (isCancel(answer) || answer === 'cancel') {\n outro('Cancelled.');\n return 130;\n }\n }\n deps[existingIdx] = entry;\n } else {\n deps.push(entry);\n }\n manifest.dependencies = deps;\n\n try {\n writeManifest(manifest as ManifestShape, options.dir);\n } catch (err) {\n fail(`Could not write manifest: ${(err as Error).message}`);\n return 1;\n }\n\n success(\n `${existingIdx >= 0 ? 'Replaced' : 'Added'} dependency on ${code(providerSlug)}@${entry.version}.`,\n );\n info(`Reads: ${entry.reads.map((r) => `${code(r.table)} (${r.fields.join(', ')})`).join('; ')}`);\n info(`Run ${code('dashwise module generate')} to refresh typed wrappers.`);\n if (isInteractive) outro('Done.');\n return 0;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────\n\ninterface NormalizedReadEntry {\n table: string;\n fields: string[];\n}\n\nasync function collectInteractive(\n providerSlug: string,\n summary: ProviderManifestSummary | null,\n resolvedVersion: string | null,\n options: DepsAddOptions,\n): Promise<ManifestDependency | null> {\n const reads: NormalizedReadEntry[] = [];\n\n if (summary && summary.exposes && summary.exposes.length > 0) {\n // Backend-assisted: present the actual exposes set.\n info(\n `Provider exposes ${summary.exposes.length} table${summary.exposes.length === 1 ? '' : 's'}.`,\n );\n // Filter to tables the provider actually allows `list` or `get` on\n // (others are visible-but-unreadable from a SDK perspective).\n const readableTables = summary.exposes.filter((e) => {\n const ops = e.operations;\n if (!ops) return true; // back-compat: no operations block = implicit allow\n return ops.list?.allowed === true || ops.get?.allowed === true;\n });\n if (readableTables.length === 0) {\n warn(\n `Provider ${code(providerSlug)} exposes tables but none are readable (operations.list / .get all denied).`,\n );\n return null;\n }\n\n const picked = await multiselect({\n message: 'Which tables do you want to read from?',\n options: readableTables.map((e) => ({\n value: e.table,\n label: `${e.table} ${dim(`(${e.fields.length} field${e.fields.length === 1 ? '' : 's'})`)}`,\n })),\n required: true,\n });\n if (isCancel(picked)) return null;\n\n for (const tableSlug of picked as string[]) {\n const exposeEntry = readableTables.find((e) => e.table === tableSlug)!;\n const fieldsPicked = await multiselect({\n message: `Fields to read from ${code(tableSlug)}:`,\n options: exposeEntry.fields.map((f) => ({ value: f, label: f })),\n required: true,\n initialValues: exposeEntry.fields, // pre-select all; user trims down\n });\n if (isCancel(fieldsPicked)) return null;\n reads.push({ table: tableSlug, fields: fieldsPicked as string[] });\n }\n } else {\n // Manual fallback when no backend summary is available.\n info('No provider summary available — enter table + fields manually.');\n const tableSlug = await text({\n message: 'Provider table slug to read from:',\n placeholder: 'contacts',\n validate: (v) =>\n /^[a-z][a-z0-9_]*[a-z0-9]$/.test(v) ? undefined : 'Table slugs are snake_case.',\n });\n if (isCancel(tableSlug)) return null;\n const fieldsStr = await text({\n message: 'Comma-separated field slugs:',\n placeholder: 'name, email, company',\n validate: (v) =>\n v.split(',').map((s) => s.trim()).filter(Boolean).length > 0\n ? undefined\n : 'At least one field required.',\n });\n if (isCancel(fieldsStr)) return null;\n reads.push({\n table: tableSlug as string,\n fields: (fieldsStr as string)\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n });\n }\n\n // Purpose — manifest validator requires 10-500 chars.\n const initialPurpose = options.purpose ?? '';\n const purpose = await text({\n message: `Why does your module need this dependency? ${dim(`(${MIN_PURPOSE_LEN}-${MAX_PURPOSE_LEN} chars; shown to workspace admins at install consent)`)}`,\n placeholder: 'Look up assignee contact info when rendering tasks.',\n initialValue: initialPurpose,\n validate: (v) => validatePurpose(v) ?? undefined,\n });\n if (isCancel(purpose)) return null;\n\n // Version range — default to `^<resolved>` for stability.\n const defaultVersion =\n options.version ?? (resolvedVersion ? `^${resolvedVersion}` : '^0.0.1');\n const version = await text({\n message: `SemVer range to pin: ${dim('(npm-style; e.g. ^1.2.3, ~1.2.0, >=1.0.0)')}`,\n placeholder: defaultVersion,\n initialValue: defaultVersion,\n validate: (v) =>\n /^[\\^~]?[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9.-]+)?$/.test(v) ||\n /^(>=|<=|>|<|=)?[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9.-]+)?$/.test(v)\n ? undefined\n : 'Must be a npm-style semver range (e.g. ^1.2.3).',\n });\n if (isCancel(version)) return null;\n\n return {\n module: providerSlug,\n version: version as string,\n reads,\n purpose: purpose as string,\n };\n}\n\nfunction validatePurpose(purpose: string): string | null {\n if (typeof purpose !== 'string') return 'Purpose must be a string.';\n if (purpose.length < MIN_PURPOSE_LEN) {\n return `Purpose must be at least ${MIN_PURPOSE_LEN} characters; got ${purpose.length}.`;\n }\n if (purpose.length > MAX_PURPOSE_LEN) {\n return `Purpose must be at most ${MAX_PURPOSE_LEN} characters; got ${purpose.length}.`;\n }\n return null;\n}\n","/**\n * `dashwise deps check` — verify each declared dep still resolves\n * against a currently-published provider and that every field /\n * operation in the contract is still exposed.\n *\n * Exit code:\n * 0 — all deps healthy\n * 1 — at least one drift issue found\n *\n * Reports per-dep issues with a clear next step:\n * - PROVIDER_NOT_FOUND → the provider was deleted or renamed\n * - NO_MATCHING_VERSION → no published version satisfies the SemVer range\n * - FIELD_NOT_EXPOSED → consumer reads a field the provider no longer exposes\n * - OP_NOT_ALLOWED → consumer declares writes the provider blocks (writes opt-in)\n *\n * Backend reachability is required — `check` is an online command by\n * design. If the backend is unreachable, exit 1 with a clear message\n * (CI workflows can catch this + retry).\n *\n * Spec: dashwise-devops-docs/plans/modules-sdk-query-v1.md §9.\n */\n\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport {\n readManifestOrThrow,\n type ManifestDependency,\n} from '../../lib/manifest-io.js';\nimport { code, dim, fail, info, out, success, warn } from '../../lib/output.js';\n\nexport interface DepsCheckOptions {\n dir?: string;\n json?: boolean;\n}\n\ninterface ProviderManifestSummary {\n exposes?: Array<{\n table: string;\n fields: string[];\n operations?: Partial<\n Record<\n 'list' | 'get' | 'search' | 'create' | 'update' | 'delete',\n { allowed?: boolean }\n >\n >;\n }>;\n}\n\ninterface ModuleByslugResponse {\n id: number;\n slug: string;\n current_version: string | null;\n}\n\ninterface VersionResponse {\n id: number;\n version: string;\n manifest_jsonb: ProviderManifestSummary;\n}\n\ninterface Issue {\n /** Stable code so JSON consumers can branch. */\n code:\n | 'PROVIDER_NOT_FOUND'\n | 'NO_MATCHING_VERSION'\n | 'FIELD_NOT_EXPOSED'\n | 'TABLE_NOT_EXPOSED'\n | 'OP_NOT_ALLOWED'\n | 'BACKEND_UNREACHABLE';\n module: string;\n message: string;\n context?: Record<string, unknown>;\n}\n\nexport async function depsCheckCommand(options: DepsCheckOptions): Promise<number> {\n let manifest;\n try {\n manifest = readManifestOrThrow(options.dir);\n } catch (err) {\n fail((err as Error).message);\n return 1;\n }\n\n const deps: ManifestDependency[] = manifest.dependencies ?? [];\n if (deps.length === 0) {\n if (options.json) {\n out(JSON.stringify({ ok: true, deps: [], issues: [] }, null, 2));\n } else {\n info('No dependencies declared. Nothing to check.');\n }\n return 0;\n }\n\n const issues: Issue[] = [];\n const perDepStatus: Array<{ module: string; ok: boolean; resolved_version: string | null }> = [];\n\n for (const dep of deps) {\n let mod: ModuleByslugResponse;\n try {\n mod = await apiRequest<ModuleByslugResponse>(\n 'GET',\n `/api/modules/by-slug/${encodeURIComponent(dep.module)}`,\n );\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n issues.push({\n code: 'PROVIDER_NOT_FOUND',\n module: dep.module,\n message: `Provider ${dep.module} not found on the backend. It may have been deleted or renamed.`,\n });\n perDepStatus.push({ module: dep.module, ok: false, resolved_version: null });\n continue;\n }\n if (err instanceof ApiError && err.status === 401) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n }\n // Network / 500 / etc. — treat as fatal; we can't reason about\n // drift without an answer from the backend.\n issues.push({\n code: 'BACKEND_UNREACHABLE',\n module: dep.module,\n message: `Could not reach the backend: ${(err as Error).message}`,\n });\n perDepStatus.push({ module: dep.module, ok: false, resolved_version: null });\n continue;\n }\n\n // Pick the highest-matching version (newest-first per the\n // listVersions controller spec).\n let versions: VersionResponse[];\n try {\n versions = await apiRequest<VersionResponse[]>(\n 'GET',\n `/api/modules/${mod.id}/versions`,\n );\n } catch (err) {\n issues.push({\n code: 'BACKEND_UNREACHABLE',\n module: dep.module,\n message: `Could not list versions: ${(err as Error).message}`,\n });\n perDepStatus.push({ module: dep.module, ok: false, resolved_version: null });\n continue;\n }\n\n const matching = pickMatching(versions, dep.version);\n if (!matching) {\n issues.push({\n code: 'NO_MATCHING_VERSION',\n module: dep.module,\n message: `No published version satisfies ${dep.version}. Available: ${versions.map((v) => v.version).join(', ') || '(none)'}.`,\n context: { range: dep.version, available: versions.map((v) => v.version) },\n });\n perDepStatus.push({ module: dep.module, ok: false, resolved_version: null });\n continue;\n }\n\n // Drift checks against the matching version's manifest.\n const exposes = matching.manifest_jsonb.exposes ?? [];\n let depHealthy = true;\n\n for (const readEntry of dep.reads) {\n const exposeEntry = exposes.find((e) => e.table === readEntry.table);\n if (!exposeEntry) {\n issues.push({\n code: 'TABLE_NOT_EXPOSED',\n module: dep.module,\n message: `Table ${code(readEntry.table)} is no longer exposed by ${dep.module}@${matching.version}.`,\n context: { table: readEntry.table, resolved_version: matching.version },\n });\n depHealthy = false;\n continue;\n }\n const exposedFields = new Set(exposeEntry.fields);\n const missing = readEntry.fields.filter((f) => !exposedFields.has(f));\n if (missing.length > 0) {\n issues.push({\n code: 'FIELD_NOT_EXPOSED',\n module: dep.module,\n message: `Fields ${missing.map((f) => code(f)).join(', ')} on ${code(readEntry.table)} are no longer exposed by ${dep.module}@${matching.version}.`,\n context: {\n table: readEntry.table,\n missing,\n resolved_version: matching.version,\n },\n });\n depHealthy = false;\n }\n // Operation gate for list/get — we don't include search here since\n // the SDK doesn't expose it and the v1 plan doesn't either.\n const listAllowed = exposeEntry.operations?.list?.allowed !== false;\n const getAllowed = exposeEntry.operations?.get?.allowed !== false;\n if (!listAllowed && !getAllowed) {\n issues.push({\n code: 'OP_NOT_ALLOWED',\n module: dep.module,\n message: `Provider ${dep.module}@${matching.version} disallows both list AND get on ${code(readEntry.table)} — no reads possible.`,\n context: { table: readEntry.table, resolved_version: matching.version },\n });\n depHealthy = false;\n }\n }\n\n // Write-side drift (only flagged when consumer declared writes).\n for (const writeEntry of dep.writes ?? []) {\n const exposeEntry = exposes.find((e) => e.table === writeEntry.table);\n if (!exposeEntry) continue; // already flagged via reads loop\n for (const op of writeEntry.operations) {\n const gate = exposeEntry.operations?.[op as 'create' | 'update' | 'delete'];\n if (!gate || gate.allowed !== true) {\n issues.push({\n code: 'OP_NOT_ALLOWED',\n module: dep.module,\n message: `Write operation ${code(op)} on ${code(writeEntry.table)} is not allowed by ${dep.module}@${matching.version}.`,\n context: {\n table: writeEntry.table,\n operation: op,\n resolved_version: matching.version,\n },\n });\n depHealthy = false;\n }\n }\n }\n\n perDepStatus.push({\n module: dep.module,\n ok: depHealthy,\n resolved_version: matching.version,\n });\n }\n\n const ok = issues.length === 0;\n\n if (options.json) {\n out(\n JSON.stringify(\n { ok, deps: perDepStatus, issues },\n null,\n 2,\n ),\n );\n return ok ? 0 : 1;\n }\n\n // Human-readable output.\n for (const dep of perDepStatus) {\n if (dep.ok) {\n success(\n `${code(dep.module)} → ${dep.resolved_version ? `v${dep.resolved_version}` : dim('(no version)')}`,\n );\n } else {\n fail(`${code(dep.module)} ${dim('(drift detected)')}`);\n }\n }\n if (issues.length > 0) {\n out('');\n warn(`${issues.length} issue${issues.length === 1 ? '' : 's'}:`);\n for (const issue of issues) {\n out(` ${dim(`[${issue.code}]`)} ${issue.message}`);\n }\n out('');\n info(\n `Fix by removing/updating the dep (${code('dashwise deps remove <slug>')} then ${code('dashwise deps add <slug>')}) or by updating the provider.`,\n );\n } else {\n out('');\n success(`All ${perDepStatus.length} dependenc${perDepStatus.length === 1 ? 'y is' : 'ies are'} healthy.`);\n }\n return ok ? 0 : 1;\n}\n\n/**\n * Pick the newest version satisfying `range`. Range parsing is\n * intentionally minimal — covers `^x.y.z`, `~x.y.z`, `>=x.y.z`,\n * `<=x.y.z`, `>x.y.z`, `<x.y.z`, `=x.y.z`, and bare `x.y.z`. Full\n * SemVer support lives in the backend; this is a fail-soft heuristic\n * so check can give useful feedback even when offline tooling is the\n * canonical resolver.\n *\n * Caller passes `versions` in newest-first order (matches the\n * backend's `GET /:id/versions` contract).\n */\nfunction pickMatching(\n versions: VersionResponse[],\n range: string,\n): VersionResponse | null {\n for (const v of versions) {\n if (rangeSatisfied(v.version, range)) return v;\n }\n return null;\n}\n\nfunction rangeSatisfied(version: string, range: string): boolean {\n const vParts = parseSemver(version);\n if (!vParts) return false;\n const trimmed = range.trim();\n const opMatch = trimmed.match(/^(>=|<=|>|<|=|\\^|~)?(.+)$/);\n if (!opMatch) return false;\n const op = opMatch[1] ?? '=';\n const target = parseSemver(opMatch[2]);\n if (!target) return false;\n const cmp = compareSemver(vParts, target);\n switch (op) {\n case '=':\n return cmp === 0;\n case '>':\n return cmp > 0;\n case '<':\n return cmp < 0;\n case '>=':\n return cmp >= 0;\n case '<=':\n return cmp <= 0;\n case '^':\n // ^1.2.3 → >=1.2.3 <2.0.0 ; ^0.2.3 → >=0.2.3 <0.3.0 ; ^0.0.3 → >=0.0.3 <0.0.4\n if (cmp < 0) return false;\n if (target[0] > 0) return vParts[0] === target[0];\n if (target[1] > 0) return vParts[0] === 0 && vParts[1] === target[1];\n return vParts[0] === 0 && vParts[1] === 0 && vParts[2] === target[2];\n case '~':\n // ~1.2.3 → >=1.2.3 <1.3.0\n if (cmp < 0) return false;\n return vParts[0] === target[0] && vParts[1] === target[1];\n default:\n return false;\n }\n}\n\nfunction parseSemver(s: string): [number, number, number] | null {\n const m = s.trim().match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-[a-zA-Z0-9.-]+)?$/);\n if (!m) return null;\n return [Number(m[1]), Number(m[2]), Number(m[3])];\n}\n\nfunction compareSemver(a: [number, number, number], b: [number, number, number]): number {\n for (let i = 0; i < 3; i++) {\n if (a[i] !== b[i]) return a[i] - b[i];\n }\n return 0;\n}\n\n/**\n * Test seam — expose internal helpers for unit tests without making\n * them part of the CLI's public surface. Same pattern as\n * `lib/tarball.ts#__forTests`.\n */\nexport const __forTests = {\n rangeSatisfied,\n pickMatching,\n parseSemver,\n compareSemver,\n};\n","/**\n * `dashwise deps list` — show declared cross-module dependencies.\n *\n * Pure-local read from `module.json#dependencies`. No backend call;\n * runs offline. For drift detection (does each declared dep still\n * resolve against an installed provider?) use `dashwise deps check`.\n *\n * Output shapes:\n * - Default: human-readable columns + per-dep `reads:` / `writes:`\n * summaries.\n * - `--json`: stable JSON array of `{ module, version, reads,\n * writes?, purpose }` — same shape as the manifest's\n * `dependencies[]` entries. Pipes cleanly into `jq`.\n *\n * Spec: dashwise-devops-docs/plans/modules-sdk-query-v1.md §9.\n */\n\nimport { readManifestOrThrow, type ManifestDependency } from '../../lib/manifest-io.js';\nimport { code, dim, fail, info, out } from '../../lib/output.js';\n\nexport interface DepsListOptions {\n dir?: string;\n json?: boolean;\n}\n\nexport async function depsListCommand(options: DepsListOptions): Promise<number> {\n let manifest;\n try {\n manifest = readManifestOrThrow(options.dir);\n } catch (err) {\n fail((err as Error).message);\n return 1;\n }\n\n const deps: ManifestDependency[] = manifest.dependencies ?? [];\n\n if (options.json) {\n // Stable, pipe-friendly. Empty deps list → empty array (not null);\n // jq consumers don't have to handle the absent-key case.\n out(JSON.stringify(deps, null, 2));\n return 0;\n }\n\n if (deps.length === 0) {\n info('No dependencies declared in module.json.');\n info(`Run ${code('dashwise deps add <provider-slug>')} to add one.`);\n return 0;\n }\n\n out(`${deps.length} dependenc${deps.length === 1 ? 'y' : 'ies'} declared:`);\n out('');\n for (const dep of deps) {\n out(` ${code(dep.module)}@${dep.version}`);\n out(` ${dim('purpose:')} ${dep.purpose}`);\n if (dep.reads.length > 0) {\n out(` ${dim('reads:')}`);\n for (const r of dep.reads) {\n out(` ${code(r.table)} → ${r.fields.join(', ')}`);\n }\n }\n if (dep.writes && dep.writes.length > 0) {\n out(` ${dim('writes:')}`);\n for (const w of dep.writes) {\n out(\n ` ${code(w.table)} → ${w.fields.join(', ')} (${w.operations.join('/')})`,\n );\n }\n }\n out('');\n }\n return 0;\n}\n","/**\n * `dashwise deps remove <provider-slug>` — delete the dep entry from\n * `module.json#dependencies`.\n *\n * Pure-local mutation. Idempotent: removing a slug that's not declared\n * is treated as a no-op + reported (exit 0). Confirmation prompt\n * unless `--yes` is passed.\n *\n * After successful removal, prints a reminder to re-run\n * `dashwise module generate` so the typed wrappers no longer reference\n * the removed dep. (Generated `deps.<member>` access becomes a\n * compile error in consumer code — that's the right surface to catch\n * stale references.)\n */\n\nimport { isCancel, select } from '@clack/prompts';\nimport {\n readManifestOrThrow,\n writeManifest,\n type ManifestDependency,\n} from '../../lib/manifest-io.js';\nimport { code, fail, info, success } from '../../lib/output.js';\n\nexport interface DepsRemoveOptions {\n dir?: string;\n /** Skip the confirmation prompt (CI / scripts). */\n yes?: boolean;\n}\n\nexport async function depsRemoveCommand(\n providerSlug: string,\n options: DepsRemoveOptions,\n): Promise<number> {\n if (!providerSlug || typeof providerSlug !== 'string') {\n fail('Usage: `dashwise deps remove <provider-slug>`');\n return 1;\n }\n\n let manifest;\n try {\n manifest = readManifestOrThrow(options.dir);\n } catch (err) {\n fail((err as Error).message);\n return 1;\n }\n\n const deps: ManifestDependency[] = manifest.dependencies ?? [];\n const target = deps.find((d) => d.module === providerSlug);\n if (!target) {\n // Idempotent — not an error. Mirrors `apt remove` / `npm uninstall`\n // semantics for \"wasn't installed anyway.\"\n info(`No dependency on ${code(providerSlug)} declared; nothing to remove.`);\n return 0;\n }\n\n if (!options.yes && process.stdout.isTTY) {\n const answer = await select({\n message: `Remove dependency on ${providerSlug}?`,\n options: [\n { value: 'go', label: 'Yes, remove it' },\n { value: 'cancel', label: 'No, keep it' },\n ],\n initialValue: 'go',\n });\n if (isCancel(answer) || answer === 'cancel') {\n info('Aborted.');\n return 130;\n }\n }\n\n manifest.dependencies = deps.filter((d) => d.module !== providerSlug);\n // Normalize: if the array became empty, drop the key entirely so the\n // manifest matches what `dashwise module init` emits for a fresh\n // module (no `dependencies` key at all).\n if ((manifest.dependencies as ManifestDependency[]).length === 0) {\n delete manifest.dependencies;\n }\n\n try {\n writeManifest(manifest, options.dir);\n } catch (err) {\n fail(`Could not write manifest: ${(err as Error).message}`);\n return 1;\n }\n\n success(`Removed dependency on ${code(providerSlug)}.`);\n info(`Run ${code('dashwise module generate')} to refresh typed wrappers.`);\n return 0;\n}\n","/**\n * `dashwise query` — run typed queries against the local module's\n * installation via the @dashai/sdk query plane.\n *\n * Three modes:\n * --inline \"<expr>\" Evaluate a one-liner. `qb`, `deps`, `db` are\n * pre-bound to the local module's generated SDK.\n * Example:\n * dashwise query --inline \"qb.tasks.where({done:false}).count()\"\n * --file <path> Dynamic-import a .mjs/.js file. The file should\n * export a default that's either a Query, an\n * AggQuery, or a Promise.\n * Example file:\n * import { qb } from '@dashai/generated';\n * export default qb.tasks.where({done:false}).limit(20);\n * --repl Open a Node REPL with the generated SDK pre-bound.\n * Top-level await supported. Ctrl-D to exit.\n *\n * All three modes:\n * - Run in the current directory (must contain `module.json` +\n * `node_modules/@dashai/generated`).\n * - Load env from `.env.local` if present (matches the scaffold's\n * dev-loop convention); DASHWISE_API_URL / _INSTALLATION_ID /\n * _API_TOKEN must be set before the SDK can hit the backend.\n * - Print the result as pretty-printed JSON. `--json` flag emits\n * compact JSON for piping.\n *\n * v1 limits:\n * - --file accepts .mjs / .js only. .ts requires `tsx` which we\n * don't bundle yet. Workaround: `npx tsx <path>` directly.\n * - --inline expression must be valid JS (or `await`-friendly\n * pattern). TS syntax not supported in --inline either.\n *\n * Spec: dashwise-devops-docs/plans/modules-sdk-query-v1.md §6.3, §9.\n */\n\nimport { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join, resolve as pathResolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { manifestPath, readManifestOrThrow } from '../lib/manifest-io.js';\nimport { code, dim, fail, info, out } from '../lib/output.js';\n\nexport interface QueryCommandOptions {\n dir?: string;\n inline?: string;\n file?: string;\n repl?: boolean;\n json?: boolean;\n /**\n * Phase 5 `.explain()` flag (2026-05-19). When true, the runner\n * calls `.explain()` on the resulting Query/JoinedQuery/AggQuery\n * (returning the Postgres plan envelope) instead of `.execute()`.\n * No-op for `--repl` mode — REPL users call `.explain()` themselves.\n *\n * Backend MVP supports joined queries only; bare own/dep/view paths\n * reject server-side with EXPLAIN_NOT_SUPPORTED_YET. The CLI passes\n * the call through unchanged and surfaces the typed error to the\n * caller.\n */\n explain?: boolean;\n /**\n * Phase 6 streaming flag (2026-05-20). When true, the runner calls\n * `.stream()` instead of `.execute()` and prints rows incrementally\n * as JSON-lines (one row per line, terminated by `\\n`). Lets users\n * see progress on big queries + Ctrl-C cleanly midway. Mutually\n * exclusive with `--explain` (different ops) and `--repl` (REPL\n * users call `.stream()` themselves and use `for await`).\n *\n * `--json` is implied — streaming always emits JSON-lines, never\n * the pretty-printed result wrapper. Bare-array `--json` output is\n * what most users want anyway when piping into `jq`.\n */\n stream?: boolean;\n}\n\nexport async function queryCommand(options: QueryCommandOptions): Promise<number> {\n const projectRoot = pathResolve(options.dir ?? process.cwd());\n\n // Sanity: must be inside a module project.\n try {\n readManifestOrThrow(projectRoot);\n } catch (err) {\n fail((err as Error).message);\n return 1;\n }\n\n // Must have run `dashwise module generate` so @dashai/generated\n // exists. Surface the missing-package case with the right next step.\n const generatedPath = join(\n projectRoot,\n 'node_modules',\n '@dashai',\n 'generated',\n );\n if (!existsSync(generatedPath)) {\n fail(\n `No ${code('@dashai/generated')} in ${code('node_modules')}. Run ${code('dashwise module generate')} first.`,\n );\n return 1;\n }\n\n // Best-effort env loading from .env.local — matches what the\n // scaffold ships + what `dashwise module dev` would inject. The\n // generated SDK reads these via `process.env.DASHWISE_*` so we\n // hydrate `process.env` directly (vs. a richer dotenv parser —\n // the format is k=v lines, no quoting needed for the dev env).\n hydrateEnvFromDotenvLocal(projectRoot);\n\n // Exactly one mode flag must be set.\n const modes = [\n options.inline !== undefined ? 'inline' : null,\n options.file !== undefined ? 'file' : null,\n options.repl === true ? 'repl' : null,\n ].filter(Boolean);\n if (modes.length === 0) {\n fail('Pass one of: `--inline \"expr\"`, `--file <path>`, or `--repl`.');\n return 1;\n }\n if (modes.length > 1) {\n fail(`--inline / --file / --repl are mutually exclusive (got: ${modes.join(', ')}).`);\n return 1;\n }\n\n // Phase 5 (2026-05-19): --explain is meaningless with --repl (REPL\n // users call .explain() themselves). Reject the combo with a clear\n // message rather than silently ignoring.\n if (options.explain === true && options.repl === true) {\n fail('--explain has no effect with --repl. In the REPL, call `.explain()` directly on your builder.');\n return 1;\n }\n // Phase 6 streaming (2026-05-20): same logic for --stream + --repl.\n if (options.stream === true && options.repl === true) {\n fail('--stream has no effect with --repl. In the REPL, call `.stream()` directly + use `for await`.');\n return 1;\n }\n // --explain and --stream are different operations (return plan vs.\n // stream rows). Mutual exclusion prevents accidental misuse like\n // \"stream the explain plan\" which has no defined semantic.\n if (options.explain === true && options.stream === true) {\n fail('--explain and --stream are mutually exclusive — `.explain()` returns a single plan envelope; `.stream()` yields rows.');\n return 1;\n }\n const explain = options.explain === true;\n const stream = options.stream === true;\n\n if (options.repl) return runRepl(generatedPath);\n if (options.file !== undefined)\n return runFile(options.file, projectRoot, options.json === true, explain, stream);\n if (options.inline !== undefined)\n return runInline(\n options.inline,\n projectRoot,\n generatedPath,\n options.json === true,\n explain,\n stream,\n );\n // Unreachable per the modes check above.\n return 1;\n}\n\n// ── Mode: --inline ──────────────────────────────────────────────────────\n\n/**\n * Evaluate a one-liner expression with `qb`, `deps`, `db` in scope.\n *\n * Strategy: write a temp `.mjs` file that imports the generated SDK\n * + evaluates the expression as a default export, then dynamic-import\n * it. The temp file lives in tmpdir; cleaned up on the way out (or\n * left on disk if the process is killed — best-effort cleanup).\n *\n * Reason for temp-file vs. `new Function(...)`: dynamic import gives\n * us proper ESM semantics + module-resolution against `node_modules/@dashai/generated`,\n * which `new Function` doesn't. Cost is one syscall per invocation.\n */\nasync function runInline(\n expression: string,\n projectRoot: string,\n _generatedPath: string,\n jsonCompact: boolean,\n explain: boolean,\n stream: boolean,\n): Promise<number> {\n const tmpDir = mkdtempSync(join(tmpdir(), 'dashwise-query-'));\n const tmpFile = join(tmpDir, 'inline.mjs');\n // Strip a trailing semicolon if present so the embedded expression\n // is a valid value position.\n const cleanedExpr = expression.trim().replace(/;\\s*$/, '');\n const source = [\n \"import { qb, deps, db } from '@dashai/generated';\",\n `export default (async () => (${cleanedExpr}))();`,\n '',\n ].join('\\n');\n writeFileSync(tmpFile, source, 'utf-8');\n try {\n return await importAndPrint(tmpFile, projectRoot, jsonCompact, explain, stream);\n } finally {\n try {\n rmSync(tmpDir, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup. tmp dirs get reaped by the OS.\n }\n }\n}\n\n// ── Mode: --file ────────────────────────────────────────────────────────\n\n/**\n * Run a `.mjs` / `.js` file via dynamic import. The file should\n * export a default that's a Query / AggQuery / Promise / value.\n *\n * `.ts` files are NOT supported in v1 — would require bundling `tsx`\n * or running through `node --import tsx`. Users can shell out via\n * `npx tsx <file>` directly for TS today.\n */\nasync function runFile(\n file: string,\n projectRoot: string,\n jsonCompact: boolean,\n explain: boolean,\n stream: boolean,\n): Promise<number> {\n const abs = pathResolve(projectRoot, file);\n if (!existsSync(abs)) {\n fail(`File not found: ${code(abs)}`);\n return 1;\n }\n if (!/\\.(mjs|js)$/.test(abs)) {\n fail(\n `Only .mjs / .js files are supported in v1. For .ts files, run ${code('npx tsx <file>')} directly. (Tracked: bundle tsx for native .ts support.)`,\n );\n return 1;\n }\n return importAndPrint(abs, projectRoot, jsonCompact, explain, stream);\n}\n\n// ── Mode: --repl ────────────────────────────────────────────────────────\n\n/**\n * Open an interactive Node REPL with the generated SDK pre-bound.\n *\n * Implementation: Node's built-in `repl` module. The generated SDK is\n * imported once at startup + its exports (`qb`, `deps`, `db`) are\n * added to the REPL's context object. Top-level await works because\n * Node's REPL has supported it since v12.\n *\n * Exit with `.exit` or Ctrl-D. Stack traces from query errors stay\n * in the REPL so users can keep iterating.\n */\nasync function runRepl(generatedPath: string): Promise<number> {\n let generated: Record<string, unknown>;\n try {\n generated = await dynamicImportFromPath(generatedPath);\n } catch (err) {\n fail(\n `Could not import ${code('@dashai/generated')}: ${(err as Error).message}`,\n );\n info(\n `Try running ${code('dashwise module generate')} to refresh the typed wrappers.`,\n );\n return 1;\n }\n\n info(`${code('dashwise query --repl')} — Node REPL with qb / deps / db pre-bound.`);\n info(`Try: ${code('await qb.<table>.execute()')} Ctrl-D to exit.`);\n out('');\n\n // Dynamic require for Node's repl module — keep it lazy so the\n // command's startup cost stays low for the inline/file modes.\n const repl = await import('node:repl');\n const server = repl.start({\n prompt: `${code('dashwise')}${dim('>')} `,\n useColors: true,\n useGlobal: false,\n });\n // Inject the generated SDK's exports into the REPL context so\n // users type `qb.tasks.execute()` without imports.\n for (const [key, value] of Object.entries(generated)) {\n Object.defineProperty(server.context, key, {\n configurable: false,\n enumerable: true,\n writable: false,\n value,\n });\n }\n\n return new Promise<number>((resolveExit) => {\n server.on('exit', () => {\n out(dim('Goodbye.'));\n resolveExit(0);\n });\n });\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────\n\n/**\n * Dynamic-import `file` (resolving from `projectRoot`'s\n * `node_modules`), await the default export if it's a Promise / Query\n * / AggQuery, and pretty-print the result.\n */\nasync function importAndPrint(\n file: string,\n projectRoot: string,\n jsonCompact: boolean,\n explain: boolean,\n stream: boolean,\n): Promise<number> {\n // Switch cwd so bare imports inside the file resolve against the\n // project's `node_modules` instead of the CLI's own. Saved + restored\n // around the import — defensive in case the consumer's code touches\n // process.cwd elsewhere.\n const originalCwd = process.cwd();\n try {\n process.chdir(projectRoot);\n const url = pathToFileURL(file).toString();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod: any = await import(url);\n let result = mod.default;\n // Default-export shapes we handle:\n // - Promise<T> → await it\n // - Query / AggQuery → .execute() (or .explain() if --explain,\n // or .stream() if --stream)\n // - Anything else → print as-is\n if (result && typeof result.then === 'function') {\n result = await result;\n }\n if (result && typeof result.toAst === 'function') {\n // Phase 6 streaming (2026-05-20): --stream takes precedence over\n // --execute (they're mutually exclusive at the option-parse level,\n // but ordering matters at dispatch time). Iterate the async\n // iterable + print one JSON-line per row so consumers can pipe\n // into jq / line-oriented tools.\n if (stream && typeof result.stream === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const iterable = result.stream() as AsyncIterable<unknown>;\n let rowCount = 0;\n for await (const row of iterable) {\n out(JSON.stringify(row));\n rowCount++;\n }\n // Emit a final summary on stderr so it doesn't pollute the\n // JSON-lines stdout stream. Consumers piping into jq see ONLY\n // the data; humans see \"streamed N rows\" at the bottom.\n if (!jsonCompact) {\n info(`Streamed ${rowCount} row${rowCount === 1 ? '' : 's'}.`);\n }\n return 0;\n }\n // Phase 5 `.explain()` (2026-05-19): if --explain was passed,\n // call .explain() instead of .execute(). All three builder\n // shapes (Query, JoinedQuery, AggQuery) expose .explain() since\n // the SDK slice landed alongside this CLI flag.\n if (explain && typeof result.explain === 'function') {\n result = await result.explain();\n } else if (typeof result.execute === 'function') {\n result = await result.execute();\n }\n }\n if (jsonCompact) {\n out(JSON.stringify(result));\n } else {\n out(JSON.stringify(result, null, 2));\n }\n return 0;\n } catch (err) {\n fail(`Query failed: ${(err as Error).message}`);\n if (process.env.DASHWISE_DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n return 1;\n } finally {\n process.chdir(originalCwd);\n }\n}\n\n/**\n * Resolve `@dashai/generated` from the project's node_modules and\n * dynamic-import its entry. Returns the module's exports object.\n */\nasync function dynamicImportFromPath(\n generatedDir: string,\n): Promise<Record<string, unknown>> {\n // Project-local @dashai/generated has `index.js` per the codegen\n // emitter; resolve directly rather than going through Node's package\n // resolution to keep the path deterministic.\n const entry = join(generatedDir, 'index.js');\n if (!existsSync(entry)) {\n throw new Error(`Expected ${entry} to exist. Did 'dashwise module generate' run?`);\n }\n const url = pathToFileURL(entry).toString();\n return (await import(url)) as Record<string, unknown>;\n}\n\n/**\n * Read `.env.local` from `projectRoot` and merge into `process.env`\n * without overwriting existing values. Supports `KEY=value` lines\n * + `#`-prefixed comments + blank lines — same dialect the scaffold's\n * `.env.local.example` uses. Robust enough for the dev-loop env.\n */\nfunction hydrateEnvFromDotenvLocal(projectRoot: string): void {\n const envFile = join(projectRoot, '.env.local');\n if (!existsSync(envFile)) return;\n const raw = readFileSync(envFile, 'utf-8');\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (trimmed.length === 0 || trimmed.startsWith('#')) continue;\n const eq = trimmed.indexOf('=');\n if (eq <= 0) continue;\n const key = trimmed.slice(0, eq).trim();\n let value = trimmed.slice(eq + 1).trim();\n // Strip a single surrounding quote pair if present.\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n}\n\n// Use manifestPath() from manifest-io so the import isn't tree-shaken\n// for unused-import lint without an actual call.\nvoid manifestPath;\n","/**\n * `dashwise module query-log` — read the per-module SDK query log.\n *\n * Hits `GET /api/modules/:moduleId/query-log?since=...&slow=...&limit=...`\n * (added in dashwise-backend Phase 6 slice 6.4). Workspace-member-\n * scoped on the server side — non-members get 403 NOT_A_WORKSPACE_MEMBER.\n *\n * Module resolution order:\n * 1. `--module <id-or-slug>` if provided\n * 2. `module.json#module.slug` in the current directory if present\n * 3. Otherwise fail with a \"which module?\" message\n *\n * Output: column-aligned table by default; pass `--json` for compact\n * JSON suitable for piping into `jq`.\n *\n * `--tail` polls every 5s for new entries (the last-seen `created_at`\n * becomes the next poll's `since` filter). Stops on Ctrl-C. Server\n * still enforces the 500-row response cap per poll, so very busy\n * modules may see \"(more entries above)\" between polls if log\n * volume exceeds 500/5s.\n */\n\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport { readManifestOrThrow } from '../../lib/manifest-io.js';\nimport { code, dim, fail, info, out } from '../../lib/output.js';\n\nexport interface ModuleQueryLogOptions {\n /**\n * Module to read the log for. Accepts a numeric id (`123`) or a\n * slug (`my-module`). If omitted, falls back to the slug in the\n * current directory's `module.json`.\n */\n module?: string;\n /**\n * Filter to slow queries only (duration_ms > 500 — matches the\n * SDK/backend slow-query threshold).\n */\n slow?: boolean;\n /**\n * Filter rows where `created_at >= NOW() - <since>`. Duration\n * shorthand (`30m`, `1h`, `2d`, `7d`) or ISO 8601 timestamp.\n * Passed through to the backend's validator.\n */\n since?: string;\n /**\n * Max rows to fetch per call. Default 50; backend caps at 500.\n */\n limit?: number;\n /**\n * Poll for new entries every 5s. Stops on Ctrl-C. Mutually\n * exclusive with `--json` (tail mode prints the table format\n * incrementally).\n */\n tail?: boolean;\n /**\n * Emit compact JSON instead of the table. Useful for piping into\n * `jq` / scripting. Ignored when `--tail` is set.\n */\n json?: boolean;\n /**\n * Override project directory (for `module.json` slug lookup).\n * Defaults to `process.cwd()`. Only consulted when `--module` is\n * absent.\n */\n dir?: string;\n}\n\ninterface QueryLogRow {\n id: string;\n request_id: string;\n installation_id: number;\n module_id: number;\n endpoint: 'query' | 'explain';\n ast_hash: string | null;\n duration_ms: number;\n row_count: number | null;\n error_code: string | null;\n error_message: string | null;\n created_at: string;\n}\n\ninterface QueryLogResponse {\n entries: QueryLogRow[];\n count: number;\n}\n\ninterface ModuleByIdResponse {\n id: number;\n slug: string;\n}\n\nconst POLL_INTERVAL_MS = 5_000;\n\nexport async function moduleQueryLogCommand(\n options: ModuleQueryLogOptions,\n): Promise<number> {\n // Resolve the moduleId. The user can pass `--module <id-or-slug>`\n // or we infer from the current directory's manifest.\n let moduleId: number;\n try {\n moduleId = await resolveModuleId(options.module, options.dir);\n } catch (err) {\n fail((err as Error).message);\n return 1;\n }\n\n if (options.tail) {\n return runTail(moduleId, options);\n }\n return runOnce(moduleId, options);\n}\n\n// ── One-shot mode (default) ──────────────────────────────────────\n\nasync function runOnce(\n moduleId: number,\n options: ModuleQueryLogOptions,\n): Promise<number> {\n const params: Record<string, string> = {};\n if (options.slow) params.slow = 'true';\n if (options.since) params.since = options.since;\n if (typeof options.limit === 'number') params.limit = String(options.limit);\n const qs = new URLSearchParams(params).toString();\n const path = `/api/modules/${moduleId}/query-log${qs ? `?${qs}` : ''}`;\n\n let body: QueryLogResponse;\n try {\n body = await apiRequest<QueryLogResponse>('GET', path);\n } catch (err) {\n return handleApiError(err);\n }\n\n if (options.json) {\n out(JSON.stringify(body));\n return 0;\n }\n\n if (body.entries.length === 0) {\n info(\n options.slow\n ? 'No slow queries in the requested window.'\n : 'No query log entries in the requested window.',\n );\n return 0;\n }\n\n renderTable(body.entries);\n out('');\n info(`${body.count} ${body.count === 1 ? 'entry' : 'entries'}.`);\n return 0;\n}\n\n// ── --tail mode ──────────────────────────────────────────────────\n\nasync function runTail(\n moduleId: number,\n options: ModuleQueryLogOptions,\n): Promise<number> {\n // Initial fetch — use whatever filters the user passed plus a\n // reasonable starting window if `--since` wasn't set.\n const initialParams: Record<string, string> = {};\n if (options.slow) initialParams.slow = 'true';\n initialParams.since = options.since ?? '5m';\n if (typeof options.limit === 'number') initialParams.limit = String(options.limit);\n const initialQs = new URLSearchParams(initialParams).toString();\n\n info(`Tailing query log for module ${moduleId}. Ctrl-C to stop.`);\n out('');\n\n // Track the most-recent created_at across polls so we can fetch\n // strictly-new rows. The backend's `since` param does a NOW()-based\n // window, so we use a small overlap (2s) to ensure we don't miss\n // entries whose created_at lands between poll cycles. De-dup by\n // request_id locally to suppress overlap repeats.\n const seenIds = new Set<string>();\n let firstPoll = true;\n\n // Print headers once up front; subsequent polls append rows without\n // re-printing.\n printTableHeader();\n\n // Initial poll uses the user-specified since; subsequent polls use\n // a fixed 7s window (5s poll interval + 2s overlap).\n while (true) {\n try {\n const path = `/api/modules/${moduleId}/query-log?${firstPoll ? initialQs : buildTailParams(options)}`;\n const body = await apiRequest<QueryLogResponse>('GET', path);\n\n // Print rows in chronological order (response is DESC, reverse\n // for the tail's natural \"latest at bottom\" reading order).\n const newRows: QueryLogRow[] = [];\n for (const row of [...body.entries].reverse()) {\n if (seenIds.has(row.request_id)) continue;\n seenIds.add(row.request_id);\n newRows.push(row);\n }\n for (const row of newRows) {\n out(formatRow(row));\n }\n firstPoll = false;\n } catch (err) {\n // Don't crash the tail on transient errors — log + continue.\n info(dim(`(tail poll error: ${(err as Error).message})`));\n }\n await sleep(POLL_INTERVAL_MS);\n }\n}\n\nfunction buildTailParams(options: ModuleQueryLogOptions): string {\n const params: Record<string, string> = { since: '7s' };\n if (options.slow) params.slow = 'true';\n if (typeof options.limit === 'number') params.limit = String(options.limit);\n return new URLSearchParams(params).toString();\n}\n\n// ── Module-id resolution ─────────────────────────────────────────\n\nasync function resolveModuleId(\n moduleArg: string | undefined,\n dir: string | undefined,\n): Promise<number> {\n // 1. Explicit --module: numeric → use as-is; slug → lookup.\n if (moduleArg && moduleArg.length > 0) {\n const asInt = Number.parseInt(moduleArg, 10);\n if (Number.isFinite(asInt) && String(asInt) === moduleArg) {\n return asInt;\n }\n return lookupModuleIdBySlug(moduleArg);\n }\n // 2. Fall back to module.json in the project directory.\n const projectRoot = dir ?? process.cwd();\n try {\n const manifest = readManifestOrThrow(projectRoot);\n if (manifest?.module?.slug) {\n return lookupModuleIdBySlug(manifest.module.slug);\n }\n } catch {\n // Manifest absent or malformed — fall through to the error below.\n }\n throw new Error(\n `No module specified. Pass --module <id-or-slug> or run inside a module project directory containing module.json.`,\n );\n}\n\nasync function lookupModuleIdBySlug(slug: string): Promise<number> {\n const found = await apiRequest<ModuleByIdResponse>(\n 'GET',\n `/api/modules/by-slug/${encodeURIComponent(slug)}`,\n );\n if (!found || typeof found.id !== 'number') {\n throw new Error(`Module ${code(slug)} not found.`);\n }\n return found.id;\n}\n\n// ── Error handling ───────────────────────────────────────────────\n\nfunction handleApiError(err: unknown): number {\n if (err instanceof ApiError) {\n if (err.status === 401) {\n fail('Not logged in. Run `dashwise login` first.');\n return 1;\n }\n if (err.status === 403) {\n fail(\n `Forbidden — you are not a member of this module's owner workspace. ` +\n `Use \\`dashwise workspace list\\` to see what you have access to.`,\n );\n return 1;\n }\n if (err.status === 404) {\n fail(`Module not found.`);\n return 1;\n }\n }\n fail(`Could not load query log: ${(err as Error).message}`);\n return 1;\n}\n\n// ── Table rendering ──────────────────────────────────────────────\n\n/**\n * Column widths chosen to fit a typical 80-col terminal plus a\n * little slack. ID is the bigint serialized as string (up to ~19\n * digits); we show only the last 8 for compactness — the request_id\n * is the real trace anchor anyway.\n */\nconst COL_WIDTHS = {\n time: 19, // \"YYYY-MM-DD HH:MM:SS\"\n endpoint: 7, // \"query\" | \"explain\"\n ms: 6, // \"12345\" with margin\n rows: 5,\n code: 18,\n request: 12, // first 12 chars of request_id (most are UUIDs)\n};\n\nfunction renderTable(entries: QueryLogRow[]): void {\n out('');\n printTableHeader();\n // Server returns DESC (newest first) — preserve that for one-shot\n // mode so the most-recent activity is at the top of the screen.\n for (const row of entries) {\n out(formatRow(row));\n }\n}\n\nfunction printTableHeader(): void {\n out(\n [\n 'TIME'.padEnd(COL_WIDTHS.time),\n 'ENDPT'.padEnd(COL_WIDTHS.endpoint),\n 'MS'.padStart(COL_WIDTHS.ms),\n 'ROWS'.padStart(COL_WIDTHS.rows),\n 'CODE'.padEnd(COL_WIDTHS.code),\n 'REQ',\n ].join(' '),\n );\n out(\n [\n '-'.repeat(COL_WIDTHS.time),\n '-'.repeat(COL_WIDTHS.endpoint),\n '-'.repeat(COL_WIDTHS.ms),\n '-'.repeat(COL_WIDTHS.rows),\n '-'.repeat(COL_WIDTHS.code),\n '-'.repeat(COL_WIDTHS.request),\n ].join(' '),\n );\n}\n\nfunction formatRow(row: QueryLogRow): string {\n const time = formatTimestamp(row.created_at);\n const endpoint = row.endpoint.padEnd(COL_WIDTHS.endpoint);\n const ms = String(row.duration_ms).padStart(COL_WIDTHS.ms);\n const rows =\n row.row_count === null ? '—'.padStart(COL_WIDTHS.rows) : String(row.row_count).padStart(COL_WIDTHS.rows);\n const errCode = row.error_code ?? '';\n const codeCol = errCode\n ? code(errCode).padEnd(COL_WIDTHS.code + (code(errCode).length - errCode.length))\n : 'OK'.padEnd(COL_WIDTHS.code);\n const req = row.request_id.slice(0, COL_WIDTHS.request);\n return [time, endpoint, ms, rows, codeCol, dim(req)].join(' ');\n}\n\nfunction formatTimestamp(iso: string): string {\n // YYYY-MM-DD HH:MM:SS for compact display; preserves UTC if the\n // input is Z-suffixed. We deliberately don't convert to local TZ\n // here so log entries are reproducible across consumers in\n // different timezones.\n return iso.slice(0, 19).replace('T', ' ');\n}\n\n// ── Misc ─────────────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * `dashwise module action-log` — read the per-installation server-action\n * audit log (cross-module + own-module dispatches).\n *\n * Hits `GET /api/modules/runtime/installations/:installationId/action-log`\n * (added in dashwise-backend Phase 7 slice 7.5a). Workspace-member-scoped\n * server-side — non-members get 403 NOT_A_WORKSPACE_MEMBER.\n *\n * **Why per-installation, not per-module**: cross-module dispatches are\n * events between TWO installations. The audit row keys by\n * installation id (not module id). The CLI surfaces either side\n * (`--role caller` for outbound; `--role provider` for inbound) so\n * authors can debug both directions from the same command.\n *\n * The user provides `--installation <id>` directly. A `--module <slug>`\n * convenience that resolves to the user's default-workspace\n * installation is a planned follow-up; it needs a new backend\n * \"list-installations-by-module-in-workspace\" endpoint.\n *\n * Output: column-aligned table by default; pass `--json` for compact\n * JSON suitable for piping into `jq`.\n *\n * `--tail` polls every 5s for new entries (last-seen `created_at`\n * becomes the next poll's `since` filter). Stops on Ctrl-C. Server\n * still enforces the 500-row response cap per poll.\n */\n\nimport { ApiError, apiRequest } from '../../lib/api-client.js';\nimport { code, dim, fail, info, out } from '../../lib/output.js';\n\nexport interface ModuleActionLogOptions {\n /**\n * Installation to read the log for (numeric id). Mutually exclusive\n * with `module` — exactly one must be set. (Validated by the CLI\n * binder; the action handler treats both as optional + checks.)\n */\n installation?: number;\n /**\n * Module slug — resolves to the caller's accessible installation\n * via `GET /api/modules/by-slug/:slug/my-installation`. Convenience\n * for the common case where the user has one workspace's\n * installation; multi-workspace authors should use `--installation`\n * with an explicit id (or `dashwise workspace use <slug>` to fix\n * the default).\n */\n module?: string;\n /**\n * Which side of cross-module dispatches to query.\n * - `caller` (default) → outbound actions THIS installation invoked\n * - `provider` → inbound actions OTHER modules invoked on THIS installation\n */\n role?: 'caller' | 'provider';\n /**\n * Filter to slow actions only (elapsed_ms > 500 — matches the\n * SDK/backend slow threshold). Uses the partial slow-action index.\n */\n slow?: boolean;\n /**\n * Filter rows where `created_at >= NOW() - <since>`. Duration\n * shorthand (`30m`, `1h`, `2d`, `7d`) or ISO 8601 timestamp.\n */\n since?: string;\n /** Filter to cross-module dispatches only (cross_module=true rows). */\n crossModuleOnly?: boolean;\n /** Max rows per call. Default 50; backend caps at 500. */\n limit?: number;\n /**\n * Poll every 5s for new entries. Stops on Ctrl-C. Mutually exclusive\n * with `--json` (tail mode prints incrementally as rows arrive).\n */\n tail?: boolean;\n /** Compact JSON instead of the table. Ignored when `--tail` is set. */\n json?: boolean;\n}\n\ninterface ActionLogRow {\n id: string;\n request_id: string;\n caller_installation_id: number;\n caller_module_slug: string;\n caller_user_id: number | null;\n provider_installation_id: number;\n provider_module_slug: string;\n action_name: string;\n input_hash: string;\n output_hash: string | null;\n ok: boolean;\n error_code: string | null;\n elapsed_ms: number;\n cross_module: boolean;\n created_at: string;\n}\n\ninterface ActionLogResponse {\n entries: ActionLogRow[];\n count: number;\n}\n\nconst POLL_INTERVAL_MS = 5_000;\n\nexport async function moduleActionLogCommand(\n options: ModuleActionLogOptions,\n): Promise<number> {\n // Validate mutually-exclusive scope flags.\n if (options.installation === undefined && options.module === undefined) {\n fail('Must pass either `--installation <id>` or `--module <slug>`.');\n return 1;\n }\n if (options.installation !== undefined && options.module !== undefined) {\n fail('`--installation` and `--module` are mutually exclusive — pass one or the other.');\n return 1;\n }\n\n // If --module was passed, resolve to an installation id.\n let installationId = options.installation;\n if (installationId === undefined && options.module !== undefined) {\n try {\n const resolved = await apiRequest<{ installation_id: number; module_slug: string }>(\n 'GET',\n `/api/modules/by-slug/${encodeURIComponent(options.module)}/my-installation`,\n );\n installationId = resolved.installation_id;\n } catch (err) {\n return mapAndPrintError(err, options.json);\n }\n }\n if (options.tail) {\n return runTail(installationId as number, options);\n }\n return runOnce(installationId as number, options);\n}\n\n// ── One-shot mode ────────────────────────────────────────────────\n\nasync function runOnce(installationId: number, options: ModuleActionLogOptions): Promise<number> {\n const params: Record<string, string> = {};\n if (options.role !== undefined) params.role = options.role;\n if (options.slow) params.slow = 'true';\n if (options.crossModuleOnly) params.cross_module_only = 'true';\n if (options.since !== undefined) params.since = options.since;\n if (options.limit !== undefined) params.limit = String(options.limit);\n\n let response: ActionLogResponse;\n try {\n response = await apiRequest<ActionLogResponse>(\n 'GET',\n `/api/modules/runtime/installations/${installationId}/action-log?${new URLSearchParams(params).toString()}`,\n );\n } catch (err) {\n return mapAndPrintError(err, options.json);\n }\n\n if (options.json) {\n out(JSON.stringify(response));\n return 0;\n }\n\n printTable(response.entries);\n if (response.entries.length === 0) {\n info('No entries.');\n }\n return 0;\n}\n\n// ── Tail mode ────────────────────────────────────────────────────\n\nasync function runTail(installationId: number, options: ModuleActionLogOptions): Promise<number> {\n if (options.json) {\n fail('`--tail` and `--json` are mutually exclusive.');\n return 1;\n }\n info(`Tailing action log for installation ${code(String(installationId))} every 5s. Ctrl-C to stop.`);\n\n let lastSeen: string | undefined;\n const printed = new Set<string>();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const params: Record<string, string> = {};\n if (options.role !== undefined) params.role = options.role;\n if (options.slow) params.slow = 'true';\n if (options.crossModuleOnly) params.cross_module_only = 'true';\n if (lastSeen !== undefined) params.since = lastSeen;\n else if (options.since !== undefined) params.since = options.since;\n params.limit = String(options.limit ?? 100);\n\n try {\n const response = await apiRequest<ActionLogResponse>(\n 'GET',\n `/api/modules/runtime/installations/${installationId}/action-log?${new URLSearchParams(params).toString()}`,\n );\n // Backend returns rows newest-first; we want oldest-first when\n // tailing so the user reads down the page. Reverse + dedup by id.\n const fresh = response.entries.filter((e) => !printed.has(e.id)).reverse();\n if (fresh.length > 0) {\n for (const entry of fresh) {\n printed.add(entry.id);\n printRow(entry);\n }\n // Update since-anchor to the newest row we just printed.\n lastSeen = fresh[fresh.length - 1].created_at;\n }\n } catch (err) {\n // Tail mode swallows transient errors + keeps polling. Fatal\n // (401/403) drops out so the user knows to re-login.\n if (err instanceof ApiError && (err.status === 401 || err.status === 403)) {\n return mapAndPrintError(err, false);\n }\n dim(`(tail: transient error — ${(err as Error).message})`);\n }\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n}\n\n// ── Output ───────────────────────────────────────────────────────\n\nfunction printTable(rows: ActionLogRow[]): void {\n if (rows.length === 0) {\n out('');\n out(' (no entries)');\n out('');\n return;\n }\n const widths = {\n time: 19,\n elapsed: 5,\n cross: 5,\n caller: 18,\n action: 22,\n code: 18,\n };\n out('');\n out(\n `${'TIME'.padEnd(widths.time)} ${'MS'.padStart(widths.elapsed)} ${'CROSS'.padEnd(widths.cross)} ${'CALLER'.padEnd(widths.caller)} ${'ACTION'.padEnd(widths.action)} ${'CODE'.padEnd(widths.code)}`,\n );\n out(\n `${'-'.repeat(widths.time)} ${'-'.repeat(widths.elapsed)} ${'-'.repeat(widths.cross)} ${'-'.repeat(widths.caller)} ${'-'.repeat(widths.action)} ${'-'.repeat(widths.code)}`,\n );\n for (const r of rows) {\n printRow(r);\n }\n out('');\n info(`${rows.length} entr${rows.length === 1 ? 'y' : 'ies'}.`);\n}\n\nfunction printRow(r: ActionLogRow): void {\n const time = r.created_at.slice(0, 19).replace('T', ' ');\n const cross = r.cross_module ? code('yes') : dim(' no');\n const codeCol = r.ok ? dim('-') : code(r.error_code ?? 'ERROR');\n out(\n `${time.padEnd(19)} ${String(r.elapsed_ms).padStart(5)} ${cross.padEnd(5)} ${r.caller_module_slug.padEnd(18)} ${r.action_name.padEnd(22)} ${codeCol}`,\n );\n}\n\nfunction mapAndPrintError(err: unknown, json: boolean | undefined): number {\n if (err instanceof ApiError) {\n if (err.status === 401) {\n const msg = 'Not logged in. Run `dashwise login` first.';\n if (json) out(JSON.stringify({ ok: false, error: { code: 'NOT_LOGGED_IN', message: msg } }));\n else fail(msg);\n return 1;\n }\n if (err.status === 403) {\n const msg = 'Workspace-member access required for this installation.';\n if (json) out(JSON.stringify({ ok: false, error: { code: 'FORBIDDEN', message: msg } }));\n else fail(msg);\n return 1;\n }\n if (err.status === 404) {\n const msg = 'Installation not found.';\n if (json) out(JSON.stringify({ ok: false, error: { code: 'INSTALLATION_NOT_FOUND', message: msg } }));\n else fail(msg);\n return 1;\n }\n }\n const msg = `Could not fetch action log: ${(err as Error).message}`;\n if (json) out(JSON.stringify({ ok: false, error: { code: 'FETCH_FAILED', message: (err as Error).message } }));\n else fail(msg);\n return 1;\n}\n","/**\n * `dashwise` CLI entry point.\n *\n * commander-based command tree. Each command sits in `./commands/`\n * and returns a numeric exit code; the entry handler awaits the\n * result + sets `process.exitCode` accordingly. Unhandled errors\n * are caught + printed via the shared output helpers.\n */\n\nimport { Command } from 'commander';\nimport { devCommand } from './commands/dev.js';\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\nimport { profileCommand } from './commands/profile.js';\nimport { workspaceListCommand, workspaceUseCommand } from './commands/workspace.js';\nimport { moduleCloneCommand } from './commands/module/clone.js';\nimport { moduleConnectGitCommand } from './commands/module/connect-git.js';\nimport { moduleDevCommand } from './commands/module/dev.js';\nimport { moduleDiffCommand } from './commands/module/diff.js';\nimport { moduleGenerateCommand } from './commands/module/generate.js';\nimport { moduleInitCommand } from './commands/module/init.js';\nimport { moduleListCommand } from './commands/module/list.js';\nimport { modulePublishCommand } from './commands/module/publish.js';\nimport { modulePullDataCommand } from './commands/module/pull-data.js';\nimport { moduleValidateCommand } from './commands/module/validate.js';\nimport { depsAddCommand } from './commands/deps/add.js';\nimport { depsCheckCommand } from './commands/deps/check.js';\nimport { depsListCommand } from './commands/deps/list.js';\nimport { depsRemoveCommand } from './commands/deps/remove.js';\nimport { queryCommand } from './commands/query.js';\nimport { moduleQueryLogCommand } from './commands/module/query-log.js';\nimport { moduleActionLogCommand } from './commands/module/action-log.js';\nimport { fail } from './lib/output.js';\n\nconst program = new Command();\n\nprogram\n .name('dashwise')\n .description('DashWise CLI — log in, author modules, publish to the marketplace.')\n .version(getVersion(), '-v, --version', 'Show the CLI version + exit')\n .option(\n '--api-url <url>',\n 'Override DashWise backend URL (default: $DASHWISE_API_URL or saved config or http://localhost:3000)',\n );\n\nprogram\n .command('login')\n .description('Sign in via the device-code flow.')\n .option('--no-prompt', 'Skip the \"open browser\" prompt; just print the URL.')\n .option('--name <name>', 'Suggested name for the minted token (default: dashwise-cli).')\n .action(async (cmdOpts: { prompt?: boolean; name?: string }) => {\n const apiUrl = program.opts<{ apiUrl?: string }>().apiUrl;\n const exit = await loginCommand({\n ...(apiUrl !== undefined ? { apiUrl } : {}),\n noPrompt: cmdOpts.prompt === false,\n ...(cmdOpts.name !== undefined ? { name: cmdOpts.name } : {}),\n });\n process.exitCode = exit;\n });\n\nprogram\n .command('logout')\n .description('Clear the local credentials and revoke the server-side token.')\n .action(async () => {\n process.exitCode = await logoutCommand();\n });\n\nprogram\n .command('profile')\n .description('Show the current user, default workspace, and accessible workspaces.')\n .option('--json', 'Emit JSON to stdout instead of human-readable kv pairs.')\n .action(async (cmdOpts: { json?: boolean }) => {\n process.exitCode = await profileCommand({\n ...(cmdOpts.json !== undefined ? { json: cmdOpts.json } : {}),\n });\n });\n\nconst workspace = program\n .command('workspace')\n .description('Workspace context commands.');\n\nworkspace\n .command('list')\n .description('List accessible workspaces.')\n .option('--json', 'Emit JSON to stdout instead of human-readable columns.')\n .action(async (cmdOpts: { json?: boolean }) => {\n process.exitCode = await workspaceListCommand({\n ...(cmdOpts.json !== undefined ? { json: cmdOpts.json } : {}),\n });\n });\n\nworkspace\n .command('use <slug>')\n .description('Set the default workspace for subsequent commands.')\n .action(async (slug: string) => {\n process.exitCode = await workspaceUseCommand(slug);\n });\n\n// One-command local dev loop. Spawns `dashwise module dev` + `next dev`\n// together with auth env vars auto-injected from the saved CLI config —\n// collapses the historical \"two terminals + manually edit .env.local\"\n// workflow into a single command. Top-level (not under `module`) because\n// it's the daily-driver entry point most developers will spend the most\n// time with.\nprogram\n .command('dev')\n .description(\n 'One-command local dev loop: runs the manifest watcher + Next.js dev server ' +\n 'together, with `DASHWISE_API_URL`/`DASHWISE_API_TOKEN`/`DASHWISE_INSTALLATION_ID` ' +\n 'auto-injected from your saved CLI config. Run `dashwise login` first.',\n )\n .option('--dir <path>', 'Project root containing `module.json` (default: current directory).')\n .option(\n '--installation-id <id>',\n 'Override the `DASHWISE_INSTALLATION_ID` env var passed to children (default: \"local\").',\n )\n .option(\n '--api-url <url>',\n 'Override the `DASHWISE_API_URL` env var passed to children (default: saved CLI config).',\n )\n .option('--port <number>', 'Port for `next dev` (default: Next.js picks 3000 / next free).', parseIntOption)\n .option('--sdk-only', 'Only run the manifest watcher; skip `next dev`.')\n .option('--next-only', 'Only run `next dev`; skip the manifest watcher.')\n .action(\n async (cmdOpts: {\n dir?: string;\n installationId?: string;\n apiUrl?: string;\n port?: number;\n sdkOnly?: boolean;\n nextOnly?: boolean;\n }) => {\n process.exitCode = await devCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.installationId !== undefined ? { installationId: cmdOpts.installationId } : {}),\n ...(cmdOpts.apiUrl !== undefined ? { apiUrl: cmdOpts.apiUrl } : {}),\n ...(cmdOpts.port !== undefined ? { port: cmdOpts.port } : {}),\n ...(cmdOpts.sdkOnly !== undefined ? { sdkOnly: cmdOpts.sdkOnly } : {}),\n ...(cmdOpts.nextOnly !== undefined ? { nextOnly: cmdOpts.nextOnly } : {}),\n });\n },\n );\n\nconst moduleCmd = program\n .command('module')\n .description('Module authoring commands.');\n\nmoduleCmd\n .command('init [slug]')\n .description(\n 'Scaffold a new DashWise module — full Next.js app with auth wiring + SSO callback + protected dashboard. Pass --simple for the legacy minimal scaffold (no auth).',\n )\n .option('--dir <path>', 'Override the target directory (default: ./<slug>).')\n .option('--name <name>', 'Human-readable module name (default: derived from slug).')\n .option('--force', 'Overwrite an existing non-empty directory.')\n .option(\n '--simple',\n 'Use the legacy minimal scaffold (hand-authored, no Next.js auth wiring). Default before 2026-05-18; opt-in now.',\n )\n .option(\n '--custom',\n \"[Deprecated alias — kept for backward compatibility.] Equivalent to the default (full Next.js + auth). Will be removed in a future major version; just call `dashwise module init` without flags.\",\n )\n .option('--git <url>', 'Initial Git repository URL — written to module.json#repository.url.')\n .action(\n async (\n slugArg: string | undefined,\n cmdOpts: {\n dir?: string;\n name?: string;\n force?: boolean;\n simple?: boolean;\n custom?: boolean;\n git?: string;\n },\n ) => {\n process.exitCode = await moduleInitCommand(slugArg, {\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.name !== undefined ? { name: cmdOpts.name } : {}),\n ...(cmdOpts.force !== undefined ? { force: cmdOpts.force } : {}),\n ...(cmdOpts.simple !== undefined ? { simple: cmdOpts.simple } : {}),\n ...(cmdOpts.custom !== undefined ? { custom: cmdOpts.custom } : {}),\n ...(cmdOpts.git !== undefined ? { git: cmdOpts.git } : {}),\n });\n },\n );\n\nmoduleCmd\n .command('connect-git <repo-url>')\n .description('Link the local module to a Git repository (writes module.json#repository).')\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('--branch <name>', 'Default branch to publish from (e.g. `main`).')\n .action(\n async (repoUrl: string, cmdOpts: { dir?: string; branch?: string }) => {\n process.exitCode = await moduleConnectGitCommand(repoUrl, {\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.branch !== undefined ? { branch: cmdOpts.branch } : {}),\n });\n },\n );\n\nmoduleCmd\n .command('generate')\n .description(\"Regenerate typed wrappers from the local module.json into node_modules/@dashai/generated/.\")\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('--dry-run', 'Print summary without writing files.')\n .action(async (cmdOpts: { dir?: string; dryRun?: boolean }) => {\n process.exitCode = await moduleGenerateCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.dryRun !== undefined ? { dryRun: cmdOpts.dryRun } : {}),\n });\n });\n\nmoduleCmd\n .command('dev')\n .description('Watch module.json + regenerate typed wrappers on every save. Ctrl-C to stop.')\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('--debounce-ms <n>', 'Filesystem change debounce window (default: 250ms).', parseIntOption)\n .action(async (cmdOpts: { dir?: string; debounceMs?: number }) => {\n process.exitCode = await moduleDevCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.debounceMs !== undefined ? { debounceMs: cmdOpts.debounceMs } : {}),\n });\n });\n\nmoduleCmd\n .command('validate')\n .description('Validate the local module.json against the backend manifest validator.')\n .option('--dir <path>', 'Project root (default: current directory).')\n .action(async (cmdOpts: { dir?: string }) => {\n process.exitCode = await moduleValidateCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n });\n });\n\nmoduleCmd\n .command('list')\n .description('List modules you own (or `--all` for owned + public).')\n .option('--all', 'Include public modules you can install but do not own.')\n .option('--workspace <slug>', 'Filter by workspace slug (default: saved default workspace).')\n .option('--json', 'Emit JSON to stdout instead of column-aligned text.')\n .action(async (cmdOpts: { all?: boolean; workspace?: string; json?: boolean }) => {\n process.exitCode = await moduleListCommand({\n ...(cmdOpts.all !== undefined ? { all: cmdOpts.all } : {}),\n ...(cmdOpts.workspace !== undefined ? { workspace: cmdOpts.workspace } : {}),\n ...(cmdOpts.json !== undefined ? { json: cmdOpts.json } : {}),\n });\n });\n\nmoduleCmd\n .command('diff')\n .description('Show what would change at the next publish vs the currently-published version.')\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('--json', 'Emit the structured diff as JSON instead of the human-readable summary.')\n .action(async (cmdOpts: { dir?: string; json?: boolean }) => {\n process.exitCode = await moduleDiffCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.json !== undefined ? { json: cmdOpts.json } : {}),\n });\n });\n\nmoduleCmd\n .command('pull-data')\n .description(\"Export the module's own-table rows to a local JSON file (for fixtures, local dev seeding).\")\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('--limit <n>', 'Max rows per table (1-1000, default 100).', parseIntOption)\n .option('--out <path>', 'Output file path (default: ./dashwise-data.json).')\n .action(async (cmdOpts: { dir?: string; limit?: number; out?: string }) => {\n process.exitCode = await modulePullDataCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.limit !== undefined ? { limit: cmdOpts.limit } : {}),\n ...(cmdOpts.out !== undefined ? { out: cmdOpts.out } : {}),\n });\n });\n\nmoduleCmd\n .command('clone <slug>')\n .description('Clone a published module locally. Uses git if repository.url is set, else writes a manifest-only scaffold.')\n .option('--dir <path>', 'Target directory (default: ./<slug>).')\n .option('--force', 'Overwrite an existing non-empty directory.')\n .option('--no-git', 'Skip git clone even when repository.url is set; use the manifest-only scaffold.')\n .action(\n async (\n slug: string,\n cmdOpts: { dir?: string; force?: boolean; git?: boolean },\n ) => {\n // commander maps `--no-git` to `git: false`; convert to our internal shape.\n process.exitCode = await moduleCloneCommand(slug, {\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.force !== undefined ? { force: cmdOpts.force } : {}),\n ...(cmdOpts.git === false ? { noGit: true } : {}),\n });\n },\n );\n\nconst depsCmd = program\n .command('deps')\n .description('Cross-module dependency commands (manipulate module.json#dependencies).');\n\ndepsCmd\n .command('list')\n .description('List declared cross-module dependencies.')\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('--json', 'Emit JSON to stdout instead of human-readable columns.')\n .action(async (cmdOpts: { dir?: string; json?: boolean }) => {\n process.exitCode = await depsListCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.json !== undefined ? { json: cmdOpts.json } : {}),\n });\n });\n\ndepsCmd\n .command('add <provider-slug>')\n .description(\n 'Declare a cross-module dependency. Interactive in TTY (picks tables + fields from the provider\\'s exposes); non-interactive requires --table, --fields, --purpose.',\n )\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('--table <slug>', 'Provider table slug to read from (non-interactive mode).')\n .option('--fields <list>', 'Comma-separated field slugs for --table (non-interactive mode).')\n .option('--purpose <text>', 'Human-readable explanation (10-500 chars, shown at install consent).')\n .option('--version <range>', 'SemVer range to pin (default: ^<provider-current-version>).')\n .option('-y, --yes', 'Skip the replace-existing confirmation prompt.')\n .action(\n async (\n providerSlug: string,\n cmdOpts: {\n dir?: string;\n table?: string;\n fields?: string;\n purpose?: string;\n version?: string;\n yes?: boolean;\n },\n ) => {\n process.exitCode = await depsAddCommand(providerSlug, {\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.table !== undefined ? { table: cmdOpts.table } : {}),\n ...(cmdOpts.fields !== undefined ? { fields: cmdOpts.fields } : {}),\n ...(cmdOpts.purpose !== undefined ? { purpose: cmdOpts.purpose } : {}),\n ...(cmdOpts.version !== undefined ? { version: cmdOpts.version } : {}),\n ...(cmdOpts.yes !== undefined ? { yes: cmdOpts.yes } : {}),\n });\n },\n );\n\ndepsCmd\n .command('remove <provider-slug>')\n .description('Remove a declared cross-module dependency.')\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('-y, --yes', 'Skip the confirmation prompt.')\n .action(async (providerSlug: string, cmdOpts: { dir?: string; yes?: boolean }) => {\n process.exitCode = await depsRemoveCommand(providerSlug, {\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.yes !== undefined ? { yes: cmdOpts.yes } : {}),\n });\n });\n\ndepsCmd\n .command('check')\n .description('Verify each declared dep still resolves to a published provider + that every field/op is still exposed. Exits 1 on drift.')\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('--json', 'Emit a JSON drift report to stdout.')\n .action(async (cmdOpts: { dir?: string; json?: boolean }) => {\n process.exitCode = await depsCheckCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.json !== undefined ? { json: cmdOpts.json } : {}),\n });\n });\n\nprogram\n .command('query')\n .description(\n 'Run a typed query against the local module installation via @dashai/sdk/query. ' +\n 'Pass one of `--inline \"<expr>\"`, `--file <path>`, or `--repl`. ' +\n '`qb`, `deps`, `db` are pre-bound to the local module\\'s generated SDK.',\n )\n .option('--dir <path>', 'Project root containing `module.json` (default: current directory).')\n .option('--inline <expression>', 'Evaluate a one-liner. e.g., `qb.tasks.where({done:false}).count()`.')\n .option('--file <path>', 'Dynamic-import a .mjs/.js file. Default export = Query | AggQuery | Promise | value.')\n .option('--repl', 'Open an interactive Node REPL with the generated SDK pre-bound. Top-level await supported.')\n .option('--json', 'Emit compact JSON (default: pretty-printed).')\n .option(\n '--explain',\n 'Call .explain() instead of .execute() — returns the Postgres plan + estimatedCost without executing the query. MVP supports joined queries; bare own/dep/view paths reject with EXPLAIN_NOT_SUPPORTED_YET.',\n )\n .option(\n '--stream',\n 'Call .stream() instead of .execute() — prints rows incrementally as JSON-lines (one row per line). Lets you see progress on big queries + Ctrl-C cleanly midway. Mutually exclusive with --explain and --repl.',\n )\n .action(\n async (cmdOpts: {\n dir?: string;\n inline?: string;\n file?: string;\n repl?: boolean;\n json?: boolean;\n explain?: boolean;\n stream?: boolean;\n }) => {\n process.exitCode = await queryCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.inline !== undefined ? { inline: cmdOpts.inline } : {}),\n ...(cmdOpts.file !== undefined ? { file: cmdOpts.file } : {}),\n ...(cmdOpts.repl !== undefined ? { repl: cmdOpts.repl } : {}),\n ...(cmdOpts.json !== undefined ? { json: cmdOpts.json } : {}),\n ...(cmdOpts.explain !== undefined ? { explain: cmdOpts.explain } : {}),\n ...(cmdOpts.stream !== undefined ? { stream: cmdOpts.stream } : {}),\n });\n },\n );\n\nmoduleCmd\n .command('publish')\n .description('Pack the current directory + upload it as a new module version.')\n .option('--dir <path>', 'Project root (default: current directory).')\n .option('--bump <direction>', 'Semver bump: patch | minor | major.')\n .option('--dry-run', 'Validate + upload but do not persist the version row.')\n .option('-y, --yes', 'Skip the confirmation prompt (for CI / scripted use).')\n .option(\n '--exclude <pattern...>',\n 'Extra exclude patterns (segment-matched) appended to the defaults.',\n )\n .action(\n async (cmdOpts: {\n dir?: string;\n bump?: 'patch' | 'minor' | 'major';\n dryRun?: boolean;\n yes?: boolean;\n exclude?: string[];\n }) => {\n process.exitCode = await modulePublishCommand({\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n ...(cmdOpts.bump !== undefined ? { bump: cmdOpts.bump } : {}),\n ...(cmdOpts.dryRun !== undefined ? { dryRun: cmdOpts.dryRun } : {}),\n ...(cmdOpts.yes !== undefined ? { yes: cmdOpts.yes } : {}),\n ...(cmdOpts.exclude !== undefined ? { exclude: cmdOpts.exclude } : {}),\n });\n },\n );\n\n// Phase 6 slice 6.4 (2026-05-19): per-module SDK query log reader.\n// Workspace-member-scoped on the backend.\nmoduleCmd\n .command('query-log')\n .description(\n 'Read the per-module SDK query log. Default: 50 most recent entries. ' +\n '`--slow` filters to duration_ms > 500ms; `--since 1h` narrows by time; ' +\n '`--tail` streams new entries every 5s.',\n )\n .option(\n '--module <id-or-slug>',\n 'Module to inspect (default: slug from current directory\\'s module.json).',\n )\n .option('--slow', 'Filter to slow queries only (duration_ms > 500).')\n .option(\n '--since <duration>',\n 'Only entries newer than this. Accepts \"30m\", \"1h\", \"6h\", \"2d\", \"7d\", or an ISO 8601 timestamp.',\n )\n .option('--limit <n>', 'Max rows per fetch (1-500, default 50).', parseIntOption)\n .option('--tail', 'Poll every 5s for new entries. Ctrl-C to stop.')\n .option('--json', 'Emit compact JSON instead of the table. Ignored with --tail.')\n .option('--dir <path>', 'Override project directory for module.json lookup.')\n .action(\n async (cmdOpts: {\n module?: string;\n slow?: boolean;\n since?: string;\n limit?: number;\n tail?: boolean;\n json?: boolean;\n dir?: string;\n }) => {\n process.exitCode = await moduleQueryLogCommand({\n ...(cmdOpts.module !== undefined ? { module: cmdOpts.module } : {}),\n ...(cmdOpts.slow !== undefined ? { slow: cmdOpts.slow } : {}),\n ...(cmdOpts.since !== undefined ? { since: cmdOpts.since } : {}),\n ...(cmdOpts.limit !== undefined ? { limit: cmdOpts.limit } : {}),\n ...(cmdOpts.tail !== undefined ? { tail: cmdOpts.tail } : {}),\n ...(cmdOpts.json !== undefined ? { json: cmdOpts.json } : {}),\n ...(cmdOpts.dir !== undefined ? { dir: cmdOpts.dir } : {}),\n });\n },\n );\n\n// P7 slice 7.5b (2026-05-20): per-installation server-action audit log.\n// Follow-up (2026-05-20): added `--module <slug>` resolver.\nmoduleCmd\n .command('action-log')\n .description(\n 'Read the per-installation server-action audit log. Shows both ' +\n 'cross-module and own-module dispatches. Filter by role (caller / ' +\n 'provider), slow, since, cross-module-only. `--tail` streams new ' +\n 'entries every 5s. Pass either `--installation <id>` or ' +\n '`--module <slug>` (slug resolves to your accessible installation).',\n )\n .option(\n '--installation <id>',\n 'Installation id to inspect. Mutually exclusive with `--module`.',\n parseIntOption,\n )\n .option(\n '--module <slug>',\n \"Module slug. Resolves to the caller's accessible installation of \" +\n 'that module (first match if multi-workspace). Mutually exclusive with `--installation`.',\n )\n .option(\n '--role <caller|provider>',\n \"Which side of cross-module dispatches to show. 'caller' (default) \" +\n \"shows outbound; 'provider' shows inbound calls on this installation.\",\n )\n .option('--slow', 'Filter to slow actions only (elapsed_ms > 500).')\n .option('--cross-module-only', 'Hide own-module dispatches (cross_module=false rows).')\n .option(\n '--since <duration>',\n 'Only entries newer than this. Accepts \"30m\", \"1h\", \"6h\", \"2d\", \"7d\", or an ISO 8601 timestamp.',\n )\n .option('--limit <n>', 'Max rows per fetch (1-500, default 50).', parseIntOption)\n .option('--tail', 'Poll every 5s for new entries. Ctrl-C to stop.')\n .option('--json', 'Emit compact JSON instead of the table. Ignored with --tail.')\n .action(\n async (cmdOpts: {\n installation?: number;\n module?: string;\n role?: string;\n slow?: boolean;\n crossModuleOnly?: boolean;\n since?: string;\n limit?: number;\n tail?: boolean;\n json?: boolean;\n }) => {\n if (cmdOpts.role !== undefined && cmdOpts.role !== 'caller' && cmdOpts.role !== 'provider') {\n fail(`--role must be 'caller' or 'provider' (got \"${cmdOpts.role}\").`);\n process.exitCode = 1;\n return;\n }\n process.exitCode = await moduleActionLogCommand({\n ...(cmdOpts.installation !== undefined ? { installation: cmdOpts.installation } : {}),\n ...(cmdOpts.module !== undefined ? { module: cmdOpts.module } : {}),\n ...(cmdOpts.role !== undefined ? { role: cmdOpts.role as 'caller' | 'provider' } : {}),\n ...(cmdOpts.slow !== undefined ? { slow: cmdOpts.slow } : {}),\n ...(cmdOpts.crossModuleOnly !== undefined ? { crossModuleOnly: cmdOpts.crossModuleOnly } : {}),\n ...(cmdOpts.since !== undefined ? { since: cmdOpts.since } : {}),\n ...(cmdOpts.limit !== undefined ? { limit: cmdOpts.limit } : {}),\n ...(cmdOpts.tail !== undefined ? { tail: cmdOpts.tail } : {}),\n ...(cmdOpts.json !== undefined ? { json: cmdOpts.json } : {}),\n });\n },\n );\n\n// Single async entry so unhandled errors hit the same formatter.\n(async () => {\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n fail(`Unhandled error: ${(err as Error).message ?? String(err)}`);\n if (process.env.DASHWISE_DEBUG) {\n // Print full stack when debugging — opt-in to keep normal\n // output uncluttered.\n // eslint-disable-next-line no-console\n console.error(err);\n }\n process.exitCode = 1;\n }\n})();\n\n/**\n * Read the CLI's own version from its package.json. We can't import\n * package.json directly (would need json import assertions + tsup\n * config tweaks), so we read it via fs at bundle time. The result\n * is inlined by tsup as a constant after the build.\n */\nfunction getVersion(): string {\n // tsup bundles this read inline — at runtime the imported JSON\n // module-replacement plugin would handle it, but to keep tsup\n // config minimal we hard-code the version here and bump on\n // release. See packages/cli/package.json for the canonical value.\n return '0.1.0';\n}\n\n/** commander helper: parse a `<n>` argument as an integer. */\nfunction parseIntOption(value: string): number {\n const n = Number.parseInt(value, 10);\n if (!Number.isFinite(n)) {\n throw new Error(`Expected an integer, got '${value}'`);\n }\n return n;\n}\n"]}