@standardagents/code 0.9.3 → 0.9.4

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api.ts","../src/permissions.ts","../src/approvals.ts","../src/heartbeat.ts","../src/render.ts","../src/bridge.ts","../src/process-registry.ts","../src/mcp-config.ts","../src/host-tools.ts","../src/mcp.ts","../src/execution-session.ts","../src/stream.ts","../src/events-stream.ts","../src/subagent-streams.ts","../src/wordmill.ts","../src/types.ts","../src/clipboard.ts","../src/tui.ts","../src/history.ts","../src/markdown.ts","../src/credentials.ts","../src/device-login.ts","../src/product.ts","../src/machine.ts","../src/registry.ts","../src/relay.ts","../src/check-update.ts","../src/daemon.ts","../src/daemon-service.ts","../src/daemon-cli.ts","../src/index.ts"],"names":["clean","DIM","RESET","cols","path","os","KEY","fs","file","input","isAlive","dir","spawn","crypto","c","hasToolCalls","dots","dotsStyled","top","bottom","clamp","flat","BOLD","output","r","applied","run","api","check","readline","parseArgs","connecting","stopped","procsStopped","killed"],"mappings":";;;;;;;;;;;;;AAwBA,SAAS,oBAAA,CAAqB,KAAc,QAAA,EAAgC;AAC1E,EAAA,MAAM,IAAA,GAAO,SAAS,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AAErE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAS,GAAA,EAAK,CAAA,EAAG,CAAA,GAAI,EAAE,KAAA,EAAO;AACrC,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,UAAU,KAAA,CAAM,GAAA,CAAI,EAAE,IAAI,CAAA;AAChD,IAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,UAAU,QAAA,CAAS,IAAA,CAAK,EAAE,OAAO,CAAA;AAC1D,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,EAAG;AAC3B,MAAA,KAAA,MAAW,GAAA,IAAO,EAAE,MAAA,EAAQ;AAC1B,QAAA,IAAI,OAAO,GAAA,EAAK,IAAA,KAAS,UAAU,KAAA,CAAM,GAAA,CAAI,IAAI,IAAI,CAAA;AACrD,QAAA,IAAI,OAAO,GAAA,EAAK,OAAA,KAAY,UAAU,QAAA,CAAS,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,CAAA,GAAI,MAAA,KAAqB,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA;AAEpE,EAAA,IAAI,GAAA,CAAI,WAAA,EAAa,WAAW,CAAA,EAAG;AACjC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,iBAAiB,IAAI,CAAA,2CAAA,CAAA;AAAA,MAC7B,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,cAAc,CAAA,EAAG;AACvB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAG,IAAI,CAAA,0DAAA,CAAA;AAAA,MACf,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,cAAA,EAAgB,aAAA,EAAe,UAAU,CAAA,EAAG;AAClD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,eAAe,IAAI,CAAA,8CAAA,CAAA;AAAA,MAC3B,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,IAAI,IAAI,WAAA,EAAa,yBAAA,EAA2B,yBAAyB,CAAA,IAAM,GAAA,EAAa,SAAS,cAAA,EAAgB;AACnH,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAG,IAAI,CAAA,uBAAA,CAAA;AAAA,MACf,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,IACE,GAAA;AAAA,IACE,iCAAA;AAAA,IACA,6BAAA;AAAA,IACA,2BAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF,IAAK,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,EACrC;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,0BAA0B,IAAI,CAAA,EAAA,EAAK,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,MAC7D,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,MAAA,EAAQ,CAAA,eAAA,EAAkB,IAAI,CAAA,EAAG,IAAA,GAAO,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA,CAAA;AAAA,IACvE,IAAA,EAAM;AAAA,GACR;AACF;AAuCO,IAAM,YAAN,MAAgB;AAAA,EACrB,WAAA,CACU,UACA,KAAA,EACR;AAFQ,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EACP;AAAA,EAFO,QAAA;AAAA,EACA,KAAA;AAAA,EAGV,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EAC5C;AAAA;AAAA,EAGA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAc,IAAA,CAAQ,QAAA,EAAkB,IAAA,EAAgC;AACtE,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,QAAQ,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,MACrD,GAAG,IAAA;AAAA,MACH,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,QACnC,GAAI,IAAA,EAAM,OAAA,IAAW;AAAC;AACxB,KACD,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAA,EAAM,MAAA,IAAU,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,IAAA,EAAO,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAChG;AACA,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAA2B;AAC/B,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,cAAA,EAAe,EAAG,EAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,GAAwC;AAC5C,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,YAAA,CAAA,EAAgB;AAAA,QAChD,SAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA,EAAG;AAAA,QACjD,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAM;AAAA,OACnC,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,oBAAA,CAAqB,GAAA,EAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,IAChD;AACA,IAAA,IAAI,GAAA,CAAI,EAAA,EAAI,OAAO,EAAE,IAAI,IAAA,EAAK;AAC9B,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ,gFAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ,+EAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,IAAO,GAAA,CAAI,WAAW,GAAA,EAAK;AAC5C,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,iFAAA,CAAA;AAAA,QACxB,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,UAAU,GAAA,EAAK;AACrB,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ,CAAA,yDAAA,EAA4D,GAAA,CAAI,MAAM,CAAA,EAAA,CAAA;AAAA,QAC9E,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,CAAA,2BAAA,EAA8B,GAAA,CAAI,MAAM,CAAA,0BAAA,CAAA,EAA6B;AAAA,EACnG;AAAA;AAAA,EAGA,MAAM,UAAA,GAAyD;AAC7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAiC,aAAa,CAAA;AACrE,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAG,IAAI,GAAA,GAAM,GAAA,CAAI,UAAU,EAAC;AACtD,IAAA,OAAO,GAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,OAAO,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAC7C,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,IAAA,EAAK,CAAE,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,YAAA,CAAa,OAAA,EAAiB,IAAA,EAAiC;AACnE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAyC,cAAA,EAAgB;AAAA,MAC9E,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,OAAA,EAAS,MAAM;AAAA,KACjD,CAAA;AACD,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,EAAA;AAC/B,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,MAAM,8BAA8B,CAAA;AACvD,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,CAAY,OAAA,EAA4B,WAAA,EAAiD;AAC7F,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AACvD,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC1B,GAAA,CAAI,GAAA;AAAA,QAAI,CAAC,OACP,IAAA,CAAK,IAAA;AAAA,UACH,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,EAAE,CAAC,CAAA,UAAA;AAAA,SACjD,CAAE,KAAA,CAAM,MAAM,EAAW;AAAA;AAC3B,KACF;AACA,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAO,GAAA,CAA4B,OAAA,IAAW,EAAG,CAAA;AAC1G,IAAA,OAAO,GAAA,CACJ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,IAAA,EAAM,MAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,GAAI,CAAA,CAAE,OAAO,EAAC;AAAA,MACxC,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE;AAAA,KAC1B,CAAE,CAAA,CACD,MAAA,CAAO,CAAC,MAAqB,WAAA,CAAY,KAAA,CAAM,CAAC,GAAA,KAAQ,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAC,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAc,QAAA,EAA2C;AAC7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA;AAAA,MACrB,gBAAgB,QAAQ,CAAA,UAAA;AAAA,KAC1B;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAG,IAAI,GAAA,GAAM,GAAA,CAAI,aAAa,EAAC;AACzD,IAAA,OAAO,GAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,SAAA,CAAU,CAAA,CACxC,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,EAAA,EAAI,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,SAAA;AAAA,MACd,UAAA,EAAY,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,IAAA,IAAQ,IAAA;AAAA,MACtC,KAAA,EAAO,EAAE,KAAA,IAAS,IAAA;AAAA,MAClB,UAAA,EAAY,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,WAAA,IAAe,IAAA;AAAA,MAC7C,QAAQ,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,GAAS;AAAA,KACpD,CAAE,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,CAAY,QAAA,EAAkB,OAAA,EAAiB,WAAA,EAAkD;AACrG,IAAA,MAAM,IAAA,GAAgC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAQ;AAC9D,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,OAAQ,WAAA,GAAc,WAAA;AAC9D,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAQ,CAAA,SAAA,CAAA,EAAa;AAAA,MACnD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CAAY,QAAA,EAAkB,KAAA,GAAQ,IAAI,KAAA,EAAwC;AACtF,IAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,GAAK,EAAA;AAC/C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA;AAAA,MACrB,CAAA,aAAA,EAAgB,QAAQ,CAAA,gBAAA,EAAmB,KAAK,GAAG,UAAU,CAAA;AAAA,KAC/D;AACA,IAAA,OAAO,MAAM,OAAA,CAAQ,GAAG,IAAI,GAAA,GAAM,GAAA,CAAI,YAAY,EAAC;AAAA,EACrD;AAAA,EAEA,MAAM,OAAA,CAAQ,QAAA,EAAkB,KAAA,GAAQ,GAAA,EAAqB;AAC3D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA;AAAA,MACrB,CAAA,aAAA,EAAgB,QAAQ,CAAA,YAAA,EAAe,KAAK,CAAA,WAAA;AAAA,KAC9C;AACA,IAAA,OAAO,MAAM,OAAA,CAAQ,GAAG,IAAI,GAAA,GAAM,GAAA,CAAI,QAAQ,EAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,QAAA,EACA,YACA,EAAA,EACA,MAAA,EACA,OACA,QAAA,EACkB;AAClB,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,MAC1B,YAAA,EAAc,UAAA;AAAA,MACd,EAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA;AAAA;AAAA,MAGA,GAAI,QAAA,GAAW,EAAE,SAAA,EAAW,QAAA,CAAS,QAAA,EAAU,UAAA,EAAY,QAAA,CAAS,UAAA,IAAc,CAAA,EAAE,GAAI;AAAC,KAC1F,CAAA;AACD,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,CAAA,EAAG,OAAA,EAAA,EAAW;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAQ,CAAA,YAAA,CAAA,EAAgB;AAAA,UACtD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C;AAAA,SACD,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,CAAA,IAAK,OAAA,EAAS,GAAI,CAAC,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAA,CAAU,QAAA,EAAkB,MAAA,EAAwC;AACxE,IAAA,MAAMA,SAAQ,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA,GAAS,IAAI,MAAM,CAAA,CAAA;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,aAAA,EAAgB,QAAQ,CAAA,GAAA,EAAMA,MAAK,CAAA,CAAA,EAAI;AAAA,QAC7E,SAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAG,OAClD,CAAA;AACD,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,GAAA,CAAI,aAAa,CAAA;AAAA,IAC5C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,GAAA,EAA+B;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA;AAAA,QACrB,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,OACjD;AACA,MAAA,OAAO,KAAK,KAAA,IAAS,IAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,GAAA,EAAa,KAAA,EAA+B;AAC1D,IAAA,MAAM,IAAA,CAAK,KAAK,CAAA,gBAAA,CAAA,EAAoB;AAAA,MAClC,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,OAAO;AAAA,KACpC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,WAAW,MAAA,EAAqF;AACpG,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA;AAAA,QACrB,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,MAAM,CAAC,CAAA,UAAA;AAAA,OACvD;AACA,MAAA,OAAO,MAAM,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA,GAAI,GAAA,CAAI,UAAU,EAAC;AAAA,IACtD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,QAAA,EAAkB,GAAA,EAA+B;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA;AAAA,QACrB,CAAA,aAAA,EAAgB,QAAQ,CAAA,QAAA,EAAW,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,OAC5D;AACA,MAAA,OAAO,KAAK,KAAA,IAAS,IAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,QAAA,EAAkB,GAAA,EAAa,KAAA,EAA+B;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAQ,CAAA,GAAA,CAAA,EAAO;AAAA,QAC7C,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,OAAO;AAAA,OACpC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,QAAA,EAAuE;AACvF,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA;AAAA,QACrB,gBAAgB,QAAQ,CAAA,aAAA,CAAA;AAAA,QACxB,EAAE,QAAQ,MAAA;AAAO,OACnB;AACA,MAAA,OAAO,GAAA,EAAK,GAAA,GAAM,EAAE,GAAA,EAAK,GAAA,CAAI,KAAK,SAAA,EAAW,GAAA,CAAI,SAAA,KAAc,IAAA,EAAK,GAAI,IAAA;AAAA,IAC1E,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,MAAM,aAAA,CAAc,QAAA,EAAkB,QAAA,EAAiD;AACrF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAmB,CAAA,aAAA,EAAgB,QAAQ,CAAA,eAAA,CAAA,EAAmB;AAAA,QAC9E,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,QAAA,KAAa,WAAW,EAAE,QAAA,EAAS,GAAI,EAAE;AAAA,OACtE,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAA,CAAgB,QAAA,EAAkB,QAAA,EAAgF;AACtH,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAQ,CAAA,iBAAA,CAAA,EAAqB;AAAA,MAC5D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAU;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAAmC;AACvC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAA+B,CAAA,iBAAA,CAAmB,CAAA;AACzE,IAAA,OAAO,MAAM,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA,GAAI,GAAA,CAAI,SAAS,EAAC;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,eAAA,CAAgB,IAAA,EAAc,OAAA,EAAiC;AACnE,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA,YAAA,EAAe,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MACzD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAS;AAAA,KACjC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAY,IAAA,EAA6B;AAC7C,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAA,YAAA,EAAe,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,QAAA,EAAiC;AAC7C,IAAA,MAAM,IAAA,CAAK,KAAK,CAAA,aAAA,EAAgB,QAAQ,YAAY,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACxE;AAAA,EAEA,MAAM,KAAK,QAAA,EAAiC;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAK,CAAA,aAAA,EAAgB,QAAQ,SAAS,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACrE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CACJ,QAAA,EACA,OAAA,EAC+E;AAC/E,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,IAAA;AAAA,QAChB,gBAAgB,QAAQ,CAAA,YAAA,CAAA;AAAA,QACxB,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,OAAA,EAAS,CAAA;AAAE,OACtD;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,IACxE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAQ,QAAA,EAAqC;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,MAAM,IAAA,CAAK,IAAA,CAAwB,CAAA,aAAA,EAAgB,QAAQ,CAAA,KAAA,CAAO,CAAA;AAC5E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,GAAG,OAAA,IAAW,IAAA;AAAA,QACvB,WAAA,EAAa,GAAG,WAAA,IAAe,IAAA;AAAA,QAC/B,KAAA,EAAO,MAAM,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAA,GAAI,CAAA,CAAE,QAAQ;AAAC,OAC9C;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,aAAa,IAAA,EAAM,KAAA,EAAO,EAAC,EAAE;AAAA,IACvD;AAAA,EACF;AACF,CAAA;;;ACngBO,SAAS,YAAY,KAAA,EAAgC;AAC1D,EAAA,IAAI,UAAkB,KAAA,CAAM,KAAA;AAC5B,EAAA,KAAA,MAAW,OAAA,IAAW,MAAM,SAAA,EAAW;AACrC,IAAA,IAAI,OAAA,GAAU,SAAS,OAAA,GAAU,OAAA;AAAA,EACnC;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,MAAA,CACd,KAAA,EACA,IAAA,EACA,IAAA,EACA,oBAAA,EACU;AACV,EAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,KAAS,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,uBAAuB,CAAA,GAAI,CAAA;AAG7G,EAAA,IAAI,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,IAAI,GAAG,OAAO,OAAA;AAIxC,EAAA,OAAO,aAAA,IAAiB,WAAA,CAAY,KAAK,CAAA,GAAI,OAAA,GAAU,KAAA;AACzD;AAMA,IAAM,qBAAA,GAAkC;AAAA,EACtC,qFAAA;AAAA;AAAA,EACA,kCAAA;AAAA,EACA,8BAAA;AAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EACA,4CAAA;AAAA;AAAA,EACA,sCAAA;AAAA,EACA,+BAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,eAAe,OAAA,EAA0B;AACvD,EAAA,OAAO,sBAAsB,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAC5D;;;ACxDA,IAAM,GAAA,GAAM,WAAA;AAQZ,eAAsB,aAAA,CAAc,KAAgB,QAAA,EAAwC;AAC1F,EAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,KAAA,CAAM,UAAU,GAAG,CAAA;AACvC,EAAA,IAAI,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACnD,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,IAAK,CAAA,GAAc,MAAA;AAChD,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,UAAA,EAAY,MAAM,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,GAAK,CAAA,CAAE,aAA0B,EAAC;AAAA,MACxE,SAAA,EAAW,MAAM,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAA,GAAK,CAAA,CAAE,YAAyB;AAAC,KACvE;AAAA,EACF;AACA,EAAA,OAAO,EAAE,UAAA,EAAY,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AACzC;AAGO,SAAS,aAAA,CAAc,GAAA,EAAgB,QAAA,EAAkB,IAAA,EAA6B;AAC3F,EAAA,MAAM,OAAA,GAAuB;AAAA,IAC3B,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,YAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAW,EAAE,IAAA,EAAK;AAAA,IAC9C,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC;AAAA,GAC5D;AACA,EAAA,KAAK,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,GAAA,EAAK,OAAO,CAAA;AACvC;;;AC1BO,IAAM,qBAAA,GAAwB,GAAA;AAO9B,IAAM,6BAAA,GAAgC,IAAA;AAStC,IAAM,YAAN,MAAgB;AAAA,EAMrB,WAAA,CACU,EAAA,EACA,MAAA,EACR,OAAA,GAA4B,EAAC,EAC7B;AAHQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGR,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,qBAAA;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,6BAAA;AAAA,EACxC;AAAA,EANU,EAAA;AAAA,EACA,MAAA;AAAA,EAPF,KAAA,GAA+C,IAAA;AAAA,EAC/C,UAAA,GAAa,CAAA;AAAA,EACJ,UAAA;AAAA,EACA,SAAA;AAAA,EAWjB,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAA,CAAK,QAAQ,WAAA,CAAY,MAAM,KAAK,IAAA,EAAK,EAAG,KAAK,UAAU,CAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAAA,EAC7B;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,IAAA,GAAa;AACnB,IAAA,IAAI,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAA,GAAa,KAAK,SAAA,EAAW;AACjD,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,GAAG,UAAA,KAAe,SAAA,CAAU,MAAM,IAAA,CAAK,EAAA,CAAG,KAAK,MAAM,CAAA;AAAA,gBACpD,IAAA,EAAK;AAAA,IACjB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEQ,IAAA,GAAa;AACnB,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,IAChB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AACF,CAAA;;;AC3EA,IAAM,KAAA,GAAQ,SAAA;AACd,IAAM,GAAA,GAAM,SAAA;AACZ,IAAM,MAAA,GAAS,6BAAA;AACf,IAAM,MAAA,GAAS,6BAAA;AAKf,IAAM,cAAA,GAAiB,CAAA;AAEvB,SAAS,KAAA,CAAM,GAAW,GAAA,EAAqB;AAC7C,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,IAAI,QAAA,GAAM,CAAA;AACnE;AAEA,SAAS,IAAA,GAAe;AACtB,EAAA,OAAO,KAAK,GAAA,CAAI,EAAA,EAAI,OAAA,CAAQ,MAAA,CAAO,WAAW,EAAE,CAAA;AAClD;AAGA,SAAS,KAAK,IAAA,EAAsB;AAClC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AACjC;AAQO,SAAS,SAAA,CAAU,QAAgB,MAAA,EAA0B;AAClE,EAAA,IAAI,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,IAAI,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAEhC,EAAA,OAAO,QAAA,CAAS,UAAU,QAAA,CAAS,MAAA,IAAU,SAAS,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAA,EAAG;AACxE,IAAA,QAAA,CAAS,KAAA,EAAM;AACf,IAAA,QAAA,CAAS,KAAA,EAAM;AAAA,EACjB;AACA,EAAA,OACE,QAAA,CAAS,MAAA,IACT,QAAA,CAAS,MAAA,IACT,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,KAAM,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAC9D;AACA,IAAA,QAAA,CAAS,GAAA,EAAI;AACb,IAAA,QAAA,CAAS,GAAA,EAAI;AAAA,EACf;AACA,EAAA,MAAM,KAAA,GAAQ,MAAK,GAAI,CAAA;AACvB,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAiB,EAAA,EAAY,IAAA,KAAiB;AAC1D,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AAC3C,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,KAAK,CAAC,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAC/E,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA;AACpC,IAAA,IAAI,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,GAAG,GAAG,CAAA,UAAA,EAAQ,MAAM,CAAA,UAAA,EAAa,WAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,EAC7F,CAAA;AACA,EAAA,IAAA,CAAK,QAAA,EAAU,QAAQ,GAAG,CAAA;AAC1B,EAAA,IAAA,CAAK,QAAA,EAAU,QAAQ,GAAG,CAAA;AAC1B,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,aAAa,OAAA,EAA2B;AACtD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAK,GAAI,CAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AAC3C,EAAA,MAAM,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,GAAG,MAAM,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,KAAK,CAAC,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAC1E,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA;AACpC,EAAA,IAAI,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,GAAG,GAAG,CAAA,UAAA,EAAQ,MAAM,CAAA,UAAA,EAAa,WAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAC3F,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,cAAc,GAAA,EAAqB;AACjD,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK;AAE5B,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,CAAC,MAAM,EAAA,EAAI;AACtC,QAAA,IAAI,EAAA,KAAO,GAAA,IAAO,GAAA,CAAI,CAAC,MAAM,IAAA,EAAM,CAAA,EAAA;AACnC,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,GAAA,IAAO,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,GAAA,CAAI,MAAM,CAAC,CAAC,GAAG,KAAK,CAAA,CAAA;AACjE,MAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AACR,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,GAAA,IAAO,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,CAAI,MAAM,CAAC,CAAC,GAAG,KAAK,CAAA,CAAA;AACpC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,wBAAwB,CAAA;AACtD,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,GAAA,IAAO,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,CAAA;AAC7B,MAAA,CAAA,IAAK,EAAA,CAAG,CAAC,CAAA,CAAE,MAAA;AACX,MAAA,aAAA,GAAgB,IAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,iBAAiB,CAAA;AACjD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,IAAI,aAAA,IAAiB,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACvC,QAAA,GAAA,IAAO,CAAA;AACP,QAAA,aAAA,GAAgB,KAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,GAAA,IAAO,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,GAAG,KAAK,CAAA,CAAA;AAAA,MAC3B;AACA,MAAA,CAAA,IAAK,CAAA,CAAE,MAAA;AACP,MAAA;AAAA,IACF;AACA,IAAA,GAAA,IAAO,CAAA,EAAG,GAAG,CAAA,EAAG,EAAE,GAAG,KAAK,CAAA,CAAA;AAC1B,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,cAAA,CAAe,KAAa,GAAA,EAAqB;AAC/D,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,YAAA,EAAc,UAAK,EAAE,OAAA,CAAQ,YAAA,EAAc,GAAG,CAAA,CAAE,IAAA,EAAK;AACnF,EAAA,OAAO,KAAA,CAAM,WAAW,GAAG,CAAA;AAC7B;AAWA,IAAM,UAAA,GAA8C;AAAA,EAClD,CAAC,GAAA,EAAM,GAAA,EAAM,EAAI,CAAA;AAAA;AAAA,EACjB,CAAC,GAAA,EAAM,EAAA,EAAM,GAAI,CAAA;AAAA;AAAA,EACjB,CAAC,GAAA,EAAM,GAAA,EAAM,GAAI;AAAA;AACnB,CAAA;AACA,IAAM,WAAW,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAEzC,SAAS,SAAA,GAAqB;AAC5B,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,EAAA;AACpC,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,IAAA;AAExC,EAAA,OAAO,wCAAA,CAAyC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,gBAAgB,EAAE,CAAA;AACrF;AAEA,SAAS,OAAO,CAAA,EAAqC;AACnD,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,OAAA,IAAW,UAAA,CAAW,MAAA,GAAS,CAAA,CAAA;AAC3C,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AACzD,EAAA,MAAM,IAAI,GAAA,GAAM,CAAA;AAChB,EAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,UAAA,CAAW,CAAC,CAAA,EAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAChD,EAAA,OAAO;AAAA,IACL,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA,GAAA,CAAK,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,CAAA;AAAA,IACnC,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA,GAAA,CAAK,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,CAAA;AAAA,IACnC,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA,GAAA,CAAK,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC;AAAA,GACrC;AACF;AAIA,SAAS,SAAS,CAAA,EAAmB;AACnC,EAAA,MAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAC1B,EAAA,OAAO,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACnC;AAEA,SAAS,YAAA,CAAa,KAAa,EAAA,EAAqB;AACtD,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,OAAO,GAAG,CAAA;AAC5B,IAAA,OAAO,CAAA,UAAA,EAAa,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,CAAA,UAAA,EAAa,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,SAAS,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,QAAA,CAAS,MAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA;AAChG;AAIO,SAAS,eAAA,CAAgB,EAAA,EAAY,QAAA,GAAW,IAAA,EAAc;AACnE,EAAA,OAAO,aAAa,QAAA,CAAS,EAAA,GAAK,QAAQ,CAAA,EAAG,WAAW,CAAA;AAC1D;AA+BO,SAAS,YAAA,CAAa,IAAA,EAAc,KAAA,GAAQ,CAAA,EAAW;AAC5D,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAI,CAAA;AACtB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,CAAC,EAAA,KAAO,GAAG,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAC3D,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,KAAK,SAAA,EAAU;AACrB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,IAAI,EAAA,CAAG,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAAE,MAAA,GAAA,IAAO,EAAA;AAAI,MAAA;AAAA,IAAU;AACnD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAS,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,IAAM,CAAA,GAAI,QAAQ,GAAA,CAAI,CAAA;AACnF,IAAA,IAAA,EAAA;AACA,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA;AAC1B,MAAA,GAAA,IAAO,aAAa,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,EAAE,CAAA,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,aAAa,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,SAAS,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA,CAAA;AAAA,IACpG;AAAA,EACF;AACA,EAAA,OAAO,GAAA,GAAM,SAAA;AACf;;;ACnMA,IAAM,cAAA,uBAAqB,GAAA,CAAI,CAAC,aAAa,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,WAAW,CAAC,CAAA;AAEhF,IAAM,SAAN,MAAa;AAAA,EAwBlB,YACU,GAAA,EACA,QAAA,EACA,IAAA,EACA,IAAA,EACA,OAEA,QAAA,EACR;AAPQ,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAEA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACP;AAAA,EAPO,GAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EAEA,QAAA;AAAA,EA9BF,EAAA,GAAuB,IAAA;AAAA,EACvB,MAAA,GAAS,KAAA;AAAA,EACT,SAAA,GAA8B,IAAA;AAAA,EAC9B,gBAAA,GAAmB,CAAA;AAAA,EACnB,cAAA,GAAuD,IAAA;AAAA,EACvD,gBAAA,GAAwC,IAAA;AAAA;AAAA;AAAA,EAGxC,cAAA,uBAAqB,GAAA,EAAY;AAAA;AAAA;AAAA;AAAA,EAIjC,KAAA,GAAQ,IAAA;AAAA;AAAA;AAAA,EAGR,eAAA,GAAkB,CAAA;AAAA;AAAA;AAAA,EAGlB,qBAAA,GAA6C,IAAA;AAAA,EAC7C,qBAAA,GAAwB,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAC7D,IAAA,IAAA,CAAK,qBAAA,GAAwB,OAAA;AAAA,EAC/B,CAAC,CAAA;AAAA;AAAA,EAaD,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,KAAA,EAA4C;AACnD,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBAAA,CAAmB,SAAA,GAAY,GAAA,EAAwB;AAC3D,IAAA,MAAM,QAAQ,IAAA,CAAK;AAAA,MACjB,IAAA,CAAK,qBAAA;AAAA,MACL,IAAI,OAAA,CAAc,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,SAAS,CAAC;AAAA,KAC9D,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,GAAyB;AACvB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,IAAA,CAAK,mBAAmB,MAAM;AAC5B,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAEA,MAAA,UAAA,CAAW,MAAM,IAAA,CAAK,gBAAA,IAAmB,EAAG,GAAI,CAAA;AAChD,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,aAAA,EAAgB,IAAA,CAAK,QAAQ,CAAA,cAAA,EAAiB,kBAAA,CAAmB,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA;AACjH,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,GAAA,IACE,cAAc,kBAAA,CAAmB,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAC,CAAA,aAAA,EACxC,kBAAA,CAAmB,IAAA,CAAK,QAAA,CAAS,UAAU,CAAC,CAAA,OAAA,EAClD,mBAAmB,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AACnD,MAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,QAAA,GAAA,IAAO,CAAA,aAAA,EAAgB,kBAAA,CAAmB,IAAA,CAAK,QAAA,CAAS,UAAU,CAAC,CAAA,CAAA;AAAA,MACrE;AAAA,IACF;AACA,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI;AACF,MAAA,EAAA,GAAK,IAAI,UAAU,GAAG,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AAEV,IAAA,EAAA,CAAG,gBAAA,CAAiB,QAAQ,MAAM;AAChC,MAAA,MAAM,eAAA,GAAkB,KAAK,gBAAA,GAAmB,CAAA;AAChD,MAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,MAAA,IAAA,CAAK,eAAe,EAAE,CAAA;AACtB,MAAA,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,eAAA,GAAkB,aAAA,GAAgB,aAAa,CAAC,CAAA;AAC1E,MAAA,IAAA,CAAK,gBAAA,IAAmB;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,CAAC,EAAA,KAAO;AAErC,MAAA,IAAI,IAAA,CAAK,EAAA,KAAO,EAAA,EAAI,IAAA,CAAK,WAAW,SAAA,EAAU;AAC9C,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAQ,EAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,IAClD,CAAC,CAAA;AAID,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AACtD,IAAA,EAAA,CAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,EAAA,KAAO;AAInC,MAAA,IAAK,EAAA,CAAyB,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,OAAO,EAAA,EAAI;AAC7D,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,QAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,MAAM,YAAA,IAAe;AAC1B,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,WAAW,EAAE,CAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,WAAW,EAAA,EAAqB;AACtC,IAAA,IAAI,IAAA,CAAK,OAAO,EAAA,EAAI;AACpB,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,cAAA,EAAgB;AACxC,IAAA,IAAA,CAAK,gBAAA,EAAA;AACL,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,cAAA,EAAgB,IAAA,CAAK,gBAAgB,CAAA;AAE/D,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,GAAA,GAAM,MAAM,IAAA,CAAK,gBAAA,GAAmB,IAAI,IAAK,CAAA;AACnE,IAAA,MAAM,QAAQ,IAAA,GAAO,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AACnD,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEQ,eAAe,EAAA,EAAqB;AAC1C,IAAA,IAAA,CAAK,aAAA,EAAc;AAKnB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,EAAA,EAAI,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAC5D,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,IAAA,EAAK;AACpB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,MAAM,KAAK,IAAA,CAAK,EAAA;AAChB,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAA,EAAM;AAAA,MACX,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,WAAW,EAAE,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,KAAK,OAAA,EAAuB;AAClC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,GAAA,EAA4B;AAClD,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAKA,IAAA,IAAI,GAAA,CAAI,SAAS,cAAA,EAAgB;AAC/B,MAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,SAAA,EAAW;AAClC,QAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,KAAA;AACjB,QAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,aAAa,CAAA;AAC9C,QAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,UAAA,IAAc,CAAA;AAC5C,QAAA,IAAI,OAAO,GAAA,CAAI,aAAA,KAAkB,QAAA,EAAU;AACzC,UAAA,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,GAAA,CAAI,aAAa,CAAA;AAAA,QAC/C;AACA,QAAA,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AACzC,QAAA,IAAA,CAAK,qBAAA,IAAwB;AAAA,MAC/B;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,eAAA,EAAiB;AAChC,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA;AACtC,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,KAAA,IAAS,CAAC,CAAC,IAAA,CAAK,QAAA,IAAY,KAAA,CAAM,SAAA,KAAc,IAAA,CAAK,QAAA,CAAS,QAAA;AAC7E,MAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,UAAA,IAAc,CAAA;AAC5C,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAC1C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAG7B,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,MACxB;AACA,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AAAA,MACjB,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAA,CAAK,MAAM,YAAA,IAAe;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,cAAA,EAAgB;AAGjC,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,MAAM,GAAA,GAAM,GAAA;AACZ,IAAA,MAAM,IAAA,CAAK,kBAAkB,GAAG,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAA,CAAQ,GAAA,EAAkB,EAAA,EAAa,MAAA,EAAiB,KAAA,EAAsB;AACpF,IAAA,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,UAAA,EAAY;AAGjC,MAAA,MAAM,QAAA,GAAW,KAAK,QAAA,GAClB;AAAA,QACE,QAAA,EAAU,KAAK,QAAA,CAAS,QAAA;AAAA,QACxB,YAAY,OAAO,GAAA,CAAI,eAAe,QAAA,GAAW,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,OACzE,GACA,MAAA;AACJ,MAAA,KAAK,IAAA,CAAK,GAAA,CAAI,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,IAAI,UAAA,EAAY,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAAA,IACzF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkB,GAAA,EAAiC;AAG/D,IAAA,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,UAAA,EAAY;AACjC,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,OAAA,GAAU,SAAS,GAAG,CAAA;AAI5B,IAAA,IAAI,aAAA,GAAgB,OAAO,GAAA,CAAI,IAAA,KAAS,WAAW,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,iBAAA,GAAoB,CAAA,GAAI,CAAA;AAC1F,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,IAA0B,CAAA,EAAG;AACnG,MAAA,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,CAAC,CAAA;AAAA,IAC3C;AAGA,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,cAAA,CAAe,MAAA,CAAO,IAAI,IAAA,CAAK,OAAA,IAAW,EAAE,CAAC,CAAA,EAAG;AACzE,MAAA,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAA,kCAAA,EAAgC,OAAO,CAAA,CAAE,CAAA;AAC/D,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAO,MAAA,EAAW,8FAA8F,CAAA;AAClI,MAAA;AAAA,IACF;AAKA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,kBAAA,IAAqB,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACtD,IAAA,MAAM,OAAA,GAAU,cAAc,GAAG,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,CAAK,IAAA,EAAM,SAAS,aAAA,EAAe,CAAC,CAAC,GAAA,CAAI,iBAAiB,CAAA;AAElF,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,MAAM,UAAA,CAAW,CAAA,OAAA,EAAK,OAAO,CAAA,sBAAA,EAAoB,aAAa,CAAA,CAAA,CAAG,CAAA;AACtE,MAAA,IAAA,CAAK,QAAQ,GAAA,EAAK,KAAA,EAAO,MAAA,EAAW,CAAA,uBAAA,EAA0B,aAAa,CAAA,EAAA,CAAI,CAAA;AAC/E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,KAAA,EAAO;AACtB,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAM,KAAK,KAAA,CAAM,eAAA,CAAgB,GAAA,EAAK,OAAA,EAAS,aAAa,CAAA;AACvF,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,QAAA,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAA,OAAA,EAAK,OAAO,CAAA,oBAAA,EAAkB,MAAM,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAC3E,QAAA,IAAA,CAAK,OAAA;AAAA,UACH,GAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA;AAAA,UACA,GAAA,GACI,CAAA,uDAAA,EAA0D,GAAG,CAAA,CAAA,GAC7D;AAAA,SACN;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAW,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,IAAI,OAAO,CAAA;AAC1D,MAAA,IAAI,WAAW,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAI,aAAa,CAAA;AACnE,MAAA,IAAI,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,aAAA,EAAe;AACnD,QAAA,aAAA,CAAc,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,KAAK,IAAI,CAAA;AAAA,MAClD;AAAA,IACF;AAMA,IAAA,MAAM,OAAA,GAAU,IAAI,UAAA,IAAc,GAAA,CAAI,MAAM,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,OAAA,EAAS,OAAO,CAAA;AACtC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,CAAI,IAAA,EAAM,IAAI,IAAI,CAAA;AAAA,IACrD,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,OAAA,EAAS,IAAI,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,oBAAA,CAAqB,KAAK,OAAO,CAAA;AAC7D,MAAA,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAA,OAAA,EAAK,OAAO,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA;AACpF,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,IAAA,EAAM,MAAA,CAAO,UAAU,EAAE,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAM,UAAA,CAAW,CAAA,OAAA,EAAK,OAAO,CAAA,QAAA,EAAM,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AACtD,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAO,MAAA,EAAW,OAAO,KAAK,CAAA;AAAA,IAClD;AAAA,EACF;AACF,CAAA;AAGA,SAAS,eAAe,KAAA,EAA2C;AACjE,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,IAAA;AACxE,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,OAAO,EAAE,SAAA,KAAc,QAAA,IAAY,EAAE,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,IAAA;AACxE,EAAA,OAAO;AAAA,IACL,WAAW,CAAA,CAAE,SAAA;AAAA,IACb,aAAa,OAAO,CAAA,CAAE,WAAA,KAAgB,QAAA,GAAW,EAAE,WAAA,GAAc,IAAA;AAAA,IACjE,aAAa,OAAO,CAAA,CAAE,WAAA,KAAgB,QAAA,GAAW,EAAE,WAAA,GAAc,IAAA;AAAA,IACjE,YAAY,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,GAAW,EAAE,UAAA,GAAa;AAAA,GAChE;AACF;AAMO,SAAS,cAAc,GAAA,EAA0B;AACtD,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,KAAA,EAAO,OAAO,GAAA,CAAI,IAAA;AACnC,EAAA,MAAM,IAAI,GAAA,CAAI,IAAA;AACd,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,GAAG,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,MAAM,CAAA;AACxC,EAAA,IAAI,MAAA,KAAW,eAAA,EAAiB,OAAO,CAAA,IAAA,EAAO,MAAM,CAAA,SAAA,CAAA;AACpD,EAAA,IAAI,MAAA,KAAW,YAAA,EAAc,OAAO,CAAA,IAAA,EAAO,MAAM,CAAA,KAAA,CAAA;AACjD,EAAA,OAAO,OAAO,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,IAAA,IAAQ,GAAG,CAAC,CAAA,CAAA;AAC/C;AAEA,IAAMC,IAAAA,GAAM,SAAA;AACZ,IAAMC,MAAAA,GAAQ,SAAA;AASP,SAAS,oBAAA,CACd,KACA,OAAA,EACwC;AACxC,EAAA,MAAM,IAAI,GAAA,CAAI,IAAA;AACd,EAAA,MAAMC,QAAO,IAAA,CAAK,GAAA,CAAI,IAAI,OAAA,CAAQ,MAAA,CAAO,WAAW,EAAE,CAAA;AACtD,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,MAAA,EAAS,aAAA,CAAc,eAAe,MAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA,EAAGA,KAAAA,GAAO,EAAE,CAAC,CAAC,CAAA,CAAA,EAAG;AAAA,EACjG;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,UAAU,MAAA,CAAO,CAAA,CAAE,UAAA,IAAc,EAAE,GAAG,MAAA,CAAO,CAAA,CAAE,UAAA,IAAc,EAAE,CAAC,CAAA,EAAE;AAAA,EACvG;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAC7B,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,YAAA,CAAa,OAAO,CAAA,CAAE,OAAA,IAAW,EAAE,CAAC,CAAA,EAAE;AAAA,EAC3E;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,oBAAA,EAAsB;AACrC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,MAAM,CAAA;AACxC,IAAA,MAAM,EAAA,GAAK,EAAE,EAAA,GAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA,GAAK,EAAA;AACvC,IAAA,MAAM,UAAU,MAAA,KAAW,OAAA,GAAU,aAAa,CAAA,GAAA,EAAM,MAAM,GAAG,EAAE,CAAA,CAAA;AACnE,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,OAAA,EAAS;AACnC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,IAAA,EAAOF,IAAG,CAAA,EAAG,eAAe,MAAA,CAAO,CAAA,CAAE,OAAO,CAAA,EAAGE,KAAAA,GAAO,CAAC,CAAC,CAAA,EAAGD,MAAK,CAAA,CAAE,CAAA;AAAA,IAChF;AACA,IAAA,IAAI,OAAO,CAAA,CAAE,WAAA,KAAgB,YAAY,CAAA,CAAE,WAAA,CAAY,MAAK,EAAG;AAC7D,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,IAAA,EAAOD,IAAG,CAAA,EAAG,cAAA,CAAe,CAAA,CAAE,WAAA,EAAaE,KAAAA,GAAO,CAAC,CAAC,CAAA,EAAGD,MAAK,CAAA,CAAE,CAAA;AAAA,IAC5E;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,SAAS,MAAA,EAAU;AAAA,EAC/D;AACA,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B;AAGO,SAAS,SAAS,GAAA,EAA0B;AACjD,EAAA,MAAM,IAAI,GAAA,CAAI,IAAA;AACd,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,GAAG,CAAA;AACrC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,MAAM,CAAA;AACxC,MAAA,IAAI,MAAA,KAAW,YAAA,EAAc,OAAO,CAAA,IAAA,EAAO,MAAM,CAAA,YAAA,CAAA;AACjD,MAAA,IAAI,WAAW,eAAA,EAAiB,OAAO,OAAO,MAAM,CAAA,OAAA,EAAU,EAAE,GAAG,CAAA,CAAA;AACnE,MAAA,OAAO,CAAA,IAAA,EAAO,MAAM,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,IACjC;AAAA,IACA,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,EAAE,IAAI,CAAA,CAAA;AAAA,IACvB,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,CAAA,CAAE,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,IAC5D,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,EAAE,OAAO,CAAA,CAAA;AAAA,IAC1B,KAAK,YAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,EAAE,IAAI,CAAA,CAAA;AAAA,IACxB,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,EAAE,IAAI,CAAA,CAAA;AAAA,IACvB,KAAK,cAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,CAAA,CAAE,WAAW,CAAA,QAAA,EAAM,EAAE,SAAS,CAAA,CAAA;AAAA,IAC/C,KAAK,kBAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,CAAA,CAAE,KAAK,CAAA,MAAA,EAAS,EAAE,KAAK,CAAA,CAAA;AAAA,IACzC,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,eAAe,MAAA,CAAO,CAAA,CAAE,WAAW,EAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,IAC7D,KAAK,oBAAA,EAAsB;AAGzB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,MAAM,CAAA;AACxC,MAAA,IAAI,MAAA,KAAW,OAAA,EAAS,OAAO,CAAA,UAAA,EAAa,cAAA,CAAe,MAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACvF,MAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,SAAA;AAC9B,MAAA,OAAO,CAAA,GAAA,EAAM,MAAM,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,CAAA,CAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,IACtD;AAAA,IACA;AACE,MAAA,OAAO,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA;AAE1D;AAGA,SAAS,YAAA,CAAa,MAAc,MAAA,EAAyB;AAC3D,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AAEpB,EAAA,IAAI,IAAA,KAAS,YAAA,IAAgB,IAAA,KAAS,WAAA,EAAa,OAAO,EAAA;AAC1D,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,yBAAyB,CAAA;AAChD,IAAA,OAAO,CAAA,GAAI,CAAA,OAAA,EAAU,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,EACjC;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA;AACjC,EAAA,OAAO,KAAK,KAAK,CAAA,KAAA,EAAQ,KAAA,KAAU,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA,CAAA;AACjD;AClhBO,IAAM,UAAUE,KAAA,CAAK,IAAA,CAAKC,IAAG,OAAA,EAAQ,EAAG,mBAAmB,cAAc,CAAA;AAGhF,IAAMC,IAAAA,GAAM,cAAA;AAkBZ,SAAS,QAAQ,GAAA,EAAsB;AACrC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,GAAA,EAAK;AAEZ,IAAA,OAAQ,IAA8B,IAAA,KAAS,OAAA;AAAA,EACjD;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,WAAA,CACU,GAAA,EACA,QAAA,EACA,OAAA,EACR;AAHQ,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACP;AAAA,EAHO,GAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EAGV,MAAc,IAAA,GAAgC;AAC5C,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,IAAI,KAAA,CAAM,IAAA,CAAK,UAAUA,IAAG,CAAA;AACrD,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAA2B,EAAC;AAAA,EAC7D;AAAA,EAEA,MAAc,MAAM,OAAA,EAAwC;AAC1D,IAAA,MAAM,KAAK,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,QAAA,EAAUA,MAAK,OAAO,CAAA;AAAA,EAClD;AAAA;AAAA,EAGQ,kBAAkB,OAAA,EAAkC;AAC1D,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,IAAA,CAAK,OAAA,IAAW,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,CAAC,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA,EAAG;AAC3E,QAAA,CAAA,CAAE,MAAA,GAAS,QAAA;AACX,QAAA,CAAA,CAAE,OAAA,GAAU,KAAK,GAAA,EAAI;AACrB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,IAAA,GAAgC;AACpC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,IAAI,KAAK,iBAAA,CAAkB,OAAO,GAAG,MAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAC7D,IAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,YAAA,GAAgC;AACpC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAAA,EACvD;AAAA,EAEA,MAAM,IAAI,EAAA,EAA0C;AAClD,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,IAAA,EAAK,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,IAAK,IAAA;AAAA,EACzD;AAAA,EAEA,MAAM,IAAI,KAAA,EAAoC;AAC5C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,IAAA,MAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,UAAA,CAAW,EAAA,EAAY,QAAA,EAAwC;AACnE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,MAAM,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACzC,IAAA,IAAI,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,SAAA,EAAW;AAC/B,MAAA,CAAA,CAAE,MAAA,GAAS,QAAA;AACX,MAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,MAAA,CAAA,CAAE,OAAA,GAAU,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,EAAA,EAA2B;AAC3C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,MAAM,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACzC,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,CAAA,CAAE,MAAA,GAAS,SAAA;AACX,MAAA,CAAA,CAAE,OAAA,GAAU,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC1B;AAAA,EACF;AACF,CAAA;ACtGA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,OAAA,CAAQ,IAAI,yBAAA,IAA6BF,KAAAA,CAAK,KAAKC,GAAAA,CAAG,OAAA,EAAQ,EAAG,iBAAA,EAAmB,UAAU,CAAA;AACvG;AAsBO,SAAS,aAAA,GAA+B;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAME,GAAA,CAAG,YAAA,CAAa,UAAA,IAAc,MAAM,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,OAAO,OAAA,IAAW,OAAO,OAAO,OAAA,KAAY,QAAA,EAAU,MAAA,CAAO,OAAA,GAAU,EAAC;AAC7E,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAE;AAAA,EACvB;AACF;AAEO,SAAS,cAAA,GAAoC;AAClD,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,OAAO,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAC/E;AAEO,SAAS,cAAc,MAAA,EAA+B;AAC3D,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAC3B,EAAA,KAAA,CAAM,GAAG,CAAA;AACX;AAEO,SAAS,gBAAgB,IAAA,EAAoB;AAClD,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,OAAO,GAAA,CAAI,QAAQ,IAAI,CAAA;AACvB,EAAA,KAAA,CAAM,GAAG,CAAA;AACX;AAEO,SAAS,mBAAA,CAAoB,MAAc,OAAA,EAAwB;AACxE,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAC1B,EAAA,IAAI,CAAC,CAAA,EAAG;AACR,EAAA,CAAA,CAAE,OAAA,GAAU,OAAA;AACZ,EAAA,KAAA,CAAM,GAAG,CAAA;AACX;AAEA,SAAS,MAAM,GAAA,EAA0B;AACvC,EAAA,MAAMC,QAAO,UAAA,EAAW;AACxB,EAAAD,GAAA,CAAG,SAAA,CAAUH,MAAK,OAAA,CAAQI,KAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,EAAAD,GAAA,CAAG,aAAA,CAAcC,KAAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACtE;AAQO,SAAS,gBAAgB,IAAA,EAAsC;AACpE,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACjC,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,IAAA;AACvB,EAAA,MAAM,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,EAAE,IAAA,EAAK;AAC1C,EAAA,MAAM,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK;AAC3C,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,OAAO,IAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,SAAS,IAAI,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAC1B,EAAA,MAAM,CAAC,OAAA,EAAS,GAAG,IAAI,CAAA,GAAI,KAAA;AAC3B,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAS,IAAA,EAAK;AAC9C;AAOO,SAAS,iBAAA,CACd,IAAA,EACA,WAAA,EACA,GAAA,EACwB;AACxB,EAAA,MAAM,SAAA,GAAY,KAAK,IAAA,EAAK;AAC5B,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,WAAA,CAAY,IAAA,EAAM,CAAA;AACzC,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,KAAA,CAAM,QAAQ,OAAO,IAAA;AACxC,EAAA,MAAM,CAAC,OAAA,EAAS,GAAG,IAAI,CAAA,GAAI,KAAA;AAC3B,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA,EAAM,GAAA,EAAK,SAAS,IAAA,EAAK;AAC9D;AAGA,SAAS,SAASC,MAAAA,EAAyB;AACzC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,KAAA,GAA0B,IAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,MAAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,EAAA,GAAKA,OAAM,CAAC,CAAA;AAClB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,EAAA,KAAO,OAAO,KAAA,GAAQ,IAAA;AAAA,WACrB,GAAA,IAAO,EAAA;AAAA,IACd,CAAA,MAAA,IAAW,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK;AACnC,MAAA,KAAA,GAAQ,EAAA;AAAA,IACV,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG;AACxB,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,QAAA,GAAA,GAAM,EAAA;AAAA,MACR;AAAA,IACF,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,EAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACrB,EAAA,OAAO,GAAA;AACT;;;ACzHA,IAAM,gBAAA,GAAmB,GAAA;AAGzB,SAASC,SAAQ,GAAA,EAAsB;AACrC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAQ,IAA8B,IAAA,KAAS,OAAA;AAAA,EACjD;AACF;AAGA,eAAe,WAAA,CAAY,SAAiB,CAAA,EAA4B;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,QAAA,CAAS,SAAS,MAAM,CAAA;AAClD,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,EAChE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EACrB,YACU,UAAA,EACA,QAAA,EACA,UACA,OAAA,EACA,GAAA,EAEA,oBAEA,GAAA,EACR;AATQ,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEA,IAAA,IAAA,CAAA,kBAAA,GAAA,kBAAA;AAEA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EACP;AAAA,EATO,UAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EAEA,kBAAA;AAAA,EAEA,GAAA;AAAA;AAAA,EAIV,QAAQ,CAAA,EAA+B;AACrC,IAAA,IAAI,CAAC,CAAA,IAAK,CAAA,KAAM,GAAA,SAAY,IAAA,CAAK,UAAA;AACjC,IAAA,OAAON,KAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,CAAC,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,iBAAiB,CAAA,EAAgC;AAC/C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,QAAA,CAAS,IAAA,CAAK,YAAY,GAAG,CAAA;AAC9C,IAAA,OAAO,IAAI,UAAA,CAAW,IAAI,CAAA,IAAKA,KAAAA,CAAK,WAAW,GAAG,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,IAAA,EAAoD;AAC9E,IAAA,IAAI;AACF,MAAA,QAAQ,IAAA;AAAM,QACZ,KAAK,WAAA;AACH,UAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,QACjC,KAAK,MAAA;AACH,UAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAAA,QAC7B,KAAK,MAAA;AACH,UAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAAA,QAC7B,KAAK,YAAA;AACH,UAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QAClC,KAAK,WAAA;AACH,UAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,QACjC,KAAK,MAAA;AACH,UAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAAA,QAC7B,KAAK,cAAA;AACH,UAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAAA,QACnC,KAAK,kBAAA;AACH,UAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAAA,QACvC,KAAK,oBAAA,EAAsB;AAGzB,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,MAAM,CAAA;AAC3C,UAAA,IAAI,WAAW,OAAA,EAAS,OAAO,MAAM,IAAA,CAAK,cAAc,IAAI,CAAA;AAC5D,UAAA,OAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA;AAAA,QAC5C;AAAA,QACA,KAAK,KAAA,EAAO;AAGV,UAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,YAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,uCAAA,EAAwC;AAAA,UACrE;AAGA,UAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,KAAM,QAAA,EAAU;AACpC,YAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA;AACrC,YAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,kCAAA,EAAmC;AACzE,YAAA,IAAA,CAAK,GAAA,CAAI,WAAW,IAAI,CAAA;AACxB,YAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,YAAA,IAAA,CAAK,kBAAA,IAAqB;AAC1B,YAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,UAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,EAAE;AAAA,UAC/D;AACA,UAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA;AAAA,QACrC;AAAA,QACA,KAAK,aAAA;AACH,UAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAAA,QACnC;AACE,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAG;AAAA;AACvD,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,IAC9E;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,IAAA,EAAoD;AACzE,IAAA,MAAMI,QAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAC,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,CAAKA,KAAI,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,CAAA,gBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,CAAA,EAAG;AACrE,IAAA,IAAI,IAAA,CAAK,WAAA,EAAY,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,eAAA,CAAA,EAAkB;AACjF,IAAA,IAAI,IAAA,CAAK,IAAA,GAAO,GAAA,EAAW,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,gBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,OAAA,CAAA,EAAU;AAE5F,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,QAAA,CAASA,OAAM,MAAM,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,GAAI,CAAA;AAC5E,IAAA,MAAM,QAAQ,OAAO,IAAA,CAAK,UAAU,QAAA,GAAW,IAAA,CAAK,QAAQ,KAAA,CAAM,MAAA;AAClE,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA,GAAS,IAAI,KAAK,CAAA;AACxD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAA,EAAG,MAAA,GAAS,CAAC,CAAA,CAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACrE,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,YAAY,cAAA,EAAe;AAAA,EACxD;AAAA,EAEA,MAAc,KAAK,IAAA,EAAoD;AACrE,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,qBAAA,EAAsB;AAC/D,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,MAAS,CAAA;AACzE,IAAA,MAAM,SAAS,CAAC,eAAA,EAAiB,gBAAgB,SAAA,EAAW,OAAA,EAAS,eAAe,KAAK,CAAA;AACzF,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,IAAI,IAAA,CAAK,MAAM,MAAA,CAAO,IAAA,CAAK,UAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AACtD,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,UAAU,CAAA;AACrC,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,YAAY,GAAK,CAAA;AAC9D,IAAA,IAAI,EAAA,CAAG,SAAS,GAAA,EAAK;AACnB,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,sDAAA,EAAuD;AAAA,IACpF;AAEA,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,MAAA,CAAO,IAAA,EAAK;AAC3B,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,OAAO,cAAA,EAAe;AAAA,EACnD;AAAA,EAEA,MAAc,KAAK,IAAA,EAAoD;AACrE,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,qBAAA,EAAsB;AAC/D,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,MAAS,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA,EAAG,IAAA,CAAK,YAAY,GAAK,CAAA;AAC5F,IAAA,IAAI,EAAA,CAAG,SAAS,GAAA,EAAK;AAEnB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,OAAO,CAAA;AACjD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,YAAA,EAAa;AAAA,IAC9E;AACA,IAAA,MAAM,GAAA,GAAM,GAAG,MAAA,CACZ,IAAA,GACA,KAAA,CAAM,IAAI,CAAA,CACV,MAAA,CAAO,OAAO,CAAA,CACd,IAAI,CAAC,CAAA,KAAMJ,KAAAA,CAAK,QAAA,CAAS,IAAA,CAAK,UAAA,EAAY,CAAC,CAAC,CAAA,CAC5C,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACf,IAAA,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,IAAI,IAAA,CAAK,IAAI,KAAK,YAAA,EAAa;AAAA,EAC5D;AAAA,EAEA,MAAc,UAAU,IAAA,EAAoD;AAC1E,IAAA,MAAMI,QAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAC,CAAA;AACjD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AACzC,IAAA,MAAM,GAAA,CAAI,MAAMJ,KAAAA,CAAK,OAAA,CAAQI,KAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACvD,IAAA,MAAM,OAAA,GAAUD,GAAAA,CAAG,UAAA,CAAWC,KAAI,CAAA;AAClC,IAAA,MAAM,GAAA,CAAI,SAAA,CAAUA,KAAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACzC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,QAAQ,CAAA,EAAG,OAAA,GAAU,WAAA,GAAc,SAAS,IAAIJ,KAAAA,CAAK,QAAA,CAAS,IAAA,CAAK,UAAA,EAAYI,KAAI,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,UAAA,CAAW,OAAO,CAAC,CAAA,OAAA;AAAA,KACrH;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,IAAA,EAAoD;AACzE,IAAA,MAAMA,QAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAC,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,KAAK,WAAA,KAAgB,IAAA;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,CAAKA,KAAI,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,CAAA,gBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,CAAA,EAAG;AAErE,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,QAAA,CAASA,OAAM,MAAM,CAAA;AAC/C,IAAA,IAAI,WAAW,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,4BAAA,EAA6B;AAC3E,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAM,EAAE,MAAA,GAAS,CAAA;AAC7C,IAAA,IAAI,UAAU,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,uDAAA,EAAwD;AACpG,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,CAAC,UAAA,EAAY;AAC5B,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,0BAAA,EAA6B,KAAK,CAAA,+CAAA,CAAA,EAAkD;AAAA,IACjH;AACA,IAAA,MAAM,OAAA,GAAU,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AAChG,IAAA,MAAM,GAAA,CAAI,SAAA,CAAUA,KAAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACzC,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA,OAAA,EAAUJ,KAAAA,CAAK,SAAS,IAAA,CAAK,UAAA,EAAYI,KAAI,CAAC,KAAK,KAAK,CAAA,YAAA,EAAe,UAAU,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,CAAA,EAAI;AAAA,EAC9H;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,WAAW,IAAA,EAAoD;AAC3E,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,EAAE,CAAA;AAC3C,IAAA,IAAI,CAAC,UAAU,CAAC,OAAA,SAAgB,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,wCAAA,EAAyC;AAC7F,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,IAAO,CAAC,KAAK,QAAA,EAAU;AAC/B,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,sDAAA,EAAuD;AAAA,IACpF;AACA,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,IAAI,SAAA,CAAU,IAAA,CAAK,UAAU,MAAM,CAAA;AAC5D,IAAA,IAAI,CAAC,OAAO,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,CAAA,mBAAA,EAAsB,MAAM,CAAA,4BAAA,CAAA,EAA+B;AAClG,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACjC,IAAA,MAAM,GAAA,CAAI,MAAMJ,KAAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACvD,IAAA,MAAM,OAAA,GAAUG,GAAAA,CAAG,UAAA,CAAW,IAAI,CAAA;AAClC,IAAA,MAAM,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA;AAC/B,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,QAAQ,CAAA,EAAG,OAAA,GAAU,WAAA,GAAc,OAAO,IAAIH,KAAAA,CAAK,QAAA,CAAS,IAAA,CAAK,UAAA,EAAY,IAAI,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,gBAAgB,MAAM,CAAA;AAAA,KAC3H;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,eAAe,IAAA,EAAoD;AAC/E,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,OAAO,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,sDAAA,EAAuD;AAC9F,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,OAAO,IAAA,CAAK,UAAA,IAAc,IAAI,CAAC,CAAA;AACzD,MAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,MAAM,GAAG,MAAM,IAAI,MAAM,cAAc,CAAA;AAC1D,MAAA,KAAA,GAAQ,OAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,MAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,EAAG,SAAS,MAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAE,GAAE,CAAE,CAAA;AAAA,IACxF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,oDAAA,EAAqD;AAAA,IAClF;AACA,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,KAAK,CAAA,EAAG;AACxC,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,OAAA,EAAU,KAAK,CAAA,uCAAA,CAAA,EAA0C;AAAA,IACtF;AACA,IAAA,IAAI,aAAuB,EAAC;AAC5B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAChD,QAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,MAAM,GAAG,MAAM,IAAI,MAAM,cAAc,CAAA;AAC1D,QAAA,UAAA,GAAa,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,2CAAA,EAA4C;AAAA,MACzE;AAAA,IACF;AAGA,IAAA,MAAM,OAAO,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,EAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAChG,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,MAAA,EAAO,EAAG,qBAAA,EAAuB,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AACjF,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,IAAA,GAAOD,KAAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,IAAI,CAAA;AAC1C,MAAA,IAAIA,MAAK,QAAA,CAAS,QAAA,EAAU,IAAI,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAClD,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,kCAAA,EAAqC,CAAA,CAAE,IAAI,CAAA,CAAA,EAAG;AAAA,MAC3E;AACA,MAAA,MAAM,GAAA,CAAI,MAAMA,KAAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACvD,MAAA,MAAM,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,IAC7C;AACA,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,KAAK,CAAA;AAG9C,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,KAAK,CAAA,CAAG,OAAA;AAC1D,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA,EAAG;AACjC,MAAA,MAAM,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,GAAK,CAAA;AAChC,MAAA,GAAA,GAAM,SAAA;AACN,MAAA,IAAA,GAAO,UAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,KAAK,EAAE,WAAA,EAAY;AAC5C,MAAA,MAAM,MAAA,GAAmC;AAAA,QACvC,KAAA,EAAO,CAAC,SAAS,CAAA;AAAA,QACjB,KAAA,EAAO,CAAC,MAAM,CAAA;AAAA,QACd,KAAA,EAAO,CAAC,MAAM,CAAA;AAAA,QACd,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,QACf,KAAA,EAAO,CAAC,KAAA,EAAO,KAAK;AAAA,OACtB;AACA,MAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,MAAA,IAAI,CAAC,OAAO,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,CAAA,oBAAA,EAAuB,GAAG,CAAA,0CAAA,CAAA,EAAwC;AACzG,MAAA,GAAA,GAAM,MAAM,CAAC,CAAA;AACb,MAAA,IAAA,GAAO,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,EAAG,SAAA,EAAW,GAAG,UAAU,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,UAAA,KAAe,QAAA,GAAW,KAAK,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,GAAO,CAAA,GAAI,IAAA;AAC7F,IAAA,OAAO,MAAM,IAAI,OAAA,CAAoB,CAAC,cAAA,KAAmB;AACvD,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM;AAAA,QAC7B,KAAK,IAAA,CAAK,UAAA;AAAA,QACV,KAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,WAAW,QAAA,EAAS;AAAA,QAC3C,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,OACjC,CAAA;AACD,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,MAAM,GAAA,GAAM,CAAC,KAAA,KAAkB;AAC7B,QAAA,IAAI,IAAI,MAAA,GAAS,GAAA,EAAS,GAAA,IAAO,KAAA,CAAM,SAAS,MAAM,CAAA;AAAA,MACxD,CAAA;AACA,MAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,GAAG,CAAA;AAC3B,MAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,QAAA,cAAA,CAAe,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gCAAgC,SAAS,CAAA;AAAA,EAAQ,GAAA,CAAI,KAAA,CAAM,IAAK,CAAC,IAAI,CAAA;AAAA,MAC1G,GAAG,SAAS,CAAA;AACZ,MAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,cAAA,CAAe,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,iBAAA,EAAoB,GAAG,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,CAAA;AAAA,MAChF,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACzB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,EAAK,IAAK,aAAA;AAC3B,QAAA,IAAI,IAAA,KAAS,GAAG,cAAA,CAAe,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,4BACrC,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,2BAA2B,IAAI,CAAA;AAAA,EAAM,IAAA,CAAK,KAAA,CAAM,IAAK,CAAC,IAAI,CAAA;AAAA,MACpG,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,KAAK,IAAA,EAAoD;AACrE,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAK,SAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAsB;AACtE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,GAAG,CAAC,CAAA,GAAI,IAAA,CAAK,UAAA;AAC7D,IAAA,MAAM,UAAU,OAAO,IAAA,CAAK,UAAA,KAAe,QAAA,GAAW,KAAK,UAAA,GAAa,IAAA;AACxE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAO,CAAA,EAAG,GAAA,EAAK,OAAO,CAAA;AACjE,IAAA,MAAM,QAAA,GAAW,CAAC,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAC1E,IAAA,MAAM,SAAA,GAAY,SAAS,MAAA,GAAS,GAAA,GAAQ,SAAS,KAAA,CAAM,CAAA,EAAG,GAAK,CAAA,GAAI,qBAAA,GAAmB,QAAA;AAC1F,IAAA,IAAI,IAAI,QAAA,EAAU;AAChB,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,2BAA2B,OAAO,CAAA;AAAA,EAAQ,SAAS,CAAA,CAAA,EAAG;AAAA,IACnF;AACA,IAAA,MAAM,MAAA,GAAS,CAAA,UAAA,EAAa,GAAA,CAAI,IAAI,CAAA,CAAA;AACpC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAI,IAAA,KAAS,CAAA;AAAA,MACjB,MAAA,EAAQ,CAAA,EAAG,SAAA,IAAa,aAAa;AAAA,CAAA,EAAM,MAAM,CAAA,CAAA,CAAA;AAAA,MACjD,OAAO,GAAA,CAAI,IAAA,KAAS,CAAA,GAAI,MAAA,GAAY,mBAAmB,MAAM,CAAA;AAAA,EAAO,SAAS,CAAA;AAAA,KAC/E;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,cAAc,IAAA,EAAoD;AAC9E,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAK,SAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAsB;AACtE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,GAAG,CAAC,CAAA,GAAI,IAAA,CAAK,UAAA;AAG7D,IAAA,IAAI,CAACG,GAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAA,EAAG;AAAA,IAC1D;AACA,IAAA,MAAM,KAAK,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACzC,IAAA,MAAM,UAAUH,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,EAAE,CAAA,IAAA,CAAM,CAAA;AAE9C,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C,MAAA,GAAA,GAAMG,GAAAA,CAAG,QAAA,CAAS,OAAA,EAAS,GAAG,CAAA;AAAA,IAChC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,yBAAA,EAA4B,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA,EAAG;AAAA,IAC5G;AAEA,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,MAAM,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAO,GAAG,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,OAAO,CAAC,QAAA,EAAU,GAAA,EAAK,GAAG,GAAG,CAAA;AAAA,IAC9F,SAAS,GAAA,EAAK;AACZ,MAAAA,GAAAA,CAAG,UAAU,GAAG,CAAA;AAChB,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,iBAAA,EAAoB,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA,EAAG;AAAA,IACpG;AAKA,IAAA,IAAI,UAAA,GAA2B,IAAA;AAC/B,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,UAAA,GAAa,GAAA;AAAA,IACf,CAAC,CAAA;AACD,IAAAA,GAAAA,CAAG,UAAU,GAAG,CAAA;AAChB,IAAA,MAAM,MAAM,KAAA,CAAM,GAAA;AAOlB,IAAA,IAAI,SAAA;AACJ,IAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAwB;AAC3C,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AACA,IAAA,KAAA,CAAM,EAAA,CAAG,QAAQ,WAAW,CAAA;AAC5B,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,gBAAgB,CAAC,CAAA;AAExD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,iBAAA,EAAqB,UAAA,CAAqB,OAAO,CAAA,CAAA,EAAG;AAAA,IACjF;AACA,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,mCAAA,EAAoC;AAEzE,IAAA,IAAI,SAAA,KAAc,MAAA,IAAa,CAACG,QAAAA,CAAQ,GAAG,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,OAAA,EAAS,EAAE,CAAA;AAC1C,MAAA,MAAM,OAAO,SAAA,IAAa,SAAA;AAC1B,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EACE,CAAA,0CAAA,EAA6C,IAAI,CAAA,oEAAA,CAAA,IAEhD,IAAA,GAAO;;AAAA;AAAA,EAAgB,IAAI,CAAA,CAAA,GAAK,0BAAA;AAAA,OACrC;AAAA,IACF;AAGA,IAAA,KAAA,CAAM,cAAA,CAAe,QAAQ,WAAW,CAAA;AACxC,IAAA,KAAA,CAAM,KAAA,EAAM;AAEZ,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,KAAA,GAAsB;AAAA,QAC1B,EAAA;AAAA,QACA,GAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAa,OAAO,IAAA,CAAK,WAAA,KAAgB,QAAA,GAAW,KAAK,WAAA,GAAc,MAAA;AAAA,QACvE,GAAA;AAAA,QACA,OAAA,EAAS,KAAK,OAAA,IAAW,EAAA;AAAA,QACzB,OAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,MAAA,EAAQ;AAAA,OACV;AAGA,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAC7B,MAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS,KAAK,KAAK,QAAA,EAAU,UAAA,CAAW,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,QAAQ,IAAA,CAAK,SAAA;AAAA,QACX;AAAA,UACE,EAAA;AAAA,UACA,GAAA;AAAA,UACA,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA;AAAA,UACA,MAAM,CAAA,qCAAA,EAAwC,EAAE,CAAA,MAAA,EAAS,GAAG,gDAAgD,OAAO,CAAA,oEAAA;AAAA,SACrH;AAAA,QACA,IAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,WAAW,IAAA,EAAoD;AAC3E,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,uCAAA,EAAwC;AAClF,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAA,EAAS;AACrB,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,oFAAA,EAAuF;AAAA,IACpH;AAEA,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,OAAO,IAAA,CAAK,QAAA,KAAa,YAAY,IAAA,CAAK,QAAA,CAAS,MAAK,EAAG;AAC7D,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACvC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,GAAA,GAAM,MAAA;AAAA,aACrE,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,8DAAA,EAA+D;AAAA,MACjG,SAAS,CAAA,EAAG;AACV,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,4BAAA,EAA+B,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAG;AAAA,MACzG;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,EAAM,OAAA,EAAS,GAAG,CAAA;AAChD,IAAA,IAAI,CAAC,KAAK,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,CAAA,8BAAA,EAAiC,OAAO,CAAA,EAAA,CAAA,EAAK;AAElF,IAAA,aAAA,CAAc,GAAG,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAG,CAAA;AACzC,MAAA,IAAA,CAAK,kBAAA,IAAqB;AAC1B,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC5C,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,QAAQ,IAAA,CAAK,SAAA;AAAA,UACX;AAAA,YACE,QAAQ,GAAA,CAAI,IAAA;AAAA,YACZ,OAAA,EAAS,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,YACrD,SAAA,EAAW,IAAA;AAAA,YACX,WAAW,KAAA,CAAM,MAAA;AAAA,YACjB,KAAA;AAAA,YACA,IAAA,EACE,uCAAuC,GAAA,CAAI,IAAI,UAAU,KAAA,CAAM,MAAM,CAAA,KAAA,EAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA,EACvG,MAAM,MAAA,GAAS,CAAA,EAAA,EAAK,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,4DAAA;AAAA,WAClD;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,kBAAA,IAAqB;AAC1B,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO,CAAA,kBAAA,EAAqB,GAAA,CAAI,IAAI,CAAA,0BAAA,EAA6B,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OACnH;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,oBAAoB,IAAA,EAAoD;AACpF,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,MAAM,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,+DAAA,EAAgE;AAAA,IAC7F;AAEA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK;AACvC,MAAA,IAAI,CAAC,MAAM,MAAA,EAAQ,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,2CAAA,EAA4C;AAC1F,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,QAAA,MAAM,GAAA,GAAM,WAAA,CAAY,CAAA,CAAE,SAAS,CAAA;AACnC,QAAA,MAAM,SACJ,CAAA,CAAE,MAAA,KAAW,SAAA,GACT,SAAA,GACA,GAAG,CAAA,CAAE,MAAM,CAAA,EAAG,OAAO,EAAE,QAAA,KAAa,QAAA,GAAW,UAAU,CAAA,CAAE,QAAQ,MAAM,EAAE,CAAA,CAAA;AACjF,QAAA,OAAO,CAAA,EAAG,EAAE,EAAE,CAAA,GAAA,EAAM,MAAM,CAAA,OAAA,EAAU,CAAA,CAAE,GAAG,CAAA,UAAA,EAAa,GAAG;AAAA,IAAA,EAAS,EAAE,OAAO,CAAA,CAAA;AAAA,MAC7E,CAAC,CAAA;AACD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,IAC9C;AAEA,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,EAAA,IAAM,EAAE,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,CAAA,8BAAA,EAAiC,EAAE,CAAA,CAAA,EAAG;AAE5E,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,MAAM,WAAW,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,EAAA;AAC/D,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,MAAM,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,MACnD,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,CAAA,4BAAA,EAA+B,EAAE,CAAA,CAAA,CAAA,EAAI;AAAA,MAClE;AACA,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAM,CAAC,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3D,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,IAAA,IAAQ,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAA,CAAA,EAAI;AAAA,IACjE;AAEA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,QAAA,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,WAAW,EAAE,CAAA,YAAA,EAAe,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA,EAAI;AAAA,MACxE;AACA,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AACjC,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAI;AACF,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AAAA,UACnC,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF,GAAG,GAAI,CAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AAAA,QAClC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,EAAE,CAAA;AAClC,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,8BAA8B,EAAE,CAAA,MAAA,EAAS,IAAA,CAAK,GAAG,CAAA,EAAA,CAAA,EAAK;AAAA,IACnF;AAEA,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAA,EAAG;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBAAA,GAAyC;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AAC3B,IAAA,IAAI,UAA0B,EAAC;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK;AACvC,MAAA,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,OAAA,MAAa,IAAA,CAAK,OAAA,IAAW,EAAA,CAAG,CAAA;AAAA,IAC5F,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AAI5B,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,EAAa,GAAA,KAAwB;AACnD,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAA,EAAK,GAAG,CAAA;AAAA,MACxB,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,QACvB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,KAAK,SAAS,CAAA;AACtD,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3C,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,KAAK,SAAS,CAAA;AACtD,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAU,WAAA,CAAY,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AACnF,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAAA,EAEQ,GAAA,CACN,GAAA,EACA,IAAA,EACA,GAAA,EACA,SAAA,EAC8E;AAC9E,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,IAAI,OAAA,GAAU,KAAA;AAGd,MAAA,MAAM,aAAa,GAAA,GAAM,IAAA;AAEzB,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI;AAGF,QAAA,KAAA,GAAQ,MAAM,GAAA,EAAK,IAAA,EAAM,EAAE,GAAA,EAAK,QAAA,EAAU,MAAM,CAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,EAAE,QAAQ,EAAA,EAAI,MAAA,EAAQ,IAAI,IAAA,EAAM,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,CAAA;AAC9D,QAAA;AAAA,MACF;AACA,MAAA,KAAA,CAAM,KAAA,EAAM;AAEZ,MAAA,IAAI,UAAA,GAAmD,IAAA;AACvD,MAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAiB;AAC/B,QAAA,IAAI,OAAA,EAAS;AACb,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,IAAI,UAAA,eAAyB,UAAU,CAAA;AACvC,QAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,UAAU,CAAA;AAAA,MAC5C,CAAA;AAEA,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,IAAI;AACF,UAAA,IAAI,MAAM,GAAA,EAAK,OAAA,CAAQ,KAAK,CAAC,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,QACnD,CAAA,CAAA,MAAQ;AACN,UAAA,IAAI;AACF,YAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,UACtB,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,UAAA,CAAW,MAAM,MAAA,CAAO,QAAQ,CAAA,EAAG,GAAG,CAAA;AAAA,MACxC,GAAG,SAAS,CAAA;AAEZ,MAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC9B,QAAA,IAAI,MAAA,CAAO,MAAA,GAAS,UAAA,EAAY,MAAA,IAAU,EAAE,QAAA,EAAS;AAAA,MACvD,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC9B,QAAA,IAAI,MAAA,CAAO,MAAA,GAAS,UAAA,EAAY,MAAA,IAAU,EAAE,QAAA,EAAS;AAAA,MACvD,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAA+B;AAChD,QAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,GAAS,MAAA,CAAO,GAAG,CAAA;AAChC,QAAA,MAAA,CAAO,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,GAAA,GAAM,CAAC,CAAA;AAAA,MACxC,CAAC,CAAA;AAED,MAAA,KAAA,CAAM,GAAG,OAAA,EAAS,CAAC,SAAS,MAAA,CAAO,IAAA,IAAQ,QAAQ,CAAC,CAAA;AAIpD,MAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACzB,QAAA,QAAA,GAAW,IAAA,IAAQ,CAAA;AACnB,QAAA,UAAA,GAAa,UAAA,CAAW,MAAM,MAAA,CAAO,QAAQ,GAAG,GAAG,CAAA;AAAA,MACrD,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,QAAA,CAAS,IAAA,EAAc,OAAA,EAAoC;AACvE,IAAA,MAAM,EAAA,GAAK,aAAa,OAAO,CAAA;AAC/B,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,MAAM,IAAA,GAAO,OAAOC,IAAAA,KAAgB;AAClC,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,OAAA,CAAQA,IAAAA,EAAK,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC9E,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,cAAA,EAAgB;AACpD,QAAA,MAAM,IAAA,GAAOP,KAAAA,CAAK,IAAA,CAAKO,IAAAA,EAAK,EAAE,IAAI,CAAA;AAClC,QAAA,IAAI,CAAA,CAAE,WAAA,EAAY,EAAG,MAAM,KAAK,IAAI,CAAA;AAAA,aAC/B;AACH,UAAA,MAAM,GAAA,GAAMP,KAAAA,CAAK,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC/C,UAAA,IAAI,EAAA,CAAG,IAAA,CAAK,GAAG,CAAA,IAAK,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAA;AACA,IAAA,MAAM,KAAK,IAAI,CAAA;AACf,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;AAEA,SAAS,YAAY,SAAA,EAA2B;AAC9C,EAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,IAAa,GAAA;AACxC,EAAA,IAAI,OAAO,EAAA,EAAI,OAAO,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA,KAAA,CAAA;AACzC,EAAA,IAAI,IAAA,GAAO,MAAM,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAC,CAAA,KAAA,CAAA;AAChD,EAAA,IAAI,IAAA,GAAO,OAAO,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,IAAI,CAAC,CAAA,KAAA,CAAA;AACnD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,CAAC,CAAA,KAAA,CAAA;AACpC;AAEA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,OAAA,GAAU,KACb,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA,CACnC,OAAA,CAAQ,SAAS,GAAG,CAAA,CACpB,QAAQ,KAAA,EAAO,OAAO,EACtB,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,CAClB,OAAA,CAAQ,OAAO,GAAG,CAAA;AACrB,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA;AAClC;ACtsBO,IAAM,oBAAA,GAAuB,YAAA;AAEpC,IAAM,2BAAA,GAA8B,CAAC,YAAA,EAAc,YAAA,EAAc,YAAY,CAAA;AAE7E,IAAM,WAAA,GAAc,EAAE,IAAA,EAAM,eAAA,EAAiB,SAAS,OAAA,EAAQ;AAgF9D,IAAM,cAAA,GAAiB,GAAA;AAGvB,IAAM,eAAA,GAAkB,GAAA;AAMjB,IAAM,YAAN,MAAgB;AAAA,EAerB,YAAoB,MAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK;AAAA,EACxC;AAAA,EAFoB,MAAA;AAAA,EAdZ,KAAA,GAA+C,IAAA;AAAA,EAC/C,MAAA,GAAS,CAAA;AAAA,EACT,OAAA,uBAAc,GAAA,EAAiH;AAAA,EAC/H,MAAA,GAAS,EAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EAEjB,UAAA;AAAA,EACA,eAAA,GAAkB,oBAAA;AAAA,EAClB,eAAwC,EAAC;AAAA,EACzC,YAAA,GAAe,EAAA;AAAA,EACf,QAAsB,EAAC;AAAA,EACvB,YAA8B,EAAC;AAAA,EAC/B,SAAA,GAA2B,IAAA;AAAA;AAAA,EAO3B,MAAM,QAAQ,UAAA,EAAmC;AAC/C,IAAA,MAAM,QAAQQ,KAAAA,CAAM,IAAA,CAAK,OAAO,OAAA,EAAS,IAAA,CAAK,OAAO,IAAA,EAAM;AAAA,MACzD,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,GAAA,IAAO,UAAA;AAAA,MACxB,GAAA,EAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,GAAI,IAAA,CAAK,MAAA,CAAO,GAAA,IAAO,EAAC,EAAG;AAAA,MAClD,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAEb,IAAA,KAAA,CAAM,GAAG,OAAA,EAAS,CAAC,GAAA,KAAQ,IAAA,CAAK,QAAQ,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAA,CAAK,OAAO,IAAI,CAAA,mBAAA,EAAsB,IAAI,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACtH,IAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACzB,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAA,CAAK,OAAO,IAAI,CAAA,eAAA,EAAkB,IAAA,IAAQ,SAAS,IAAI,CAAC,CAAA;AAAA,IAClH,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAA,CAAO,YAAY,MAAM,CAAA;AAC/B,IAAA,KAAA,CAAM,MAAA,CAAO,GAAG,MAAA,EAAQ,CAAC,UAAkB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAE7D,IAAA,KAAA,CAAM,MAAA,CAAO,YAAY,MAAM,CAAA;AAC/B,IAAA,IAAI,UAAA,GAAa,EAAA;AACjB,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AACrC,MAAA,UAAA,GAAA,CAAc,UAAA,GAAa,CAAA,EAAG,KAAA,CAAM,IAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAc,MAAM,IAAA,CAAK,OAAA;AAAA,QAC7B,YAAA;AAAA,QACA;AAAA,UACE,eAAA,EAAiB,oBAAA;AAAA,UACjB,cAAc,EAAE,KAAA,EAAO,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AAAA,UACzC,UAAA,EAAY;AAAA,SACd;AAAA,QACA;AAAA,OACF;AAOA,MAAA,MAAM,UAAA,GAAa,WAAW,eAAA,IAAmB,oBAAA;AACjD,MAAA,IAAI,CAAC,2BAAA,CAA4B,QAAA,CAAS,UAAU,CAAA,EAAG;AAGrD,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,qDAAqD,UAAU,CAAA,sBAAA,EAAyB,2BAAA,CAA4B,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA;AAAA,SAChI;AAAA,MACF;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,UAAA;AACvB,MAAA,IAAA,CAAK,YAAA,GAAe,UAAA,CAAW,YAAA,IAAgB,EAAC;AAChD,MAAA,IAAA,CAAK,aAAa,UAAA,CAAW,UAAA,IAAc,EAAE,IAAA,EAAM,IAAA,CAAK,OAAO,IAAA,EAAK;AACpE,MAAA,IAAA,CAAK,YAAA,GAAe,WAAW,YAAA,IAAgB,EAAA;AAG/C,MAAA,IAAA,CAAK,OAAO,2BAA2B,CAAA;AAGvC,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,MAAM,KAAK,YAAA,EAAa;AACrD,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,MAAM,KAAK,gBAAA,EAAiB;AAAA,IAC/D,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,IAAA,CAAK,SAAA,GAAY,UAAA,GAAa,CAAA,EAAG,GAAG;AAAA,EAAK,UAAA,CAAW,IAAA,EAAM,CAAA,CAAA,GAAK,GAAA;AAC/D,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,GAA8B;AAClC,IAAA,MAAM,MAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAChD,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA,GAAI,GAAA,CAAI,QAAQ,EAAC;AAAA,EACxD;AAAA,EAEA,MAAM,gBAAA,GAAkC;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,MAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AACpD,MAAA,IAAA,CAAK,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA,EAAK,SAAS,CAAA,GAAI,GAAA,CAAI,YAAY,EAAC;AAAA,IACpE,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,YAAY,EAAC;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,IAAA,EAAc,IAAA,EAAuD;AAClF,IAAA,MAAM,GAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAc,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,CAAA;AAKvE,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,GAAA,EAAK,OAAA,EAAS,KAAK,iBAAiB,CAAA;AAChE,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC,CAAC,KAAK,OAAO,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,aAAa,GAAA,EAAqC;AACtD,IAAA,MAAM,MAAO,MAAM,IAAA,CAAK,QAAQ,gBAAA,EAAkB,EAAE,KAAK,CAAA;AAGzD,IAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,GAAA,EAAK,QAAQ,CAAA;AAClD,IAAA,OAAO,KAAK,MAAA,CAAO,GAAA,EAAK,EAAE,GAAA,EAAI,EAAG,MAAM,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEQ,MAAA,CAAO,MAAA,EAAgB,IAAA,EAA+B,IAAA,EAAc,OAAA,EAAiC;AAC3G,IAAA,MAAM,WAAA,GAA8B;AAAA,MAClC,MAAA,EAAQ,KAAK,MAAA,CAAO,IAAA;AAAA,MACpB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,MAAA;AAAA,MACA,UAAA,EAAY,MAAA,CAAO,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,MACtC,YAAA,EAAc,OAAO,IAAI,CAAA;AAAA,MACzB,OAAOC,MAAAA,CAAO,WAAA,CAAY,CAAC,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,MAC3C,OAAA;AAAA,MACA,EAAA,EAAI,KAAK,GAAA;AAAI,KACf;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,CAAC,OAAA,EAAS,MAAM,WAAA,EAAY;AAAA,EAC3C;AAAA,EAEA,YAAA,GAAsC;AACpC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,MAAA,EAAQ,IAAA,CAAK,SAAA,GAAY,OAAA,GAAU,WAAA;AAAA,MACnC,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,YAAA,EAAc,KAAK,YAAA,IAAgB,MAAA;AAAA,MACnC,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAA,EAAO,KAAK,SAAA,IAAa;AAAA,KAC3B;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAC3C,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,KAAA,EAAO,MAAM,GAAA,EAAI;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,KAAA,EAAO,KAAK,SAAS,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA;AAAA,EAIQ,OAAA,CAAQ,MAAA,EAAgB,MAAA,EAAiB,SAAA,GAAY,cAAA,EAAkC;AAC7F,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,MAAA,EAAQ;AAC9B,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,KAAK,MAAA,CAAO,IAAI,qBAAqB,CAAC,CAAA;AACtE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,MAAA,MAAM,UAA0B,EAAE,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,QAAQ,MAAA,EAAO;AACrE,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,MAAM,CAAA,MAAA,EAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,kBAAA,EAAqB,SAAS,CAAA,GAAA,CAAK,CAAC,CAAA;AAAA,MACtG,GAAG,SAAS,CAAA;AACZ,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAC/C,MAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,MAAA,CAAO,QAAgB,MAAA,EAAwB;AACrD,IAAA,MAAM,OAAA,GAA+B,EAAE,OAAA,EAAS,KAAA,EAAO,QAAQ,MAAA,EAAO;AACtE,IAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EACpB;AAAA,EAEQ,MAAM,OAAA,EAAuE;AACnF,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK,MAAM,KAAA,CAAM,KAAA,CAAM,KAAK,SAAA,CAAU,OAAO,IAAI,IAAI,CAAA;AAAA,IACvD,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,OAAO,KAAA,EAAqB;AAClC,IAAA,IAAA,CAAK,MAAA,IAAU,KAAA;AACf,IAAA,IAAI,EAAA;AACJ,IAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,MAAM,CAAA,EAAG;AAC5C,MAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAC3C,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AACtC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,SAAS,GAAA,EAAsD;AAErE,IAAA,IAAI,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,KAAc,QAAA,IAAY,OAAS,OAAA,IAAW,GAAA,CAAA,IAAS,GAAA,CAAI,MAAA,KAAW,MAAA,EAAW;AACrG,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,EAAE,CAAA;AACrC,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAC1B,MAAA,YAAA,CAAa,MAAM,KAAK,CAAA;AACxB,MAAA,IAAI,GAAA,CAAI,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,OAAA,EAAU,GAAA,CAAI,KAAA,CAAM,IAAI,GAAG,CAAC,CAAA;AAAA,WACjF,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAC7B,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,OAAO,GAAA,CAAI,OAAO,QAAA,EAAU;AAC5C,MAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAQ;AACzB,QAAA,IAAA,CAAK,KAAA,CAAM,EAAE,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,IAAI,EAAA,EAAI,MAAA,EAAQ,EAAC,EAAG,CAAA;AAAA,MACvD,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,KAAA,CAAM;AAAA,UACT,OAAA,EAAS,KAAA;AAAA,UACT,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA,8BAAA,EAAiC,GAAA,CAAI,MAAM,CAAA,CAAA;AAAG,SAC/E,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,EAAA,KAAO,MAAA,EAAW;AACtC,MAAA,IAAI,GAAA,CAAI,WAAW,kCAAA,EAAoC,KAAK,KAAK,YAAA,EAAa,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAC9F,MAAA,IAAI,GAAA,CAAI,WAAW,sCAAA,EAAwC,KAAK,KAAK,gBAAA,EAAiB,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACxG;AAAA,EACF;AAAA,EAEQ,QAAQ,GAAA,EAAkB;AAChC,IAAA,KAAA,MAAW,GAAG,KAAK,CAAA,IAAK,KAAK,OAAA,EAAS;AACpC,MAAA,YAAA,CAAa,MAAM,KAAK,CAAA;AACxB,MAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF,CAAA;AAOO,IAAM,aAAN,MAAiB;AAAA,EAKtB,YAAoB,UAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAAqB;AAAA,EAArB,UAAA;AAAA,EAJZ,OAAA,uBAAc,GAAA,EAAuB;AAAA;AAAA,EAErC,eAAiC,EAAC;AAAA;AAAA,EAK1C,MAAM,QAAQ,MAAA,EAA6C;AACzD,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,IAAI,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,MAAM,CAAA;AACnC,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AACpC,IAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AACpC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,WAAW,IAAA,EAAoB;AAC7B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,KAAA,MAAW,GAAGC,EAAC,CAAA,IAAK,KAAK,OAAA,EAASA,GAAE,KAAA,EAAM;AAC1C,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,IAAI,IAAA,EAAqC;AACvC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,cAAA,GAA2B;AACzB,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,EAC9C;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,GAAGA,EAAC,CAAA,IAAK,KAAK,OAAA,EAAS,CAAA,IAAKA,GAAE,KAAA,CAAM,MAAA;AAC/C,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAA,GAAqE;AACnE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAACA,EAAAA,KAAMA,EAAAA,CAAE,cAAc,CAAA;AAAA,MACtE,WAAA,EAAa,KAAK,GAAA;AAAI,KACxB;AAAA,EACF;AAAA,EAEA,kBAAA,CAAmB,IAAI,EAAA,EAAsB;AAC3C,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,MAAM,SAAS,IAAA,EAA0F;AACvG,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,MAAM,CAAA;AAC3C,IAAA,MAAM,aAAa,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,KAAK,MAAA,GAAS,EAAA;AAEnE,IAAA,IAAI,WAAW,MAAA,EAAQ;AAGrB,MAAA,MAAM,UAAU,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACjD,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,KAAA,EAAO,EAAE,KAAA,CAAM,MAAA;AAAA,QACf,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,MAAA,IAAU;AAAA,OACpC,CAAE,CAAA;AACF,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,MAAA,EAAQ,OAAA,CAAQ,MAAA,GACZ,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAQ,EAAG,IAAA,EAAM,CAAC,CAAA,GACnC;AAAA,OACN;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,YAAA,EAAc;AAE3B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,EAAQ,CAAE,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA;AACrF,MAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,UAAA,GAAa,CAAA,+BAAA,EAAkC,UAAU,CAAA,EAAA,CAAA,GAAO,2EAAA,EAA4E;AACxL,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,KAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,EAAE;AAAA,IAC1D;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,EAAe;AAClC,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO,KAAA,CAAM,MAAA,GACT,CAAA,+BAAA,EAAkC,UAAU,yBAAyB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GACrF,CAAA,yEAAA;AAAA,OACN;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI,WAAW,eAAA,EAAiB;AAC9B,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,GAAA,IAAO,EAAE,CAAA;AACjC,QAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,iCAAA,EAAkC;AACvE,QAAA,GAAA,GAAM,MAAM,MAAA,CAAO,YAAA,CAAa,GAAG,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA;AACvC,QAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,8BAAA,EAA+B;AACzE,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,CAAK,cAAc,CAAA;AAC9C,QAAA,IAAI,QAAA,YAAoB,OAAO,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,SAAS,OAAA,EAAQ;AAC3E,QAAA,GAAA,GAAM,MAAM,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,QAAQ,CAAA;AAAA,MAChD;AAEA,MAAA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA;AACtC,MAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,GAAA,CAAI,WAAW,CAAA;AAChD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,iCAAiC;AAAA,EAAK,MAAM,CAAA,CAAA,EAAG;AAAA,MAC3F;AACA,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,IAAI,IAAI;AAAA,EAAK,MAAM,CAAA,CAAA,EAAG;AAAA,IACtD,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,IAC9E;AAAA,EACF;AACF,CAAA;AAIA,SAAS,UAAU,GAAA,EAA+C;AAChE,EAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,EAAA,SAAW,EAAC;AACvC,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA;AACpC,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,IAAI,MAAM,8CAA8C,CAAA;AAC5F,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,MAAA;AAC3E,IAAA,OAAO,IAAI,MAAM,2CAA2C,CAAA;AAAA,EAC9D,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,EACpG;AACF;AAGA,SAAS,cAAA,CAAe,SAAqD,UAAA,EAA6B;AACxG,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,IAAW,EAAC,EAAG;AACjC,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,SAAA,IACzE,KAAA,CAAM,SAAS,UAAA,IAAc,KAAA,CAAM,YAAY,OAAO,KAAA,CAAM,aAAa,QAAA,EAAU;AAC1F,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA;AAChB,MAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,UAAU,KAAA,CAAM,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,WAC5C,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,MAAA,CAAO,EAAE,GAAA,IAAO,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACrD,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,SAAA,IAC9E,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,SAChF,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,UAAA,KAAe,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAC7F,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,EAAK;AAC/B;AAEA,SAAS,wBAAwB,QAAA,EAA8D;AAC7F,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAWA,EAAAA,IAAK,QAAA,IAAY,EAAC,EAAG;AAC9B,IAAA,IAAI,OAAOA,EAAAA,CAAE,IAAA,KAAS,UAAU,KAAA,CAAM,IAAA,CAAKA,GAAE,IAAI,CAAA;AAAA,SAAA,IACxC,OAAOA,EAAAA,CAAE,IAAA,KAAS,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,iBAAA,EAAoB,MAAA,CAAOA,EAAAA,CAAE,GAAA,IAAO,EAAE,CAAC,CAAA,EAAA,EAAKA,EAAAA,CAAE,IAAA,CAAK,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,EACzH;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,EAAK;AAC/B;AAEA,SAAS,kBAAkB,CAAA,EAA2B;AACpD,EAAA,MAAM,EAAA,GAAK,CAAA,EAAG,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG,CAAA,CAAE,UAAA,CAAW,OAAA,GAAU,CAAA,CAAA,EAAI,CAAA,CAAE,UAAA,CAAW,OAAO,KAAK,EAAE,CAAA,CAAA;AACxF,EAAA,OACE,CAAA,qBAAA,EAAwB,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK,EAAE,CAAA,WAAA,EAAc,CAAA,CAAE,eAAe,CAAA,QAAA,EAC5D,CAAA,CAAE,MAAM,CAAA,aAAA,EAAgB,CAAA,CAAE,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,eAAA,EAC1C,CAAA,CAAE,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,CAAA;AAEjE;AAGA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAA;AACvC;AACA,SAAS,SAAS,KAAA,EAAyB;AACzC,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,QAAQ,CAAA;AACnD,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA,CAAE,MAAK,EAAG;AACpE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,QAAA,CAAU,KAAA,CAAkC,CAAC,CAAC,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AACA,SAAS,OAAOL,MAAAA,EAAuB;AACrC,EAAA,OAAOI,MAAAA,CAAO,WAAW,QAAQ,CAAA,CAAE,OAAOJ,MAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AAC/D;;;AC3fO,IAAM,mBAAN,MAAuB;AAAA,EACnB,QAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EAEQ,GAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EAEjB,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AACnB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAIpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,eAAA,CAAgB,OAAA,CAAQ,KAAK,OAAA,CAAQ,QAAA,EAAU,QAAQ,WAAW,CAAA;AAKtF,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,IAAA,CAAK,OAAO,IAAI,SAAA;AAAA,MACd,OAAA,CAAQ,UAAA;AAAA,MACR,IAAA,CAAK,QAAA;AAAA,MACL,OAAA,CAAQ,QAAA;AAAA,MACR,OAAA,CAAQ,WAAA;AAAA,MACR,IAAA,CAAK,GAAA;AAAA,MACL,MAAM,KAAK,iBAAA,EAAkB;AAAA,MAC7B,OAAA,CAAQ;AAAA,KACV;AACA,IAAA,IAAA,CAAK,SAAS,IAAI,MAAA;AAAA,MAChB,OAAA,CAAQ,GAAA;AAAA,MACR,OAAA,CAAQ,QAAA;AAAA,MACR,IAAA,CAAK,IAAA;AAAA,MACL,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,KAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA,EAGA,iBAAA,GAA0B;AACxB,IAAA,KAAK,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,GAAsC;AAC1C,IAAA,MAAM,QAAQ,MAAM,aAAA,CAAc,IAAA,CAAK,GAAA,EAAK,KAAK,QAAQ,CAAA;AACzD,IAAA,IAAA,CAAK,IAAA,CAAK,WAAA,GAAc,IAAI,GAAA,CAAI,MAAM,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,IAAI,GAAA,CAAI,MAAM,SAAS,CAAA;AAC7C,IAAA,IAAI,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAA,GAAyB;AACvB,IAAA,KAAK,KAAK,GAAA,CACP,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU,gBAAgB,EAAE,GAAA,EAAK,IAAA,CAAK,UAAA,EAAY,SAAS,IAAA,CAAK,WAAA,EAAa,CAAA,CACxF,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,wBAAA,GAAwD;AAC5D,IAAA,MAAM,UAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,MAAA,IAAU,gBAAe,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,EAAG;AAC9D,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,MAAM,CAAA;AAC5C,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,MAC1E,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,EAAA,EAAI,KAAA;AAAA,UACJ,OAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC;AAAA,SACjD,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAIA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,IAAI,QAAA,EAAS;AAAA,EACpB;AACF,CAAA;;;AC/HO,IAAM,gBAAN,MAAoB;AAAA,EAQzB,WAAA,CACU,GAAA,EACA,QAAA,EACA,KAAA,EACR;AAHQ,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EACP;AAAA,EAHO,GAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EAVF,EAAA,GAAuB,IAAA;AAAA,EACvB,MAAA,GAAS,KAAA;AAAA,EACT,SAAA,GAA8B,IAAA;AAAA,EAC9B,gBAAA,GAAmB,CAAA;AAAA,EACnB,cAAA,GAAuD,IAAA;AAAA,EACvD,gBAAA,GAAwC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAchD,OAAA,GAAyB;AACvB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,IAAA,CAAK,mBAAmB,MAAM;AAC5B,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AACA,MAAA,UAAA,CAAW,MAAM,IAAA,CAAK,gBAAA,IAAmB,EAAG,GAAI,CAAA;AAChD,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAI,KAAK,MAAA,EAAQ;AAEjB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,aAAA,EAAgB,IAAA,CAAK,QAAQ,CAAA,cAAA,EAAiB,kBAAA,CAAmB,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,YAAA,CAAA;AACnH,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI;AACF,MAAA,EAAA,GAAK,IAAI,UAAU,GAAG,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,EAAA,CAAG,gBAAA,CAAiB,QAAQ,MAAM;AAChC,MAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,MAAA,IAAA,CAAK,eAAe,EAAE,CAAA;AACtB,MAAA,IAAA,CAAK,gBAAA,IAAmB;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,CAAC,EAAA,KAAO;AAGrC,MAAA,IAAI,IAAA,CAAK,EAAA,KAAO,EAAA,EAAI,IAAA,CAAK,WAAW,SAAA,EAAU;AAC9C,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAQ,EAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,IAClD,CAAC,CAAA;AAED,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AACtD,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAAA,EACxD;AAAA,EAEQ,WAAW,EAAA,EAAqB;AACtC,IAAA,IAAI,IAAA,CAAK,OAAO,EAAA,EAAI;AACpB,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEQ,eAAe,EAAA,EAAqB;AAC1C,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,EAAA,EAAI,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAC5D,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,IAAA,EAAK;AACpB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,cAAA,EAAgB;AACxC,IAAA,IAAA,CAAK,gBAAA,EAAA;AACL,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,GAAA,GAAM,MAAM,IAAA,CAAK,gBAAA,GAAmB,IAAI,IAAK,CAAA;AACnE,IAAA,MAAM,QAAQ,IAAA,GAAO,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AACnD,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AAAA,EACjB;AAAA,EAEQ,UAAU,GAAA,EAAmB;AACnC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAI,IAAA,KAAS,OAAA,IAAW,OAAO,GAAA,CAAI,cAAc,QAAA,EAAU;AAC7D,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAA,CAAI,SAAA,EAAW,IAAI,IAAI,CAAA;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAI,IAAA,KAAS,eAAA,IAAA,CAAoB,GAAA,CAAI,KAAA,IAAS,OAAO,CAAA,EAAG;AAC1D,MAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,EAAU,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,UAAU,CAAA;AAC/E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAI,IAAA,KAAS,iBAAA,IAAA,CAAsB,GAAA,CAAI,KAAA,IAAS,OAAO,CAAA,EAAG;AAC5D,MAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,EAAU,IAAA,CAAK,MAAM,gBAAA,GAAmB,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,UAAU,CAAA;AAC1F,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAI,IAAA,KAAS,cAAA,IAAA,CAAmB,GAAA,CAAI,KAAA,IAAS,OAAO,CAAA,EAAG;AACzD,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,IAAQ,EAAC;AAC1B,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,OAAO,IAAA,CAAK,YAAY,QAAA,IAAY,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AAExF,QAAA,MAAM,KAAK,IAAA,CAAK,UAAA;AAChB,QAAA,MAAMM,aAAAA,GAAe,MAAM,OAAA,CAAQ,EAAE,IACjC,EAAA,CAAG,MAAA,GAAS,IACZ,OAAO,EAAA,KAAO,YAAY,EAAA,CAAG,IAAA,OAAW,EAAA,IAAM,EAAA,CAAG,MAAK,KAAM,MAAA,IAAU,EAAA,CAAG,IAAA,EAAK,KAAM,IAAA;AACxF,QAAA,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,OAAA,EAASA,aAAY,CAAA;AAAA,MACvD;AACA,MAAA,IAAI,KAAK,IAAA,KAAS,WAAA,IAAe,KAAK,MAAA,KAAW,QAAA,IAAY,KAAK,KAAA,EAAO;AACvE,QAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;AC5IO,IAAM,eAAN,MAAmB;AAAA,EAOxB,WAAA,CACU,KACA,KAAA,EACR;AAFQ,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EACP;AAAA,EAFO,GAAA;AAAA,EACA,KAAA;AAAA,EARF,EAAA,GAAuB,IAAA;AAAA,EACvB,MAAA,GAAS,KAAA;AAAA,EACT,SAAA,GAA8B,IAAA;AAAA,EAC9B,gBAAA,GAAmB,CAAA;AAAA,EACnB,cAAA,GAAuD,IAAA;AAAA,EAO/D,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,UAAU,qBAAqB,kBAAA,CAAmB,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA;AAC1F,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI;AACF,MAAA,EAAA,GAAK,IAAI,UAAU,GAAG,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,EAAA,CAAG,gBAAA,CAAiB,QAAQ,MAAM;AAChC,MAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,MAAA,IAAA,CAAK,eAAe,EAAE,CAAA;AACtB,MAAA,IAAA,CAAK,MAAM,MAAA,IAAS;AAAA,IACtB,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,CAAC,EAAA,KAAO;AACrC,MAAA,IAAI,IAAA,CAAK,EAAA,KAAO,EAAA,EAAI,IAAA,CAAK,WAAW,SAAA,EAAU;AAC9C,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAQ,EAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,IAClD,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AACtD,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAAA,EACxD;AAAA,EAEQ,eAAe,EAAA,EAAqB;AAC1C,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,EAAA,EAAI,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAC5D,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,IAAA,EAAK;AACpB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,UAAU,GAAA,EAAmB;AACnC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,EAAK,SAAS,gBAAA,IAAoB,GAAA,CAAI,QAAQ,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAAA,SAAA,IAC9E,GAAA,EAAK,SAAS,gBAAA,IAAoB,GAAA,CAAI,QAAQ,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAAA,SAAA,IACnF,KAAK,IAAA,KAAS,gBAAA,IAAoB,OAAO,GAAA,CAAI,aAAa,QAAA,EAAU;AAC3E,MAAA,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEQ,WAAW,EAAA,EAAqB;AACtC,IAAA,IAAI,IAAA,CAAK,OAAO,EAAA,EAAI;AACpB,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,cAAA,EAAgB;AACxC,IAAA,IAAA,CAAK,gBAAA,EAAA;AACL,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,GAAA,GAAM,MAAM,IAAA,CAAK,gBAAA,GAAmB,IAAI,IAAK,CAAA;AACnE,IAAA,MAAM,QAAQ,IAAA,GAAO,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AACnD,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AAAA,EACjB;AACF,CAAA;;;ACrFA,IAAM,UAAA,GAAa,GAAA;AAanB,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,MAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACxC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,UAAA,GAAa,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,UAAA,GAAa,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,CAAA;AACpE;AAIA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,OAAO,IAAA,CAAK,QAAQ,YAAA,EAAc,EAAE,EAAE,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CAAE,IAAA,EAAK;AACrE;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,WAAA,CACE,GAAA,EAGQ,QAAA,EAEA,UAAA,GAAoC,CAAC,QAAA,EAAU,KAAA,KAAU,IAAI,aAAA,CAAc,GAAA,EAAK,QAAA,EAAU,KAAK,CAAA,EACvG;AAHQ,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAEA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EACP;AAAA,EAHO,QAAA;AAAA,EAEA,UAAA;AAAA,EARF,OAAA,uBAAc,GAAA,EAAmB;AAAA;AAAA,EAYzC,UAAU,QAAA,EAAiC;AACzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAG,MAAA,IAAU,IAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,SAAA,EAAmC;AACtC,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,SAAS,CAAA;AAC9B,IAAA,KAAA,MAAW,CAAC,IAAI,KAAK,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG;AAC3C,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACjB,QAAA,KAAA,CAAM,OAAO,KAAA,EAAM;AACnB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,MACxB;AAAA,IACF;AACA,IAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,MAAA,IAAI,CAAC,KAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEQ,KAAK,QAAA,EAAwB;AACnC,IAAA,MAAM,KAAA,GAAe,EAAE,MAAA,EAAQ,IAAA,EAAmC,uBAAO,IAAI,GAAA,EAAI,EAAG,MAAA,EAAQ,IAAA,EAAK;AAEjG,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,KAA0B;AAC3C,MAAA,IAAI,MAAA,KAAW,MAAM,MAAA,EAAQ;AAC7B,MAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,MAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,IACxB,CAAA;AAGA,IAAA,MAAM,kBAAkB,MAAqB;AAC3C,MAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,IAAU,IAAA,GAAO,CAAA;AAC7C,MAAA,OAAO,QAAQ,KAAA,CAAM,MAAA;AAAA,IACvB,CAAA;AAEA,IAAA,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA,MAIvC,SAAS,MAAM;AACb,QAAA,IAAI,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,CAAA,YAAa,SAAS,CAAA;AAAA,MACjD,CAAA;AAAA,MACA,kBAAkB,MAAM;AACtB,QAAA,IAAI,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,CAAA,YAAa,UAAU,CAAA;AAAA,MAClD,CAAA;AAAA,MACA,iBAAiB,MAAM;AAAA,MAAC,CAAA;AAAA,MACxB,OAAA,EAAS,CAAC,SAAA,EAAW,IAAA,KAAS;AAC5B,QAAA,IAAI,SAAA,KAAc,mBAAA,IAAuB,IAAA,EAAM,EAAA,EAAI;AACjD,UAAA,KAAA,CAAM,MAAM,GAAA,CAAI,MAAA,CAAO,KAAK,EAAE,CAAA,EAAG,YAAY,MAAA,CAAO,IAAA,CAAK,YAAY,cAAA,CAAe,MAAA,CAAO,KAAK,IAAA,IAAQ,EAAE,CAAC,CAAA,IAAK,SAAS,CAAC,CAAC,CAAA;AAC3H,UAAA,SAAA,CAAU,iBAAiB,CAAA;AAAA,QAC7B,CAAA,MAAA,IAAW,SAAA,KAAc,gBAAA,IAAoB,IAAA,EAAM,EAAA,EAAI;AACrD,UAAA,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAClC,UAAA,SAAA,CAAU,iBAAiB,CAAA;AAAA,QAC7B;AAAA,MACF,CAAA;AAAA,MACA,SAAS,MAAM;AAAA,MAAC;AAAA,KACjB,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAIhC,IAAA,KAAK,KAAA,CAAM,OAAO,OAAA,EAAQ;AAAA,EAC5B;AAAA;AAAA,EAGA,QAAA,GAAiB;AACf,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,OAAA,CAAQ,QAAO,EAAG,KAAA,CAAM,OAAO,KAAA,EAAM;AAC9D,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF,CAAA;;;ACnIO,IAAM,UAAA,GAAa;AAAA,EACxB,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAEA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAIA,IAAM,SAAA,GAAY,sCAAA;AAElB,IAAM,OAAA,GAAU,IAAA;AAGhB,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,WAAA,GAAc,EAAA;AAEpB,IAAM,IAAA,GAAO,SAAA;AACb,IAAMd,IAAAA,GAAM,SAAA;AACZ,IAAM,GAAA,GAAM,UAAA;AAGZ,SAAS,OAAA,CAAQ,MAAc,MAAA,EAAwB;AACrD,EAAA,IAAI,CAAA,GAAA,CAAK,IAAA,GAAO,CAAA,IAAK,UAAA,GAAA,CAAc,SAAS,CAAA,IAAK,KAAA;AACjD,EAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAK,CAAA,KAAM,IAAK,UAAU,CAAA;AACxC,EAAA,CAAA,IAAK,CAAA,KAAM,EAAA;AACX,EAAA,OAAO,SAAA,CAAA,CAAW,CAAA,KAAM,CAAA,IAAK,SAAA,CAAU,MAAM,CAAA;AAC/C;AAOO,IAAM,WAAN,MAAe;AAAA,EACZ,IAAA,GAAe,WAAW,CAAC,CAAA;AAAA,EAC3B,MAAA,GAAwB,IAAA;AAAA;AAAA,EACxB,OAAA,GAAU,CAAA;AAAA;AAAA,EACV,QAAgB,EAAC;AAAA,EACjB,QAAA,GAAW,CAAA;AAAA,EACX,GAAA;AAAA,EAER,WAAA,CAAY,GAAA,GAAoB,IAAA,CAAK,MAAA,EAAQ;AAC3C,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,GAAA,EAAmB;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,WAAW,CAAC,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AAAA,EACjB;AAAA;AAAA,EAGA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,UAAU,IAAA,CAAK,IAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,KAAK,GAAA,EAAqB;AACxB,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,CAAA,EAAG,IAAA,CAAK,OAAA,GAAU,GAAA;AACvC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAI,MAAM,IAAA,CAAK,OAAA,IAAW,OAAA,EAAS,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA,kBAC1C,CAAA,EAAG,IAAI,GAAG,IAAA,CAAK,IAAI,GAAG,GAAG,CAAA,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA,EAC5B;AAAA,EAEQ,WAAW,GAAA,EAAmB;AACpC,IAAA,MAAM,UAAU,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,KAAK,IAAI,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,IAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AACf,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,OAAO,MAAM,CAAA;AACvD,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAI1B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAC3B,MAAA,MAAM,OAAO,GAAA,GAAM,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,KAAI,GAAI,GAAA;AACzC,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,MAAM,CAAA;AAC/B,MAAA,IAAI,IAAA,GAAO,SAAS,OAAA,GAAU,IAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,WAAW,OAAA,GAAU,EAAA;AAAA,EAC5B;AAAA,EAEQ,WAAW,GAAA,EAAqB;AACtC,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,OAAA;AACrB,IAAA,IAAI,CAAA,IAAK,KAAK,QAAA,EAAU;AAEtB,MAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AACZ,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AACf,MAAA,OAAO,GAAG,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAG,GAAG,CAAA,CAAA;AAAA,IAClC;AACA,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACtB,MAAA,IAAI,CAAA,GAAI,EAAE,KAAA,EAAO;AAGf,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACtB,QAAA,IAAI,IAAI,GAAA,IAAO,CAAA,EAAG,IAAI,CAAA,EAAG,EAAE,GAAG,GAAG,CAAA,CAAA;AAAA,MACnC,CAAA,MAAA,IAAW,CAAA,GAAI,CAAA,CAAE,IAAA,EAAM;AAErB,QAAA,MAAM,GAAA,GAAM,IAAI,CAAA,CAAE,KAAA;AAClB,QAAA,MAAM,MAAA,GAAS,GAAA,GAAM,OAAA,GAAU,WAAA,GAAc,WAAA;AAC7C,QAAA,GAAA,IAAO,CAAA,EAAGA,IAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,MAAM,CAAC,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA;AAAA,MAC1D,CAAA,MAAO;AAEL,QAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,QAAA,IAAI,IAAI,GAAA,IAAO,CAAA,EAAG,IAAI,CAAA,EAAG,EAAE,GAAG,GAAG,CAAA,CAAA;AAAA,MACnC;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;;;ACvHO,IAAM,SAAkB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAG7C,IAAM,YAAA,GAAsC;AAAA,EAC1C,CAAA,EAAG,mCAAA;AAAA,EACH,CAAA,EAAG,wBAAA;AAAA,EACH,CAAA,EAAG,4BAAA;AAAA,EACH,CAAA,EAAG,iCAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEO,SAAS,WAAW,KAAA,EAAsB;AAC/C,EAAA,OAAO,CAAA,kBAAA,EAAqB,KAAK,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA,CAAA;AAC3D;AC9BA,IAAM,UAAA,GAAqC;AAAA,EACzC,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAIA,IAAM,eAAA,GAAkB,IAAI,IAAA,GAAO,IAAA;AAEnC,SAAS,GAAA,CAAI,GAAA,EAAa,IAAA,EAAgB,SAAA,GAAY,kBAAkB,CAAA,EAA6C;AACnH,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,QAAA,CAAS,GAAA,EAAK,MAAM,EAAE,QAAA,EAAU,UAAU,SAAA,EAAU,EAAG,CAAC,GAAA,EAAK,MAAA,KAAW;AACtE,MAAA,OAAA,CAAQ,EAAE,EAAA,EAAI,CAAC,GAAA,EAAK,MAAA,EAAQ,UAAU,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA;AAAA,IACzD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,SAAS,SAAS,QAAA,EAAyC;AACzD,EAAA,MAAM,OAAO,UAAA,CAAWG,KAAAA,CAAK,QAAQ,QAAQ,CAAA,CAAE,aAAa,CAAA;AAC5D,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAOG,GAAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAO,IAAK,IAAA,CAAK,SAAS,CAAA,IAAK,IAAA,CAAK,IAAA,GAAO,eAAA,EAAiB,OAAO,IAAA;AAC7E,IAAA,OAAO,EAAE,MAAMA,GAAAA,CAAG,YAAA,CAAa,QAAQ,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,EAAG,IAAA,EAAK;AAAA,EACpE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,UAAA,GAA6C;AAE1D,EAAA,MAAM,GAAA,GAAMH,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,MAAA,EAAO,EAAG,CAAA,QAAA,EAAW,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,IAAA,CAAM,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,CAAA,4CAAA,CAAA;AAAA,IACA,wCAAwC,GAAG,CAAA,uBAAA,CAAA;AAAA,IAC3C,CAAA,cAAA,CAAA;AAAA,IACA,CAAA,YAAA,CAAA;AAAA,IACA,CAAA,cAAA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACX,EAAA,MAAM,MAAM,MAAM,GAAA,CAAI,aAAa,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AACjD,EAAA,IAAI,IAAI,EAAA,EAAI;AACV,IAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AACxB,IAAA,IAAI;AACF,MAAAE,GAAAA,CAAG,WAAW,GAAG,CAAA;AAAA,IACnB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AAEA,EAAA,MAAM,OAAO,MAAM,GAAA,CAAI,aAAa,CAAC,IAAA,EAAM,qDAA+C,CAAC,CAAA;AAC3F,EAAA,IAAI,KAAK,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAM,EAAE,IAAA,EAAK;AAC5C,IAAA,IAAI,CAAA,EAAG,OAAO,QAAA,CAAS,CAAC,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,SAAA,GAA4C;AACzD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK;AAAA,IACxB,CAAC,UAAA,EAAY,CAAC,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,IACpC,CAAC,SAAS,CAAC,YAAA,EAAc,aAAa,IAAA,EAAM,WAAA,EAAa,IAAI,CAAC;AAAA,GAChE,EAA2B;AACzB,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAE/B,IAAA,IAAI,IAAI,EAAA,IAAM,GAAA,CAAI,OAAO,MAAA,GAAS,CAAA,IAAK,IAAI,MAAA,CAAO,MAAA,IAAU,mBAAmB,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,IAAQ,IAAI,MAAA,CAAO,CAAC,MAAM,EAAA,EAAM;AAC/H,MAAA,OAAO,EAAE,MAAM,GAAA,CAAI,MAAA,CAAO,SAAS,QAAQ,CAAA,EAAG,MAAM,WAAA,EAAY;AAAA,IAClE;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,WAAA,GAA8C;AAC3D,EAAA,MAAM,GAAA,GAAMH,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,MAAA,EAAO,EAAG,CAAA,QAAA,EAAW,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,IAAA,CAAM,CAAA;AAC7E,EAAA,MAAM,EAAA,GAAK;AAAA,IACT,8CAAA;AAAA,IACA,sDAAA;AAAA,IACA,CAAA,iCAAA,EAAoC,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,+CAAA;AAAA,GAC7D,CAAE,KAAK,GAAG,CAAA;AACV,EAAA,MAAM,IAAI,YAAA,EAAc,CAAC,cAAc,MAAA,EAAQ,UAAA,EAAY,EAAE,CAAC,CAAA;AAC9D,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AACxB,EAAA,IAAI;AACF,IAAAE,GAAAA,CAAG,WAAW,GAAG,CAAA;AAAA,EACnB,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,GAAA;AACT;AAGA,eAAsB,kBAAA,GAAqD;AACzE,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,QAAA,EAAU,OAAO,MAAM,UAAA,EAAW;AAC3D,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,OAAA,EAAS,OAAO,MAAM,WAAA,EAAY;AAC3D,IAAA,OAAO,MAAM,SAAA,EAAU;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACrGO,SAAS,iBAAiB,GAAA,EAAqB;AACpD,EAAA,OAAO,WAAW,GAAG,CAAA,CAAA,CAAA;AACvB;AAQO,IAAM,gBAAA,GAAmB,CAAA;AAMzB,SAAS,mBAAA,GAA8B;AAC5C,EAAA,OAAO,gBAAA;AACT;AAOO,SAAS,gBAAgB,KAAA,EAAsB;AACpD,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACxC,EAAA,OAAO,SAAI,MAAA,CAAO,CAAC,IAAI,QAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA;AACzC;AAGO,SAAS,sBACd,KAAA,EACA,UAAA,EACA,UAAA,GAAa,gBAAA,EACb,QAAQ,SAAA,EACA;AACR,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACxC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,GAAA,IAAO,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG,UAAU,CAAA,MAAA,EAAI,KAAK,CAAA,CAAA,GAAK,CAAA,EAAG,UAAU,CAAA,MAAA,EAAI,KAAK,CAAA,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,GAAA;AACT;AAYO,SAAS,iBAAiBJ,KAAAA,EAK/B;AACA,EAAA,MAAM,MAAA,GAAS,gBAAA;AAEf,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAIA,KAAAA,GAAO,IAAI,MAAM,CAAA;AAE3C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AACrC,EAAA,MAAM,UAAU,MAAA,GAAS,CAAA;AACzB,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ;AAC3C;AAGA,SAAS,gBAAgB,CAAA,EAAmB;AAE1C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,EAAA,IAAM,CAAA,CAAE,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA,EAAG;AACjD,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,IAAK,eAAA,CAAgB,EAAE,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,CAAA;AACT;AAUO,SAAS,YACd,IAAA,EACA,SAAA,EACA,aACA,UAAA,EACA,KAAA,GAAQ,WACR,WAAA,EACQ;AACR,EAAA,MAAM,UAAA,GAAa,IAAI,SAAS,CAAA,CAAA,CAAA;AAChC,EAAA,MAAM,SAAA,GAAY,CAAA;AAClB,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAI,SAAS,CAAA;AAC/C,EAAA,MAAM,KAAA,GACJ,UAAA,CAAW,MAAA,GAAS,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA,GAAI,UAAA;AAC1E,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,GAAI,KAAA,CAAM,SAAS,SAAS,CAAA;AAEhE,EAAA,MAAM,GAAA,GACJ,WAAA,KAAgB,MAAA,GACZ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,CAAA,GACf,CAAA,EAAG,UAAU,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,CAAA,CAAA;AACnC,EAAA,OACE,GAAG,WAAW,CAAA,MAAA,EAAI,SAAI,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG,KAAK,KAC9C,GAAA,GACA,CAAA,EAAG,WAAW,CAAA,EAAG,QAAA,CAAI,OAAO,SAAS,CAAC,SAAI,KAAK,CAAA,CAAA;AAEnD;AAGO,SAAS,cAAA,CAAe,IAAA,EAAc,WAAA,EAAqB,KAAA,GAAQ,SAAA,EAAmB;AAC3F,EAAA,OAAO,CAAA,EAAG,WAAW,CAAA,MAAA,EAAI,QAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAC,SAAI,KAAK,CAAA,CAAA;AACrE;AAGO,SAAS,gBAAA,CAAiB,IAAA,EAAc,WAAA,EAAqB,KAAA,GAAQ,SAAA,EAAmB;AAC7F,EAAA,OAAO,CAAA,EAAG,WAAW,CAAA,MAAA,EAAI,QAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAC,SAAI,KAAK,CAAA,CAAA;AACrE;AAOO,SAAS,qBACd,IAAA,EACA,KAAA,EACA,aACA,UAAA,GAAa,UAAA,EACb,QAAQ,SAAA,EACA;AACR,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAK,CAAA,CAAA,CAAA;AACvB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AACnC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,GAAS,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA,GAAI,KAAA;AAC1E,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,GAAO,CAAA,GAAI,IAAI,MAAM,CAAA;AAC9C,EAAA,OACE,GAAG,WAAW,CAAA,MAAA,EAAI,KAAK,CAAA,EACpB,UAAU,GAAG,GAAG,CAAA,EAAG,KAAK,CAAA,EACxB,WAAW,CAAA,EAAG,QAAA,CAAI,OAAO,IAAI,CAAC,SAAI,KAAK,CAAA,CAAA;AAE9C;AAkDO,SAAS,YAAA,CACd,OAAA,EACA,QAAA,EACA,WAAA,EACA,QAAQ,SAAA,EACA;AACR,EAAA,MAAM,EAAA,GAAK,gBAAgB,OAAO,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,EAAE,CAAA;AACrC,EAAA,OAAO,CAAA,EAAG,WAAW,CAAA,MAAA,EAAI,KAAK,IAAI,OAAO,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA,EAAI,WAAW,SAAI,KAAK,CAAA,CAAA;AACrF;AAWO,SAAS,kBAAA,CACd,WAAA,EACA,MAAA,EACA,WAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA,CAAO,KAAK,GAAA,CAAI,CAAA,EAAG,WAAW,CAAC,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AACpC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,eAAA,GAAkB,IAAA;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,SAAA,GAAY,IAAA;AAEhB,IAAA,GAAG;AACD,MAAA,MAAM,IAAA,GAAO,kBAAkB,MAAA,GAAS,MAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,WAAW,CAAA;AAChD,MAAA,IAAI,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,KAAK,CAAA;AAC3C,MAAA,IAAI,SAAS,CAAA,IAAK,KAAA,KAAU,KAAK,SAAA,CAAU,MAAA,GAAS,GAAG,IAAA,GAAO,CAAA;AAC9D,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AACrC,MAAA,SAAA,GAAY,SAAA,CAAU,MAAM,IAAI,CAAA;AAChC,MAAA,GAAA,CAAI,IAAA,CAAK,OAAO,KAAK,CAAA;AACrB,MAAA,eAAA,GAAkB,KAAA;AAClB,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAAA,IAC9B,CAAA,QAAS,UAAU,MAAA,GAAS,CAAA;AAAA,EAC9B;AACA,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,GAAA,CAAI,KAAK,MAAM,CAAA;AACrC,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,oBAAoB,SAAA,EAA2B;AAC7D,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AAE5C,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,EAAA,GAAK,EAAA;AACX,EAAA,MAAM,EAAA,GAAK,GAAA;AACX,EAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAA,CAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAEvC,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,EAAA;AACpC,EAAA,MAAM,EAAA,GACJ,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA,IAC1B,yCAAyC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,EAAE,CAAA;AAC9E,EAAA,IAAI,IAAI,OAAO,CAAA,UAAA,EAAa,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA;AAEvC,EAAA,OAAO,aAAa,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,CAAC,CAAA,CAAA,CAAA;AAC9C;AAOO,SAAS,uBAAA,CACd,KAAA,EACA,SAAA,EACA,KAAA,EACA,YAAY,GAAA,EACJ;AACR,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAC/B,EAAA,MAAM,MAAM,KAAA,GAAQ,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAA,CAAA,CAAY,KAAA,GAAQ,GAAA,IAAO,CAAA,GAAI,CAAA,IAAK,CAAA;AAC1C,EAAA,IAAI,WAAW,SAAA,EAAW;AAExB,IAAA,OAAO,mBAAA,CAAoB,CAAA,GAAI,OAAA,GAAU,SAAS,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,mBAAA,EAAoB;AAC7B;AAOO,SAAS,cAAA,CACd,IAAA,EACA,MAAA,EACA,IAAA,EACA,KAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAE3B,EAAA,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAC9D,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AACpE,EAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AACzE,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AACxD;AASO,SAAS,kBAAkB,IAAA,EAUrB;AACX,EAAA,MAAM,EAAE,MAAAA,KAAAA,EAAM,WAAA,EAAa,QAAQ,WAAA,EAAa,KAAA,EAAO,YAAW,GAAI,IAAA;AACtE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,IAAe,mBAAA,EAAoB;AAC5D,EAAA,MAAM,GAAA,GAAM,iBAAiBA,KAAI,CAAA;AACjC,EAAA,MAAM,OAAO,kBAAA,CAAmB,WAAA,EAAa,MAAA,EAAQ,WAAA,EAAa,IAAI,QAAQ,CAAA;AAC9E,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACjC,EAAA,MAAM,QAAQ,IAAA,CAAK,WAAA;AAEnB,EAAA,IAAI,SAAS,IAAA,IAAQ,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5C,IAAA,MAAMa,KAAAA,GAAO,gBAAgB,KAAK,CAAA;AAClC,IAAA,MAAMC,WAAAA,GAAa,qBAAA,CAAsB,KAAA,EAAO,UAAU,CAAA;AAC1D,IAAA,MAAMC,IAAAA,GAAM,YAAY,GAAA,CAAI,IAAA,EAAMF,OAAM,WAAA,EAAa,UAAA,EAAY,WAAWC,WAAU,CAAA;AACtF,IAAA,MAAME,OAAAA,GAAS,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,WAAW,CAAA;AACnD,IAAA,OAAO,CAAC,GAAA,GAAMD,IAAAA,EAAK,GAAG,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,GAAA,GAAM,YAAA,CAAa,GAAG,GAAA,CAAI,QAAA,EAAU,WAAW,CAAC,CAAA,EAAG,MAAMC,OAAM,CAAA;AAAA,EACvG;AAUA,EAAA,MAAM,IAAI,GAAA,CAAI,IAAA;AACd,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,MAAM,CAAA;AACrC,EAAA,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,KAAA;AACtB,EAAA,MAAM,KAAA,GAAQ,SAAA;AACd,EAAA,MAAM,UAAU,CAAC,CAAA,KAAc,uBAAA,CAAwB,CAAA,EAAG,GAAG,KAAK,CAAA;AAIlE,EAAA,MAAM,IAAA,GAAO,gBAAgB,KAAK,CAAA;AAClC,EAAmB,qBAAA,CAAsB,KAAA,EAAO,UAAU;AAC1D,EAAA,MAAM,UAAA,GAAa,IAAI,IAAI,CAAA,CAAA,CAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,CAAA;AACnB,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAI,UAAU,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,GAAS,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA,GAAI,UAAA;AACtF,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,UAAU,CAAA;AAE9D,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,GAAA,IAAO,OAAA,CAAQ,eAAe,KAAA,EAAO,EAAA,EAAA,EAAM,GAAG,KAAK,CAAC,IAAI,QAAA,GAAM,KAAA;AAC9D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,GAAA,IAAO,OAAA,CAAQ,eAAe,KAAA,EAAO,EAAA,EAAA,EAAM,GAAG,KAAK,CAAC,IAAI,QAAA,GAAM,KAAA;AAAA,EAChE;AAKA,EAAA;AACE,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,KAAK,CAAA;AAE5B,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,MAAML,KAAI,OAAA,CAAQ,cAAA,CAAe,OAAO,EAAA,EAAA,EAAM,CAAA,EAAG,KAAK,CAAC,CAAA;AACvD,MAAA,IAAI,EAAA,KAAO,QAAA,IAAO,EAAA,KAAO,QAAA,EAAK;AAG5B,QAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC7C,QAAA,MAAM,SAAS,EAAA,GAAK,MAAA;AACpB,QAAA,EAAA,EAAA;AACA,QAAA,GAAA,IAAA,CACG,SAAS,UAAA,IAAcA,EAAAA,GAAI,gBAAA,KAC3B,MAAA,GAAS,WAAM,QAAA,CAAA,GAChB,KAAA;AACG,MACP,CAAA,MAAO;AACL,QAAA,GAAA,IAAOA,KAAI,EAAA,GAAK,KAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,IAAA,GAAA,IAAO,OAAA,CAAQ,eAAe,KAAA,EAAO,EAAA,EAAA,EAAM,GAAG,KAAK,CAAC,IAAI,QAAA,GAAM,KAAA;AAAA,EAChE;AACA,EAAA,GAAA,IAAO,OAAA,CAAQ,cAAA,CAAe,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAC,IAAI,QAAA,GAAM,KAAA;AAG7E,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,KAAA,GAAQ,QAAQ,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,KAAK,CAAC,CAAA;AACrE,IAAA,MAAM,SAAS,OAAA,CAAQ,cAAA,CAAe,SAAS,CAAA,EAAG,CAAA,EAAG,KAAK,CAAC,CAAA;AAC3D,IAAA,MAAM,EAAA,GAAK,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAC,CAAA;AAClC,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,WAAW,EAAE,CAAA;AACxC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,GAAG,GAAG,CAAA,EAAG,KAAK,CAAA,MAAA,EAAI,KAAK,IAAI,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,IAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,MAAM,SAAI,KAAK,CAAA;AAAA,KACxE;AAAA,EACF;AAIA,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAG1B,IAAA,MAAM,MAAM,cAAA,CAAe,QAAA,EAAU,IAAI,CAAA,GAAI,CAAA,EAAG,GAAG,KAAK,CAAA;AACxD,IAAA,MAAMA,EAAAA,GAAI,QAAQ,GAAG,CAAA;AACrB,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,MAAA,IAAUA,EAAAA,GAAI,QAAA,GAAM,KAAA;AAAA,SAAA,IACxB,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,MAAA,IAAUA,KAAI,QAAA,GAAM,KAAA;AAAA,SACrC,MAAA,IAAUA,KAAI,QAAA,GAAM,KAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,CAAC,GAAA,GAAM,GAAA,EAAK,GAAG,QAAA,EAAU,MAAM,MAAM,CAAA;AAC9C;AAEA,IAAM,CAAA,GAAI;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO,UAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM,UAAA;AAAA,EACN,OAAA,EAAS,UAAA;AAAA,EACT,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAIA,IAAM,MAAA,GAAS,CAAC,QAAA,EAAK,QAAA,EAAK,UAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AAGtD,IAAM,UAAA,GAAa,EAAA;AAMnB,IAAM,eAAA,GAAkB;AAAA,EACtB,UAAA;AAAA;AAAA,EACA,eAAA;AAAA;AAAA,EACA,eAAA;AAAA;AAAA,EACA,UAAA;AAAA;AAAA,EACA,gBAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAA;AAKA,IAAM,gBAAA,GAAmB,gBAAA;AACzB,IAAM,gBAAA,GAAmB,kBAAA;AAYzB,SAAS,gBAAgB,EAAA,EAAqB;AAC5C,EAAA,OACG,EAAA,IAAM,QAAU,EAAA,IAAM,IAAA;AAAA,EACtB,EAAA,IAAM,SAAU,EAAA,IAAM,KAAA;AAAA,EACtB,EAAA,IAAM,SAAU,EAAA,IAAM,KAAA;AAAA,EACtB,EAAA,IAAM,SAAU,EAAA,IAAM,KAAA;AAAA,EACtB,EAAA,IAAM,SAAU,EAAA,IAAM,KAAA;AAAA,EACtB,EAAA,IAAM,SAAU,EAAA,IAAM,KAAA;AAAA,EACtB,MAAM,KAAA,IAAU,EAAA,IAAM,KAAA,IACtB,EAAA,IAAM,UAAW,EAAA,IAAM,MAAA;AAAA,EACxB,EAAA,IAAM,MAAA;AAEV;AAYA,SAAS,eAAe,CAAA,EAAmB;AAEzC,EAAA,OAAO,EAAE,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA,CAAE,OAAA,CAAQ,6BAA6B,GAAG,CAAA;AAC9E;AAcO,IAAM,GAAA,GAAN,MAAM,IAAA,CAAI;AAAA,EAwGf,WAAA,CAAmB,QAAe,CAAA,EAAG;AAAlB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACjB,IAAA,QAAA,CAAS,kBAAA,CAAmB,QAAQ,KAAK,CAAA;AACzC,IAAA,IAAI,QAAQ,KAAA,CAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,WAAW,IAAI,CAAA;AACtD,IAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,UAAA,EAAY,CAAC,GAAA,EAAK,QAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,GAAG,CAAC,CAAA;AAClE,IAAA,OAAA,CAAQ,MAAM,MAAA,EAAO;AAGrB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,aAAa,CAAA;AAElC,IAAA,OAAA,CAAQ,GAAG,MAAA,EAAQ,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAErE,IAAA,OAAA,CAAQ,OAAO,EAAA,CAAG,QAAA,EAAU,MAAM,IAAA,CAAK,sBAAsB,CAAA;AAAA,EAC/D;AAAA,EAZmB,KAAA;AAAA;AAAA,EAtGX,WAAA,GAAc,EAAA;AAAA,EACd,SAAA,GAAY,CAAA;AAAA;AAAA,EACZ,aAAA,GAAgB,CAAA;AAAA;AAAA,EAChB,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,CAAA;AAAA;AAAA,EAEf,QAAA,GAAW,IAAI,QAAA,EAAS;AAAA,EACxB,YAAA,GAAsD,IAAA;AAAA,EACtD,OAAA,GAAU,CAAA;AAAA;AAAA;AAAA,EAGV,eAAA,GAAkB,KAAA;AAAA,EAClB,WAAA,GAAc,CAAA;AAAA,EACd,YAAiE,EAAC;AAAA;AAAA,EAClE,iBAAA,uBAAwB,GAAA,EAAoB;AAAA;AAAA,EAC5C,QAAA,GAAW,CAAA;AAAA;AAAA,EACX,SAAA,GAAY,CAAA;AAAA;AAAA,EACZ,UAAA,GAA4B,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,cAAA,GAAiB,EAAA;AAAA,EACjB,cAAA,GAAiB,EAAA;AAAA,EACjB,eAAA,GAAiC,IAAA;AAAA;AAAA,EACjC,iBAAA,GAA0D,IAAA;AAAA,EAC1D,eAAA,GAAwD,IAAA;AAAA;AAAA;AAAA;AAAA,EAIxD,IAAA,GAAwB,IAAA;AAAA;AAAA;AAAA,EAGxB,YAAA,GAAe,KAAA;AAAA;AAAA;AAAA,EAIf,WAA2B,EAAC;AAAA,EAC5B,QAAA,GAAW,CAAA;AAAA;AAAA,EACX,IAAA,GAAsB,IAAA;AAAA;AAAA,EACtB,SAAA,GAAY,CAAA;AAAA;AAAA,EACZ,OAAA,GAAU,CAAA;AAAA;AAAA,EACV,SAAA,GAAY,IAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd,OAAA,GAAU,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQV,aAAA,GAAgB,CAAA;AAAA;AAAA,EAEhB,oBAA8B,EAAC;AAAA;AAAA,EAE/B,oBAAA,GAAuB,CAAA;AAAA,EACvB,WAAA,GAAoD,IAAA;AAAA;AAAA,EAEpD,aAAA,GAAgB,KAAA;AAAA;AAAA,EAEhB,iBAA2B,EAAC;AAAA;AAAA,EAG5B,eAAA,GAAqC,IAAA;AAAA,EACrC,iBAA2B,EAAC;AAAA;AAAA;AAAA,EAI5B,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA,GAAkD,IAAA;AAAA;AAAA,EAGlD,OAAA,GAAU,KAAA;AAAA,EACV,UAAA,GAAmD,IAAA;AAAA;AAAA;AAAA;AAAA,EAKnD,gBAA+B,EAAC;AAAA,EAChC,cAAA,GAAiB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,UAAoB,EAAC;AAAA,EACrB,UAAA,GAA4B,IAAA;AAAA,EAC5B,YAAA,GAAe,EAAA;AAAA,EACf,qBAAoC,EAAC;AAAA;AAAA,EAG7C,WAA0D,MAAM;AAAA,EAAC,CAAA;AAAA,EACjE,cAA0B,MAAM;AAAA,EAAC,CAAA;AAAA;AAAA;AAAA,EAGjC,YAA2B,MAAM,KAAA;AAAA;AAAA,EAEjC,YAAwB,MAAM;AAAA,EAAC,CAAA;AAAA,EACvB,MAAA,GAAqB,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,EACzC,iBAAyC,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuB1C,oBAAA,GAA6B;AACnC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,YAAA,CAAa,IAAA,CAAK,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAW,MAAM;AAClC,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,eAAA,EAAiB;AAC3C,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB,GAAG,EAAE,CAAA;AAAA,EACP;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,eAAe,EAAA,EAAsB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAA,GAAoB;AAClB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAC/C,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,WAAW,MAAM;AAChC,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB,GAAG,GAAI,CAAA;AAAA,EACT;AAAA;AAAA,EAGA,GAAA,GAAY;AAKV,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,YAAA,CAAa,IAAA,CAAK,eAAe,CAAA;AAC3D,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACnC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AACA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AACA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,sBAAsB,CAAA;AAAA,EAC7C;AAAA,EACA,cAAc,EAAA,EAA8B;AAC1C,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,UAAA,GAAqB;AACnB,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,EAAG,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,GAAA,EAAI,CAAE,KAAK,KAAK,CAAA;AAAA,EAClF;AAAA;AAAA,EAIQ,QAAA,CAAS,KAAyB,GAAA,EAAyB;AACjE,IAAA,MAAM,GAAA,GAAO,GAAA,IAAO,GAAA,CAAI,QAAA,IAAa,GAAA,IAAO,EAAA;AAS5C,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,YAAA,IAAgB,QAAQ,eAAA,EAAiB;AACnE,MAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,IAAO,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,SAAS,GAAA,EAAK;AACvC,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,KAAA,IAAS,IAAI,KAAA,EAAO;AAC1C,MAAA,IAAA,CAAK,UAAA,EAAW;AAChB,MAAA;AAAA,IACF;AAKA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,KAAA,CAAM,GAAA,CAAI,QAAQ,WAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAC7D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,IAAA,CAAK,iBAAiB,GAAG,CAAA;AACzB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,GAAG,CAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AAKV,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,SAAS,OAAA,EAAS;AACjD,QAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,QAAA,IAAA,CAAK,YAAA,EAAa;AAClB,QAAA,IAAA,CAAK,SAAA,EAAU;AACf,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACzB,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,OAAA,IAAW,GAAA,CAAI,SAAS,QAAA,EAAU;AACjD,QAAA,IAAA,CAAK,YAAA,EAAa;AAClB,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IAEpB;AAKA,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,MAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,EAAiB;AACtC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAK,QAAA,EAAU,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,GAAI,CAAA;AAC3E,MAAA,IAAI,GAAA,CAAI,SAAS,IAAA,EAAM;AACrB,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,UAAA,IAAA,CAAK,QAAA,GAAA,CAAY,GAAA,GAAM,CAAA,GAAI,OAAA,CAAQ,UAAU,OAAA,CAAQ,MAAA;AACrD,UAAA,IAAA,CAAK,YAAA,EAAa;AAAA,QACpB;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,UAAA,IAAA,CAAK,QAAA,GAAA,CAAY,GAAA,GAAM,CAAA,IAAK,OAAA,CAAQ,MAAA;AACpC,UAAA,IAAA,CAAK,YAAA,EAAa;AAAA,QACpB;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,CAAI,SAAS,KAAA,EAAO;AACtB,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,UAAA,IAAA,CAAK,WAAA,GAAc,GAAA,GAAM,OAAA,CAAQ,GAAG,CAAA,CAAE,IAAA;AACtC,UAAA,IAAA,CAAK,SAAA,GAAY,KAAK,WAAA,CAAY,MAAA;AAClC,UAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,UAAA,IAAA,CAAK,YAAA,EAAa;AAAA,QACpB;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,SAAS,OAAA,EAAS;AAEjD,QAAA,IAAI,IAAI,KAAA,EAAO;AACb,UAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AACxB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,QAAQ,MAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAC,CAAA;AAChD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,QAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AACnB,QAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,QAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,QAAA,IAAA,CAAK,YAAA,EAAa;AAClB,QAAA;AAAA,MACF;AAAA,IAEF;AAEA,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,MAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,SAAA,EAAA;AACL,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG;AAE3B,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AACxB,MAAA,IAAI,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ;AAC5C,QAAA,IAAA,CAAK,SAAA,EAAA;AACL,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAI,IAAA,KAAS,MAAA,IAAW,IAAI,IAAA,IAAQ,GAAA,CAAI,SAAS,GAAA,EAAM;AACzD,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAI,IAAA,KAAS,KAAA,IAAU,IAAI,IAAA,IAAQ,GAAA,CAAI,SAAS,GAAA,EAAM;AACxD,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,WAAA,CAAY,MAAA;AAClC,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA;AAAA,IACF;AAKA,IAAA,IAAI,GAAA,CAAI,SAAS,IAAA,EAAM;AACrB,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,IAAA,CAAK,WAAA,EAAY;AACtC,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,IAAA,CAAK,kBAAkB,EAAE,CAAA;AACzB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,WAAU,EAAG;AACtB,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,MAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,KAAK,WAAA,EAAY;AAChD,MAAA,IAAI,QAAA,GAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,IAAA,CAAK,kBAAkB,CAAC,CAAA;AACxB,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,SAAS,OAAA,EAAS;AAKjD,MAAA,IAAI,IAAI,KAAA,EAAO;AACb,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AACxB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAElB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,CAAC,GAAA,KAAQ,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA;AAC1F,MAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AACnB,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,MAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,YAAA,GAAe,EAAA;AACpB,MAAA,IAAA,CAAK,qBAAqB,EAAC;AAC3B,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACf,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,CAAA;AAChC,QAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAK,EAAG,MAAM,CAAA;AAAA,MACnC;AACA,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,IAAA,KAAS,GAAA,EAAK;AAChC,MAAA,KAAK,KAAK,mBAAA,EAAoB;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,MAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,WAAA,GACH,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAA,GAAY,CAAC,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAK,SAAS,CAAA;AACvF,QAAA,IAAA,CAAK,SAAA,EAAA;AACL,QAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,MAAA,IAAI,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ;AAC5C,QAAA,IAAA,CAAK,WAAA,GACH,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACvF,QAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAI,IAAA,IAAQ,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,SAAS,KAAA,EAAO;AAChD,IAAA,IAAI,GAAA,IAAO,OAAO,GAAA,EAAK;AACrB,MAAA,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,eAAe,IAAA,EAAoB;AACzC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAK,SAAS,CAAA;AAC3G,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA;AACvB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAGQ,iBAAiB,KAAA,EAAqB;AAC5C,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AACrC,IAAA,MAAM,OAAA,GAAA,CAAW,GAAA,IAAO,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA,EAAO,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA;AAChF,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,WAAA,GACH,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,GAAI,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAK,SAAS,CAAA;AAC7F,MAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,MAAA;AAC1B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AACA,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAGQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AACjD,IAAA,IAAA,CAAK,UAAA,GAAa,WAAW,MAAM;AACjC,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB,GAAG,GAAI,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,WAAA,GAKN;AACA,IAAA,MAAMX,KAAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AACvC,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,gBAAA,CAAiBA,KAAI,CAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,cAAc,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AACzC,IAAA,MAAM,OAA4D,EAAC;AACnE,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAIrB,MAAA,IAAI,SAAA,GAAY,GAAA;AAChB,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,GAAG;AACD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,EAAE,CAAA;AACvC,QAAA,IAAI,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AACpC,QAAA,IAAI,SAAS,CAAA,IAAK,KAAA,KAAU,CAAA,IAAK,SAAA,GAAY,GAAG,IAAA,GAAO,CAAA;AACvD,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,GAAS,WAAW,GAAA,EAAK,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,CAAA;AACjE,QAAA,SAAA,IAAa,IAAA;AACb,QAAA,SAAA,IAAa,IAAA;AAAA,MACf,SAAS,SAAA,GAAY,CAAA;AACrB,MAAA,MAAA,IAAU,GAAA,GAAM,CAAA;AAAA,IAClB;AAEA,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,GAAQ,GAAA,CAAI,GAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,CAAA,KAAM,IAAA,CAAK,MAAA,GAAS,CAAA;AAInC,MAAA,MAAM,YAAY,MAAA,GAAS,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA;AAChD,MAAA,IAAI,IAAA,CAAK,YAAY,MAAA,IAAW,IAAA,CAAK,cAAc,MAAA,KAAW,MAAA,IAAU,YAAY,MAAA,CAAA,EAAU;AAC5F,QAAA,QAAA,GAAW,CAAA;AACX,QAAA,QAAA,GAAW,GAAA,CAAI,SAAA,IAAa,IAAA,CAAK,SAAA,GAAY,GAAA,CAAI,KAAA,CAAA;AACjD,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAA,IAAS,IAAA,CAAK,MAAA,EAAQ;AACzB,MAAA,QAAA,GAAW,KAAK,MAAA,GAAS,CAAA;AACzB,MAAA,MAAM,GAAA,GAAM,KAAK,QAAQ,CAAA;AACzB,MAAA,QAAA,GAAW,GAAA,CAAI,YAAY,GAAA,CAAI,GAAA;AAAA,IACjC;AAGA,IAAA,OAAO,QAAA,IAAY,KAAK,MAAA,EAAQ;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,WAAA,CAAY,QAAQ,GAAA,EAAK,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,KAAK,MAAA,EAAO;AAAA,EAC3D;AAAA;AAAA,EAGQ,kBAAkB,KAAA,EAAqB;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS,GAAI,KAAK,WAAA,EAAY;AACtD,IAAA,MAAM,SAAS,QAAA,GAAW,KAAA;AAC1B,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,IAAU,IAAA,CAAK,MAAA,EAAQ;AACzC,IAAA,MAAM,GAAA,GAAM,KAAK,MAAM,CAAA;AACvB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,GAAG,CAAC,CAAA;AACtE,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,MAAA,EAAQ,IAAA,CAAK,YAAY,MAAM,CAAA;AACrE,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,OAAW,EAAE,CAAA;AAAA,EACtD;AAAA;AAAA,EAGQ,gBAAgB,IAAA,EAAoB;AAC1C,IAAA,IAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,QAAQ,MAAA,GAAS,CAAC,MAAM,IAAA,EAAM;AACpD,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA,EAGQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ;AAC1B,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA;AACzB,MAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,aAAA;AAC/B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,IAC1C,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,GAAa,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,UAAA,EAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,WAAA,CAAY,MAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAGQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC9B,IAAA,IAAI,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,UAAA,EAAA;AACL,MAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,IACjD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,cAAc,IAAA,CAAK,YAAA;AACxB,MAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,kBAAA;AAC1B,MAAA,IAAA,CAAK,YAAA,GAAe,EAAA;AACpB,MAAA,IAAA,CAAK,qBAAqB,EAAC;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,WAAA,CAAY,MAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,EAAmB;AACrC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,IAAA,CAAK,MAAM,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,0BAAA,EAA6B,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACzD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AACzE,MAAA,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,EAAM,IAAI,IAAA,EAAM,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,CAAA;AAC/D,MAAA,IAAA,CAAK,cAAA,CAAe,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,IAC3C,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACrC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAA,CAAQ,GAAA,GAAM,CAAA,IAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EACjD;AAAA,EAEA,SAAS,KAAA,EAAoB;AAC3B,IAAA,IAAI,KAAA,KAAU,KAAK,KAAA,EAAO;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,CAAC,OAAO,EAAA,CAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAClD,IAAA,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAA,EAAY,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAGQ,cAAc,EAAA,EAAoB;AACxC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AAC9B,IAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA;AACvB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC3B,IAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,GAAI,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAA;AAC3D,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC3B,IAAA,OAAO,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,GAAI,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EACjD;AAAA;AAAA,EAGQ,UAAU,CAAA,EAAmB;AACnC,IAAA,IAAI,CAAA,GAAI,GAAA,EAAM,OAAO,MAAA,CAAO,CAAC,CAAA;AAC7B,IAAA,IAAI,CAAA,GAAI,KAAW,OAAO,CAAA,EAAA,CAAI,IAAI,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAClD,IAAA,OAAO,CAAA,EAAA,CAAI,CAAA,GAAI,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EACtC;AAAA,EAEQ,YAAA,GAAuB;AAG7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,OAAO,GAAG,CAAA,CAAE,IAAI,GAAG,eAAA,CAAgB,GAAG,CAAC,CAAA,EAAG,MAAA,CAAO,KAAK,KAAA,CAAM,GAAA,GAAM,UAAU,CAAA,GAAI,MAAA,CAAO,MAAM,CAAC,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA;AAAA,EAC1G;AAAA;AAAA,EAGQ,UAAA,GAAqB;AAC3B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,IAAA,CAAK,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAI,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,CAAA;AACrE,IAAA,IAAI,IAAA,CAAK,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAI,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,SAAS,CAAC,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,GAAK,EAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gBAAA,GAA2B;AACjC,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,EAAM,OAAO,EAAA;AAEpC,IAAA,OAAO,CAAA,cAAA,EAAiB,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,GAAA,EAA0B;AACtC,IAAA,MAAM,IAAA,GAAO,GAAA,IAAO,IAAA,GAAO,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA;AAC5E,IAAA,IAAI,IAAA,KAAS,KAAK,UAAA,EAAY;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAGA,eAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,UAAA,IAAc,IAAA,GAAO,EAAA,GAAK,CAAA,QAAA,EAAW,KAAK,UAAU,CAAA,CAAA,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,YAAY,QAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA,EAGQ,WAAA,GAAuB;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,GAAG,CAAA;AAAA,EAC7G;AAAA;AAAA,EAGQ,gBAAA,GAAmC;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,WAAW,GAAG,CAAA,SAAU,EAAC;AAC/C,IAAA,MAAM,CAAA,GAAI,KAAK,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AACvD,IAAA,IAAI,CAAA,KAAM,EAAA,EAAI,OAAO,IAAA,CAAK,QAAA;AAC1B,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AAAA,MACnB,CAACW,EAAAA,KAAMA,EAAAA,CAAE,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,IAAKA,EAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,IAAKA,EAAAA,CAAE,MAAM,WAAA,EAAY,CAAE,SAAS,CAAC;AAAA,KACvF;AAAA,EACF;AAAA,EAEQ,WAAW,GAAA,EAAyB;AAC1C,IAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,KAAK,QAAQ,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,eAAeX,KAAAA,EAA6B;AAClD,IAAA,MAAM,EAAA,GAAK,KAAK,UAAA,EAAW;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,gBAAA,EAAiB;AAGpC,IAAA,MAAM,eAAe,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,KAAK,IAAI,CAAA,GAAI,CAAA;AAC5D,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,KAAK,IAAA,CAAK,aAAA,CAAc,KAAK,GAAA,EAAI,GAAI,KAAK,YAAY,CAAA;AAC5D,MAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAG,EAAA,GAAK,GAAA,GAAM,KAAK,EAAE,CAAA,CAAA;AAC1D,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,YAAA,EAAc,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA,CAAA;AACrE,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,QACjB,CAAA;AAAA,QACAA,KAAAA,GAAO,KAAK,YAAA,CAAa,IAAI,IAAI,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,GAAI,CAAA,GAAI;AAAA,OAClE;AACA,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,KAAA,GAAQ,CAAA,EAAG;AAC1B,QAAA,IAAI,IAAI,IAAA,CAAK,IAAA;AACb,QAAA,IAAI,CAAA,CAAE,SAAS,KAAA,EAAO,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,GAAI,QAAA;AAClD,QAAA,QAAA,GAAW,IAAI,CAAA,CAAE,GAAG,GAAG,CAAC,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA;AAAA,MACpC;AACA,MAAA,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,IAAI,KAAK,CAAA,CAAA;AAAA,IACpC,CAAA,MAAA,IAAW,KAAK,YAAA,EAAc;AAG5B,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,aAAa,uBAAkB,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA;AACnE,MAAA,IAAA,GAAO,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,IAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,KAAK,EAAA,GAAK,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,OAAO,IAAA,IAAQ,EAAA;AACrB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,KAAAA,GAAO,CAAA,GAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA,GAAI,IAAA,CAAK,YAAA,CAAa,KAAK,CAAC,CAAA;AACrF,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,GAAA,CAAI,OAAO,GAAG,CAAC,GAAG,KAAK,CAAA,CAAA;AAAA,EAC1C;AAAA;AAAA,EAGQ,YAAA,GAAuB;AAG7B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,GAAc,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,QAAA,EAAM,IAAA,CAAK,WAAW,CAAA,QAAA,EAAW,CAAA,CAAE,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AAE1F,IAAA,MAAM,MAAA,GAAS,CAAA,QAAA,EAAM,IAAA,CAAK,OAAO,CAAA,IAAA,CAAA;AACjC,IAAA,MAAM,EAAA,GACJ,KAAK,OAAA,GAAU,CAAA,GACX,KAAK,eAAA,GACH,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,OAAA,EAAU,MAAM,WAAW,CAAA,CAAE,KAAK,CAAA,CAAA,CAAA,GAC3C,CAAA,EAAG,CAAA,CAAE,IAAI,GAAG,MAAM,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,CAAA,GAC9B,EAAA;AACN,IAAA,OAAO,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA,EAAG,KAAK,UAAA,EAAY,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,CAAA;AAAA,EACjD;AAAA,EAEQ,aAAa,CAAA,EAAmB;AAEtC,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,EAAA,IAAM,CAAA,CAAE,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA,EAAG;AACjD,MAAA,CAAA,IAAK,gBAAgB,EAAA,CAAG,WAAA,CAAY,CAAC,CAAE,IAAI,CAAA,GAAI,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,YAAA,CAAa,GAAW,GAAA,EAAqB;AACnD,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,OAAO,CAAA,GAAI,EAAE,MAAA,EAAQ;AACnB,MAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,MAAA,IAAU,EAAE,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AACvC,QAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,QAAA,OAAO,CAAA,GAAI,EAAE,MAAA,IAAU,CAAC,WAAW,IAAA,CAAK,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,EAAA;AAC/C,QAAA,GAAA,IAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACvB,QAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AACR,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,WAAA,CAAY,CAAC,CAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,KAAA,GAAS,CAAA,GAAI,CAAA;AAChC,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,EAAE,CAAA,GAAI,CAAA,GAAI,CAAA;AAC1C,MAAA,IAAI,KAAA,GAAQ,UAAU,GAAA,EAAK;AACzB,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACF;AACA,MAAA,GAAA,IAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,KAAK,CAAA;AAC3B,MAAA,KAAA,IAAS,OAAA;AACT,MAAA,CAAA,IAAK,KAAA;AAAA,IACP;AACA,IAAA,IAAI,SAAA,SAAkB,CAAA,CAAE,KAAA;AACxB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,kBAAkBA,KAAAA,EAAwB;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,SAAU,EAAC;AACjC,IAAA,MAAM,OAAO,IAAA,CAAK,YAAA,CAAaA,KAAI,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,IAAA,CAAK,YAAA,CAAa,GAAG,IAAA,CAAK,GAAA,CAAI,GAAGA,KAAAA,GAAO,CAAC,CAAC,CAAC,CAAA;AAC3F,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAK,QAAA,CAAS,MAAA,EAAQ,KAAK,MAAM,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,QAAA,EAAU,IAAA,CAAK,KAAK,EAAE,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAaA,KAAAA,EAAwB;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,SAAU,EAAC;AACjC,IAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,EAAiB;AACtC,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,mBAAA,EAAsB,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC5E,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAK,QAAA,EAAU,OAAA,CAAQ,SAAS,CAAC,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AAC7B,MAAA,MAAM,MAAM,CAAA,KAAM,GAAA;AAClB,MAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,GAAA,CAAI,IAAA,KAAS,aAAa,GAAA,CAAI,IAAA,EAAK,GAAI,GAAA,CAAI,IAAA,KAAS,EAAA;AACzE,MAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,CAAA;AACzB,MAAA,IAAI,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,KAAK,CAAA,CAAA;AACnC,MAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAGA,QAAO,QAAA,IAAY,KAAA,GAAQ,KAAA,GAAQ,CAAA,GAAI,CAAA,CAAE,CAAA;AACtE,MAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU,OAAA,GAAU,QAAQ,KAAA,CAAM,CAAA,EAAG,QAAA,GAAW,CAAC,CAAA,GAAI,QAAA;AAC1E,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACtC,MAAA,MAAM,OAAA,GAAU,MAAM,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,CAAA,GAAM,IAAA;AACnD,MAAA,MAAM,UAAA,GAAa,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,IAAI,GAAG,CAAA,CAAE,KAAK,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA;AAC3F,MAAA,IAAI,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA;AAC5D,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAGA,QAAO,QAAA,GAAW,OAAA,CAAQ,SAAS,KAAK,CAAA;AAChE,QAAA,IAAA,IAAQ,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,MACtD;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAA,CAAW,GAAWA,KAAAA,EAAsB;AAClD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,KAAI,CAAC,CAAC,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,eAAA,GAAwB;AAC9B,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,IAAA,MAAMA,KAAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AACvC,IAAA,IAAI,EAAA;AACJ,IAAA,IAAIA,KAAAA,KAAS,KAAK,aAAA,IAAiB,IAAA,CAAK,gBAAgB,CAAA,IAAK,IAAA,CAAK,kBAAkB,MAAA,EAAQ;AAE1F,MAAA,MAAM,SACJ,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA,GAAI,IAAA,CAAK,oBAAoB,IAAA,CAAK,cAAA;AACpE,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AAAA,QACpB,CAAA;AAAA,QACA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,oBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC;AAAA,OACpE;AACA,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK,KAAA,IAAS,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAGA,KAAI,CAAA;AAK3E,MAAA,MAAM,gBAAgB,IAAA,CAAK,UAAA,CAAW,OAAO,QAAQ,CAAA,IAAK,GAAGA,KAAI,CAAA;AACjE,MAAA,EAAA,GAAK,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,CAAC,CAAA;AAG1C,MAAA,EAAA,IAAM,CAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,EAAA,GAAK,IAAA,CAAK,aAAA;AAAA,IACZ;AACA,IAAA,IAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,eAAA,EAAiB;AAG3C,IAAA,IAAI,KAAK,aAAA,EAAe;AACxB,IAAA,MAAMA,KAAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AAEvC,IAAA,IAAA,CAAK,eAAA,EAAgB;AAIrB,IAAA,MAAM,YAAsB,EAAC;AAG7B,IAAA,MAAM,UAAoB,EAAC;AAI3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,QAAO,CAAC,CAAA;AACnC,IAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAiB;AAKpC,MAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,IAAI,GAAG,MAAM,CAAA;AAC1D,MAAA,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AACrC,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IAClB,CAAA;AAOA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,kBAAA,CAAmBA,KAAI,CAAA;AACjD,IAAA,KAAA,MAAW,IAAA,IAAQ,YAAA,EAAc,WAAA,CAAY,IAAI,CAAA;AAMjD,IAAA,WAAA,CAAY,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,QAAA,CAAI,MAAA,CAAOA,KAAI,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAInD,IAAA,MAAM,GAAA,GAAM,iBAAiBA,KAAI,CAAA;AACjC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAErC,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,KAAAA,GAAO,IAAI,MAAM,CAAA;AAG9C,IAAA,MAAM,UAAA,GAAa,KAAK,SAAA,GACpB,IAAA,GACA,GAAG,CAAA,CAAE,MAAM,CAAA,iEAAA,EAAqD,CAAA,CAAE,KAAK,CAAA,CAAA;AAC3E,IAAA,IAAI,UAAA,EAAY,WAAA,CAAY,OAAA,GAAU,UAAU,CAAA;AAGhD,IAAA,MAAM,QAAA,GAAW,KAAK,SAAA,GAAY,CAAA,EAAG,EAAE,GAAG,CAAA,6BAAA,EAAgC,CAAA,CAAE,KAAK,CAAA,CAAA,GAAK,IAAA;AACtF,IAAA,IAAI,QAAA,EAAU,WAAA,CAAY,OAAA,GAAU,QAAQ,CAAA;AAI5C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAC/C,IAAA,IAAI,UAAA,EAAY,WAAA,CAAY,OAAA,GAAU,UAAU,CAAA;AAIhD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAI,GAAI,UAAU,CAAA,GAAI,MAAA,CAAO,MAAM,CAAA;AACxE,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,SAAA,EAAW;AAChC,MAAA,MAAM,KAAA,GACJ,GAAA,CAAI,SAAA,KAAc,gBAAA,GACd,gBAAA,GACA,eAAA,CAAgB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,IAAK,CAAC,CAAA;AAE7D,MAAA,MAAM,SAAS,QAAA,GAAW,EAAA;AAC1B,MAAA,IAAI,QAAQ,GAAA,CAAI,KAAA;AAChB,MAAA,IAAI,MAAA,GAAS,GAAG,KAAA,GAAQ,EAAA;AAAA,WAAA,IACf,KAAA,CAAM,MAAA,GAAS,MAAA,EAAQ,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,GAAS,CAAC,CAAC,CAAA,GAAI,QAAA;AAClF,MAAA,MAAM,IAAA,GAAO,GAAG,KAAK,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,KAAK,GAAG,KAAK,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,OAAA,EAAU,EAAE,KAAK,CAAA,CAAA;AAC5F,MAAA,WAAA,CAAY,UAAU,IAAI,CAAA;AAAA,IAC5B;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AACzC,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,EAAW,WAAA,CAAY,OAAA,GAAU,IAAI,CAAA;AAGxD,IAAA,MAAM,MAAA,GAAS,KAAK,YAAA,EAAa;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAInC,IAAA,MAAM,kBAAkB,IAAA,CAAK,OAAA;AAE7B,IAAA,MAAM,cAAc,eAAA,GAAmB,IAAA,CAAK,GAAA,EAAI,GAAI,OAAQ,IAAA,GAAO,IAAA;AACnE,IAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,MAChC,IAAA,EAAAA,KAAAA;AAAA,MACA,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,MAAA;AAAA,MACA,WAAA,EAAa,EAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,MAC5B,aAAa,mBAAA,EAAoB;AAAA,MACjC;AAAA,KACD,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACnC,IAAA,WAAA,CAAY,MAAM,CAAA;AAElB,IAAA,MAAM,eAAe,SAAA,CAAU,MAAA;AAC/B,IAAA,KAAA,MAAW,GAAA,IAAO,OAAA,EAAS,WAAA,CAAY,GAAG,CAAA;AAC1C,IAAA,WAAA,CAAY,SAAS,CAAA;AAIrB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,iBAAA,CAAkBA,KAAI,CAAA;AAChD,IAAA,KAAA,MAAW,IAAA,IAAQ,YAAA,EAAc,WAAA,CAAY,IAAI,CAAA;AAGjD,IAAA,MAAM,MAAA,GAAS,KAAK,WAAA,EAAY;AAChC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,MAAM,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,MAAA,CAAO,QAAA,EAAU,YAAA,GAAe,CAAC,CAAC,CAAA;AAC5E,IAAA,MAAM,iBAAiB,YAAA,GAAe,YAAA;AACtC,IAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,CAAI,MAAA,GAAS,GAAG,GAAA,CAAI,OAAA,GAAU,OAAO,QAAQ,CAAA;AAEzE,IAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AACrB,IAAA,IAAA,CAAK,oBAAA,GAAuB,cAAA;AAE5B,IAAA,IAAA,CAAK,iBAAA,GAAoB,UAAU,KAAA,EAAM;AACzC,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA;AACrD,IAAA,IAAA,CAAK,aAAA,GAAgBA,KAAAA;AACrB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAOnB,IAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAC1B,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,IAAI,cAAc,CAAA;AACrD,IAAA,IAAI,GAAA,GAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AACxC,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,GAAA,IAAO,IAAA;AACP,MAAA,IAAI,EAAA,GAAK,CAAA,EAAG,GAAA,IAAO,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,CAAA;AAC7B,MAAA,IAAI,cAAA,GAAiB,CAAA,EAAG,GAAA,IAAO,CAAA,KAAA,EAAQ,cAAc,CAAA,CAAA,CAAA;AAAA,IACvD;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC7B,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAwB,WAAA,GAAc,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtC,OAAwB,cAAA,GAAiB,GAAA;AAAA;AAAA,EAGzC,mBAAA,CAAoB,OAAe,SAAA,EAA0B;AAC3D,IAAA,IAAA,CAAK,mBAAmB,SAAS,CAAA;AACjC,IAAA,IAAA,CAAK,cAAA,IAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAA,CAAoB,OAAe,SAAA,EAA0B;AAC3D,IAAA,IAAA,CAAK,mBAAmB,SAAS,CAAA;AACjC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,cAAA,IAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA,EAIQ,mBAAmB,SAAA,EAA0B;AACnD,IAAA,IAAI,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,IAAA,CAAK,eAAA,EAAiB;AACjE,MAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AACvB,MAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AACtB,MAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,WAAA,GAAoB;AAClB,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACnC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AACA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACjC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,CAAC,KAAK,cAAA,EAAgB;AAClD,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AACtB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,KAAK,iBAAA,IAAqB,IAAA,CAAK,eAAA,IAAmB,CAAC,KAAK,OAAA,EAAS;AAErE,IAAA,IAAA,CAAK,iBAAA,GAAoB,WAAW,MAAM;AACxC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB,GAAG,EAAE,CAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,YAAA,CAAa,IAAA,CAAK,eAAe,CAAA;AAC3D,IAAA,IAAA,CAAK,eAAA,GAAkB,WAAW,MAAM;AACtC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,CAAC,KAAK,cAAA,EAAgB;AAClD,MAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AACtB,MAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AACtB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB,CAAA,EAAG,KAAI,cAAc,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,mBAAmBA,KAAAA,EAAwB;AAGjD,IAAA,MAAM,UAAA,GAAa,uBAAA;AAEnB,IAAA,MAAMiB,MAAAA,GAAQ,CAAC,CAAA,EAAW,IAAA,EAAc,IAAA,KAAyB;AAC/D,MAAA,MAAM,MAAMjB,KAAAA,GAAO,CAAA;AACnB,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,GAAA,GAAM,EAAE,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,IAAI,QAAA,GAAM,CAAA;AACpE,MAAA,OAAO,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,GAAK,CAAA,EAAG,IAAI,GAAG,CAAC,CAAA,CAAA;AAAA,IAC5D,CAAA;AAOA,IAAA,MAAM,YAAA,GAAe,8CAAA;AACrB,IAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KACjB,IAAA,CACG,QAAQ,KAAA,EAAO,EAAE,CAAA,CACjB,KAAA,CAAM,IAAI,CAAA,CACV,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,EAAK,KAAM,MAAM,CAAC,YAAA,CAAa,IAAA,CAAK,CAAC,CAAC,CAAA;AAC3D,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,cAAc,CAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAgB,CAAA;AACxC,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,MAAA,IAAU,IAAA,CAAI,WAAA;AACvC,MAAA,OAAO,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,CAAA,EAAG,CAAA,KACnBiB,MAAAA,CAAM,CAAA,EAAG,IAAI,CAAA,KAAM,CAAA,IAAK,YAAA,GAAe,CAAA,EAAG,EAAE,IAAI,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,MAAM,IAAI;AAAA,OACvE;AAAA,IACF;AACA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,OAAO,UAAU,IAAA,CAAK,cAAc,CAAA,CACjC,KAAA,CAAM,GAAgB,CAAA,CACtB,GAAA,CAAI,CAAC,CAAA,KAAMA,MAAAA,CAAM,CAAA,EAAG,UAAA,EAAY,IAAI,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ,IAAA,EAA6B;AACnC,IAAA,MAAM,QAAQ,IAAA,EAAM,KAAA;AACpB,IAAA,IAAI,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,MAAM,MAAA,EAAQ;AACjD,MAAA,MAAM,UAAU,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,MAAM,CAAA;AACtD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,MACtB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAUjB,KAAAA,EAAwB;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAM,KAAA;AACzB,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,EAAC;AAC5B,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAc,CAAA,CAAE,QAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC3D,IAAA,MAAMiB,SAAQ,CAAC,CAAA,EAAW,GAAA,KACxB,CAAA,CAAE,SAAS,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAC,IAAI,QAAA,GAAM,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,eAAA;AAClB,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,CAAE,MAAA;AACtD,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,IAAA,EAAM,WAAW,IAAA,CAAK,IAAA,EAAM,eAAe,MAAM,CAAA;AAG9E,IAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA,CAAA,CAAA;AAC3C,IAAA,MAAM,GAAA,GAAMA,OAAM,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA,EAAGjB,KAAAA,GAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,CAAE,IAAI,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA,CAAE,IAAI,GAAG,IAAI,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AACpF,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AAErB,MAAA,MAAM,IAAA,GAAOiB,MAAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGjB,KAAAA,GAAO,CAAC,CAAC,CAAA;AAC/D,MAAA,IAAI,EAAE,MAAA,KAAW,MAAA,MAAY,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,WAAA,IAC9E,CAAA,CAAE,MAAA,KAAW,aAAA,EAAe,GAAA,CAAI,IAAA,CAAK,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,WACzE,GAAA,CAAI,IAAA,CAAK,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,UAAK,IAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,UAAU,IAAA,EAAsB;AACtC,IAAA,OAAO,KACJ,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AAChD,MAAA,IAAI,UAAU,EAAA,IAAM,oBAAA,CAAqB,IAAA,CAAK,KAAK,GAAG,OAAO,IAAA;AAC7D,MAAA,OAAO,GAAA,GAAM,IAAA;AAAA,IACf,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,IAAA,EAAoB;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAChC,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAGA,WAAW,KAAA,EAAuB;AAChC,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,IAAA,EAAoB;AACnC,IAAA,MAAMA,QAAO,IAAA,CAAK,GAAA,CAAI,IAAI,OAAA,CAAQ,MAAA,CAAO,WAAW,EAAE,CAAA;AACtD,IAAA,MAAM,EAAA,GAAK,gBAAA;AACX,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,QAAO,CAAC,CAAA;AAGlC,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAA8B;AAC9C,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,GAAG,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAChF,MAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAC,EAAE,CAAA;AAC7B,MAAA,MAAM,MAAgB,EAAC;AACvB,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,KAAA,IAAS,KAAK,KAAA,EAAO;AACnB,QAAA,OAAO,CAAA,CAAE,SAAS,KAAA,EAAO;AACvB,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,YAAA,GAAA,GAAM,EAAA;AAAA,UACR;AACA,UAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA;AAC1B,UAAA,CAAA,GAAI,CAAA,CAAE,MAAM,KAAK,CAAA;AAAA,QACnB;AACA,QAAA,IAAI,CAAC,KAAK,GAAA,GAAM,CAAA;AAAA,aAAA,IACP,IAAI,MAAA,GAAS,CAAA,GAAI,EAAE,MAAA,IAAU,KAAA,SAAc,GAAA,GAAM,CAAA;AAAA,aACrD;AACH,UAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,UAAA,GAAA,GAAM,CAAA;AAAA,QACR;AAAA,MACF;AACA,MAAA,IAAI,OAAO,CAAC,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,GAAG,CAAA;AACpC,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAIA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,IAAI,EAAE,KAAA,CAAM,IAAI,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAEvE,IAAA,MAAM,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAC5D,IAAA,IAAA,CAAK,MAAM,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACzB,MAAA,MAAM,OAAA,GAAA,CAAW,CAAA,KAAM,CAAA,GAAI,SAAA,GAAO,IAAA,IAAQ,IAAA;AAC1C,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AAEpC,MAAA,MAAM,QAAQ,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,CAAA,EAAG,EAAE,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAAK,MAAA;AACxE,MAAA,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACxC,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,EACf;AAAA;AAAA,EAIA,WAAW,EAAA,EAAmB;AAC5B,IAAA,IAAI,EAAA,IAAM,CAAC,IAAA,CAAK,OAAA,EAAS;AACvB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,EAAI;AAE7B,MAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AAErC,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACtB,CAAA,MAAA,IAAW,CAAC,EAAA,EAAI;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAA,EAAsE;AACjF,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACjD,IAAA,KAAA,MAAW,MAAM,CAAC,GAAG,KAAK,iBAAA,CAAkB,IAAA,EAAM,CAAA,EAAG;AACnD,MAAA,IAAI,CAAC,OAAO,GAAA,CAAI,EAAE,GAAG,IAAA,CAAK,iBAAA,CAAkB,OAAO,EAAE,CAAA;AAAA,IACvD;AAGA,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,IAAI,CAAA,CAAE,cAAc,gBAAA,EAAkB;AACtC,MAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACtC,MAAA,MAAM,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AACpD,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,OAAO,KAAK,GAAA,CAAI,GAAG,KAAK,GAAA,GAAM,eAAA,CAAgB,SAAS,CAAA,EAAG,GAAA,EAAA;AAC1D,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,GAAG,CAAA;AAAA,IACtC;AACA,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAGQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AACzD,IAAA,IAAI,QAAA,IAAY,CAAC,IAAA,CAAK,YAAA,EAAc;AAClC,MAAA,IAAA,CAAK,eAAe,WAAA,CAAY,MAAM,IAAA,CAAK,YAAA,IAAgB,UAAU,CAAA;AAAA,IACvE,CAAA,MAAA,IAAW,CAAC,QAAA,IAAY,IAAA,CAAK,YAAA,EAAc;AACzC,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,mBAAmB,CAAA,EAAiB;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,IAAA,CAAK,eAAA,GAAkB,KAAA;AACpC,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EACA,eAAe,CAAA,EAAiB;AAC9B,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EACA,aAAa,SAAA,EAA0B;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAIA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA,EAEA,QAAA,CAAS,IAAA,EAAc,MAAA,GAAwB,EAAC,EAAS;AACvD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,MAAA;AACtB,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAGA,SAAA,CAAU,UAAkB,SAAA,EAAyB;AACnD,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAQ,OAAsB,SAAA,EAAyB;AAGrD,IAAA,MAAM,IAAA,GAAO,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,GAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK,GAAI,IAAA;AACzE,IAAA,IAAI,IAAA,KAAS,KAAK,IAAA,EAAM;AACtB,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,SAAA;AACf,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA,EAIQ,aAAA,GAAsB;AAC5B,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,UAAU,CAAA;AAC/B,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,WAAW,CAAA;AAChC,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,EACrB;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,WAAW,CAAA;AAChC,IAAA,MAAM,WAAW,IAAA,CAAK,cAAA;AACtB,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,GAAI,IAAI,CAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCA,YAAY,IAAA,EAAkD;AAC5D,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,MAAM,MAAA,GAAS,CAAC,CAAC,IAAA,CAAK,MAAA;AACtB,MAAA,MAAM,cAAA,GAAiB,KAAK,cAAA,KAAmB,KAAA;AAC/C,MAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,UAAA;AACxC,MAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,UAAA;AACtC,MAAA,IAAI,GAAA,GAAM,KAAK,OAAA,IAAW,EAAA;AAE1B,MAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,CAAK,aAAA,EAAc;AAChC,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,WAAW,CAAA;AAEhC,MAAA,MAAMA,KAAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AACvC,MAAA,MAAM,GAAA,GAAM,iBAAiBA,KAAI,CAAA;AACjC,MAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACjC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,QAAO,CAAC,CAAA;AACnC,MAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAChB,MAAA,MAAM,SAAS,CAAA,EAAG,IAAA,CAAK,UAAA,EAAY,SAAI,KAAK,CAAA,CAAA,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,CAAA;AAEhB,MAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB;AACjC,QAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,IAAI,GAAG,MAAM,CAAA;AAC1D,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,GAAG;AAAA,CAAI,CAAA;AAAA,MACzC,CAAA;AAIA,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,QAAA,CAAS,MAAM,oBAAA,CAAqB,GAAA,CAAI,MAAM,WAAA,EAAa,MAAA,EAAQ,UAAU,CAAC,CAAA;AAC9E,QAAA,QAAA,CAAS,MAAM,YAAA,CAAa,MAAA,GAAS,KAAK,GAAA,CAAI,QAAA,EAAU,MAAM,CAAC,CAAA;AAC/D,QAAA,QAAA,CAAS,GAAA,GAAM,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,MAAM,CAAC,CAAA;AAE/C,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,WAAW,CAAA;AAChC,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,GAAU,OAAA,GAAU,GAAA,CAAI,MAAA;AACxC,QAAA,IAAI,GAAA,GAAM,CAAA,EAAG,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MACxE,CAAA;AAEA,MAAA,MAAM,aAAa,MAAM;AAEvB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,iBAAiB,CAAA;AAAA,MACxC,CAAA;AAEA,MAAA,MAAM,SAAS,MAAM;AAEnB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,WAAW,CAAA;AAChC,QAAA,IAAA,EAAK;AAAA,MACP,CAAA;AAEA,MAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAyB;AACvC,QAAA,UAAA,EAAW;AACX,QAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,CAAK,WAAA,EAAY;AAAA,kBACpB,eAAA,GAAkB,IAAA;AAC5B,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf,CAAA;AAEA,MAAA,IAAA,EAAK;AACL,MAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAA,EAAK,GAAA,KAAQ;AACnC,QAAA,IAAI,GAAA,EAAK,SAAS,QAAA,EAAU;AAC1B,UAAA,IAAI,cAAA,IAAkB,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AACpC,YAAA,GAAA,GAAM,EAAA;AACN,YAAA,MAAA,EAAO;AACP,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,IAAI,CAAA;AACX,UAAA;AAAA,QACF;AACA,QAAA,IAAI,GAAA,EAAK,IAAA,KAAS,QAAA,IAAY,GAAA,EAAK,SAAS,OAAA,EAAS;AACnD,UAAA,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACjB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,GAAA,EAAK,SAAS,WAAA,EAAa;AAC7B,UAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACjB,UAAA,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACrB,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF;AACA,QAAA,IAAI,GAAA,IAAO,CAAC,GAAA,EAAK,IAAA,IAAQ,CAAC,GAAA,EAAK,IAAA,IAAQ,OAAO,GAAA,EAAK;AACjD,UAAA,IAAI,GAAA,CAAI,SAAS,IAAA,CAAK,GAAA,CAAI,GAAG,GAAA,CAAI,QAAA,GAAW,OAAA,GAAU,CAAC,CAAA,EAAG;AACxD,YAAA,GAAA,IAAO,GAAA;AACP,YAAA,MAAA,EAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,CACE,UACA,IAAA,EACmF;AACnF,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAE9B,MAAA,MAAM,OAAA,GAA8F;AAAA,QAClG,EAAE,OAAO,OAAA,EAAS,KAAA,EAAO,cAAc,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AAAA,QACrE,EAAE,OAAO,QAAA,EAAU,KAAA,EAAO,0BAA0B,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,IAAA,EAAK;AAAA,QACjF;AAAA,UACE,KAAA,EAAO,aAAA;AAAA,UACP,KAAA,EAAO,eAAe,IAAI,CAAA,uBAAA,CAAA;AAAA,UAC1B,QAAA,EAAU,GAAA;AAAA,UACV,OAAO,CAAA,CAAE;AAAA,SACX;AAAA,QACA,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,GAAA,EAAI;AAAA,QAC5D;AAAA,UACE,KAAA,EAAO,eAAA;AAAA,UACP,KAAA,EAAO,oBAAA;AAAA,UACP,QAAA,EAAU,GAAA;AAAA,UACV,OAAO,CAAA,CAAE,OAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACF;AACA,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAC,CAAA;AAE3D,MAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,SAAA,EAAW,CAAA,CAAE,QAAQ,gBAAgB,CAAA;AAE3E,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,MAAMA,KAAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AACvC,MAAA,MAAM,GAAA,GAAM,iBAAiBA,KAAI,CAAA;AACjC,MAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACjC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,QAAO,CAAC,CAAA;AACnC,MAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAGhB,MAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAA2B;AAC9C,QAAA,MAAMkB,QAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC5C,QAAA,IAAI,CAACA,KAAAA,EAAM,OAAO,CAAC,EAAE,CAAA;AACrB,QAAA,MAAM,MAAgB,EAAC;AACvB,QAAA,IAAI,IAAA,GAAOA,KAAAA;AACX,QAAA,OAAO,IAAA,CAAK,MAAA,GAAS,GAAA,CAAI,QAAA,EAAU;AACjC,UAAA,GAAA,CAAI,IAAA,CAAK,KAAK,KAAA,CAAM,CAAA,EAAG,IAAI,QAAA,GAAW,CAAC,IAAI,QAAG,CAAA;AAC9C,UAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,GAAW,CAAC,CAAA;AAClC,UAAA,IAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AAEnB,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,KAAK,IAAI,CAAA;AACjC,QAAA,OAAO,GAAA,CAAI,MAAA,GAAS,GAAA,GAAM,CAAC,EAAE,CAAA;AAAA,MAC/B,CAAA;AAIA,MAAA,MAAM,eAAe,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AAE1D,QAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAmB,EAAE,EAAE,IAAA,EAAK;AACvD,QAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACjC,QAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAO,KAAA,GAAQ,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAC,CAAA,EAAG,KAAK,KAAK,CAAE,CAAA;AAAA,MAC3E,CAAC,CAAA;AACD,MAAA,IAAI,CAAC,YAAA,CAAa,MAAA,EAAQ,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,CAAE,GAAG,CAAA,YAAA,EAAe,KAAK,CAAA,CAAE,CAAA;AAE1E,MAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB;AACjC,QAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,IAAI,GAAG,MAAM,CAAA;AAC1D,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,GAAG;AAAA,CAAI,CAAA;AAAA,MACzC,CAAA;AAGA,MAAA,MAAM,cAAc,OAAA,CAAQ,MAAA;AAC5B,MAAA,MAAM,eAAe,YAAA,CAAa,MAAA;AAClC,MAAA,MAAM,OAAA,GAAU,CAAA,GAAY,YAAA,GAAe,CAAA,GAAc,WAAA,GAAc,CAAA;AACvE,MAAA,MAAM,SAAA,GAAY,CAAA;AAClB,MAAA,MAAM,YAAY,SAAA,GAAY,OAAA;AAE9B,MAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAsB;AACjD,QAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,QAAA,MAAM,MAAM,CAAA,KAAM,GAAA;AAClB,QAAA,MAAM,UAAU,GAAA,GAAM,CAAA,EAAG,EAAE,KAAK,CAAA,MAAA,EAAI,KAAK,CAAA,CAAA,CAAA,GAAM,IAAA;AAC/C,QAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAG,KAAK,KAAK,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAG,KAAK,CAAA,CAAA;AACxF,QAAA,MAAM,QAAA,GAAW,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA,CAAE,QAAQ,IAAI,KAAK,CAAA,CAAA;AACjD,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,IAAQ,GAAA,GAAM,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAG,KAAK,CAAA,CAAA,GAAK,EAAA;AAE7D,QAAA,MAAM,aAAa,CAAA,CAAE,KAAA;AACrB,QAAA,MAAM,IAAA,GAAO,CAAA,GAAI,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,GAAA,GAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,CAAA,CAAA;AAClF,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,WAAW,IAAI,CAAA;AAC3C,QAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,MAC/D,CAAA;AAEA,MAAA,MAAM,SAAA,GAAY,CAAC,MAAA,KAAoB;AACrC,QAAA,IAAI,QAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,CAAG,CAAA;AAErD,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA,QAAA;AAAA,UACE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,iBAAA,EAAoB,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,GAAG,CAAA,IAAA,EAAO,KAAK,IAAI,OAAO,CAAA;AAAA,SAC3E;AACA,QAAA,QAAA,CAAS,GAAA,GAAM,gBAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,MAAM,CAAC,CAAA;AACjD,QAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,UAAA,QAAA,CAAS,MAAM,YAAA,CAAa,IAAA,EAAM,GAAA,CAAI,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,QACzD;AAEA,QAAA,QAAA,CAAS,MAAM,YAAA,CAAa,EAAA,EAAI,GAAA,CAAI,QAAA,EAAU,MAAM,CAAC,CAAA;AACrD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,UAAA,QAAA,CAAS,GAAA,GAAM,aAAa,mBAAA,CAAoB,CAAC,GAAG,GAAA,CAAI,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,QAC3E;AACA,QAAA,QAAA,CAAS,GAAA,GAAM,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACjD,CAAA;AAEA,MAAA,SAAA,CAAU,KAAK,CAAA;AAEf,MAAA,MAAM,QAAQ,MAAM;AAClB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AACzB,QAAA,IAAI,YAAY,CAAA,EAAG,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,CAAG,CAAA;AAC5D,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,MAC/B,CAAA;AAEA,MAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAAqD,MAAA,KAAoB;AACrF,QAAA,KAAA,EAAM;AACN,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA,OAAA,CAAoD,EAAE,QAAQ,CAAA;AAAA,MAChE,CAAA;AAIA,MAAA,MAAM,kBAAkB,MAAM;AAC5B,QAAA,KAAA,EAAM;AACN,QAAA,KAAK,IAAA,CAAK,WAAA,CAAY,EAAE,WAAA,EAAa,iBAAA,EAAmB,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AACpF,UAAA,IAAA,CAAK,WAAA,EAAY;AACjB,UAAA,IAAI,KAAK,OAAA,CAAQ,EAAE,QAAQ,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAA;AAAA,eAC3C,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,QACjC,CAAC,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB;AAC9B,QAAA,IAAI,KAAA,KAAU,iBAAiB,eAAA,EAAgB;AAAA,kBACrC,KAAK,CAAA;AAAA,MACjB,CAAA;AAEA,MAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAA,EAAK,GAAA,KAAQ;AACnC,QAAA,IAAI,GAAA,EAAK,IAAA,KAAS,IAAA,IAAQ,GAAA,KAAQ,GAAA,EAAK;AACrC,UAAA,GAAA,GAAA,CAAO,GAAA,GAAM,IAAI,WAAA,IAAe,WAAA;AAChC,UAAA,SAAA,CAAU,IAAI,CAAA;AAAA,QAChB,CAAA,MAAA,IAAW,GAAA,EAAK,IAAA,KAAS,MAAA,IAAU,QAAQ,GAAA,EAAK;AAC9C,UAAA,GAAA,GAAA,CAAO,MAAM,CAAA,IAAK,WAAA;AAClB,UAAA,SAAA,CAAU,IAAI,CAAA;AAAA,QAChB,CAAA,MAAA,IAAW,GAAA,EAAK,IAAA,KAAS,KAAA,EAAO;AAE9B,UAAA,IAAA,CAAK,eAAe,CAAA;AAAA,QACtB,WAAW,GAAA,EAAK,IAAA,KAAS,QAAA,IAAY,GAAA,EAAK,SAAS,OAAA,EAAS;AAC1D,UAAA,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,CAAE,KAAK,CAAA;AAAA,QACzB,CAAA,MAAA,IAAW,GAAA,EAAK,IAAA,KAAS,QAAA,EAAU;AACjC,UAAA,IAAA,CAAK,MAAM,CAAA;AAAA,QACb,CAAA,MAAO;AACL,UAAA,MAAM,CAAA,GAAA,CAAK,GAAA,IAAO,EAAA,EAAI,WAAA,EAAY;AAClC,UAAA,IAAI,CAAA,KAAM,GAAA,EAAK,IAAA,CAAK,OAAO,CAAA;AAAA,eAAA,IAClB,CAAA,KAAM,GAAA,EAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,eAAA,IACxB,CAAA,KAAM,GAAA,EAAK,IAAA,CAAK,aAAa,CAAA;AAAA,eAAA,IAC7B,CAAA,KAAM,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA;AAAA,eAAA,IACtB,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,OAAU,eAAe,CAAA;AAAA,QACvD;AAAA,MACF,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CAAU,OAAe,KAAA,EAA6E;AACpG,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,MAAMlB,KAAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AACvC,MAAA,MAAM,GAAA,GAAM,iBAAiBA,KAAI,CAAA;AACjC,MAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACjC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,QAAO,CAAC,CAAA;AAGnC,MAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM;AAAA,EAAK,GAAG,GAAG,KAAK;AAAA,CAAI,CAAA;AAAA,WAC/C,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAI9B,MAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAsB;AAC/C,QAAA,MAAM,EAAA,GAAK,MAAM,CAAC,CAAA;AAClB,QAAA,MAAM,MAAM,CAAA,KAAM,GAAA;AAClB,QAAA,MAAM,IAAA,GAAO,GAAG,IAAA,IAAQ,EAAA;AACxB,QAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,QAAA,MAAM,QAAA,GAAW,CAAA;AACjB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,WAAW,QAAA,IAAY,KAAA,GAAQ,KAAA,GAAQ,CAAA,GAAI,CAAA,CAAE,CAAA;AAC9E,QAAA,IAAI,QAAQ,EAAA,CAAG,KAAA,CAAM,QAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC/C,QAAA,IAAI,KAAA,CAAM,MAAA,GAAS,QAAA,EAAU,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,CAAC,CAAC,CAAA,GAAI,QAAA;AACjF,QAAA,MAAM,OAAA,GAAU,MAAM,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,CAAA,GAAM,IAAA;AACnD,QAAA,MAAM,WAAA,GAAc,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,KAAK,GAAG,CAAA,CAAE,KAAK,KAAK,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA;AAC7F,QAAA,IAAI,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA;AACtC,QAAA,IAAI,KAAA,EAAO;AAET,UAAA,MAAM,IAAA,GAAO,WAAW,KAAA,CAAM,MAAA;AAC9B,UAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,GAAA,CAAI,QAAA,GAAW,OAAO,KAAK,CAAA;AACnD,UAAA,OAAA,IAAW,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,GAAA,GAAM,CAAA,CAAE,IAAA,GAAO,EAAE,GAAG,CAAA,EAAG,IAAI,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA;AAAA,QACvE;AACA,QAAA,OAAO,OAAA;AAAA,MACT,CAAA;AAEA,MAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB;AACjC,QAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,IAAI,GAAG,MAAM,CAAA;AAC1D,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,GAAG;AAAA,CAAI,CAAA;AAAA,MACzC,CAAA;AAIA,MAAA,MAAM,IAAA,GAAO,CAAC,MAAA,KAAoB;AAChC,QAAA,IAAI,MAAA,UAAgB,MAAA,CAAO,KAAA,CAAM,QAAQ,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,sBAC9C,GAAA,GAAM,gBAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,MAAM,CAAC,CAAA;AACtD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,UAAA,QAAA,CAAS,GAAA,GAAM,aAAa,iBAAA,CAAkB,CAAC,GAAG,GAAA,CAAI,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,QACzE;AACA,QAAA,QAAA,CAAS,GAAA,GAAM,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACjD,CAAA;AACA,MAAA,IAAA,CAAK,KAAK,CAAA;AAIV,MAAA,MAAM,SAAA,GAAY,QAAQ,CAAA,GAAI,CAAA;AAC9B,MAAA,MAAM,OAAA,GAAU,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA;AACnC,MAAA,MAAM,QAAQ,MAAM;AAClB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AACzB,QAAA,MAAM,KAAK,SAAA,GAAY,OAAA;AACvB,QAAA,IAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,CAAG,CAAA;AAC9C,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,MAC/B,CAAA;AACA,MAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAyB;AACtC,QAAA,KAAA,EAAM;AACN,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf,CAAA;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAA,EAAK,GAAA,KAAQ;AACnC,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,IAAI,GAAA,CAAI,IAAA,KAAS,IAAA,IAAQ,GAAA,KAAQ,GAAA,EAAK;AACpC,UAAA,GAAA,GAAA,CAAO,GAAA,GAAM,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA;AACvC,UAAA,IAAA,CAAK,IAAI,CAAA;AAAA,QACX,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,QAAQ,GAAA,EAAK;AAC7C,UAAA,GAAA,GAAA,CAAO,GAAA,GAAM,KAAK,KAAA,CAAM,MAAA;AACxB,UAAA,IAAA,CAAK,IAAI,CAAA;AAAA,QACX,WAAW,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,SAAS,OAAA,EAAS;AACxD,UAAA,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,CAAA;AAAA,QACxB,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAChC,UAAA,KAAA,CAAM,MAAS,CAAA;AAAA,QACjB;AAAA,MACF,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CAAO,QAAA,EAAkB,WAAA,GAAc,EAAA,EAA4B;AACjE,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,WAAW,CAAA;AAChC,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,EAAK,EAAE,IAAI,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,IAAI,QAAQ;AAAA,CAAI,CAAA;AAC3D,MAAA,IAAI,WAAA,EAAa,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,YAAA,EAAU,WAAW,CAAA,EAAG,CAAA,CAAE,KAAK;AAAA,CAAI,CAAA;AAClF,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,SAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,MACjF,CAAA;AACA,MAAA,IAAA,EAAK;AACL,MAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAyB;AACvC,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AACzB,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf,CAAA;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAA,EAAK,GAAA,KAAQ;AACnC,QAAA,IAAI,GAAA,EAAK,IAAA,KAAS,QAAA,EAAU,OAAO,OAAO,IAAI,CAAA;AAC9C,QAAA,IAAI,GAAA,EAAK,IAAA,KAAS,QAAA,IAAY,GAAA,EAAK,IAAA,KAAS,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,IAAA,EAAK,IAAK,IAAI,CAAA;AACrF,QAAA,IAAI,GAAA,EAAK,SAAS,WAAA,EAAa;AAC7B,UAAA,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACrB,UAAA,IAAA,EAAK;AACL,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,IAAO,CAAC,GAAA,EAAK,IAAA,IAAQ,CAAC,GAAA,EAAK,IAAA,IAAQ,OAAO,GAAA,EAAK;AACjD,UAAA,GAAA,IAAO,GAAA;AACP,UAAA,IAAA,EAAK;AAAA,QACP;AAAA,MACF,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,KAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AACzB,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,EACtD;AACF,CAAA;;;ACl7EO,IAAM,WAAA,GAAc,eAAA;AAC3B,IAAM,WAAA,GAAc,GAAA;AAQpB,SAAS,MAAM,KAAA,EAA0B;AACvC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,EAAC;AACnC,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,IAAA,EAAK,KAAM,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,WAAW,CAAA;AACtG;AAOA,eAAsB,WAAA,CACpB,KAAA,EACA,QAAA,EACA,YAAA,EACmB;AACnB,EAAA,MAAM,MAAM,KAAA,CAAM,MAAM,MAAM,KAAA,CAAM,QAAA,EAAU,WAAW,CAAC,CAAA;AAC1D,EAAA,IAAI,GAAA,CAAI,QAAQ,OAAO,GAAA;AACvB,EAAA,IAAI,YAAA,IAAgB,iBAAiB,QAAA,EAAU;AAC7C,IAAA,MAAM,SAAS,KAAA,CAAM,MAAM,MAAM,KAAA,CAAM,YAAA,EAAc,WAAW,CAAC,CAAA;AACjE,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,KAAK,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU,WAAA,EAAa,MAAM,CAAA;AAC9C,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAOO,SAAS,aAAA,CACd,KAAA,EACA,QAAA,EACA,OAAA,EACA,IAAA,EACU;AACV,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,EAAA,IAAI,CAAC,KAAK,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAC,CAAA,KAAM,GAAG,OAAO,OAAA;AACpD,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACd,EAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAA,CAAQ,SAAS,WAAW,CAAA;AAChF,EAAA,KAAK,MAAM,KAAA,CAAM,QAAA,EAAU,aAAa,CAAC,GAAG,OAAO,CAAC,CAAA;AACpD,EAAA,OAAO,OAAA;AACT;;;ACzDA,IAAM,GAAA,GAAM,OAAA;AACZ,IAAM,IAAI,GAAA,GAAM,IAAA;AAChB,IAAMmB,QAAO,GAAA,GAAM,IAAA;AACnB,IAAMrB,OAAM,GAAA,GAAM,IAAA;AAClB,IAAM,OAAO,GAAA,GAAM,IAAA;AACnB,IAAM,QAAQ,GAAA,GAAM,IAAA;AACpB,IAAM,OAAO,GAAA,GAAM,UAAA;AACnB,IAAM,OAAO,GAAA,GAAM,KAAA;AACnB,IAAM,OAAO,GAAA,GAAM,KAAA;AAInB,IAAM,IAAA,GAAO,iBAAA;AACb,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,MAAA;AAC7B;AACA,SAAS,aAAA,CAAc,GAAW,KAAA,EAAuB;AACvD,EAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA;AAClC,EAAA,OAAO,MAAM,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA;AACzC;AAGA,SAAS,OAAO,CAAA,EAAmB;AAGjC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,YAAA,EAAc,CAAC,GAAG,IAAA,KAAS;AACvC,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,OAAO,IAAA,IAAU,KAAA,CAAM,MAAA,GAAS,CAAA,CAAA,GAAK,IAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA;AAAA,IACJ,4BAAA;AAAA,IACA,CAAC,CAAA,EAAG,IAAA,EAAM,GAAA,KAAQ,CAAA,EAAG,IAAI,CAAA,EAAG,KAAK,CAAA,EAAG,IAAI,GAAG,CAAC,CAAA,CAAA,EAAIA,IAAG,CAAA,EAAG,GAAG,GAAG,CAAC,CAAA;AAAA,GAC/D;AAEA,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,kBAAA,EAAoB,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,EAAGqB,KAAI,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA;AAC7D,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,gBAAA,EAAkB,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,EAAG,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA;AAC3D,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,cAAA,EAAgB,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,EAAGrB,IAAG,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA;AAIxD,EAAA,CAAA,GAAI,CAAA,CAAE,QAAQ,gBAAA,EAAkB,CAAC,GAAG,CAAA,KAAM,CAAA,EAAG,IAAI,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA;AAC3G,EAAA,OAAO,CAAA;AACT;AAQA,SAAS,UAAA,CAAW,MAAc,KAAA,EAAyB;AACzD,EAAA,IAAI,KAAA,GAAQ,KAAK,YAAA,CAAa,IAAI,KAAK,KAAA,EAAO,OAAO,CAAC,IAAI,CAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,IAAA,GAAO,aAAa,CAAC,CAAA;AAC3B,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,MAAA,GAAS,IAAA;AAAA,IACX,CAAA,MAAA,IAAW,MAAA,GAAS,CAAA,GAAI,IAAA,IAAQ,KAAA,EAAO;AACrC,MAAA,GAAA,IAAO,GAAA,GAAM,CAAA;AACb,MAAA,MAAA,IAAU,CAAA,GAAI,IAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,EAAA,IAAM,KAAA,CAAM,WAAW,CAAA,EAAG,KAAA,CAAM,KAAK,GAAG,CAAA;AACpD,EAAA,OAAO,KAAA;AACT;AAOA,SAAS,UACP,GAAA,EACAE,KAAAA,EACA,SAAA,EACA,QAAA,EACA,WACA,IAAA,EACM;AACN,EAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,EAAGA,KAAAA,GAAO,SAAS,CAAC,CAAA;AAC9D,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,EAAA,EAAI,GAAA,KAAQ,GAAA,CAAI,IAAA,CAAA,CAAM,GAAA,KAAQ,CAAA,GAAI,SAAA,GAAY,QAAA,IAAY,EAAE,CAAC,CAAA;AAChF;AAGA,SAAS,WAAW,GAAA,EAAuB;AACzC,EAAA,IAAI,CAAA,GAAI,IAAI,IAAA,EAAK;AACjB,EAAA,IAAI,EAAE,UAAA,CAAW,GAAG,GAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AACpC,EAAA,IAAI,CAAA,CAAE,SAAS,GAAG,CAAA,MAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACtC,EAAA,OAAO,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,IAAI,CAACW,EAAAA,KAAMA,EAAAA,CAAE,IAAA,EAAM,CAAA;AACzC;AAEA,IAAM,SAAA,GAAY,YAAA;AAClB,SAAS,iBAAiB,IAAA,EAAuB;AAC/C,EAAA,OAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AACxE;AAGA,SAAS,YAAY,IAAA,EAA4B;AAC/C,EAAA,MAAMX,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAClD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAASW,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAIX,KAAAA,EAAMW,EAAAA,EAAAA,EAAK;AAC7B,IAAA,MAAA,CAAOA,EAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,OAAO,CAAA,CAAEA,EAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,QAAA,EAAM,CAAC,CAAA,CAAA;AAC1B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,KAAO;AACtB,IAAA,MAAM,QAAQ,EAAC;AACf,IAAA,KAAA,IAASA,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAIX,KAAAA,EAAMW,EAAAA,EAAAA,EAAK;AAC7B,MAAA,MAAM,GAAA,GAAM,CAAA,CAAEA,EAAC,CAAA,IAAK,EAAA;AACpB,MAAA,MAAM,MAAA,GAAS,EAAA,KAAO,CAAA,GAAI,CAAA,EAAGQ,KAAI,CAAA,EAAG,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,CAAC,CAAA,CAAA,GAAK,OAAO,GAAG,CAAA;AAClE,MAAA,KAAA,CAAM,KAAK,aAAA,CAAc,MAAA,EAAQ,MAAA,CAAOR,EAAC,CAAC,CAAC,CAAA;AAAA,IAC7C;AACA,IAAA,GAAA,CAAI,IAAA,CAAA,CAAM,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA;AACrD,IAAA,IAAI,OAAO,CAAA,EAAG;AAEZ,MAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,IAAI,GAAG,QAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,CAAA,EAAG,IAAI,CAAA,kBAAA,EAAM,CAAC,CAAA,CAAE,CAAA;AACnF,MAAA,GAAA,CAAI,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IACtB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,cAAA,CAAe,GAAA,EAAaX,KAAAA,GAAO,EAAA,EAAc;AAC/D,EAAA,MAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,SAAS,IAAI,CAAA,CAAE,MAAM,IAAI,CAAA;AACnD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAGpB,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG;AACxB,MAAA,OAAA,GAAU,CAAC,OAAA;AACX,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,GAAA,CAAI,KAAK,CAAA,EAAG,IAAI,SAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAC/B,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,gBAAA,CAAiB,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG;AAChF,MAAA,MAAM,KAAA,GAAoB,CAAC,UAAA,CAAW,IAAI,CAAC,CAAA;AAC3C,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,OAAO,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,CAAE,MAAK,EAAG;AACpE,QAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAC/B,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,WAAA,CAAY,KAAK,CAAC,CAAA;AAC9B,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AAC9C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,MAAW,MAAM,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,IAAQA,KAAI,CAAA,MAAO,IAAA,CAAK,CAAA,EAAGmB,KAAI,CAAA,EAAG,IAAI,GAAG,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA;AACxF,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,4BAAA,CAA6B,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3C,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,oCAAA,EAAS,CAAC,CAAA,CAAE,CAAA;AAC5B,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AACxC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,EAAA,IAAM,UAAA,CAAW,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGnB,KAAAA,GAAO,CAAC,CAAC,CAAA,EAAG;AACpE,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,MAAA,EAAI,CAAC,CAAA,CAAA,EAAIF,IAAG,CAAA,EAAG,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA;AAAA,MACzC;AACA,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA;AAC/C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AACrC,MAAA,SAAA,CAAU,GAAA,EAAKE,OAAM,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,IAAI,CAAA,MAAA,EAAI,CAAC,KAAK,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG,SAAA,EAAW,OAAO,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AACrG,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AACvD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,MAAA,GAAS,GAAG,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AAC3C,MAAA,MAAM,YAAY,QAAA,CAAS,CAAC,CAAA,CAAE,MAAA,GAAS,OAAO,MAAA,GAAS,CAAA;AACvD,MAAA,SAAA,CAAU,GAAA,EAAKA,OAAM,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA,EAAGmB,KAAI,CAAA,EAAG,MAAM,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA,EAAK,GAAA,CAAI,OAAO,SAAS,CAAA,EAAG,WAAW,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AACjH,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,EAAG,SAAA,CAAU,GAAA,EAAKnB,KAAAA,EAAM,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,SACxD,GAAA,CAAI,KAAK,EAAE,CAAA;AAChB,IAAA,CAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AC3NA,IAAM,MAAMC,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,OAAA,IAAW,iBAAiB,CAAA;AACrD,IAAM,IAAA,GAAOD,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,aAAa,CAAA;AAElC,SAAS,kBAAkB,QAAA,EAA0B;AAC1D,EAAA,IAAI,CAAA,GAAI,SAAS,IAAA,EAAK;AACtB,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,MAAO,SAAA,GAAY,CAAA;AAC9C,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAC7B;AAEO,SAAS,eAAA,GAAmC;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMG,GAAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,YAAY,EAAC;AAC3C,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AAAA,EACzB;AACF;AAEO,SAAS,cAAc,QAAA,EAA6C;AACzE,EAAA,MAAM,QAAQ,eAAA,EAAgB;AAC9B,EAAA,OAAO,KAAA,CAAM,SAAA,CAAU,iBAAA,CAAkB,QAAQ,CAAC,CAAA,IAAK,IAAA;AACzD;AAEO,SAAS,cAAA,CACd,IAAA,EACA,OAAA,GAAuC,EAAC,EAClC;AACN,EAAA,MAAM,QAAQ,eAAA,EAAgB;AAC9B,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA;AAChD,EAAA,KAAA,CAAM,UAAU,QAAQ,CAAA,GAAI,EAAE,GAAG,MAAM,QAAA,EAAS;AAChD,EAAA,IAAI,OAAA,CAAQ,iBAAiB,IAAA,EAAM;AACjC,IAAA,KAAA,CAAM,gBAAA,GAAmB,QAAA;AAAA,EAC3B;AACA,EAAAA,IAAG,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAErC,EAAAA,GAAAA,CAAG,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACtE,EAAA,IAAI;AACF,IAAAA,GAAAA,CAAG,SAAA,CAAU,IAAA,EAAM,GAAK,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGO,SAAS,iBAAiB,QAAA,EAAwB;AACvD,EAAA,MAAM,QAAQ,eAAA,EAAgB;AAC9B,EAAA,OAAO,KAAA,CAAM,SAAA,CAAU,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AAClD,EAAAA,IAAG,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACrC,EAAAA,GAAAA,CAAG,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACtE,EAAA,IAAI;AACF,IAAAA,GAAAA,CAAG,SAAA,CAAU,IAAA,EAAM,GAAK,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,SAAS,eAAA,GAAiC;AAC/C,EAAA,OAAO,eAAA,GAAkB,gBAAA,IAAoB,IAAA;AAC/C;AAEO,SAAS,oBAAoB,QAAA,EAAwB;AAC1D,EAAA,MAAM,QAAQ,eAAA,EAAgB;AAC9B,EAAA,KAAA,CAAM,gBAAA,GAAmB,kBAAkB,QAAQ,CAAA;AACnD,EAAAA,IAAG,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACrC,EAAAA,GAAAA,CAAG,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACtE,EAAA,IAAI;AACF,IAAAA,GAAAA,CAAG,SAAA,CAAU,IAAA,EAAM,GAAK,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;ACrEA,IAAM,CAAA,GAAI;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AASA,eAAsB,YAAY,QAAA,EAAmC;AACnE,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,sBAAA,CAAA,EAA0B,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AACjF,EAAA,IAAI,CAAC,MAAM,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,qDAAA,EAAwD,KAAA,CAAM,MAAM,CAAA,8BAAA,CAAgC,CAAA;AACnI,EAAA,MAAM,IAAA,GAAQ,MAAM,KAAA,CAAM,IAAA,EAAK;AAG/B,EAAAgB,MAAA,CAAO,MAAM,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,2DAAA,EAA8D,EAAE,KAAK;AAAA,CAAI,CAAA;AAC9F,EAAAA,MAAA,CAAO,KAAA,CAAM;AAAA,EAAA,EAAO,EAAE,IAAI,CAAA,EAAG,KAAK,UAAU,CAAA,EAAG,EAAE,KAAK;;AAAA,CAAM,CAAA;AAC5D,EAAAA,MAAA,CAAO,MAAM,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,wDAAA,EAAsD,EAAE,KAAK;AAAA,CAAI,CAAA;AACtF,EAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,EAAI,GAAA,CAAK,IAAA,CAAK,cAAc,GAAA,IAAO,GAAA;AACzD,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,QAAA,IAAY,CAAC,CAAA,GAAI,GAAA;AACnD,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,QAAQ,CAAC,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AACvD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,IAAI,MAAA,KAAW,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAC9E,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC/C,IAAA,IAAI,KAAK,MAAA,KAAW,UAAA,IAAc,IAAA,CAAK,KAAA,SAAc,IAAA,CAAK,KAAA;AAC1D,IAAA,IAAI,KAAK,MAAA,KAAW,QAAA,EAAU,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACpF;AACA,EAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AACtE;AAGO,SAAS,QAAQ,GAAA,EAAmB;AACzC,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,EAAA,MAAM,MAAM,QAAA,KAAa,QAAA,GAAW,MAAA,GAAS,QAAA,KAAa,UAAU,KAAA,GAAQ,UAAA;AAC5E,EAAA,MAAM,IAAA,GAAO,QAAA,KAAa,OAAA,GAAU,CAAC,IAAA,EAAM,SAAS,EAAA,EAAI,GAAG,CAAA,GAAI,CAAC,GAAG,CAAA;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQX,MAAM,GAAA,EAAK,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,CAAA;AAClE,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EACd,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;ACrDO,IAAM,QAAA,GAAW,qBAAA;AAIjB,IAAM,iBAAA,GAAoB;AAAA,EAC/B,QAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAA;AAGO,IAAM,mBAAA,GAAsB,6BAAA;AAG5B,SAAS,WAAA,GAAsB;AACpC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAML,GAAAA,CAAG,YAAA,CAAa,IAAI,GAAA,CAAI,iBAAA,EAAmB,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,EAAG,MAAM,CAAC,CAAA;AAC3F,IAAA,OAAO,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,EAAA;AAAA,EACzD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAGO,SAAS,YAAY,IAAA,EAAuB;AACjD,EAAA,OACE,IAAA,KAAS,WAAA,IACT,IAAA,KAAS,WAAA,IACT,IAAA,KAAS,SACT,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACtB,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,IAC1B,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IACjB,aAAA,CAAc,KAAK,IAAI,CAAA,IACvB,4BAAA,CAA6B,IAAA,CAAK,IAAI,CAAA;AAE1C;AAWO,SAAS,yBAAyB,QAAA,EAA2B;AAClE,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA,CAAE,QAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,SAAS,UAAA,CAAW,QAAQ,KAAK,CAAC,WAAA,CAAY,IAAI,CAAA,EAAG,OAAO,KAAA;AAEjE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AACjD,EAAA,OAAA,CAAQ,WAAA,IAAe,CAAC,OAAA,EAAA,GAA4B,IAAA,KAAoB;AACtE,IAAA,MAAM,MAAM,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,SAAS,OAAA,IAAW,EAAA;AACxE,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,8BAA8B,CAAA,EAAG;AAClD,IAAA,OAAQ,QAAA,CAAuC,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EACjE,CAAA,CAAA;AACA,EAAA,OAAA,CAAQ,IAAI,4BAAA,GAA+B,GAAA;AAC3C,EAAA,OAAO,IAAA;AACT;AC9CA,IAAM,MAAM,MAAMH,KAAAA,CAAK,KAAKC,GAAAA,CAAG,OAAA,IAAW,iBAAiB,CAAA;AAC3D,IAAM,OAAO,MAAMD,KAAAA,CAAK,IAAA,CAAK,GAAA,IAAO,cAAc,CAAA;AAe3C,SAAS,mBAAA,GAAuC;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAMG,GAAAA,CAAG,aAAa,IAAA,EAAK,EAAG,MAAM,CAAC,CAAA;AACzD,IAAA,IAAI,OAAO,MAAA,CAAO,UAAA,KAAe,YAAY,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AAIzE,MAAA,OAAO,EAAE,YAAY,MAAA,CAAO,UAAA,EAAY,YAAY,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,GAAA,EAAI,EAAE;AAAA,IACtF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,QAAA,GAA4B;AAAA,IAChC,UAAA,EAAYM,OAAO,UAAA,EAAW;AAAA,IAC9B,UAAA,EAAY,KAAK,GAAA;AAAI,GACvB;AACA,EAAA,mBAAA,CAAoB,QAAQ,CAAA;AAC5B,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,oBAAoB,QAAA,EAAiC;AACnE,EAAAN,IAAG,SAAA,CAAU,GAAA,IAAO,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,EAAAA,GAAAA,CAAG,aAAA,CAAc,IAAA,EAAK,EAAG,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,KAAO,CAAA;AAC7E;AAGO,SAAS,eAAe,QAAA,EAAmC;AAChE,EAAA,OAAO,CAAA,OAAA,EAAU,SAAS,UAAU,CAAA,CAAA;AACtC;AAGO,SAAS,oBAAoB,QAAA,EAAmC;AACrE,EAAA,OAAO,CAAA,IAAA,EAAO,QAAA,CAAS,UAAU,CAAA,CAAA,EAAIM,MAAAA,CAAO,YAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAC5E;AAGO,SAAS,4BAA4B,QAAA,EAAoD;AAC9F,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,IAAA;AACzC,EAAA,OAAO,QAAA,CAAS,WAAW,SAAS,CAAA,GAAI,SAAS,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,GAAI,IAAA;AAC7E;ACxDA,IAAM,UAAA,GAAa,uBAAA;AAInB,IAAM,UAAA,GAAa,MAAA;AASnB,IAAM,WAAA,GAAc,OAAA;AAIb,IAAM,0BAA0B,EAAA,GAAK,GAAA;AA4CrC,SAAS,WAAW,SAAA,EAA2B;AACpD,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,SAAS,CAAA,CAAA;AAClC;AAEA,SAAS,WAAW,SAAA,EAA2B;AAC7C,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,SAAS,GAAG,UAAU,CAAA,CAAA;AAC/C;AAEA,SAAS,QAAQ,SAAA,EAA2B;AAC1C,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,SAAS,GAAG,WAAW,CAAA,CAAA;AAChD;AAKO,SAAS,mBAAmB,MAAA,EAIxB;AACT,EAAA,OAAQ,MAAA,CAAO,IAAA,EAAM,IAAA,EAAK,IAAK,EAAA,KAAQ,OAAO,QAAA,IAAY,EAAA,CAAA,KAAQ,MAAA,CAAO,EAAA,IAAM,EAAA,CAAA,IAAO,SAAA;AACxF;AAGA,eAAsB,cAAA,CAAe,KAAgB,SAAA,EAA2C;AAC9F,EAAA,MAAM,IAAI,MAAM,GAAA,CAAI,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAC,CAAA;AAChD,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,MAAK,GAAI,CAAA,CAAE,MAAK,GAAI,IAAA;AACxD;AAQA,eAAsB,cAAA,CAAe,GAAA,EAAgB,SAAA,EAAmB,IAAA,EAA6B;AACnG,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,MAAM,IAAI,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG,WAAW,IAAI,CAAA;AACzD;AAEA,SAAS,mBAAmB,KAAA,EAAsC;AAChE,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,IAAA;AACxE,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,OAAO,EAAE,EAAA,KAAO,QAAA,IAAY,EAAE,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,IAAA;AAC1D,EAAA,OAAO;AAAA,IACL,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,IAAA,EAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAE,EAAE,CAAA;AAAA,IAC/E,UAAU,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,EAAE,QAAA,GAAW,EAAA;AAAA,IACxD,UAAU,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,EAAE,QAAA,GAAW,EAAA;AAAA,IACxD,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,EAAA;AAAA,IAC5C,SAAS,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,MAAA;AAAA,IACrD,MAAA,EACE,CAAA,CAAE,MAAA,IAAU,OAAO,EAAE,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,GAC9D,EAAE,MAAA,GACH,IAAA;AAAA,IACN,QAAA,EACE,CAAA,CAAE,QAAA,IAAY,OAAO,EAAE,QAAA,KAAa,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,CAAA,CAAE,QAAQ,CAAA,GACpE,CAAA,CAAE,WACH,EAAC;AAAA,IACP,YAAY,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,GAAW,EAAE,UAAA,GAAa,CAAA;AAAA,IAC9D,YAAY,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,GAAW,EAAE,UAAA,GAAa;AAAA,GAChE;AACF;AAIA,eAAe,cAAA,CAAe,KAAgB,SAAA,EAAkD;AAC9F,EAAA,OAAO,mBAAmB,MAAM,GAAA,CAAI,UAAU,UAAA,CAAW,SAAS,CAAC,CAAC,CAAA;AACtE;AAOA,eAAsB,aAAa,GAAA,EAA0C;AAC3E,EAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA;AAC/C,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,WAAW,MAAM,CAAA;AAC1C,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,YAAY,MAAM,CAAA;AAC5C,MAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,EAAE,KAAA,CAAM,IAAA,EAAK,EAAG,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA;AAC/E,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,CAAA,CAAE,KAAK,CAAA;AACtC,IAAA,IAAI,GAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,EAC3B;AACA,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACjC,IAAA,IAAI,QAAA,MAAc,IAAA,GAAO,QAAA;AAAA,EAC3B;AACA,EAAA,OAAO,OAAA;AACT;AAGA,eAAsB,WAAA,CAAY,KAAgB,SAAA,EAAkD;AAClG,EAAA,MAAM,GAAA,GAAM,MAAM,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA;AAC/C,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA;AACpD,EAAA,IAAI,QAAA,MAAc,IAAA,GAAO,QAAA;AACzB,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,YAAA,CAAa,MAAA,EAAuB,GAAA,GAAM,IAAA,CAAK,KAAI,EAAY;AAC7E,EAAA,OAAO,CAAC,CAAC,MAAA,CAAO,UAAU,GAAA,GAAM,MAAA,CAAO,OAAO,YAAA,GAAe,uBAAA;AAC/D;AAKA,SAAS,UAAU,QAAA,EAA0C;AAC3D,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,OAAO;AAAA,IACL,IAAI,QAAA,CAAS,UAAA;AAAA,IACb,IAAA,EAAMR,IAAG,QAAA,EAAS;AAAA,IAClB,QAAA,EAAUA,IAAG,QAAA,EAAS;AAAA,IACtB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAA,EAAS,aAAY,IAAK,MAAA;AAAA,IAC1B,MAAA,EAAQ,IAAA;AAAA,IACR,UAAU,EAAC;AAAA,IACX,UAAA,EAAY,GAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AACF;AAOA,eAAsB,sBAAA,CACpB,GAAA,EACA,QAAA,EACA,MAAA,EACwB;AAIxB,EAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,GAAA,EAAK,SAAS,UAAU,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,QAAA,IAAY,SAAA,CAAU,QAAQ,CAAA;AAG7C,EAAA,MAAA,CAAO,QAAA,GAAWA,IAAG,QAAA,EAAS;AAC9B,EAAA,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC1B,EAAA,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA;AACtB,EAAA,MAAA,CAAO,OAAA,GAAU,WAAA,EAAY,IAAK,MAAA,CAAO,OAAA;AACzC,EAAA,MAAA,GAAS,MAAM,CAAA;AACf,EAAA,MAAA,CAAO,UAAA,GAAa,KAAK,GAAA,EAAI;AAC7B,EAAA,MAAM,IAAI,SAAA,CAAU,UAAA,CAAW,QAAA,CAAS,UAAU,GAAG,MAAM,CAAA;AAC3D,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,kBAAkB,UAAA,EAAmC;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,aAAa,KAAA,EAAO,CAAC,MAAM,UAAA,EAAY,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAA,EAAG;AAAA,MACjF,QAAA,EAAU,MAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAQ;AAAA,KACnC,EAAE,IAAA,EAAK;AACR,IAAA,OAAO,GAAA,IAAO,IAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGA,eAAsB,eAAA,CACpB,GAAA,EACA,QAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,UAAA,GAAa,kBAAkB,UAAU,CAAA;AAC/C,EAAA,MAAM,sBAAA,CAAuB,GAAA,EAAK,QAAA,EAAU,CAAC,MAAA,KAAW;AACtD,IAAA,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,GAAI;AAAA,MAC5B,IAAA,EAAM,WAAW,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,EAAI,IAAK,UAAA;AAAA,MACrD,YAAA,EAAc,KAAK,GAAA,EAAI;AAAA,MACvB;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAGA,eAAsB,iBAAA,CACpB,GAAA,EACA,QAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,sBAAA,CAAuB,GAAA,EAAK,QAAA,EAAU,CAAC,MAAA,KAAW;AACtD,IAAA,OAAO,MAAA,CAAO,SAAS,UAAU,CAAA;AAAA,EACnC,CAAC,CAAA;AACH;AAGA,eAAsB,WAAA,CACpB,GAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,sBAAA,CAAuB,GAAA,EAAK,QAAA,EAAU,CAAC,MAAA,KAAW;AACtD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAA,CAAO,MAAA,GAAS;AAAA,MACd,OAAA;AAAA,MACA,YAAA,EAAc,MAAA,CAAO,MAAA,EAAQ,YAAA,IAAgB,GAAA;AAAA,MAC7C,YAAA,EAAc,GAAA;AAAA,MACd,KAAK,OAAA,CAAQ;AAAA,KACf;AAAA,EACF,CAAC,CAAA;AACH;AAGA,eAAsB,WAAA,CAAY,KAAgB,QAAA,EAA0C;AAC1F,EAAA,MAAM,sBAAA,CAAuB,GAAA,EAAK,QAAA,EAAU,CAAC,MAAA,KAAW;AACtD,IAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAAA,EAClB,CAAC,CAAA;AACH;AAQA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,EAAC;AACnC,EAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IACX,CAACS,EAAAA,KACC,CAAC,CAACA,MACF,OAAOA,EAAAA,KAAM,QAAA,IACb,OAAQA,EAAAA,CAAqB,EAAA,KAAO,QAAA,IACpC,OAAQA,GAAqB,IAAA,KAAS;AAAA,GAC1C;AACF;AAGA,eAAsB,qBAAA,CACpB,GAAA,EACA,SAAA,EACA,IAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,WAAW,SAAS,CAAA;AAChC,EAAA,MAAM,QAAQ,aAAA,CAAc,MAAM,GAAA,CAAI,SAAA,CAAU,GAAG,CAAC,CAAA;AACpD,EAAA,MAAM,GAAA,GAAsB;AAAA,IAC1B,IAAID,MAAAA,CAAO,WAAA,CAAY,CAAC,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,IACxC,IAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA,EAAc,KAAK,GAAA;AAAI,GACzB;AACA,EAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,EAAA,MAAM,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAC9B,EAAA,OAAO,GAAA,CAAI,EAAA;AACb;AAGA,eAAsB,mBAAA,CACpB,KACA,SAAA,EAC2B;AAC3B,EAAA,OAAO,cAAc,MAAM,GAAA,CAAI,UAAU,UAAA,CAAW,SAAS,CAAC,CAAC,CAAA;AACjE;AAGA,eAAsB,oBAAA,CACpB,GAAA,EACA,SAAA,EACA,UAAA,EACe;AACf,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC7B,EAAA,MAAM,GAAA,GAAM,WAAW,SAAS,CAAA;AAChC,EAAA,MAAM,YAAY,aAAA,CAAc,MAAM,IAAI,SAAA,CAAU,GAAG,CAAC,CAAA,CAAE,MAAA;AAAA,IACxD,CAACC,EAAAA,KAAM,CAAC,UAAA,CAAW,QAAA,CAASA,GAAE,EAAE;AAAA,GAClC;AACA,EAAA,MAAM,IAAI,SAAA,CAAU,GAAA,EAAK,SAAA,CAAU,MAAA,GAAS,YAAY,IAAI,CAAA;AAC9D;AAQA,eAAsB,mBAAA,CACpB,GAAA,EACA,QAAA,EACA,GAAA,EACiB;AACjB,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,aAAA,EAAe;AAClB,MAAA,MAAMV,MAAAA,GAAO,OAAO,GAAA,CAAI,IAAA,EAAM,SAAS,QAAA,GAAW,GAAA,CAAI,KAAK,IAAA,GAAO,EAAA;AAClE,MAAA,IAAI,CAACA,QAAM,OAAO,gCAAA;AAClB,MAAA,MAAM,eAAA,CAAgB,GAAA,EAAK,QAAA,EAAUA,MAAI,CAAA;AACzC,MAAA,OAAO,iBAAiBA,MAAI,CAAA,CAAA;AAAA,IAC9B;AAAA,IACA,KAAK,gBAAA,EAAkB;AACrB,MAAA,MAAMA,MAAAA,GAAO,OAAO,GAAA,CAAI,IAAA,EAAM,SAAS,QAAA,GAAW,GAAA,CAAI,KAAK,IAAA,GAAO,EAAA;AAClE,MAAA,IAAI,CAACA,QAAM,OAAO,mCAAA;AAClB,MAAA,MAAM,iBAAA,CAAkB,GAAA,EAAK,QAAA,EAAUA,MAAI,CAAA;AAC3C,MAAA,OAAO,mBAAmBA,MAAI,CAAA,CAAA;AAAA,IAChC;AAAA,IACA,KAAK,QAAA;AAGH,MAAA,OAAO,kBAAA;AAAA,IACT;AACE,MAAA,OAAO,CAAA,gBAAA,EAAoB,IAAuB,IAAI,CAAA,CAAA;AAAA;AAE5D;;;AC3XO,IAAM,oBAAA,GAAuB,kBAAA;AAC7B,IAAM,qBAAA,GAAwB,mBAAA;AAmB9B,SAAS,qBAAqB,KAAA,EAA0C;AAC7E,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,IAAA;AACxE,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,OAAO,EAAE,YAAA,KAAiB,QAAA,IAAY,OAAO,CAAA,CAAE,IAAA,KAAS,UAAU,OAAO,IAAA;AAC7E,EAAA,OAAO;AAAA,IACL,cAAc,CAAA,CAAE,YAAA;AAAA,IAChB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,SAAS,OAAO,CAAA,CAAE,YAAY,QAAA,GAAW,CAAA,CAAE,UAAU,CAAA,CAAE,IAAA;AAAA,IACvD,YAAY,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,GAAW,EAAE,UAAA,GAAa,IAAA;AAAA,IAC9D,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,CAAA;AAAA,IAC5C,SAAS,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,EAAA;AAAA,IACrD,cAAc,OAAO,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAW,EAAE,YAAA,GAAe;AAAA,GACtE;AACF;AAEO,SAAS,sBAAsB,KAAA,EAA2C;AAC/E,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,IAAA;AACxE,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,OAAO,EAAE,YAAA,KAAiB,QAAA,IAAY,OAAO,CAAA,CAAE,MAAA,KAAW,UAAU,OAAO,IAAA;AAC/E,EAAA,IAAI,CAAC,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,aAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,OAAO,IAAA;AAC3E,EAAA,OAAO;AAAA,IACL,cAAc,CAAA,CAAE,YAAA;AAAA,IAChB,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,QAAQ,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,GAAS,MAAA;AAAA,IAClD,YAAY,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,GAAW,EAAE,UAAA,GAAa;AAAA,GAChE;AACF;AAGA,eAAsB,qBAAA,CACpB,GAAA,EACA,QAAA,EACA,QAAA,EACe;AACf,EAAA,MAAM,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,qBAAA,EAAuB,QAAQ,CAAA;AAC3D;AAOA,eAAsB,sBACpB,GAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,GAAmD,EAAC,EAChB;AACpC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,GAAA;AACjC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AACtD,EAAA,MAAM,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,oBAAA,EAAsB,OAAO,CAAA;AACvD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,MAAM,CAAC,CAAA;AAC9C,MAAA,MAAM,WAAW,qBAAA,CAAsB,MAAM,IAAI,KAAA,CAAM,QAAA,EAAU,qBAAqB,CAAC,CAAA;AACvF,MAAA,IAAI,QAAA,IAAY,QAAA,CAAS,YAAA,KAAiB,OAAA,CAAQ,YAAA,EAAc;AAC9D,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,EAAU,sBAAsB,IAAI,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACpE,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,EAAU,uBAAuB,IAAI,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACvE;AACF;ACxEA,IAAM,QAAA,GAAW,sBAAA;AACjB,IAAM,YAAA,GAAe,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA;AAG/E,IAAM,aAAA,GAAgB,4BAAA;AACtB,IAAM,UAAA,GAAa,mBAAA;AAEnB,IAAM,UAAA,GAAa,kBAAA;AACnB,IAAM,YAAA,GAAe,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,CAAA;AAGtC,IAAM,gBAAA,GAAmB,GAAA;AAIzB,IAAM,gBAAA,GAAmB,KAAK,EAAA,GAAK,GAAA;AAiCnC,SAAS,QAAA,GAAmB;AAC1B,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAQ,EAAG,aAAa,CAAA;AAC3C;AAEA,SAAS,SAAA,GAAoB;AAC3B,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,QAAA,EAAS,EAAG,UAAU,CAAA;AACzC;AAEA,SAAS,SAAA,GAA+B;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMG,GAAAA,CAAG,YAAA,CAAa,SAAA,IAAa,OAAO,CAAA;AAChD,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,MAAA,EAAsB;AACxC,EAAA,IAAI;AACF,IAAA,MAAMI,OAAM,QAAA,EAAS;AACrB,IAAA,IAAI,CAACJ,GAAAA,CAAG,UAAA,CAAWI,IAAG,CAAA,EAAGJ,GAAAA,CAAG,SAAA,CAAUI,IAAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC9D,IAAAJ,GAAAA,CAAG,aAAA,CAAc,SAAA,EAAU,EAAG,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,CAAC,CAAA;AAAA,EACjF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,SAAS,mBAAA,CAAoBI,IAAAA,GAAM,QAAA,EAAS,EAA2B;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMJ,IAAG,YAAA,CAAaH,KAAAA,CAAK,KAAKO,IAAAA,EAAK,UAAU,GAAG,OAAO,CAAA;AAC/D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,OAAO,OAAO,KAAA,EAAO,OAAA,KAAY,QAAA,GAAW,KAAA,GAAQ,IAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,oBAAA,CAAqB,KAAA,EAAwBA,IAAAA,GAAM,QAAA,EAAS,EAAS;AACnF,EAAA,IAAI;AACF,IAAA,IAAI,CAACJ,GAAAA,CAAG,UAAA,CAAWI,IAAG,CAAA,EAAGJ,GAAAA,CAAG,SAAA,CAAUI,IAAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC9D,IAAAJ,GAAAA,CAAG,aAAA,CAAcH,KAAAA,CAAK,IAAA,CAAKO,IAAAA,EAAK,UAAU,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACpE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,SAAS,oBAAA,CAAqBA,IAAAA,GAAM,QAAA,EAAS,EAAS;AAC3D,EAAA,IAAI;AACF,IAAAJ,IAAG,UAAA,CAAWH,KAAAA,CAAK,IAAA,CAAKO,IAAAA,EAAK,UAAU,CAAC,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAaO,SAAS,oBAAA,CACd,WAAmB,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,EAChD,GAAA,GAA0C,QAAQ,GAAA,EAC3B;AAGvB,EAAA,MAAM,OAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7C,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,mCAAmC,GAAG,OAAO,IAAA;AAEhE,EAAA,MAAM,QAAA,GAAA,CAAY,IAAI,SAAA,IAAa,EAAA,EAAI,MAAM,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9D,EAAA,IAAI,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,QAAQ,GAAG,OAAO,MAAA;AAClD,EAAA,IAAI,IAAA,CAAK,SAAS,SAAS,CAAA,IAAK,mBAAmB,IAAA,CAAK,IAAI,GAAG,OAAO,MAAA;AACtE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,KAAA;AACpC,EAAA,IAAI,IAAA,CAAK,SAAS,gBAAgB,CAAA,IAAK,KAAK,QAAA,CAAS,SAAS,GAAG,OAAO,MAAA;AACxE,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,cAAc,EAAA,EAAsE;AAClG,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,CAAC,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,OAAA,CAAS,CAAA,EAAG,OAAA,EAAS,CAAA,YAAA,EAAe,QAAQ,CAAA,OAAA,CAAA,EAAU;AAAA,IAC7G,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,CAAC,QAAA,EAAU,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,OAAA,CAAS,CAAA,EAAG,OAAA,EAAS,CAAA,gBAAA,EAAmB,QAAQ,CAAA,OAAA,CAAA,EAAU;AAAA,IACrH,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,CAAC,KAAA,EAAO,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,OAAA,CAAS,CAAA,EAAG,OAAA,EAAS,CAAA,WAAA,EAAc,QAAQ,CAAA,OAAA,CAAA,EAAU;AAAA,IAC3G;AACE,MAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,OAAA,CAAS,CAAA,EAAG,OAAA,EAAS,CAAA,SAAA,EAAY,QAAQ,CAAA,OAAA,CAAA,EAAU;AAAA;AAE3G;AAWO,SAAS,gBAAA,CACd,MACA,IAAA,EAMoB;AACpB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA;AAChC,EAAA,IAAI,GAAA,CAAI,8BAA8B,OAAO,UAAA;AAC7C,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,cAAA;AAErB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,IAAI,KAAA,IAAS,KAAA,CAAM,OAAA,KAAY,IAAA,CAAK,MAAA,EAAQ;AAC1C,IAAA,IAAI,KAAA,CAAM,aAAa,IAAA,EAAM;AAC3B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,GAAA,EAAI;AACjC,MAAA,OAAO,GAAA,GAAM,KAAA,CAAM,SAAA,GAAY,gBAAA,GAAmB,WAAA,GAAc,OAAA;AAAA,IAClE;AAIA,IAAA,OAAO,KAAA,CAAM,QAAA,KAAa,CAAA,GAAI,eAAA,GAAkB,gBAAA;AAAA,EAClD;AACA,EAAA,OAAO,OAAA;AACT;AAQO,SAAS,qBAAA,CACd,MAAA,EACA,EAAA,EACAA,IAAAA,GAAM,UAAS,EACN;AACT,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,oBAAA,CAAqB,EAAE,OAAA,EAAS,MAAA,EAAQ,WAAW,QAAA,EAAU,IAAA,IAAQA,IAAG,CAAA;AACxE,EAAA,MAAM,SAAA,GAAYP,KAAAA,CAAK,IAAA,CAAKO,IAAAA,EAAK,UAAU,CAAA;AAC3C,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,cAAc,EAAE,CAAA;AAItC,EAAA,MAAM,MAAA,GACJ,iFACwB,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,gIAE/C,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA,yBAAA,EAA4B,KAAK,SAAA,CAAU,MAAM,CAAC,CAAA,WAAA,EAAc,SAAS,CAAA,yEAAA,CAAA;AACxH,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQC,KAAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,CAAC,IAAA,EAAM,MAAM,CAAA,EAAG,EAAE,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,UAAU,CAAA;AACzF,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,oBAAA,CAAqB,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,EAAE,EAAGD,IAAG,CAAA;AAC9F,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,oBAAA,CAAqB,cAAA,EAAwBA,IAAAA,GAAM,QAAA,EAAS,EAA2B;AACrG,EAAA,MAAM,KAAA,GAAQ,oBAAoBA,IAAG,CAAA;AACrC,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,OAAA,KAAY,gBAAgB,OAAO,IAAA;AACvD,EAAA,oBAAA,CAAqBA,IAAG,CAAA;AACxB,EAAA,OAAO,KAAA,CAAM,QAAA,KAAa,CAAA,GAAI,KAAA,GAAQ,IAAA;AACxC;AAIA,eAAe,YAAY,cAAA,EAAgD;AACzE,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,gBAAgB,CAAA;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,YAAA,EAAc;AAAA,MACpC,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,0EAAA;AAAA,QACR,YAAA,EAAc,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,cAAc,CAAA;AAAA;AAC7C,KACD,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,IAAA,OAAO,IAAA,CAAK,WAAW,CAAA,EAAG,MAAA,IAAU,IAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,OAAO,CAAA;AAAA,EACtB;AACF;AAqBO,SAAS,cAAA,CAAe,WAAmB,OAAA,EAA0B;AAC1E,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAc;AAC3B,IAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK,CAAE,QAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,KAAA,CAAM,iCAAiC,CAAA;AAC5E,IAAA,OAAO,CAAA,GAAI,EAAE,IAAA,EAAM,CAAC,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,EAAG,GAAA,EAAK,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA,EAAK,GAAI,IAAA;AAAA,EACvF,CAAA;AACA,EAAA,MAAM,CAAA,GAAI,MAAM,SAAS,CAAA;AACzB,EAAA,MAAM,CAAA,GAAI,MAAM,OAAO,CAAA;AACvB,EAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,OAAO,KAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,EAAE,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,CAAA,CAAE,GAAA,KAAQ,IAAA,IAAQ,CAAA,CAAE,GAAA,KAAQ,IAAA;AACrC;AAEA,eAAsB,eAAe,cAAA,EAAoD;AACvF,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAG5B,EAAA,IAAI,QAAQ,GAAA,CAAI,kBAAA,IAAsB,OAAA,CAAQ,GAAA,CAAI,IAAI,OAAO,IAAA;AAG7D,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,IAAI,UAAU,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,YAAY,YAAA,EAAc;AAC1D,IAAA,OAAO,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,cAAc,CAAA,GAC/C,EAAE,OAAA,EAAS,cAAA,EAAgB,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,GACjD,IAAA;AAAA,EACN;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,UAAA,CAAW,MAAM,CAAA;AACjB,EAAA,OAAO,cAAA,CAAe,QAAQ,cAAc,CAAA,GAAI,EAAE,OAAA,EAAS,cAAA,EAAgB,QAAO,GAAI,IAAA;AACxF;AAMA,eAAsB,oBAAoB,cAAA,EAAoD;AAC5F,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAC5B,EAAA,IAAI,QAAQ,GAAA,CAAI,kBAAA,IAAsB,OAAA,CAAQ,GAAA,CAAI,IAAI,OAAO,IAAA;AAE7D,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,UAAA,CAAW,MAAM,CAAA;AACjB,EAAA,OAAO,cAAA,CAAe,QAAQ,cAAc,CAAA,GAAI,EAAE,OAAA,EAAS,cAAA,EAAgB,QAAO,GAAI,IAAA;AACxF;AAOO,SAAS,UAAU,EAAA,EAA8D;AACtF,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,cAAc,EAAE,CAAA;AACtC,IAAA,MAAM,KAAA,GAAQC,KAAAA,CAAM,GAAA,EAAK,IAAA,EAAM;AAAA,MAC7B,KAAA,EAAO,QAAQ,QAAA,KAAa,OAAA;AAAA,MAC5B,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,KACjC,CAAA;AACD,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,KAAA,CAAM,QAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAO,OAAO,CAAE,CAAA;AAC1C,IAAA,KAAA,CAAM,QAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAO,OAAO,CAAE,CAAA;AAC1C,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS,OAAA,CAAQ,EAAE,EAAA,EAAI,IAAA,KAAS,CAAA,EAAG,MAAA,EAAQ,GAAA,EAAK,CAAC,CAAA;AACpE,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ,OAAA,CAAQ,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,GAAG,CAAA,EAAG,CAAC,CAAA;AAAA,EACxE,CAAC,CAAA;AACH;;;AChTA,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,mBAAmB,CAAA,GAAI,GAAA;AAC7B,IAAM,eAAA,GAAkB,IAAI,EAAA,GAAK,GAAA;AACjC,IAAM,WAAW,EAAA,GAAK,GAAA;AACtB,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,aAAA,GAAgB,GAAA;AAEtB,IAAM,WAAWR,KAAAA,CAAK,IAAA,CAAKC,IAAG,OAAA,EAAQ,EAAG,mBAAmB,YAAY,CAAA;AAGjE,SAAS,UAAU,IAAA,EAAoB;AAC5C,EAAA,IAAI;AACF,IAAAE,GAAAA,CAAG,UAAUH,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACxD,IAAA,IAAI;AACF,MAAA,IAAIG,GAAAA,CAAG,QAAA,CAAS,QAAQ,CAAA,CAAE,OAAO,aAAA,EAAe;AAC9C,QAAAA,GAAAA,CAAG,UAAA,CAAW,QAAA,EAAU,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAM,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAAA,GAAAA,CAAG,cAAA,CAAe,QAAA,EAAU,CAAA,EAAA,iBAAG,IAAI,MAAK,EAAE,WAAA,EAAa,CAAA,CAAA,EAAI,IAAI;AAAA,CAAI,CAAA;AAAA,EACrE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,OAAO,CAAC,CAAA;AAClD,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACpC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,YAAA,EAAcF,GAAAA,CAAG,SAAS,CAAA;AAC/C;AASA,IAAM,eAAN,MAAmB;AAAA,EAQjB,YACE,GAAA,EACA,QAAA,EACA,WAAA,EACS,QAAA,EACA,YACA,SAAA,EACT;AAHS,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAET,IAAA,IAAA,CAAK,IAAA,GAAO,EAAE,KAAA,EAAO,CAAA,EAAG,WAAA,kBAAa,IAAI,GAAA,EAAI,EAAG,SAAA,kBAAW,IAAI,GAAA,EAAI,EAAE;AAErE,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,gBAAA,CAAiB;AAAA,MAClC,GAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA,EAAU;AAAA,QACR,QAAA,EAAU,eAAe,QAAQ,CAAA;AAAA,QACjC,UAAA,EAAY,WAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,KAAA,EAAO;AAAA,OACT;AAAA,MACA,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,CAAC,IAAA,KAAS,SAAA,CAAU,CAAA,CAAA,EAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,QACnE,QAAA,EAAU,CAAC,GAAA,EAAK,OAAA,KAAY;AAC1B,UAAA,IAAA,CAAK,QAAA,IAAY,UAAU,CAAA,GAAI,EAAA;AAC/B,UAAA,IAAI,IAAA,CAAK,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,QACzC,CAAA;AAAA,QACA,YAAA,EAAc,CAAC,KAAA,EAAO,OAAA,KAAY;AAChC,UAAA,IAAI,UAAU,cAAA,IAAkB,OAAA,KAAY,CAAA,IAAK,OAAA,GAAU,OAAO,CAAA,EAAG;AACnE,YAAA,SAAA,CAAU,CAAA,CAAA,EAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,SAAA,EAAY,KAAK,CAAA,EAAG,OAAA,GAAU,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,UAChG;AAAA,QACF,CAAA;AAAA,QACA,WAAA,EAAa,CAAC,OAAA,EAAS,KAAA,KAAU;AAC/B,UAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,UAAA,SAAA;AAAA,YACE,IAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,aAAA,EAAgB,OAAA,GAAU,OAAA,GAAU,SAAS,MAClE,KAAA,GAAQ,CAAA,SAAA,EAAY,MAAM,WAAA,IAAe,KAAA,CAAM,SAAS,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,WACnE;AAAA,QACF,CAAA;AAAA,QACA,cAAc,MAAM;AAKlB,UAAA,SAAA,CAAU,IAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,uEAAA,CAAoE,CAAA;AACtG,UAAA,IAAA,CAAK,YAAY,QAAQ,CAAA;AAAA,QAC3B,CAAA;AAAA;AAAA;AAAA;AAAA,QAIA,oBAAoB,YAAY;AAC9B,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAc,CAAE,MAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QACnD,CAAA;AAAA,QACA,eAAA,EAAiB,OAAO,GAAA,EAAK,OAAA,EAAS,aAAA,KAAkB;AACtD,UAAA,MAAM,OAAA,GAAU,cAAc,GAAG,CAAA;AACjC,UAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,IAAA,EAAM,SAAS,aAAA,EAAe,CAAC,CAAC,GAAA,CAAI,iBAAiB,CAAA;AAC/E,UAAA,IAAI,KAAA,KAAU,OAAA,EAAS,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAChD,UAAA,IAAI,CAAC,IAAI,UAAA,EAAY;AAEnB,YAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,gDAAA,EAAiD;AAAA,UACpF;AACA,UAAA,SAAA,CAAU,CAAA,CAAA,EAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,qBAAA,EAAwB,OAAO,CAAA,OAAA,EAAU,aAAa,CAAA,CAAA,CAAG,CAAA;AAC3F,UAAA,MAAM,QAAA,GAAW,MAAM,qBAAA,CAAsB,GAAA,EAAK,QAAA,EAAU;AAAA,YAC1D,cAAc,GAAA,CAAI,UAAA;AAAA,YAClB,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,OAAA;AAAA,YACA,YAAY,GAAA,CAAI,iBAAA;AAAA,YAChB,IAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,WAAA;AAAA,YACT,YAAA,EAAc,KAAK,GAAA;AAAI,WACxB,CAAA;AACD,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,2DAAA,EAA4D;AAAA,UAC/F;AACA,UAAA,IAAI,SAAS,MAAA,KAAW,QAAA,OAAe,IAAA,CAAK,WAAA,CAAY,IAAI,OAAO,CAAA;AACnE,UAAA,IAAI,SAAS,MAAA,KAAW,aAAA,OAAoB,IAAA,CAAK,SAAA,CAAU,IAAI,aAAa,CAAA;AAC5E,UAAA,IAAI,QAAA,CAAS,MAAA,KAAW,QAAA,IAAY,QAAA,CAAS,WAAW,aAAA,EAAe;AACrE,YAAA,aAAA,CAAc,GAAA,EAAK,QAAA,EAAU,IAAA,CAAK,IAAI,CAAA;AAAA,UACxC;AACA,UAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAA,EAAO;AAAA,QAC5D;AAAA;AACF,KACD,CAAA;AAGD,IAAA,KAAK,KAAK,OAAA,CAAQ,wBAAA,EAAyB,CAAE,IAAA,CAAK,CAAC,OAAA,KAAY;AAC7D,MAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,MAAA,CAAO,CAACmB,OAAM,CAACA,EAAAA,CAAE,EAAE,CAAA,EAAG;AAC5C,QAAA,SAAA,CAAU,CAAA,CAAA,EAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,OAAA,EAAU,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,MAC1E;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAvFW,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EAbF,OAAA;AAAA,EACQ,IAAA;AAAA,EACT,QAAA,GAAW,CAAA;AAAA,EACnB,OAAA,GAAU,KAAA;AAAA;AAAA,EAEV,SAAA;AAAA,EA+FA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACtB;AAAA,EAEA,IAAI,IAAA,GAAgB;AAClB,IAAA,OAAO,KAAK,QAAA,GAAW,CAAA;AAAA,EACzB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAc,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjD,IAAA,IAAA,CAAK,QAAQ,gBAAA,EAAiB;AAC9B,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,OAAA,EAAQ;AAAA,EACpC;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EACpB;AACF,CAAA;AAMA,eAAsB,SAAA,CAAU,OAAA,GAAyB,EAAC,EAAkB;AAC1E,EAAA,MAAM,WAAW,iBAAA,CAAkB,OAAA,CAAQ,QAAA,IAAY,eAAA,MAAqB,mBAAmB,CAAA;AAC/F,EAAA,wBAAA,CAAyB,QAAQ,CAAA;AACjC,EAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,EAAA,MAAM,WAAW,mBAAA,EAAoB;AACrC,EAAA,MAAM,SAAA,GAAY,CAAA,OAAA,EAAU,QAAA,CAAS,UAAU,CAAA,CAAA;AAE/C,EAAA,MAAM,IAAA,GAAO,cAAc,QAAQ,CAAA;AACnC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,wBAAwB,QAAQ,CAAA;AAAA;AAAA;AAAA,KAElC;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,QAAA,EAAU,KAAK,YAAY,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,cAAA,EAAe;AACvC,EAAA,IAAI,CAAC,MAAM,EAAA,EAAI;AACb,IAAA,SAAA,CAAU,CAAA,kCAAA,EAAqC,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAC7D,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAA,CAAM,MAAM;AAAA,CAAI,CAAA;AAC9D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAKA,EAAA,IAAI,WAAA,GACF,kBAAA,CAAoB,MAAM,WAAA,CAAY,GAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA,IAAM;AAAA,IACpF,QAAA,EAAUnB,IAAG,QAAA,EAAS;AAAA,IACtB,IAAI,QAAA,CAAS;AAAA,GACd,CAAA;AAEH,EAAA,MAAM,OAAA,GAAU,qBAAqB,OAAO,CAAA;AAC5C,EAAA,SAAA;AAAA,IACE,CAAA,wBAAA,EAAsB,OAAO,CAAA,EAAG,OAAA,GAAU,yBAAA,GAA4B,EAAE,CAAA,UAAA,EAAa,QAAA,CAAS,UAAU,CAAA,EAAA,EAAK,WAAW,CAAA,YAAA,EAAe,QAAQ,CAAA;AAAA,GACjJ;AAGA,EAAA,OAAA,CAAQ,EAAA,CAAG,mBAAA,EAAqB,CAAC,GAAA,KAAQ;AACvC,IAAA,SAAA,CAAU,CAAA,yBAAA,EAA4B,GAAA,EAAK,KAAA,IAAS,GAAG,CAAA,CAAE,CAAA;AACzD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AACD,EAAA,OAAA,CAAQ,EAAA,CAAG,oBAAA,EAAsB,CAAC,GAAA,KAAQ;AACxC,IAAA,SAAA,CAAU,CAAA,oBAAA,EAAuB,eAAe,KAAA,GAAQ,GAAA,CAAI,QAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EACnF,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAE9C,EAAA,MAAM,MAAA,GAAS,OAAO,QAAA,EAAkB,IAAA,EAAgB,YAAY,CAAA,KAAqB;AACvF,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,IAAA,MAAM,UAAA,GAAa,aAAa,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,OAAA,CAAQ,QAAQ,WAAA,EAAa;AAE/B,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAA,CAAQ,QAAQ,CAAA,CAChC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,IAAI,CAAA,CACrB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA,CAAE,CAAC,CAAA;AAC9C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAA,CAAO,IAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC9B,MAAA,SAAA,CAAU,YAAY,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,aAAA,CAAe,CAAA;AAAA,IAClE;AAGA,IAAA,IAAI;AACF,MAAAE,IAAG,SAAA,CAAU,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC9C,SAAS,CAAA,EAAG;AACV,MAAA,SAAA,CAAU,CAAA,2BAAA,EAA8B,UAAU,CAAA,EAAA,EAAK,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AACnG,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,GAAA,EAAK,QAAA,EAAU,WAAA,EAAa,QAAA,EAAU,UAAA,EAAY,SAAA,IAAa,IAAA,CAAK,GAAA,EAAK,CAAA;AACzG,IAAA,MAAA,CAAO,SAAA,GAAY,CAAC,EAAA,KAAO,MAAA,CAAO,EAAE,CAAA;AACpC,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,MAAM,CAAA;AAC5B,IAAA,SAAA,CAAU,CAAA,SAAA,EAAY,SAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,QAAA,EAAM,UAAU,CAAA,CAAE,CAAA;AAC5D,IAAA,MAAM,OAAO,KAAA,EAAM;AAEnB,IAAA,KAAK,gBAAgB,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAChE,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA2B;AACzC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAA,CAAO,IAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA;AACvB,IAAA,SAAA,CAAU,YAAY,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9C,CAAA;AAGA,EAAA,MAAM,QAAQ,YAA2B;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,MAAM,GAAA,CAAI,YAAY,iBAAA,EAAmB,CAAC,SAAS,CAAC,CAAA;AACpE,MAAA,MAAM,MAAA,GAAS,OAAA,CACZ,IAAA,CAAK,CAAC,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,UAAA,IAAc,CAAA,KAAM,EAAE,UAAA,IAAc,CAAA,CAAE,CAAA,CACxD,KAAA,CAAM,GAAG,WAAW,CAAA;AACvB,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,QAAA,MAAM,MAAA,CAAO,EAAE,EAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,UAAA,IAAc,KAAK,GAAI,CAAA;AAAA,MACvD;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,SAAA,CAAU,CAAA,cAAA,EAAiB,aAAa,KAAA,GAAQ,CAAA,CAAE,UAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACzE;AAAA,EACF,CAAA;AAIA,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,GAAA,EAAK;AAAA,IACnC,MAAA,EAAQ,MAAM,KAAK,KAAA,EAAM;AAAA,IACzB,eAAA,EAAiB,CAAC,CAAA,KAAM;AACtB,MAAA,IAAI,EAAE,IAAA,EAAM,QAAA,CAAS,SAAS,CAAA,OAAQ,MAAA,CAAO,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,QAAQ,EAAC,EAAA,CAAI,CAAA,CAAE,UAAA,IAAc,KAAK,GAAI,CAAA;AAAA,IAC7F,CAAA;AAAA,IACA,eAAA,EAAiB,CAAC,CAAA,KAAM;AACtB,MAAA,IAAI,CAAA,CAAE,UAAA,EAAY,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,WAAA,IACpB,EAAE,IAAA,EAAM,QAAA,CAAS,SAAS,CAAA,OAAQ,MAAA,CAAO,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,QAAQ,EAAC,EAAA,CAAI,CAAA,CAAE,UAAA,IAAc,KAAK,GAAI,CAAA;AAAA,IAClG,CAAA;AAAA,IACA,eAAA,EAAiB,CAAC,EAAA,KAAO,MAAA,CAAO,EAAE;AAAA,GACnC,CAAA;AACD,EAAA,MAAA,CAAO,OAAA,EAAQ;AACf,EAAA,MAAM,KAAA,EAAM;AAIZ,EAAA,MAAM,WAAA,CAAY,GAAA,EAAK,QAAA,EAAU,OAAO,CAAA,CAAE,KAAA;AAAA,IAAM,CAAC,CAAA,KAC/C,SAAA,CAAU,CAAA,kBAAA,EAAqB,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE;AAAA,GAC7E;AACA,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,KAAK,YAAY,GAAA,EAAK,QAAA,EAAU,OAAO,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAGvD,IAAA,KAAK,eAAe,GAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CACzC,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,MAAA,IAAI,GAAG,WAAA,GAAc,CAAA;AAAA,IACvB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnB,GAAG,YAAY,CAAA;AAMf,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,MAAA,EAAO,EAAG;AACrC,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAA,CAAO,MAAA,CAAO,SAAS,UAAU,CAAA;AACjC,QAAA,MAAA,CAAO,OAAO,OAAA,EAAQ;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,MAAA,CAAO,SAAS,YAAY,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,gBAAgB,CAAA;AAKnB,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,MAAM,eAAe,YAA2B;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,cAAA,CAAe,OAAO,CAAA;AACzC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,KAAK,oBAAA,EAAqB;AAChC,MAAA,MAAM,QAAA,GAAW,iBAAiB,IAAA,EAAM,EAAE,OAAO,mBAAA,EAAoB,EAAG,IAAI,CAAA;AAC5E,MAAA,IAAI,QAAA,KAAa,WAAW,EAAA,EAAI;AAC9B,QAAA,SAAA,CAAU,CAAA,yBAAA,EAA4B,IAAA,CAAK,MAAM,CAAA,kBAAA,CAAoB,CAAA;AACrE,QAAA,qBAAA,CAAsB,IAAA,CAAK,QAAQ,EAAE,CAAA;AAAA,MACvC;AACA,MAAA,MAAM,QAAQ,mBAAA,EAAoB;AAClC,MAAA,IAAI,SAAS,KAAA,CAAM,OAAA,KAAY,KAAK,MAAA,IAAU,KAAA,CAAM,aAAa,CAAA,EAAG;AAClE,QAAA,SAAA,CAAU,CAAA,cAAA,EAAiB,IAAA,CAAK,MAAM,CAAA,sCAAA,CAAmC,CAAA;AACzE,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AACA,EAAA,KAAK,YAAA,EAAa;AAClB,EAAA,MAAM,cAAc,WAAA,CAAY,MAAM,KAAK,YAAA,IAAgB,eAAe,CAAA;AAK1E,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,MAAM,gBAAgB,YAA2B;AAC/C,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,mBAAA,CAAoB,GAAA,EAAK,SAAS,UAAU,CAAA;AAC/D,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,MAAA,MAAMkB,WAAoB,EAAC;AAC3B,MAAA,IAAI,YAAA,GAAe,KAAA;AACnB,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,IAAI;AACF,UAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,YAAA,YAAA,GAAe,IAAA;AACf,YAAAA,QAAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACnB,YAAA;AAAA,UACF;AACA,UAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,GAAA,EAAK,UAAU,GAAG,CAAA;AAC3D,UAAA,SAAA,CAAU,CAAA,QAAA,EAAW,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AAC1C,UAAAA,QAAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,QACrB,SAAS,CAAA,EAAG;AACV,UAAA,SAAA,CAAU,CAAA,QAAA,EAAW,GAAA,CAAI,IAAI,CAAA,SAAA,EAAY,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AACrF,UAAAA,QAAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,QACrB;AAAA,MACF;AACA,MAAA,MAAM,qBAAqB,GAAA,EAAK,QAAA,CAAS,YAAYA,QAAO,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAK5E,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,KAAK,oBAAA,EAAqB;AAChC,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,SAAA,CAAU,4EAAuE,CAAA;AAAA,QACnF,CAAA,MAAA,IAAW,CAAC,CAAC,GAAG,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,EAAG;AACrD,UAAA,SAAA,CAAU,CAAA,uBAAA,EAA0B,EAAE,CAAA,YAAA,CAAc,CAAA;AACpD,UAAA,MAAM,EAAE,EAAA,EAAI,MAAA,EAAAF,SAAO,GAAI,MAAM,UAAU,EAAE,CAAA;AACzC,UAAA,SAAA,CAAU,iBAAiB,EAAA,GAAK,WAAA,GAAc,QAAQ,CAAA,EAAA,EAAKA,QAAO,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,EAAE,KAAA,CAAM,CAAA,CAAE,EAAE,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAC5G,UAAA,IAAI,EAAA,EAAI;AACN,YAAA,SAAA,CAAU,uCAAuC,CAAA;AACjD,YAAA,QAAA,CAAS,CAAC,CAAA;AAAA,UACZ;AAAA,QACF,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,6DAAwD,CAAA;AAGlE,UAAA,KAAK,YAAA,EAAa;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,QAAA,GAAW,KAAA;AAAA,IACb;AAAA,EACF,CAAA;AACA,EAAA,KAAK,aAAA,EAAc;AACnB,EAAA,MAAM,eAAe,WAAA,CAAY,MAAM,KAAK,aAAA,IAAiB,eAAe,CAAA;AAI5E,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,IAAI,WAAA,IAAe,CAAC,CAAC,GAAG,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,EAAG;AAC7D,MAAA,SAAA,CAAU,0CAA0C,CAAA;AACpD,MAAA,QAAA,CAAS,CAAC,CAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,KAAK,KAAA,EAAM;AAAA,EACb,GAAG,QAAQ,CAAA;AAEX,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAuB;AACvC,IAAA,aAAA,CAAc,SAAS,CAAA;AACvB,IAAA,aAAA,CAAc,OAAO,CAAA;AACrB,IAAA,aAAA,CAAc,WAAW,CAAA;AACzB,IAAA,aAAA,CAAc,YAAY,CAAA;AAC1B,IAAA,aAAA,CAAc,OAAO,CAAA;AACrB,IAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,MAAA,EAAO,SAAU,IAAA,EAAK;AACnD,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,SAAA,CAAU,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EACnB,CAAA;AACA,EAAA,OAAA,CAAQ,EAAA,CAAG,SAAA,EAAW,MAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AACvC,EAAA,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,MAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAEtC,EAAA,SAAA,CAAU,CAAA,gDAAA,EAA8C,SAAS,CAAA,CAAE,CAAA;AAEnE,EAAA,MAAM,IAAI,QAAQ,MAAM;AAAA,EAAC,CAAC,CAAA;AAC5B;ACpdA,IAAM,aAAA,GAAgB,wBAAA;AACtB,IAAM,YAAA,GAAe,6BAAA;AAYd,SAAS,oBAAA,CAAqB,SAAA,GAAsB,EAAC,EAAmB;AAC7E,EAAA,MAAM,QAAQnB,KAAAA,CAAK,OAAA,CAAQ,QAAQ,IAAA,CAAK,CAAC,KAAK,EAAE,CAAA;AAChD,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,6CAA6C,CAAA;AACzE,EAAA,MAAM,IAAA,GAAiB,CAAC,OAAA,CAAQ,QAAQ,CAAA;AACxC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG;AAEzB,IAAA,IAAIO,IAAAA,GAAMP,KAAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAC5B,IAAA,IAAI,GAAA,GAAqB,IAAA;AACzB,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,IAAKO,SAAQP,KAAAA,CAAK,OAAA,CAAQO,IAAG,CAAA,EAAG,CAAA,EAAA,EAAK;AACvD,MAAA,MAAM,YAAYP,KAAAA,CAAK,IAAA,CAAKO,MAAK,cAAA,EAAgB,KAAA,EAAO,QAAQ,SAAS,CAAA;AACzE,MAAA,IAAIJ,GAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,QAAA,GAAA,GAAM,SAAA;AACN,QAAA;AAAA,MACF;AACA,MAAAI,IAAAA,GAAMP,KAAAA,CAAK,OAAA,CAAQO,IAAG,CAAA;AAAA,IACxB;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACf;AACA,EAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,GAAG,SAAS,CAAA;AAC9C,EAAA,OAAO,EAAE,IAAA,EAAK;AAChB;AAIA,SAAS,WAAA,GAAsB;AAC7B,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZP,KAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC7B,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,OAAA,GAAA,CAAW,QAAQ,GAAA,CAAI,IAAA,IAAQ,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAClE,EAAA,OAAO,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,OAAA,EAAS,GAAG,KAAK,CAAC,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACtD;AAEA,SAASsB,IAAAA,CAAI,KAAa,IAAA,EAAiD;AACzE,EAAA,MAAM,MAAM,SAAA,CAAU,GAAA,EAAK,MAAM,EAAE,QAAA,EAAU,QAAQ,CAAA;AACrD,EAAA,MAAMH,OAAAA,GAAS,CAAA,EAAG,GAAA,CAAI,MAAA,IAAU,EAAE,GAAG,GAAA,CAAI,MAAA,IAAU,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK;AAC7D,EAAA,OAAO,EAAE,EAAA,EAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,QAAAA,OAAAA,EAAO;AACxC;AAEA,IAAM,SAAA,GAAY,MAAMnB,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,OAAA,EAAQ,EAAG,SAAA,EAAW,cAAA,EAAgB,CAAA,EAAG,aAAa,CAAA,MAAA,CAAQ,CAAA;AACnG,IAAM,QAAA,GAAW,MAAMD,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,SAAQ,EAAG,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,YAAY,CAAA;AACzF,IAAM,SAAA,GAAY,CAAC,CAAA,KAAc,CAAA,CAAE,QAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,MAAM,CAAA;AAQ7F,SAAS,cAAA,CAAe,SAAyB,QAAA,EAAkC;AACxF,EAAA,IAAI,QAAQ,QAAA,KAAa,QAAA,EAAU,OAAO,cAAA,CAAe,SAAS,QAAQ,CAAA;AAC1E,EAAA,IAAI,QAAQ,QAAA,KAAa,OAAA,EAAS,OAAO,cAAA,CAAe,SAAS,QAAQ,CAAA;AACzE,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,MAAA,EAAQ,CAAA,6CAAA,EAAgD,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,IACxE,UAAA,EAAY;AAAA,GACd;AACF;AAEA,SAAS,cAAA,CAAe,SAAyB,QAAA,EAAkC;AACjF,EAAA,MAAM,SAASD,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,OAAA,IAAW,iBAAiB,CAAA;AACxD,EAAAE,IAAG,SAAA,CAAU,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AACxC,EAAAA,GAAAA,CAAG,SAAA,CAAUH,KAAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,CAAA,6BAAA,EAAgC,SAAA,CAAU,WAAA,EAAa,CAAC,CAAA,SAAA,CAAA;AAAA,IACxD,GAAI,WAAW,CAAC,CAAA,sDAAA,EAAyD,UAAU,QAAQ,CAAC,CAAA,SAAA,CAAW,CAAA,GAAI;AAAC,GAC9G,CAAE,KAAK,IAAI,CAAA;AACX,EAAA,MAAM,KAAA,GAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIc,aAAa,CAAA;AAAA;AAAA;AAAA,EAGzC,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,cAAA,EAAiB,SAAA,CAAU,CAAC,CAAC,CAAA,SAAA,CAAW,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,EAKtC,UAAUA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,gBAAgB,CAAC,CAAC,CAAA;AAAA,wCAAA,EAC5C,UAAUA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,gBAAgB,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA,EAGtF,UAAU;AAAA;AAAA;AAAA;AAAA,CAAA;AAKV,EAAAG,GAAAA,CAAG,aAAA,CAAc,SAAA,EAAU,EAAG,KAAK,CAAA;AACnC,EAAA,MAAM,MAAM,OAAO,OAAA,CAAQ,WAAW,UAAA,GAAa,OAAA,CAAQ,QAAO,GAAI,GAAA;AACtE,EAAAmB,IAAAA,CAAI,aAAa,CAAC,SAAA,EAAW,OAAO,GAAG,CAAA,CAAA,EAAI,SAAA,EAAW,CAAC,CAAA;AACvD,EAAA,MAAM,IAAA,GAAOA,IAAAA,CAAI,WAAA,EAAa,CAAC,WAAA,EAAa,OAAO,GAAG,CAAA,CAAA,EAAI,SAAA,EAAW,CAAC,CAAA;AACtE,EAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AAEZ,IAAA,MAAM,IAAA,GAAOA,KAAI,WAAA,EAAa,CAAC,QAAQ,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AACzD,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ,CAAA,kBAAA,EAAqB,IAAA,CAAK,MAAA,IAAU,KAAK,MAAM,CAAA,CAAA;AAAA,QACvD,UAAA,EAAY,CAAA,0CAAA,EAA6C,GAAG,CAAA,CAAA,EAAI,WAAW,CAAA;AAAA,OAC7E;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA,uBAAA,EAA0B,SAAA,EAAW,CAAA,CAAA,CAAA,EAAI;AACtE;AAEA,SAAS,cAAA,CAAe,SAAyB,QAAA,EAAkC;AACjF,EAAAnB,GAAAA,CAAG,SAAA,CAAUH,KAAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA;;AAAA;AAAA,UAAA,EAKH,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,EAAE,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA,GAAM,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC;AAAA;AAAA;AAAA,iBAAA,EAG5D,aAAa;AAAA,EAC9B,QAAA,GAAW,6CAA6C,QAAQ;AAAA,CAAA,GAAO,EAAE;AAAA;AAAA;AAAA,CAAA;AAIzE,EAAAG,GAAAA,CAAG,aAAA,CAAc,QAAA,EAAS,EAAG,IAAI,CAAA;AACjC,EAAA,MAAM,SAASmB,IAAAA,CAAI,WAAA,EAAa,CAAC,QAAA,EAAU,eAAe,CAAC,CAAA;AAC3D,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,CAAA,kCAAA,EAAqC,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,MAC1D,UAAA,EACE,CAAA,gBAAA,EAAmB,QAAA,EAAU,sJACmD,YAAY,CAAA;AAAA,KAChG;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAASA,KAAI,WAAA,EAAa,CAAC,UAAU,QAAA,EAAU,OAAA,EAAS,YAAY,CAAC,CAAA;AAC3E,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,CAAA,yBAAA,EAA4B,MAAA,CAAO,MAAM,CAAA,CAAA,EAAG;AAAA,EAC1E;AAGA,EAAA,MAAM,MAAA,GAASA,KAAI,UAAA,EAAY,CAAC,iBAAiBrB,GAAAA,CAAG,QAAA,EAAS,CAAE,QAAQ,CAAC,CAAA;AACxE,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA;AAAA,IACJ,MAAA,EACE,CAAA,6BAAA,EAAgC,QAAA,EAAU,CAAA,CAAA,CAAA,IACzC,MAAA,CAAO,EAAA,GAAK,qBAAA,GAAwB,CAAA,+DAAA,EAA6DA,GAAAA,CAAG,QAAA,EAAS,CAAE,QAAQ,CAAA,CAAA;AAAA,GAC5H;AACF;AAEO,SAAS,gBAAA,GAAkC;AAChD,EAAA,IAAI,OAAA,CAAQ,aAAa,QAAA,EAAU;AACjC,IAAA,MAAM,MAAM,OAAO,OAAA,CAAQ,WAAW,UAAA,GAAa,OAAA,CAAQ,QAAO,GAAI,GAAA;AACtE,IAAAqB,IAAAA,CAAI,aAAa,CAAC,SAAA,EAAW,OAAO,GAAG,CAAA,CAAA,EAAI,SAAA,EAAW,CAAC,CAAA;AACvD,IAAA,IAAI;AACF,MAAAnB,GAAAA,CAAG,UAAA,CAAW,SAAA,EAAW,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,qBAAA,EAAsB;AAAA,EACnD;AACA,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAAmB,KAAI,WAAA,EAAa,CAAC,UAAU,SAAA,EAAW,OAAA,EAAS,YAAY,CAAC,CAAA;AAC7D,IAAA,IAAI;AACF,MAAAnB,GAAAA,CAAG,UAAA,CAAW,QAAA,EAAU,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAAmB,IAAAA,CAAI,WAAA,EAAa,CAAC,QAAA,EAAU,eAAe,CAAC,CAAA;AAC5C,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,2BAAA,EAA4B;AAAA,EACzD;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,CAAA,sBAAA,EAAyB,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAG;AAC1E;AAEO,SAAS,aAAA,GAA0E;AACxF,EAAA,IAAI,OAAA,CAAQ,aAAa,QAAA,EAAU;AACjC,IAAA,MAAM,SAAA,GAAYnB,GAAAA,CAAG,UAAA,CAAW,SAAA,EAAW,CAAA;AAC3C,IAAA,MAAM,OAAOmB,IAAAA,CAAI,WAAA,EAAa,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mBAAmB,CAAA;AACtD,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,OAAA,EAAS,IAAA,CAAK,EAAA,IAAM,CAAC,CAAC,QAAA;AAAA,MACtB,MAAA,EAAQ,SAAA,GACJ,IAAA,CAAK,EAAA,GACH,QAAA,GACE,CAAA,aAAA,EAAgB,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,CAAA,GAC3B,qBAAA,GACF,uBAAA,GACF;AAAA,KACN;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,MAAM,SAAA,GAAYnB,GAAAA,CAAG,UAAA,CAAW,QAAA,EAAU,CAAA;AAC1C,IAAA,MAAM,SAASmB,IAAAA,CAAI,WAAA,EAAa,CAAC,QAAA,EAAU,WAAA,EAAa,YAAY,CAAC,CAAA;AACrE,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK,KAAM,QAAA;AAAA,MAClC,QAAQ,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,IAAA,MAAU,SAAA,GAAY;AAAA,KAC1D;AAAA,EACF;AACA,EAAA,OAAO,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,OAAO,MAAA,EAAQ,CAAA,qBAAA,EAAwB,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAG;AAChG;;;AChNA,IAAMZ,EAAAA,GAAI;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,UAAA;AAAA,EACP,GAAA,EAAK,UAAA;AAAA,EACL,MAAA,EAAQ,UAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,KAAA,GAAc;AACrB,EAAAS,MAAAA,CAAO,KAAA;AAAA,IACL;AAAA,MACE,EAAA;AAAA,MACA,CAAA,EAAGT,EAAAA,CAAE,IAAI,CAAA,mBAAA,EAAsBA,GAAE,KAAK,CAAA,kDAAA,CAAA;AAAA,MACtC,EAAA;AAAA,MACA,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,QAAA,EAAWA,GAAE,KAAK,CAAA,CAAA;AAAA,MAC3B,kFAAA;AAAA,MACA,yEAAA;AAAA,MACA,2DAAA;AAAA,MACA,0EAAA;AAAA,MACA,wFAAA;AAAA,MACA,gFAAA;AAAA,MACA,qEAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI;AAAA,GACb;AACF;AAEA,SAAS,kBAAkB,IAAA,EAAuD;AAChF,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAI,QAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,GAAA,KAAQ,YAAA,IAAgB,GAAA,KAAQ,IAAA,EAAM;AACxC,MAAA,QAAA,GAAW,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,EAAG;AACxC,MAAA,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,aAAA,CAAc,MAAM,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACf;AAAA,EACF;AACA,EAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAC1B;AAEA,SAAS,gBAAgB,IAAA,EAAuB;AAC9C,EAAA,OAAO,iBAAA;AAAA,IACL,IAAA,IAAQ,OAAA,CAAQ,GAAA,CAAI,6BAAA,IAAiC,iBAAgB,IAAK;AAAA,GAC5E;AACF;AAGA,eAAe,eAAe,QAAA,EAAsC;AAClE,EAAA,wBAAA,CAAyB,QAAQ,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAMa,IAAAA,GAAM,IAAI,SAAA,CAAU,QAAA,EAAU,OAAO,YAAY,CAAA;AACvD,IAAA,MAAMC,MAAAA,GAAQ,MAAMD,IAAAA,CAAI,cAAA,EAAe;AACvC,IAAA,IAAIC,MAAAA,CAAM,IAAI,OAAOD,IAAAA;AACrB,IAAAJ,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,MAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,QAAA,EAAWA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIc,MAAAA,CAAM,MAAM;;AAAA,CAAM,CAAA;AAAA,EAC3F;AACA,EAAAL,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,IAAI,CAAA,wBAAA,EAA2BA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,GAAE,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAIA,GAAE,KAAK;;AAAA,CAAM,CAAA;AAC1F,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY,QAAQ,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,QAAA,EAAU,KAAK,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,cAAA,EAAe;AACvC,EAAA,IAAI,CAAC,MAAM,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AACvE,EAAA,cAAA;AAAA,IACE,EAAE,UAAU,YAAA,EAAc,KAAA,EAAO,YAAY,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,EAAE;AAAA,IAC5E,EAAE,eAAe,KAAA;AAAM,GACzB;AACA,EAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,cAAA,EAAiBA,GAAE,IAAI,CAAA,EAAG,IAAI,CAAA,EAAGA,GAAE,KAAK;;AAAA,CAAM,CAAA;AAChF,EAAA,OAAO,GAAA;AACT;AAEA,eAAe,eAAe,YAAA,EAAsC;AAClE,EAAA,MAAM,QAAA,GAAW,gBAAgB,YAAY,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,MAAM,cAAA,CAAe,QAAQ,CAAA;AAKzC,EAAA,MAAM,WAAW,mBAAA,EAAoB;AACrC,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,GAAA,EAAK,SAAS,UAAU,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC7E,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,QAAA,IAAY,EAAE,QAAA,EAAUT,GAAAA,CAAG,QAAA,EAAS,EAAG,EAAA,EAAI,QAAA,CAAS,UAAA,EAAY,CAAA;AACrG,EAAA,MAAM,KAAKwB,SAAAA,CAAS,eAAA,CAAgB,SAAEpB,KAAA,EAAO,MAAA,EAAAc,QAAQ,CAAA;AACrD,EAAA,MAAM,MAAA,GAAA,CAAU,MAAM,EAAA,CAAG,QAAA;AAAA,IACvB,CAAA,EAAGT,EAAAA,CAAE,IAAI,CAAA,YAAA,EAAeA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,6BAAA,EAAgCA,EAAAA,CAAE,KAAK,KAAK,SAAS,CAAA,GAAA;AAAA,KAC5F,IAAA,EAAK;AACR,EAAA,EAAA,CAAG,KAAA,EAAM;AACT,EAAA,IAAI,QAAQ,MAAM,cAAA,CAAe,GAAA,EAAK,QAAA,CAAS,YAAY,MAAM,CAAA;AAIjE,EAAA,MAAM,sBAAA,CAAuB,KAAK,QAAQ,CAAA;AAC1C,EAAA,MAAM,cAAc,MAAA,IAAU,SAAA;AAE9B,EAAAS,OAAO,KAAA,CAAM,CAAA,EAAGT,GAAE,GAAG,CAAA,sCAAA,EAAoCA,GAAE,KAAK;AAAA,CAAI,CAAA;AACpE,EAAA,MAAM,QAAQ,YAAA,GAAe,CAAC,YAAA,EAAc,QAAQ,IAAI,EAAC;AACzD,EAAA,MAAM,SAAS,cAAA,CAAe,oBAAA,CAAqB,KAAK,CAAA,EAAG,YAAA,GAAe,WAAW,MAAS,CAAA;AAC9F,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,GAAG,SAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM;AAAA,CAAI,CAAA;AACrD,IAAA,IAAI,MAAA,CAAO,UAAA,EAAYS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,GAAG,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,EAAGA,GAAE,KAAK;AAAA,CAAI,CAAA;AAC9E,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,KAAK,SAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM;AAAA,CAAI,CAAA;AAGvD,EAAAS,OAAO,KAAA,CAAM,CAAA,EAAGT,GAAE,GAAG,CAAA,8CAAA,EAA4CA,GAAE,KAAK;AAAA,CAAI,CAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAC9B,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAI,CAAC,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAA,EAAK,SAAS,UAAU,CAAA;AACzD,IAAA,IAAI,MAAA,IAAU,YAAA,CAAa,MAAM,CAAA,EAAG;AAClC,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,KAAA,EAAO;AACT,IAAAS,MAAAA,CAAO,KAAA;AAAA,MACL,CAAA,EAAGT,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,EAAG,WAAW,CAAA,EAAGA,GAAE,KAAK,CAAA;;AAAA;AAAA,EAElDA,GAAE,GAAG,CAAA;AAAA,sDAAA,EACiDA,GAAE,KAAK;AAAA;AAAA,KACpE;AAAA,EACF,CAAA,MAAO;AACL,IAAAS,MAAAA,CAAO,KAAA;AAAA,MACL,CAAA,EAAGT,EAAAA,CAAE,MAAM,CAAA,MAAA,EAAIA,GAAE,KAAK,CAAA;AAAA,EACjBA,EAAAA,CAAE,GAAG,CAAA,sEAAA,EAAyEA,EAAAA,CAAE,KAAK;AAAA;AAAA,KAC5F;AAAA,EACF;AACF;AAEA,eAAe,aAAA,GAA+B;AAC5C,EAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,EAAA,MAAM,WAAW,mBAAA,EAAoB;AACrC,EAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,IAAI,WAAWA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM;AAAA,CAAI,CAAA;AAC9D,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,MAAM,IAAA,GAAO,cAAc,QAAQ,CAAA;AACnC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAAS,MAAAA,CAAO,KAAA;AAAA,MACL,GAAGT,EAAAA,CAAE,IAAI,WAAWA,EAAAA,CAAE,KAAK,KAAKT,GAAAA,CAAG,QAAA,EAAU,CAAA,CAAA,EAAIS,GAAE,GAAG,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA,EAAIA,GAAE,KAAK;AAAA;AAAA,KAC1F;AACA,IAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,IAAI,CAAA,QAAA,EAAWA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,GAAE,MAAM,CAAA,iBAAA,EAAoB,QAAQ,CAAA,EAAGA,GAAE,KAAK;AAAA,CAAI,CAAA;AAC/F,IAAA;AAAA,EACF;AACA,EAAA,wBAAA,CAAyB,QAAQ,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,QAAA,EAAU,KAAK,YAAY,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAA,EAAK,SAAS,UAAU,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAE3E,EAAAS,MAAAA,CAAO,KAAA;AAAA,IACL,CAAA,EAAGT,EAAAA,CAAE,IAAI,CAAA,QAAA,EAAWA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAK,kBAAA,CAAmB,MAAA,IAAU,EAAE,QAAA,EAAUT,GAAAA,CAAG,QAAA,EAAS,EAAG,EAAA,EAAI,QAAA,CAAS,UAAA,EAAY,CAAC,CAAA,CAAA,EAAIS,EAAAA,CAAE,GAAG,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAA,EAAIA,EAAAA,CAAE,KAAK;AAAA;AAAA,GAC/J;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAAS,OAAO,KAAA,CAAM,CAAA,EAAGT,GAAE,IAAI,CAAA,SAAA,EAAYA,GAAE,KAAK,CAAA;AAAA,CAAuB,CAAA;AAChE,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,MAAM,OAAO,MAAA,CAAO,MAAA,GAChB,GAAG,IAAA,CAAK,KAAA,CAAA,CAAO,KAAK,GAAA,EAAI,GAAI,MAAA,CAAO,MAAA,CAAO,gBAAgB,GAAI,CAAC,WAAW,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAA,CAAA,GAC/F,OAAA;AACJ,EAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,IAAI,YAAYA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,MAAA,GAAS,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,MAAA,EAASA,EAAAA,CAAE,KAAK,CAAA,CAAA,GAAK,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,OAAA,EAAUA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA,qBAAA,EAAqB,IAAI;AAAA,CAAI,CAAA;AAChJ,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC5C,EAAAS,OAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,IAAI,YAAYA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,QAAA,CAAS,SAAS,EAAA,GAAKA,EAAAA,CAAE,GAAA,GAAM,iBAAA,GAAoBA,GAAE,KAAK;AAAA,CAAI,CAAA;AAC3G,EAAA,KAAA,MAAW,CAAA,IAAK,QAAA,CAAS,IAAA,EAAK,EAAGS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAA,EAAKT,EAAAA,CAAE,GAAG,CAAA,EAAG,CAAC,CAAA,EAAGA,GAAE,KAAK;AAAA,CAAI,CAAA;AAC5E;AAEA,eAAe,cAAA,CAAe,QAA0B,MAAA,EAAgC;AACtF,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAAS,OAAO,KAAA,CAAM,CAAA,EAAGT,GAAE,GAAG,CAAA,MAAA,EAAIA,GAAE,KAAK,CAAA;AAAA,CAA6B,CAAA;AAC7D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,MAAMH,IAAAA,GAAMP,KAAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,EAAA,IAAI,WAAW,KAAA,IAAS,CAACG,GAAAA,CAAG,UAAA,CAAWI,IAAG,CAAA,EAAG;AAC3C,IAAAY,MAAAA,CAAO,MAAM,CAAA,EAAGT,EAAAA,CAAE,GAAG,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIH,IAAG,CAAA;AAAA,CAAoC,CAAA;AAC3E,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,MAAM,GAAA,GAAM,MAAM,cAAA,CAAe,QAAQ,CAAA;AACzC,EAAA,MAAM,WAAW,mBAAA,EAAoB;AACrC,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAA,EAAK,SAAS,UAAU,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC3E,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,MAAA,IAAU,EAAE,QAAA,EAAUN,GAAAA,CAAG,QAAA,EAAS,EAAG,EAAA,EAAI,QAAA,CAAS,UAAA,EAAY,CAAA;AACrG,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,MAAM,eAAA,CAAgB,GAAA,EAAK,QAAA,EAAUM,IAAG,CAAA;AACxC,IAAAY,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,YAAA,EAAeH,IAAG,CAAA,wBAAA,EAA2B,WAAW,CAAA;AAAA,CAAK,CAAA;AAAA,EACjG,CAAA,MAAO;AACL,IAAA,MAAM,iBAAA,CAAkB,GAAA,EAAK,QAAA,EAAUA,IAAG,CAAA;AAC1C,IAAAY,MAAAA,CAAO,MAAM,CAAA,EAAGT,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,SAAA,EAAYH,IAAG,CAAA;AAAA,CAAkC,CAAA;AAAA,EACrF;AACF;AAGA,eAAsB,iBAAiB,IAAA,EAA+B;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,GAAG,QAAQ,CAAA,GAAI,IAAA;AAC/B,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,kBAAkB,QAAQ,CAAA;AACrD,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,KAAA;AACH,MAAA,MAAM,UAAU,EAAE,QAAA,EAAU,YAAY,OAAA,CAAQ,GAAA,CAAI,+BAA+B,CAAA;AACnF,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,MAAM,eAAe,QAAQ,CAAA;AAC7B,MAAA;AAAA,IACF,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,MAAAY,OAAO,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,EAAA,GAAKT,GAAE,KAAA,GAAQ,QAAA,GAAMA,EAAAA,CAAE,GAAA,GAAM,QAAG,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM;AAAA,CAAI,CAAA;AAEtF,MAAA,MAAM,EAAA,GAAK,gBAAgB,QAAQ,CAAA;AACnC,MAAA,MAAM,IAAA,GAAO,cAAc,EAAE,CAAA;AAC7B,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,wBAAA,CAAyB,EAAE,CAAA;AAC3B,QAAA,MAAM,WAAA,CAAY,IAAI,SAAA,CAAU,EAAA,EAAI,IAAA,CAAK,YAAY,CAAA,EAAG,mBAAA,EAAqB,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MAC/F;AACA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA;AACH,MAAA,MAAM,aAAA,EAAc;AACpB,MAAA;AAAA,IACF,KAAK,aAAA;AACH,MAAA,MAAM,cAAA,CAAe,KAAA,EAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AACnC,MAAA;AAAA,IACF,KAAK,gBAAA;AACH,MAAA,MAAM,cAAA,CAAe,QAAA,EAAU,IAAA,CAAK,CAAC,CAAC,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,qBAAA,EAAwB,WAAA,EAAa;AAAA,CAAI,CAAA;AACtD,MAAA;AAAA,IACF;AACE,MAAA,KAAA,EAAM;AACN,MAAA,IAAI,WAAW,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,QAAA,IAAY,YAAY,IAAA,EAAM;AAC7E,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA;AAEN;;;AC9KA,IAAMT,EAAAA,GAAI;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,UAAA;AAAA,EACN,OAAA,EAAS,UAAA;AAAA,EACT,MAAA,EAAQ,UAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM;AAAA;AACR,CAAA;AAOA,IAAM,SAAA,GAAY;AAAA,EAChB,qFAAA;AAAA,EACA,6CAAA;AAAA,EACA,mCAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,0FAAA;AAAA,EACA,8BAAA;AAAA,EACA,wCAAA;AAAA,EACA;AACF,CAAA;AASA,SAAS,UAAA,GAAmB;AAC1B,EAAAS,MAAAA,CAAO,KAAA;AAAA,IACL;AAAA,MACE,EAAA;AAAA,MACA,CAAA,EAAGT,EAAAA,CAAE,IAAI,CAAA,KAAA,EAAQA,GAAE,KAAK,CAAA,CAAA;AAAA,MACxB,gCAAA;AAAA,MACA,EAAA;AAAA,MACA,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,OAAA,EAAUA,GAAE,KAAK,CAAA,CAAA;AAAA,MAC1B,+EAAA;AAAA,MACA,gEAAA;AAAA,MACA,0DAAA;AAAA,MACA,0EAAA;AAAA,MACA,mEAAA;AAAA,MACA,yCAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI;AAAA,GACb;AACF;AAEA,SAASgB,WAAU,IAAA,EAAyB;AAC1C,EAAA,MAAM,MAAA,GAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,gBAAgB,KAAA,EAAM;AAC7D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AACpC,MAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,KAAQ,YAAA,IAAgB,GAAA,KAAQ,IAAA,EAAM;AACxC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACxB,MAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,QAAA,GAAW,KAAA;AAClB,QAAA,CAAA,EAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,cAAA,GAAiB,IAAA;AAAA,MAC1B;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,aAAA,CAAc,MAAM,CAAA;AAC5C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,QAAA,GAAW,KAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,cAAA,GAAiB,IAAA;AAAA,MAC1B;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAIhB,MAAA,IAAI,CAAA,KAAM,KAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,EAAG,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC7B,MAAA,IAAI,KAAK,MAAA,GAAS,CAAA,EAAG,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAC9E,MAAA,IAAI,KAAK,CAAC,CAAA,EAAG,MAAA,CAAO,GAAA,GAAM,KAAK,CAAC,CAAA;AAChC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,GAAG,CAAA,QAAS,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAE,CAAA;AACjE,IAAA,IAAI,MAAA,CAAO,GAAA,EAAK,MAAM,IAAI,MAAM,yCAAyC,CAAA;AACzE,IAAA,MAAA,CAAO,GAAA,GAAM,GAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAA;AACT;AAQA,SAAS,iBAAA,CAAkB,GAAA,EAAU,OAAA,EAAiBP,OAAAA,EAAgB,IAAa,KAAA,EAAsB;AACvG,EAAA,GAAA,CAAI,MAAM,EAAE,CAAA;AACZ,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,EAAA,EAAKT,EAAAA,CAAE,GAAG,WAAW,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,GAAK,EAAA;AAC/D,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,OAAO,CAAA,CAAA,EAAIA,GAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,GAAG,OAAO,CAAA,EAAGA,GAAE,KAAK,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AACxE,EAAA,MAAM,IAAA,GAAA,CAAQS,OAAAA,IAAU,EAAA,EAAI,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC9C,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAA,EAAK,EAAA,GAAKT,EAAAA,CAAE,GAAA,GAAMA,EAAAA,CAAE,GAAG,CAAA,EAAG,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,MAAM,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,WAAA,EAAcA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAC7C;AACA,EAAA,GAAA,CAAI,MAAM,EAAE,CAAA;AACd;AAQA,SAAS,cAAA,CAAe,KAAU,IAAA,EAAoB;AACpD,EAAA,MAAMX,KAAAA,GAAO,KAAK,GAAA,CAAI,EAAA,EAAA,CAAK,QAAQ,MAAA,CAAO,OAAA,IAAW,MAAM,CAAC,CAAA;AAC5D,EAAA,GAAA,CAAI,WAAA,EAAY;AAChB,EAAA,GAAA,CAAI,MAAM,EAAE,CAAA;AACZ,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,MAAW,IAAA,IAAQ,cAAA,CAAe,IAAA,EAAMA,KAAI,CAAA,EAAG;AAC7C,IAAA,IAAI,CAAC,MAAA,IAAU,IAAA,CAAK,IAAA,EAAK,EAAG;AAC1B,MAAA,GAAA,CAAI,KAAA,CAAM,GAAGW,EAAAA,CAAE,IAAI,SAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AACxC,MAAA,MAAA,GAAS,IAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IACvB;AAAA,EACF;AACA,EAAA,GAAA,CAAI,MAAM,EAAE,CAAA;AACd;AASA,SAAS,YAAY,KAAA,EAAqC;AACxD,EAAA,MAAM,MAAA,GAAS,CAAC,QAAA,EAAK,QAAA,EAAK,UAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AACtD,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,gBAAgB,CAAA;AACvC,EAAAS,MAAAA,CAAO,MAAM,WAAW,CAAA;AACxB,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,EAAE,CAAA,GAAI,OAAO,MAAM,CAAA;AACrD,IAAAA,MAAAA,CAAO,MAAM,CAAA,QAAA,EAAW,GAAG,GAAG,eAAA,CAAgB,GAAG,CAAC,CAAA,EAAG,CAAC,GAAGT,EAAAA,CAAE,KAAK,IAAIA,EAAAA,CAAE,GAAG,GAAG,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAChG,CAAA;AACA,EAAA,IAAA,EAAK;AACL,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,EAAM,EAAE,CAAA;AAElC,EAAA,OAAO;AAAA,IACL,MAAM,MAAM;AACV,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAAS,MAAAA,CAAO,MAAM,mBAAmB,CAAA;AAAA,IAClC;AAAA,GACF;AACF;AAGA,SAAS,QAAA,CAAS,eAAe,CAAA,EAAS;AACxC,EAAAA,MAAAA,CAAO,MAAM,WAAW,CAAA;AACxB,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAAA,MAAAA,CAAO,KAAA;AAAA,MACL;AAAA,EAAKT,EAAAA,CAAE,IAAI,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,SAAA,EAAY,YAAY,CAAA,mBAAA,EAAsB,YAAA,KAAiB,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA;AAAA;AAAA,KACpG;AAAA,EACF;AACA,EAAAS,OAAO,KAAA,CAAM;AAAA,EAAKT,EAAAA,CAAE,IAAI,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,IAAIA,EAAAA,CAAE,GAAG,CAAA,kCAAA,EAAgCA,EAAAA,CAAE,KAAK;AAAA,CAAI,CAAA;AACzF;AAOA,SAAS,YAAA,CAAa,UAAkB,UAAA,EAA0B;AAChE,EAAA,MAAM,IAAA,GAAOT,IAAG,OAAA,EAAQ;AACxB,EAAA,MAAMM,IAAAA,GAAM,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,MAAM,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,UAAA;AAChF,EAAA,MAAM,IAAA,GAAO,SAAS,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnE,EAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA;AAIZ,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,CAAA,EAAGG,GAAE,IAAI,CAAA,EAAG,aAAa,eAAe,CAAC,GAAGA,EAAAA,CAAE,KAAK,GAAG,OAAA,GAAU,CAAA,EAAA,EAAKA,GAAE,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,IACtG,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,qBAAA,EAAwBA,GAAE,KAAK,CAAA,CAAA;AAAA,IACvC,GAAI,QAAA,KAAa,mBAAA,GAAsB,KAAK,CAAC,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAG,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACzE,GAAGA,EAAAA,CAAE,GAAG,GAAGH,IAAG,CAAA,EAAGG,GAAE,KAAK,CAAA;AAAA,GAC1B;AACA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,GAAG,CAAC,CAAA,CAAE,MAAM,CAAC,CAAA;AACjE,EAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAA,CAAO,UAAU,MAAA,GAAS,IAAA,CAAK,UAAU,CAAC,CAAA;AAC/D,EAAAS,MAAAA,CAAO,MAAM,IAAI,CAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,CAAC,CAAA,CAAE,OAAO,SAAS,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,OAAO,CAAA;AAC7B,IAAAA,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,KAAK,CAAA,EAAG,IAAA,GAAO,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,GAAK,EAAE;AAAA,CAAI,CAAA;AAAA,EAC5D;AACA,EAAAA,MAAAA,CAAO,MAAM,IAAI,CAAA;AACnB;AAOA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AACjD,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,CAAA,EAAGT,EAAAA,CAAE,GAAG,CAAA,EAAG,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA;AACxC,EAAA,MAAM,GAAG,MAAA,EAAQ,KAAA,EAAO,IAAI,CAAA,GAAI,CAAA;AAChC,EAAA,IAAI,UAAU,QAAA,EAAK;AACjB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB,CAAA,CAAA,EAAIA,GAAE,GAAG,CAAA,EAAA,EAAKA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,UAAU,QAAA,EAAK;AAKjB,IAAA,MAAM,aAAA,GAAgB,CAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,aAAa,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA;AACpC,IAAA,MAAM,OAAO,KAAA,CACV,GAAA;AAAA,MAAI,CAAC,CAAA,EAAG,CAAA,KACP,CAAA,KAAM,CAAA,GACF,CAAA,EAAG,MAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,OAAA,EAAK,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,GACjC,CAAA,EAAG,MAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,EAAG,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA;AAAA,KAC7C,CACC,KAAK,IAAI,CAAA;AACZ,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,OAAO,GAAG,IAAI;AAAA,EAAK,MAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,QAAA,EAAM,MAAM,CAAA,UAAA,EAAa,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,EAAGA,GAAE,KAAK,CAAA,CAAA;AAAA,IAC7F;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,OAAA,EAAK,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAChD;AAeA,eAAe,IAAA,GAAsB;AAInC,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,EAAU;AAChC,IAAA,MAAM,gBAAA,CAAiB,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAUgB,UAAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC3C,SAAS,KAAA,EAAO;AACd,IAAAP,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,GAAG,CAAA,MAAA,EAASA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,iBAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC;AAAA,CAAI,CAAA;AACnG,IAAA,UAAA,EAAW;AACX,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,UAAA,EAAW;AACX,IAAA;AAAA,EACF;AACA,EAAA,MAAM,cAAc,OAAA,CAAQ,QAAA;AAC5B,EAAA,MAAM,gBAAA,GAAmB,QAAQ,cAAA,IAAmB,OAAO,gBAAgB,QAAA,IAAY,WAAA,CAAY,MAAK,KAAM,EAAA;AAC9G,EAAA,MAAM,SAAS,OAAA,CAAQ,GAAA;AAEvB,EAAA,MAAM,aAAaV,KAAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,KAAK,CAAA;AACvD,EAAA,MAAM,OAAA,GAAUC,IAAG,QAAA,EAAS;AAO5B,EAAA,MAAM,MAAA,GAA4C,EAAE,EAAA,EAAI,IAAA,EAAK;AAC7D,EAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,EAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,EAAA,IAAI,cAAA,GAAuD,IAAA;AAC3D,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAI,cAAA,eAA6B,cAAc,CAAA;AAC/C,MAAA,MAAA,CAAO,IAAI,KAAA,EAAM;AACjB,MAAA,QAAA,EAAS;AACT,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAAkB,OAAO,KAAA,CAAM;AAAA,EAAKT,EAAAA,CAAE,GAAG,CAAA,6BAAA,EAAgCA,EAAAA,CAAE,KAAK;AAAA,CAAI,CAAA;AAClE,IAAA,cAAA,GAAiB,WAAW,MAAM;AAChC,MAAA,cAAA,GAAiB,KAAA;AACjB,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB,GAAG,GAAI,CAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,GAAA,GAAM,OAAO,QAAA,KAAsC;AACvD,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,MAAA,MAAA,CAAO,EAAA,GAAKe,UAAS,eAAA,CAAgB,EAAE,OAAApB,KAAAA,EAAO,MAAA,EAAAc,QAAQ,CAAA;AACtD,MAAA,MAAA,CAAO,EAAA,CAAG,EAAA,CAAG,QAAA,EAAU,iBAAiB,CAAA;AAGxC,MAAA,MAAA,CAAO,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,MAAM;AAC1B,QAAA,IAAI,cAAA,EAAgB;AACpB,QAAA,QAAA,EAAS;AACT,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA,CAAO,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AAAA,EACpC,CAAA;AACA,EAAA,MAAM,cAAc,YAA6B;AAC/C,IAAA,WAAS;AACP,MAAA,MAAM,UAAU,MAAM,GAAA;AAAA,QACpB,CAAA,EAAGT,EAAAA,CAAE,IAAI,CAAA,4BAAA,EAA+BA,GAAE,KAAK,CAAA,+BAAA;AAAA,SAC9C,IAAA,EAAK;AACR,MAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,MAAAS,OAAO,KAAA,CAAM,CAAA,EAAGT,GAAE,GAAG,CAAA,4BAAA,EAA+BA,GAAE,KAAK;AAAA,CAAI,CAAA;AAAA,IACjE;AAAA,EACF,CAAA;AAKA,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,iBAAiB,CAAA;AAOtC,EAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,EAAA,IAAI,WAAW,WAAA,KAAgB,OAAA,CAAQ,cAAA,GAAiB,EAAA,GAAK,iBAAgB,IAAK,mBAAA,CAAA;AAClF,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,MAAM,WAAA,EAAY;AAC7B,IAAA,gBAAA,GAAmB,IAAA;AAAA,EACrB;AACA,EAAA,QAAA,GAAW,kBAAkB,QAAQ,CAAA;AAIrC,EAAA,MAAM,UAAA,GAAa,yBAAyB,QAAQ,CAAA;AAIpD,EAAA,YAAA,CAAa,UAAU,UAAU,CAAA;AACjC,EAAA,IAAI,UAAA,EAAY;AACd,IAAAS,OAAO,KAAA,CAAM,CAAA,EAAGT,GAAE,GAAG,CAAA,8CAAA,EAAiDA,GAAE,KAAK;;AAAA,CAAM,CAAA;AAAA,EACrF;AAOA,EAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,EAAA,IAAI,eAAA,GAAqC,IAAA;AACzC,EAAA;AACE,IAAA,MAAM,OAAA,GAAU,YAAY,sBAAsB,CAAA;AAClD,IAAA,eAAA,GAAkB,MAAM,eAAe,OAAO,CAAA;AAC9C,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,MAAM,OAAA,GAAU,qBAAqB,OAAO,CAAA;AAC5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAA,EAAKT,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,GAAE,GAAG,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,EAAIA,GAAE,KAAK;;AAAA,CAAM,CAAA;AAAA,IACpG;AACA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,KAAK,oBAAA,EAAqB;AAChC,MAAA,MAAM,QAAA,GAAW,iBAAiB,eAAA,EAAiB,EAAE,OAAO,mBAAA,EAAoB,EAAG,IAAI,CAAA;AACvF,MAAA,IAAI,aAAa,OAAA,IAAW,EAAA,IAAM,sBAAsB,eAAA,CAAgB,MAAA,EAAQ,EAAE,CAAA,EAAG;AACnF,QAAAS,MAAAA,CAAO,KAAA;AAAA,UACL,CAAA,EAAA,EAAKT,EAAAA,CAAE,IAAI,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,cAAA,EAAiBA,EAAAA,CAAE,KAAK,CAAA,EAAGA,GAAE,IAAI,CAAA,CAAA,EAAI,eAAA,CAAgB,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,uEAAA,EAAqEA,EAAAA,CAAE,KAAK;;AAAA;AAAA,SAC1L;AAAA,MACF,CAAA,MAAA,IAAW,aAAa,WAAA,EAAa;AACnC,QAAAS,MAAAA,CAAO,KAAA;AAAA,UACL,CAAA,EAAA,EAAKT,EAAAA,CAAE,IAAI,CAAA,MAAA,EAAIA,GAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,eAAA,EAAkB,eAAA,CAAgB,MAAM,CAAA,uCAAA,EAA0CA,GAAE,KAAK;;AAAA;AAAA,SAC1H;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,aAAA,CAAc,EAAA,IAAM,KAAK,CAAA,CAAE,OAAA;AAC3C,QAAAS,MAAAA,CAAO,KAAA;AAAA,UACL,CAAA,EAAA,EAAKT,EAAAA,CAAE,IAAI,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,iBAAA,EAAoBA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,CAAA,EAAI,eAAA,CAAgB,OAAO,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,QAAA,EAAMA,EAAAA,CAAE,IAAI,CAAA,CAAA,EAAI,eAAA,CAAgB,MAAM,CAAA,EAAGA,GAAE,KAAK;AAAA,EAAA,EACjJA,GAAE,GAAG,CAAA,IAAA,EAAOA,GAAE,KAAK,CAAA,EAAGA,GAAE,IAAI,CAAA,EAAG,OAAO,CAAA,EAAGA,GAAE,KAAK,CAAA,EAAGA,GAAE,GAAG,CAAA,UAAA,EAAaA,GAAE,KAAK;;AAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,EAAA,IAAI,MAAM,MAAA,GAAS,IAAI,UAAU,QAAA,EAAU,MAAA,CAAO,YAAY,CAAA,GAAI,IAAA;AAClE,EAAA,IAAI,WAAA,GAAuE,IAAA;AAC3E,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,UAAA,GAAa,YAAY,+BAA+B,CAAA;AAC9D,IAAA,WAAA,GAAc,MAAM,IAAI,cAAA,EAAe;AACvC,IAAA,UAAA,CAAW,IAAA,EAAK;AAAA,EAClB;AACA,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,WAAA,EAAa,EAAA,EAAI;AAC5B,IAAA,MAAM,IAAA,GAAO,SAAS,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAInE,IAAA,IAAI,WAAA,IAAe,CAAC,WAAA,CAAY,EAAA,EAAI;AAClC,MAAAS,OAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,GAAG,SAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,uCAAA,EAA0CA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,YAAY,MAAM;AAAA,CAAI,CAAA;AACpH,MAAA,IAAI,WAAA,CAAY,IAAA,EAAMS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAA,EAAKT,EAAAA,CAAE,GAAG,CAAA,EAAG,WAAA,CAAY,IAAI,CAAA,EAAGA,GAAE,KAAK;AAAA,CAAI,CAAA;AAC9E,MAAAS,MAAAA,CAAO,MAAM,IAAI,CAAA;AAAA,IACnB;AACA,IAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,EAA2C,MAAA,KAAmB;AACpF,MAAAA,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,GAAG,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,MAAA,CAAO,MAAM;AAAA,CAAI,CAAA;AAC9D,MAAA,IAAI,MAAA,CAAO,IAAA,EAAMS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAA,EAAKT,EAAAA,CAAE,GAAG,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAGA,GAAE,KAAK;AAAA,CAAI,CAAA;AAAA,IACtE,CAAA;AACA,IAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,IAAI,CAAA,EAAG,YAAA,CAAa,0BAA0B,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK;AAAA,CAAI,CAAA;AAG/E,IAAA,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,KAAO,mBAAA,EAAqB;AAC7C,MAAAS,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,GAAG,CAAA,aAAA,EAAgBA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,GAAE,IAAI,CAAA,EAAG,IAAI,CAAA,EAAGA,GAAE,KAAK;AAAA,CAAI,CAAA;AAAA,IAC7E;AACA,IAAAS,MAAAA,CAAO,KAAA;AAAA,MACL,CAAA,EAAGT,EAAAA,CAAE,GAAG,CAAA,iDAAA,EAAoDA,GAAE,KAAK;;AAAA;AAAA,KACrE;AACA,IAAAS,MAAAA,CAAO,KAAA;AAAA,MACL,CAAA,EAAGT,GAAE,KAAK,CAAA,MAAA,EAASA,GAAE,IAAI,CAAA,KAAA,EAAQA,GAAE,KAAK,CAAA,EAAGA,GAAE,KAAK,CAAA,kCAAA,EAAqCA,GAAE,KAAK,CAAA,CAAA,EAAIA,GAAE,GAAG,CAAA,uBAAA,EAA0BA,GAAE,KAAK;;AAAA;AAAA,KAC1I;AACA,IAAA,WAAS;AACP,MAAA,MAAM,KAAA,GAAA,CAAS,MAAM,GAAA,CAAI,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,CAAG,CAAA,EAAG,IAAA,EAAK;AACxD,MAAA,IAAI,CAAC,KAAA,EAAO;AAIV,QAAA,MAAM,MAAM,MAAM,WAAA,CAAY,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM;AACnD,UAAAS,MAAAA,CAAO,MAAM,CAAA,EAAGT,EAAAA,CAAE,GAAG,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,EAAG,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK;AAAA,CAAI,CAAA;AACpG,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AACD,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,GAAA,GAAM,IAAI,SAAA,CAAU,QAAA,EAAU,GAAG,CAAA;AACjC,QAAA,MAAMiB,WAAAA,GAAa,YAAY,+BAA+B,CAAA;AAC9D,QAAA,MAAMH,MAAAA,GAAQ,MAAM,GAAA,CAAI,cAAA,EAAe;AACvC,QAAAG,YAAW,IAAA,EAAK;AAChB,QAAA,IAAIH,OAAM,EAAA,EAAI;AACZ,UAAA,cAAA;AAAA,YACE,EAAE,UAAU,YAAA,EAAc,GAAA,EAAK,YAAY,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,EAAE;AAAA,YAC1E,EAAE,aAAA,EAAe,CAAC,gBAAA;AAAiB,WACrC;AACA,UAAAL,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,cAAA,EAAiBA,GAAE,IAAI,CAAA,EAAG,IAAI,CAAA,EAAGA,GAAE,KAAK;AAAA,CAAI,CAAA;AAC9E,UAAA;AAAA,QACF;AACA,QAAA,cAAA,CAAec,QAAO,iCAAiC,CAAA;AACvD,QAAA;AAAA,MACF;AACA,MAAA,GAAA,GAAM,IAAI,SAAA,CAAU,QAAA,EAAU,KAAK,CAAA;AACnC,MAAA,MAAM,UAAA,GAAa,YAAY,+BAA+B,CAAA;AAC9D,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,cAAA,EAAe;AACvC,MAAA,UAAA,CAAW,IAAA,EAAK;AAChB,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,cAAA;AAAA,UACE,EAAE,UAAU,YAAA,EAAc,KAAA,EAAO,YAAY,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,EAAE;AAAA,UAC5E,EAAE,aAAA,EAAe,CAAC,gBAAA;AAAiB,SACrC;AACA,QAAAL,MAAAA,CAAO,KAAA,CAAM,CAAA,EAAGT,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,cAAA,EAAiBA,GAAE,IAAI,CAAA,EAAG,IAAI,CAAA,EAAGA,GAAE,KAAK;AAAA,CAAI,CAAA;AAC9E,QAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,IAC1B;AAAA,EACF,WAAW,gBAAA,EAAkB;AAC3B,IAAA,mBAAA,CAAoB,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,CAAC,GAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AACxB,EAAA,cAAA,GAAiB,IAAA;AACjB,EAAA,MAAA,CAAO,IAAI,KAAA,EAAM;AAMjB,EAAA,MAAM,WAAW,mBAAA,EAAoB;AACrC,EAAA,KAAK,gBAAgB,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA,CAAE,MAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AAE9D,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAC,CAAA;AAErB,EAAA,MAAM,IAAA,GAAOT,IAAG,OAAA,EAAQ;AACxB,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,MAAM,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,UAAA;AACrF,EAAA,MAAM,QAAA,GAAW,SAAS,MAAA,GAAS,EAAA,GAAK,WAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,GAAI,QAAA;AAEpE,EAAA,MAAM,OAAA,GAA2B,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAS;AAC3D,EAAA;AACE,IAAA,MAAM,eAAA,GAAkB,YAAY,wBAAwB,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAG,EAAE,KAAA,CAAM,MAAM,EAAqB,CAAA;AAC1E,IAAA,eAAA,CAAgB,IAAA,EAAK;AACrB,IAAA,OAAA,CAAQ,uBAAuB,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AAC9D,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,QAAA,CAAS,UAAA,IAAc,YAAA,CAAa,CAAC,CAAC,CAAA;AAC5F,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,MAAA;AAAA,QACtB,CAAA,EAAGS,EAAAA,CAAE,IAAI,CAAA,EAAG,aAAa,gCAAgC,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,gCAAA,EAAmBA,GAAE,KAAK,CAAA,CAAA;AAAA,QACxG;AAAA,UACE,EAAE,OAAO,CAAA,oBAAA,EAAkB,QAAQ,IAAI,IAAA,EAAM,mBAAA,EAAqB,OAAO,IAAA,EAAK;AAAA,UAC9E,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YAC3B,OAAO,CAAA,CAAE,IAAA;AAAA,YACT,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,mBAAA,EAAmB,CAAA,CAAE,MAAA,GAAS,CAAA,OAAA,EAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,YAC/E,KAAA,EAAO;AAAA,WACT,CAAE;AAAA;AACJ,OACF;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,GAAA,EAAK,KAAK,CAAA;AACrD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AACf,UAAA,OAAA,CAAQ,MAAA,GAAS,KAAA;AACjB,UAAA,OAAA,CAAQ,UAAA,GAAa,UAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAMA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,QAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,MAAA,IAAU,QAAQ,UAAA,EAAY;AACrE,IAAA,IAAA,GAAO;AAAA,MACL,CAAA,KAAA,EAAQ,QAAQ,UAAU,CAAA,CAAA;AAAA,MAC1B,WAAW,OAAA,CAAQ,MAAA,CAAO,QAAA,IAAY,OAAA,CAAQ,OAAO,IAAI,CAAA,CAAA;AAAA,MACzD,CAAA,OAAA,EAAU,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,KAC7B;AACA,IAAA,UAAA,GAAa,CAAC,QAAQ,OAAA,CAAQ,UAAU,IAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA,CAAE,CAAA;AAAA,EAC3E,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,CAAC,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAA,EAAI,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,EAAI,CAAA,OAAA,EAAU,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AACnF,IAAA,UAAA,GAAa,CAAC,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAA,EAAI,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,eAAA,GAAkB,YAAY,kBAAkB,CAAA;AACtD,EAAA,IAAI,WAA4B,EAAC;AACjC,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,GAAA,CAAI,WAAA,CAAY,iBAAA,EAAmB,UAAU,CAAA;AAAA,EAChE,CAAA,CAAA,MAAQ;AACN,IAAA,QAAA,GAAW,EAAC;AAAA,EACd;AACA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,MAAM,gBAAA,CAAiB,GAAA,EAAK,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,IAAI,EAAC;AAC7F,EAAA,eAAA,CAAgB,IAAA,EAAK;AAKrB,EAAA,MAAM,sBAAsB,YAA6B;AACvD,IAAA,MAAM,EAAA,GAAK,MAAM,GAAA,CAAK,YAAA,CAAa,UAAU,IAAI,CAAA;AACjD,IAAA,IAAI,QAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,MAAA,IAAU,QAAQ,UAAA,EAAY;AACrE,MAAA,MAAM,GAAA,CACH,KAAA,CAAM,EAAA,EAAI,cAAA,EAAgB,EAAE,GAAA,EAAK,OAAA,CAAQ,UAAA,EAAY,OAAA,EAAS,QAAQ,MAAA,CAAO,IAAA,EAAM,CAAA,CACnF,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,OAAA,GAAU,KAAA;AAGd,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,KAAA,GAAkE,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC5F,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,OAAO,CAAA,CAAE;AAAA,KACX,CAAE,CAAA;AACF,IAAA,KAAA,CAAM,KAAK,EAAE,KAAA,EAAO,4BAAA,EAAyB,KAAA,EAAO,MAAM,CAAA;AAC1D,IAAA,MAAM,aACJ,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,SACjC,CAAA,EAAG,OAAA,CAAQ,MAAA,CAAO,IAAI,IAAI,WAAA,CAAY,OAAA,CAAQ,UAAA,IAAc,EAAE,CAAC,CAAA,CAAA,GAC/D,QAAA;AACN,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA;AAAA,MACvB,CAAA,EAAGA,GAAE,IAAI,CAAA,EAAG,aAAa,kBAAkB,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,GAAE,IAAI,CAAA,EAAG,UAAU,CAAA,EAAGA,EAAAA,CAAE,KAAK,KAAKA,EAAAA,CAAE,GAAG,CAAA,gCAAA,EAAmBA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAAA,MAC5H;AAAA,KACF;AACA,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,QAAA,GAAW,MAAA;AACX,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,QAAA,GAAW,MAAM,mBAAA,EAAoB;AACrC,MAAA,WAAA,GAAc,QAAA,CAAS,CAAC,CAAA,EAAG,EAAA;AAAA,IAC7B;AAAA,EACF,CAAA,MAAO;AACL,IAAA,QAAA,GAAW,MAAM,mBAAA,EAAoB;AAAA,EACvC;AAKA,EAAA,WAAS;AACP,IAAA,MAAM,cAAA,CAAe,KAAK,GAAA,EAAK,QAAA,EAAU,YAAY,OAAA,EAAS,OAAA,EAAS,SAAS,WAAW,CAAA;AAC3F,IAAA,WAAA,GAAc,QAAA;AACd,IAAA,QAAA,GAAW,MAAM,mBAAA,EAAoB;AAIrC,IAAA,MAAM,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,kBAAA,EAAoB,WAAW,CAAA;AACzD,IAAA,OAAA,GAAU,KAAA;AAAA,EACZ;AACF;AAGA,SAAS,WAAA,CAAY,CAAA,EAAW,GAAA,GAAM,EAAA,EAAY;AAChD,EAAA,OAAO,CAAA,CAAE,SAAS,GAAA,GAAM,QAAA,GAAM,EAAE,KAAA,CAAM,EAAE,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,CAAA;AACtD;AAOA,eAAe,iBAAA,CAAkB,KAAU,MAAA,EAA+C;AACxF,EAAA,MAAM,UAAA,GAAa,gBAAA;AACnB,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA;AAAA,IAC/C,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,CAAC,CAAA,EAAG,YAAA,IAAgB,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,EAAG,YAAA,IAAgB,CAAA;AAAA,GAC/D;AACA,EAAA,MAAM,QAA2D,QAAA,CAAS,GAAA,CAAI,CAAC,CAACH,IAAAA,EAAK,CAAC,CAAA,MAAO;AAAA,IAC3F,KAAA,EAAO,WAAA,CAAYA,IAAAA,EAAK,EAAE,CAAA;AAAA,IAC1B,MAAM,CAAA,EAAG,YAAA,GAAe,aAAa,CAAA,CAAE,YAAA,GAAe,GAAI,CAAA,GAAI,EAAA;AAAA,IAC9D,KAAA,EAAOA;AAAA,GACT,CAAE,CAAA;AACF,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,uBAAA,EAAqB,MAAA,CAAO,IAAI,CAAA,MAAA,CAAA,EAAK,IAAA,EAAM,kBAAA,EAAoB,KAAA,EAAO,UAAA,EAAY,CAAA;AACtG,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA;AAAA,IACvB,GAAGG,EAAAA,CAAE,IAAI,GAAG,YAAA,CAAa,CAAA,WAAA,EAAc,OAAO,IAAI,CAAA,CAAE,CAAC,CAAA,EAAGA,GAAE,KAAK,CAAA,EAAA,EAAKA,GAAE,GAAG,CAAA,gCAAA,EAAmBA,GAAE,KAAK,CAAA,CAAA;AAAA,IACnG;AAAA,GACF;AACA,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,MAAA,KAAW,YAAY,OAAO,MAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,MAAA;AAAA,IACtB,CAAA,aAAA,EAAgB,OAAO,IAAI,CAAA,+BAAA,CAAA;AAAA,IAC3B;AAAA,GACF;AACA,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,CAAC,QAAQ,UAAA,CAAW,GAAG,KAAK,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACxD,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,4CAAA,EAA+CA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,gBAAgB,CAAA,EAAiB;AACxC,EAAA,OAAO,CAAA,EAAG,MAAA,KAAW,IAAA,IAAQ,CAAA,EAAG,UAAU,MAAA,KAAW,IAAA;AACvD;AASA,eAAe,gBAAA,CACb,KACA,OAAA,EACwD;AACxD,EAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,IACb,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,KAAM;AACvB,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,IAAI;AAGF,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,YAAY,CAAA,CAAE,EAAA,EAAI,IAAI,MAAM,CAAA;AACnD,QAAA,MAAM,MAAA,GAAS,IAAA,CACZ,MAAA,CAAO,CAAC,CAAA,KAAW,EAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,CAAC,gBAAgB,CAAC,CAAC,CAAA,CACrF,GAAA,CAAI,CAAC,CAAA,MAAY,EAAE,EAAA,EAAI,CAAA,CAAE,UAAA,IAAc,CAAA,EAAG,IAAA,EAAM,WAAA,CAAY,CAAA,CAAE,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,IAAO,CAAE,CAAA,CACrG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,MAAA,GAAS,CAAC,CAAA,CAC/B,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA,CAAE,CAAC,CAAA;AAChC,QAAA,IAAI,MAAA,YAAkB,MAAA,CAAO,IAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,KAAA,GAAQ,OAAA,GACV,OAAA,CAAQ,MAAA,GAAS,EAAA,GACf,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,QAAA,GACvB,OAAA,GACF,iBAAA;AACJ,MAAA,MAAM,OAAO,CAAA,CAAE,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,UAAU,CAAA,GAAI,EAAA;AACzD,MAAA,MAAM,IAAA,GAAO,CAAC,CAAA,CAAE,EAAA,CAAG,MAAM,CAAA,EAAG,CAAC,CAAA,EAAG,IAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,QAAK,CAAA;AAChE,MAAA,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,OAAO,IAAA,EAAK;AAAA,IACjC,CAAC;AAAA,GACH;AACF;AAQA,SAAS,aAAA,CAAc,GAAiB,MAAA,EAAqC;AAC3E,EAAA,MAAM,SAAA,GAAA,CAAa,CAAA,CAAE,UAAA,IAAc,EAAA,EAAI,IAAA,EAAK;AAC5C,EAAA,MAAM,KAAA,GAAA,CACH,EAAE,KAAA,IAAS,EAAA,EAAI,MAAK,IACrB,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,KACnB,SAAA,GAAY,UAAU,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAACA,EAAAA,KAAMA,EAAAA,CAAE,WAAA,EAAa,CAAA,GAAI,UAAA,CAAA;AAC3F,EAAA,MAAM,MAAA,GAAA,CAAU,CAAA,CAAE,UAAA,IAAc,EAAA,EAAI,IAAA,EAAK;AACzC,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,MAAA,EAAM,MAAM,CAAA,CAAA,GAAK,KAAA;AAC3C;AAGA,SAAS,aAAa,WAAA,EAA6B;AACjD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,GAAO,WAAA;AACjC,EAAA,IAAI,IAAA,GAAO,IAAI,OAAO,UAAA;AACtB,EAAA,IAAI,IAAA,GAAO,MAAM,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAC,CAAA,KAAA,CAAA;AAChD,EAAA,IAAI,IAAA,GAAO,OAAO,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,IAAI,CAAC,CAAA,KAAA,CAAA;AACnD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,CAAC,CAAA,KAAA,CAAA;AACpC;AASA,SAAS,aAAa,CAAA,EAAiB;AACrC,EAAA,MAAM,KAAK,CAAA,EAAG,UAAA;AACd,EAAA,IAAI,MAAM,OAAA,CAAQ,EAAE,CAAA,EAAG,OAAO,GAAG,MAAA,GAAS,CAAA;AAC1C,EAAA,IAAI,OAAO,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,CAAA,GAAI,GAAG,IAAA,EAAK;AAClB,IAAA,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,KAAM,UAAU,CAAA,KAAM,IAAA;AAAA,EAC/C;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,YAAY,OAAA,EAA0B;AAC7C,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,QACJ,GAAA,CAAI,CAAC,CAAA,KAAY,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,OAAO,CAAA,EAAG,SAAS,QAAA,GAAW,CAAA,CAAE,OAAO,EAAG,CAAA,CACvF,KAAK,EAAE,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,EAAA;AACT;AAGA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AACzB,EAAA,IAAI,IAAA,CAAK,KAAK,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,SAAS,GAAG,OAAO,IAAA;AACrD,EAAA,MAAM,OAAO,CAAC,GAAG,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,cAAc,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,EAAE,CAAC,CAAA;AAClF,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI,KAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,IAAA,KAAS,QAAQ,OAAO,IAAA;AACzD,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa,OAAO,aAAa,IAAI,CAAA;AACvD,EAAA,OAAO,KAAA;AACT;AAGA,eAAe,YAAA,CAAa,GAAA,EAAgB,QAAA,EAAkB,GAAA,EAAyB;AACrF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,EAAU,GAAG,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAQ,IAAA,CACX,MAAA;AAAA,IACC,CAAC,CAAA,KACC,CAAA,CAAE,QAAA,EAAU,gBACZ,CAAA,CAAE,IAAA,KAAS,MAAA,IACV,CAAA,CAAE,SAAS,WAAA,IAAe,WAAA,CAAY,CAAA,CAAE,OAAO,EAAE,IAAA;AAAK,GAC3D,CACC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,UAAA,IAAc,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,CAAA;AAC3D,EAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,mCAAA,EAAyB,MAAM,MAAM,CAAA,QAAA,EAAW,KAAA,CAAM,MAAA,KAAW,IAAI,EAAA,GAAK,GAAG,CAAA,aAAA,EAAMA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC9G,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA,EAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,kCAAA,EAAgCA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC5F,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,UAAU,YAAA,EAAc;AAC5B,MAAA,iBAAA;AAAA,QACE,GAAA;AAAA,QACA,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA;AAAA,QAC/B,OAAO,CAAA,CAAE,QAAA,CAAS,UAAU,WAAA,CAAY,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA,QAClD,CAAA,CAAE,SAAS,EAAA,KAAO;AAAA,OACpB;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,CAAE,OAAO,EAAE,IAAA,EAAK;AACzC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,GAAA,CAAI,iBAAiB,IAAI,CAAA;AAAA,SAC3C,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,EAC/B;AACF;AAEA,eAAe,cAAA,CACb,KACA,GAAA,EACA,QAAA,EACA,YACA,OAAA,EACA,OAAA,EACA,SACA,mBAAA,EACe;AAKf,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,KAAS,QAAA;AAChC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,EAAQ,IAAA,IAAQ,oBAAA;AAI3C,EAAA,MAAM,QAAA,GAAW,IAAI,eAAA,CAAgB,GAAA,EAAK,UAAU,OAAO,CAAA;AAC3D,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,KAAK,QAAA,CAAS,YAAA,EAAa,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,CAAI,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACpF,CAAA;AACA,EAAA,MAAM,IAAA,GAAwB,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,WAAA,kBAAa,IAAI,GAAA,EAAI,EAAG,SAAA,kBAAW,IAAI,GAAA,EAAI,EAAE;AAO/F,EAAA,IAAI,IAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,IAAA,GAAyB,IAAA;AAC7B,EAAA,IAAI,GAAA,GAAyB,IAAA;AAC7B,EAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,EAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,EAAM,iBAAA,EAAkB;AAIxD,EAAA,MAAM,cAAA,GAAiB,MAAM,aAAA,CAAc,GAAA,EAAK,QAAQ,CAAA;AACxD,EAAA,KAAA,MAAW,KAAK,cAAA,CAAe,UAAA,EAAY,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAA;AACjE,EAAA,KAAA,MAAW,KAAK,cAAA,CAAe,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9D,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,IAAA,CAAK,QAAQ,cAAA,CAAe,KAAA;AAC5B,IAAA,GAAA,CAAI,QAAA,CAAS,eAAe,KAAK,CAAA;AAAA,EACnC;AACA,EAAA,GAAA,CAAI,aAAA,CAAc,CAAC,CAAA,KAAa;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,aAAA,CAAc,GAAA,EAAK,UAAU,IAAI,CAAA;AAAA,EACnC,CAAC,CAAA;AAID,EAAA,aAAA,CAAc,GAAA,EAAK,UAAU,IAAI,CAAA;AAUjC,EAAA,MAAM,SAAA,GAAY,YAAY,qBAAqB,CAAA;AAGnD,EAAA,IAAI,IAAA,GAAO,KAAA;AAIX,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,SAAoD,EAAC;AAC3D,EAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAIjC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAG5C,EAAA,IAAI,QAAA,GAA2D,IAAA;AAC/D,EAAA,IAAI,eAAA,GAAkB,KAAA;AAMtB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAUpC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAI5C,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,GAAA,CAAI,SAAA,CAAU,QAAA,EAAU,SAAA,GAAY,OAAO,CAAA;AAC3C,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,KAAA,MAAW,CAAA,IAAK,WAAA,CAAY,MAAA,EAAO,EAAG,KAAA,GAAQ,CAAA;AAC9C,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,EAC5B,CAAA;AAMA,EAAA,IAAI,KAAA,GAAiC,UAAA;AACrC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,QAAA,GAAY,MAAM,GAAA,CAAI,KAAA,CAAM,UAAU,iBAAiB,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAG/E,IAAA,MAAM,kBAAA,GAAqB,2BAAA,CAA4B,QAAA,EAAU,SAAS,CAAA;AAC1E,IAAA,IAAI,kBAAA,KAAuB,OAAA,CAAQ,QAAA,CAAS,UAAA,EAAY,KAAA,GAAQ,UAAA;AAAA,EAClE;AAEA,EAAA,IAAI,CAAC,MAAA,EAAQ;AAIX,IAAA,MAAM,gBAAA,GAAmB,kBAAA;AAAA,MACtB,MAAM,WAAA,CAAY,GAAA,EAAK,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA,IAAM;AAAA,QACzE,QAAA,EAAU,OAAA;AAAA,QACV,EAAA,EAAI,QAAQ,QAAA,CAAS;AAAA;AACvB,KACF;AACA,IAAA,IAAA,GAAO,IAAI,gBAAA,CAAiB;AAAA,MAC1B,GAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA,EAAa,OAAA;AAAA,MACb,IAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,QAAA,EAAU,mBAAA,CAAoB,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAC9C,UAAA,EAAY,GAAG,gBAAgB,CAAA,WAAA,CAAA;AAAA,QAC/B,UAAA,EAAY,aAAA;AAAA,QACZ;AAAA,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,KAAW;AAC5B,UAAA,GAAA,CAAI,KAAA,CAAM,aAAA,CAAc,IAAI,CAAC,CAAA;AAE7B,UAAA,IAAI,QAAQ,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,GAAA,CAAI,MAAM,CAAC,CAAA;AAC/C,UAAA,cAAA,EAAe;AAAA,QACjB,CAAA;AAAA,QACA,WAAA,EAAa,CAAC,OAAA,EAAkB,KAAA,KAAqC;AACnE,UAAA,IAAI,OAAA,EAAS;AAGX,YAAA,MAAA,EAAQ,SAAS,UAAU,CAAA;AAE3B,YAAA,IAAA,EAAM,gBAAA,EAAiB;AAAA,UACzB,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,KAAA;AAAA,cACF,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,qBAAA,EAAmB,KAAA,EAAO,WAAA,GAAc,CAAA,EAAA,EAAK,KAAA,CAAM,WAAW,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,sEAAA,EAAoEA,GAAE,KAAK,CAAA;AAAA,aAC9J;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,cAAA,EAAgB,CAAC,MAAA,KAAmB;AAClC,UAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,YAAA,GAAA,CAAI,KAAA;AAAA,cACF,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,0HAAA,EAAmHA,GAAE,KAAK,CAAA;AAAA,aACvI;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,cAAc,MAAM;AAClB,UAAA,GAAA,CAAI,KAAA;AAAA,YACF,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,6GAAA,EAAsGA,GAAE,KAAK,CAAA;AAAA,WAC1H;AAAA,QACF,CAAA;AAAA,QACA,QAAA,EAAU,CAAC,EAAA,EAAI,OAAA,KAAY;AAQzB,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,IAAI,CAAC,YAAY,GAAA,CAAI,EAAE,GAAG,WAAA,CAAY,GAAA,CAAI,IAAI,OAAO,CAAA;AAAA,UACvD,CAAA,MAAO;AACL,YAAA,WAAA,CAAY,OAAO,EAAE,CAAA;AAAA,UACvB;AACA,UAAA,aAAA,EAAc;AAAA,QAChB,CAAA;AAAA,QACA,YAAA,EAAc,CAAC,KAAA,EAAO,OAAA,KAAY;AAMhC,UAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,YAAA,IAAI,OAAA,IAAW,CAAA,EAAG,GAAA,CAAI,YAAA,CAAa,KAAK,CAAA;AAAA,UAC1C,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,aAAa,IAAI,CAAA;AAAA,UACvB;AAAA,QACF,CAAA;AAAA,QACA,eAAA,EAAiB,OAAO,GAAA,EAAK,OAAA,EAAS,IAAA,KAAS;AAG7C,UAAA,OAAO,GAAA,CAAI,QAAA;AAAA,YACT,CAAA,EAAG,OAAO,CAAA,EAAG,GAAA,CAAI,iBAAA,GAAoB;AAAA,KAAA,EAAU,GAAA,CAAI,iBAAiB,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,YAC3E;AAAA,WACF;AAAA,QACF;AAAA;AACF,KACD,CAAA;AACD,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA;AACZ,IAAA,GAAA,GAAM,IAAA,CAAK,GAAA;AACX,IAAA,MAAA,GAAS,IAAA,CAAK,MAAA;AAAA,EAChB;AAOA,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,GAAA,EAAK,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA,IAI9C,SAAS,CAAC,IAAA,EAAM,QAAQ,GAAA,CAAI,mBAAA,CAAoB,MAAM,GAAG,CAAA;AAAA,IACzD,kBAAkB,CAAC,IAAA,EAAM,QAAQ,GAAA,CAAI,mBAAA,CAAoB,MAAM,GAAG,CAAA;AAAA,IAClE,iBAAiB,MAAM;AAAA,IAAC,CAAA;AAAA,IACxB,OAAA,EAAS,CAAC,SAAA,EAAW,IAAA,KAAS;AAC5B,MAAA,IAAI,SAAA,KAAc,YAAA,IAAgB,OAAO,IAAA,EAAM,iBAAiB,QAAA,EAAU;AACxE,QAAA,OAAA,GAAU,IAAA,CAAK,YAAA;AACf,QAAA,aAAA,EAAc;AAAA,MAChB,CAAA,MAAA,IAAW,SAAA,KAAc,mBAAA,IAAuB,IAAA,EAAM,EAAA,EAAI;AACxD,QAAA,WAAA,CAAY,IAAI,IAAA,CAAK,EAAA,EAAI,KAAK,QAAA,IAAY,IAAA,CAAK,QAAQ,SAAS,CAAA;AAChE,QAAA,aAAA,EAAc;AAAA,MAChB,CAAA,MAAA,IAAW,SAAA,KAAc,gBAAA,IAAoB,IAAA,EAAM,EAAA,EAAI;AACrD,QAAA,WAAA,CAAY,MAAA,CAAO,KAAK,EAAE,CAAA;AAC1B,QAAA,aAAA,EAAc;AAAA,MAChB,CAAA,MAAA,IAAW,SAAA,KAAc,cAAA,IAAkB,IAAA,EAAM;AAC/C,QAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAIA,OAAA,EAAS,CAAC,GAAA,KAAgB;AACxB,MAAA,IAAI,mBAAA,CAAoB,GAAG,CAAA,EAAG,KAAK,aAAa,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IAChE;AAAA,GACD,CAAA;AAUD,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAA2E;AAGvG,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,MAAM,gBAAA,GAAmB,IACtB,UAAA,EAAW,CACX,KAAK,CAAC,IAAA,KAAS,KAAK,OAAA,CAAQ,CAAC,MAAM,WAAA,CAAY,GAAA,CAAI,EAAE,IAAA,EAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA,CACpE,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AAKjB,EAAA,MAAM,aAAA,GAAgB,MACpB,GAAA,CAAI,YAAA;AAAA,IACF,CAAC,GAAG,eAAA,CAAgB,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,CAAC,CAAA,KAAM;AAC9C,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,SAAA,CAAU,EAAE,KAAK,CAAA,CAAE,cAAA;AAC9C,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,EAAE,KAAK,CAAA,EAAG,MAAA,GAAS,CAAA,QAAA,EAAM,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,IAC1F,CAAC;AAAA,GACH;AAIF,EAAA,MAAM,cAAc,IAAI,gBAAA,CAAiB,GAAA,EAAK,MAAM,eAAe,CAAA;AAInE,EAAA,MAAM,qBAAqB,YAAY;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA;AACN,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AAC7C,MAAA,eAAA,CAAgB,KAAA,EAAM;AACtB,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AAKpB,QAAA,MAAM,MAAA,GAAA,CAAU,CAAA,CAAE,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK;AACrC,QAAA,IAAI,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,YAAA,EAAc;AAKlD,QAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAChD,QAAA,eAAA,CAAgB,GAAA,CAAI,EAAE,EAAA,EAAI;AAAA,UACxB,KAAA,EAAO,aAAA,CAAc,CAAA,EAAG,WAAW,CAAA;AAAA,UACnC,cAAA,EAAgB,iBAAiB,aAAA,KAAkB,SAAA,GAAY,cAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAAA,UAC5F,SAAA,EAAW,EAAE,UAAA,IAAc,KAAA;AAAA,SAC5B,CAAA;AAAA,MACH;AAEA,MAAA,WAAA,CAAY,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA;AACvC,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,cAAA,GAAuD,IAAA;AAC3D,EAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,gBAAA,GAAmB,IAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,cAAA,GAAiB,WAAW,YAAY;AACtC,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,gBAAA,GAAmB,KAAA;AACnB,QAAA,iBAAA,EAAkB;AAAA,MACpB;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,GAAA,EAAK;AAAA,IACnC,MAAA,EAAQ,MAAM,iBAAA,EAAkB;AAAA,IAChC,eAAA,EAAiB,CAAC,CAAA,KAAM;AACtB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,QAAA,EAAU,iBAAA,EAAkB;AAAA,IAC/C,CAAA;AAAA,IACA,eAAA,EAAiB,CAAC,CAAA,KAAM;AACtB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,QAAA,EAAU,iBAAA,EAAkB;AAAA,IAC/C,CAAA;AAAA,IACA,eAAA,EAAiB,CAAC,EAAA,KAAO;AACvB,MAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAA,EAAG,iBAAA,EAAkB;AAAA,IACjD;AAAA,GACD,CAAA;AAKD,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,IAAI,eAAA,CAAgB,IAAA,GAAO,CAAA,EAAG,iBAAA,EAAkB;AAAA,EAClD,GAAG,GAAI,CAAA;AACP,EAAA,aAAA,CAAc,KAAA,EAAM;AAKpB,EAAA,IAAI,UAAA;AACJ,EAAA,MAAM,eAAe,IAAI,OAAA,CAAc,CAAC,CAAA,KAAO,aAAa,CAAE,CAAA;AAE9D,EAAA,MAAM,OAAO,YAAY;AACvB,IAAA,GAAA,CAAI,GAAA,EAAI;AASR,IAAA,MAAMkB,QAAAA,GAAW,QAAQ,OAAA,IAAW,KAAA,GAChC,IAAI,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,GACjC,OAAA,CAAQ,OAAA,EAAQ;AACpB,IAAA,MAAMC,aAAAA,GAAe,IAAA,GAAO,IAAA,CAAK,qBAAA,EAAsB,CAAE,KAAA,CAAM,MAAM,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAC3F,IAAA,MAAA,EAAQ,KAAA,EAAM;AACd,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,WAAA,CAAY,QAAA,EAAS;AACrB,IAAA,GAAA,EAAK,QAAA,EAAS;AACd,IAAA,MAAM,GAAGC,OAAM,CAAA,GAAI,MAAM,QAAQ,IAAA,CAAK;AAAA,MACpC,OAAA,CAAQ,GAAA,CAAI,CAACF,QAAAA,EAASC,aAAY,CAAC,CAAA;AAAA,MACnC,IAAI,OAAA,CAA2B,CAAC,CAAA,KAAM,UAAA,CAAW,MAAM,CAAA,CAAE,CAAC,MAAA,EAAW,CAAC,CAAC,CAAA,EAAG,IAAI,CAAC;AAAA,KAChF,CAAA;AACD,IAAA,QAAA,CAASC,OAAM,CAAA;AACf,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA;AACA,EAAA,GAAA,CAAI,eAAe,IAAI,CAAA;AAKvB,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,gBAAA,CAAiB,IAAI,MAAM,CAAA;AAC3B,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,gBAAgB,EAAE,CAAA;AAC1D,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGpB,EAAAA,CAAE,IAAI,CAAA,8CAAA,EAA4CA,EAAAA,CAAE,IAAI,CAAA,EAAG,YAAY,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,oCAAA,EAAuCA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACvJ,IAAA,MAAM,IAAA,EAAK;AAAA,EACb,CAAA;AACA,EAAA,MAAM,KAAA,GAAmB;AAAA,IACvB,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC1B,IAAA,EAAM,OAAO,EAAA,KAAe;AAC1B,MAAA,IAAI,CAAC,IAAA,EAAM;AAIT,QAAA,GAAA,CAAI,KAAA;AAAA,UACF,GAAGA,EAAAA,CAAE,IAAI,wBAAwB,UAAU,CAAA,8DAAA,EAA4DA,GAAE,KAAK,CAAA;AAAA,SAChH;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAK,OAAA,CAAQ,oBAAA,EAAsB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAC/D,MAAA,cAAA,EAAe;AAAA,IACjB;AAAA,GACF;AAKA,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,UAAA,EAAY,MAAM,cAAA,EAAe;AAAA,IACjC,cAAA,EAAgB,MAAM,GAAA,EAAK,cAAA,MAAoB,EAAC;AAAA,IAChD,OAAA,EAAS,MAAM,GAAA,EAAK,OAAA,MAAa,EAAE,OAAA,EAAS,EAAC,EAAE;AAAA,IAC/C,OAAA,EAAS,OAAO,GAAA,KAAQ;AACtB,MAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,2CAAA,EAA4C;AACjF,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AACpC,QAAA,iBAAA,EAAkB;AAClB,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,MAAM,MAAA,EAAO;AAAA,MAChD,SAAS,CAAA,EAAG;AACV,QAAA,iBAAA,EAAkB;AAClB,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,MACxE;AAAA,IACF,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,IAAA,KAAS;AACpB,MAAA,GAAA,EAAK,WAAW,IAAI,CAAA;AACpB,MAAA,iBAAA,EAAkB;AAAA,IACpB,CAAA;AAAA,IACA,GAAA,EAAK,OAAO,GAAA,KAAQ;AAClB,MAAA,aAAA,CAAc,GAAG,CAAA;AACjB,MAAA,OAAO,MAAA,CAAO,QAAQ,GAAG,CAAA;AAAA,IAC3B,CAAA;AAAA;AAAA;AAAA;AAAA,IAIA,cAAA,EAAgB,CAAC,KAAA,KAAU;AACzB,MAAA,KAAK,OAAA;AAAA,QACH,iCAAiC,KAAK,CAAA,sEAAA;AAAA,OACxC;AAAA,IACF,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChB,MAAA,GAAA,EAAK,WAAW,IAAI,CAAA;AACpB,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,iBAAA,EAAkB;AAAA,IACpB,CAAA;AAAA,IACA,YAAY,CAAC,IAAA,EAAM,OAAA,KAAY,mBAAA,CAAoB,MAAM,OAAO;AAAA,GAClE;AAOA,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAA,CACb,EAAE,aAAa,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,MAAA,EAAO,EAAG,IAAI,CAAA,IAAK,KAAA;AACnG,EAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,KACrB,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,IAAA,EAAM,CAAA,MAAA,EAAS,GAAA,CAAI,GAAG,IAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,QAAA,EAAU,IAAI,IAAA,EAAM,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,CAAE,CAAA;AAE5G,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAc,MAAA,GAAwB,EAAC,KAAM;AAClE,IAAA,QAAA,GAAW,EAAE,MAAM,MAAA,EAAO;AAC1B,IAAA,GAAA,CAAI,iBAAiB,IAAI,CAAA;AAGzB,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,WAAA,CAAY,IAAI,GAAA,EAAA,CAAM,WAAA,CAAY,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,WAAA,CAAY,QAAA,EAAU,IAAA,EAAM,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,IAC7D,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,CAAA,GAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,KAAK,CAAA,IAAK,CAAA;AACxC,MAAA,IAAI,CAAA,GAAI,CAAA,EAAG,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,WAC5B,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,mBAAmB,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC3F,MAAA;AAAA,IACF;AACA,IAAA,YAAA,GAAe,KAAA;AACf,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,EACrB,CAAA;AAOA,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,GAAa,cAAA;AACzC,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,MAAM,cAAA,GAAiB,OAAO,OAAA,KAAoB;AAChD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,kDAAA,EAAgDA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC3E,MAAA;AAAA,IACF;AACA,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,OAAO,IAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,WAAA,EAAc,UAAU,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC/E,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,UAAA,CAAW,UAAU,OAAO,CAAA;AAGlD,MAAA,IAAI,GAAA,CAAI,SAAA,EAAW,QAAA,CAAS,GAAA,CAAI,IAAI,SAAS,CAAA;AAC7C,MAAA,iBAAA,CAAkB,GAAA,EAAK,OAAA,EAAS,GAAA,CAAI,EAAA,GAAK,GAAA,CAAI,MAAA,IAAU,EAAA,GAAK,GAAA,CAAI,KAAA,IAAS,gBAAA,EAAkB,GAAA,CAAI,EAAA,EAAI,UAAU,CAAA;AAAA,IAC/G,SAAS,CAAA,EAAG;AACV,MAAA,iBAAA,CAAkB,GAAA,EAAK,OAAA,EAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,UAAU,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,EAAO,UAAU,CAAA;AAAA,IAC/F,CAAA,SAAE;AACA,MAAA,WAAA,GAAc,KAAA;AAAA,IAChB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA;AAC9B,IAAA,GAAA,CAAI,eAAe,CAAC,CAAA;AACpB,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ,MAAM,QAAQ,CAAA,CAAE,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,EACxD,CAAA;AAMA,EAAA,MAAM,oBAAoB,YAAY;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAAA,IAC5B,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,MAAA,EAAIA,GAAE,KAAK,CAAA,4BAAA,EAAgC,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACtF;AAAA,EACF,CAAA;AAKA,EAAA,MAAM,oBAAoB,YAAY;AACpC,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,0BAAA,EAAwBA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,WAAA,CAAY,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,IAAO,iCAAA;AAC5B,IAAA,OAAA,CAAQ,MAAM,CAAA;AACd,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,MAAM,SAAA,GACF,CAAA,EAAGA,EAAAA,CAAE,IAAI,8DAAyDA,EAAAA,CAAE,KAAK,CAAA,CAAA,GACzE,CAAA,EAAGA,GAAE,IAAI,CAAA,cAAA,EAAY,MAAM,CAAA,uCAAA,EAAqCA,GAAE,KAAK,CAAA;AAAA,KAC7E;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAsB;AACrC,IAAA,MAAM,CAAA,GAAI,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA,EAAG,IAAI,CAAA,GAAI,GAAA;AAC5C,IAAA,OAAO,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA,CAAA,CAAG,CAAA,GAAI,EAAA,IAAM,EAAE,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAAA,EAChD,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KACf,OAAO,EAAE,YAAA,KAAiB,QAAA,IAAY,EAAE,YAAA,KAAiB,CAAA,GACrD,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,YAAY,CAAA,GAAI,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GAC/C,IAAA;AAKN,EAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAA4B;AACtD,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK;AAC9B,MAAA,IAAI,CAAA,GAAI,CAAA,CAAE,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,WAAA,IAC1C,CAAA,KAAM,CAAA,CAAE,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAG,aAAa,QAAG,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,WACxE,IAAA,CAAK,KAAK,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,IAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACtC;AACA,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,EAAA;AAAA,MACA,CAAA,EAAGA,GAAE,IAAI,CAAA,EAAG,aAAa,+BAA0B,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAAA,MAC9D,EAAA;AAAA,MACA,CAAA,EAAG,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,GAAA,EAAMA,EAAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,OAAO,WAAW,CAAA,CAAE,OAAA,KAAY,IAAI,EAAA,GAAK,GAAG,CAAA,OAAA,EAAUA,EAAAA,CAAE,KAAK,CAAA;AAAA,KAChH;AACA,IAAA,IAAI,EAAE,UAAA,EAAY;AAChB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,yCAAA,EAA4C,OAAA,CAAQ,EAAE,QAAQ,CAAC,CAAA,eAAA,EAAkBA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAAA,QACnG,CAAA,EAAGA,GAAE,MAAM,CAAA,+BAAA,EAAkC,OAAO,CAAA,QAAA,EAAMA,EAAAA,CAAE,IAAI,CAAA,EAAG,IAAI,iBAAiBA,EAAAA,CAAE,KAAK,GAAGA,EAAAA,CAAE,MAAM,KAAK,EAAE,CAAA,CAAA,EAAIA,GAAE,KAAK,CAAA;AAAA,OAC9H;AAAA,IACF,WAAW,IAAA,EAAM;AACf,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA,0BAAA,EAAwBA,EAAAA,CAAE,IAAI,CAAA,EAAG,IAAI,CAAA,YAAA,EAAeA,EAAAA,CAAE,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACvG,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA,wDAAA,CAAqD,CAAA;AAAA,IAC9F;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB,CAAA;AAIA,EAAA,MAAM,YAAA,GAAe,OAAO,IAAA,GAA2B,EAAC,KAAM;AAC5D,IAAA,IAAI,eAAA,EAAiB;AACrB,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAI;AAIF,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,GAAA,CAAI,KAAA;AAAA,UACF,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,4FAAA,EAA0FA,GAAE,KAAK,CAAA;AAAA,SAC9G;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,IAAI,CAAC,KAAA,EAAO;AAEV,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,WAAA,CAAY,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC7D,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,IAAO,iCAAA;AAC5B,QAAA,GAAA,CAAI,KAAA;AAAA,UACF,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,uIAAA,EACyDA,GAAE,KAAK,CAAA;AAAA,SAC3E;AACA,QAAA,OAAA,CAAQ,MAAM,CAAA;AACd,QAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,iBAAY,MAAM,CAAA,oBAAA,EAAuBA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACrE,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,GAAA,EAAK;AAC9B,QAAA,GAAA,CAAI,KAAA;AAAA,UACF,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,yBAAA,EAA4B,MAAM,GAAG,CAAA,iBAAA,EAAoB,KAAA,CAAM,GAAA,KAAQ,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,EAAIA,GAAE,KAAK;AAAA,EACpGA,EAAAA,CAAE,IAAI,CAAA,6EAAA,EAAgFA,EAAAA,CAAE,KAAK,CAAA;AAAA,SACpG;AACA,QAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,KAAA,CAAM,kBAAA,CAAmB,KAAK,CAAC,CAAA;AACnC,MAAA,MAAM,IAAA,GAAO,QAAQ,KAAK,CAAA;AAC1B,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,UAAA,GACvB,CAAA,qBAAA,EAAwB,OAAO,CAAA,YAAA,EAAU,IAAI,CAAA,MAAA,CAAA,GAAW,EAAE,KAC1D,CAAA,OAAA,EAAU,IAAA,GAAO,CAAA,YAAA,EAAU,IAAI,SAAS,yBAAoB,CAAA,CAAA;AAChE,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO,SAAS,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAC,CAAA,kBAAA,CAAA,EAAsB;AAAA,QACpF,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,IAAA,EAAc;AAAA,QAC5C,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,IAAA;AAAc,OAC1C,CAAA;AACD,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,4DAAA,EAA0DA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACtF,QAAA;AAAA,MACF;AACA,MAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,cAAA,EAAYA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACxC,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,MAAM,GAAA,CAAI,eAAA,CAAgB,QAAA,EAAU,MAAM,QAAQ,CAAA;AAAA,MAC9D,SAAS,CAAA,EAAG;AACV,QAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,SAAIA,EAAAA,CAAE,KAAK,CAAA,iBAAA,EAAoB,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAC7F,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,iBAAA,EAAoB,OAAA,EAAS,KAAA,IAAS,eAAe,CAAA,CAAE,CAAA;AACpF,QAAA;AAAA,MACF;AACA,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,IAAY,KAAA,CAAM,QAAA;AACpC,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,GAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,EAAG,YAAA,CAAa,gBAAgB,CAAC,CAAA,iBAAA,EAAoB,CAAA,KAAM,CAAA,GAAI,EAAA,GAAK,GAAG,GAAG,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAEhI,MAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,QAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,gBAAA,EAAcA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC1C,QAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,MAAM,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA,SAAE;AACA,MAAA,eAAA,GAAkB,KAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAIA,EAAA,MAAM,mBAAA,GAAsB,CAAC,GAAA,KAC3B,oGAAA,CAAqG,KAAK,GAAG,CAAA;AAK/G,EAAA,MAAM,SAAA,GAA8B;AAAA,IAClC,IAAA,EAAM,MAAM,GAAA,CAAI,UAAA,EAAW;AAAA,IAC3B,YAAY,CAAC,IAAA,EAAM,YAAY,GAAA,CAAI,eAAA,CAAgB,MAAM,OAAO,CAAA;AAAA,IAChE,MAAA,EAAQ,CAAC,IAAA,KAAS,GAAA,CAAI,YAAY,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,IAItC,cAAA,EAAgB,CAAC,KAAA,KAAU;AACzB,MAAA,KAAK,OAAA;AAAA,QACH,2BAA2B,KAAK,CAAA,6HAAA;AAAA,OAClC;AAAA,IACF;AAAA,GACF;AAKA,EAAA,GAAA,CAAI,WAAA,CAAY;AAAA,IACd;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,oBAAA;AAAA,MACP,IAAA,EAAM,uBAAA;AAAA,MACN,GAAA,EAAK,MAAM,UAAA;AAAW,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,0BAAA;AAAA,MACP,IAAA,EAAM,MAAM,GAAA,CAAI,eAAA,EAAgB,IAAK,iBAAA;AAAA,MACrC,GAAA,EAAK;AAAA,KACP;AAAA,IACA,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mBAAA,EAAqB,MAAM,MAAM,CAAA,MAAA,EAAS,GAAA,CAAI,KAAK,IAAI,GAAA,EAAK,MAAM,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA,EAAE;AAAA,IAClH;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO,mBAAA;AAAA,MACP,MAAM,MAAM;AACV,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,KAAK,SAAA,CAAU,IAAA;AACjD,QAAA,OAAO,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,SAAA,CAAA,GAAc,MAAA;AAAA,MAC/B,CAAA;AAAA,MACA,GAAA,EAAK,MAAM,gBAAA,CAAiB,GAAA,EAAK,IAAA,EAAM,MAAM,aAAA,CAAc,GAAA,EAAK,QAAA,EAAU,IAAI,CAAC;AAAA,KACjF;AAAA;AAAA;AAAA,IAGA,GAAI,MAAA,GACA,EAAC,GACD;AAAA,MACE;AAAA,QACE,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,aAAA;AAAA,QACP,MAAM,MAAM;AACV,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,cAAA,EAAe,CAAE,MAAA;AAClC,UAAA,OAAO,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,UAAA,CAAA,GAAe,MAAA;AAAA,QAChC,CAAA;AAAA,QACA,GAAA,EAAK,MAAM,UAAA,CAAW,GAAA,EAAK,MAAM;AAAA;AACnC,KACF;AAAA,IACJ;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,IAAA,EAAM,uCAAA;AAAA,MACN,KAAK,MAAM,eAAA,CAAgB,GAAA,EAAK,GAAA,EAAK,QAAQ,QAAQ;AAAA,KACvD;AAAA,IACA;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM,MAAO,aAAA,EAAc,CAAE,YAAY,2BAAA,GAA8B,oBAAA;AAAA,MACvE,GAAA,EAAK,MAAM,cAAA,CAAe,GAAA,EAAK,OAAO;AAAA,KACxC;AAAA,IACA;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,IAAA,EAAM,yBAAA;AAAA,MACN,GAAA,EAAK,MAAM,aAAA,CAAc,GAAA,EAAK,SAAS;AAAA,KACzC;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,qBAAA;AAAA,MACP,IAAA,EAAM,sCAAA;AAAA,MACN,GAAA,EAAK,MAAM,iBAAA;AAAkB,KAC/B;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,wBAAA;AAAA,MACP,IAAA,EAAM,2BAAA;AAAA,MACN,GAAA,EAAK,MAAM,YAAA;AAAa,KAC1B;AAAA,IACA,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,sBAAA,EAAwB,IAAA,EAAM,aAAA,EAAe,GAAA,EAAK,MAAM,cAAA,CAAe,GAAA,EAAK,KAAK,CAAA,EAAE;AAAA,IAChH,EAAE,MAAM,aAAA,EAAe,KAAA,EAAO,sBAAsB,GAAA,EAAK,MAAM,eAAA,CAAgB,GAAG,CAAA,EAAE;AAAA,IACpF,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,mBAAA,EAAqB,IAAA,EAAM,2BAAA,EAA6B,GAAA,EAAK,MAAM,gBAAA,CAAiB,GAAG,CAAA,EAAE;AAAA,IAClH,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,MAAM,+BAAA,EAAiC,GAAA,EAAK,MAAM,MAAA,EAAO,EAAE;AAAA,IAChG,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,GAAA,EAAK,MAAM,MAAK;AAAE,GAClD,CAAA;AAMD,EAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,GAAA,EAAK,UAAU,mBAAmB,CAAA;AACpE,EAAA,GAAA,CAAI,WAAW,OAAO,CAAA;AAEtB,EAAA,GAAA,CAAI,QAAA,GAAW,CAAC,IAAA,EAAM,MAAA,KAAW;AAI/B,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,EAAU;AAC/B,IAAA,IAAI,OAAA,CAAQ,WAAW,GAAG,CAAA,IAAK,CAAC,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACxD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACtC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,aAAA,CAAc,GAAA,EAAK,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAC1C,QAAA,KAAK,eAAe,OAAO,CAAA;AAAA,MAC7B;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,QAAQ,UAAA,CAAW,IAAI,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,GAAI,IAAA;AACtE,IAAA,aAAA,CAAc,GAAA,EAAK,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA;AAC9C,IAAA,IAAA,GAAO,QAAA;AACP,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,GAAgB,KAAA;AAChB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAC5B,MAAA,GAAA,CAAI,cAAA,CAAe,OAAO,MAAM,CAAA;AAChC,MAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,iBAAYA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAChD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAC5B,MAAA,GAAA,CAAI,cAAA,CAAe,OAAO,MAAM,CAAA;AAChC,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,iBAAYA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,IAAI,KAAKA,EAAAA,CAAE,GAAG,CAAA,kBAAA,EAAqBA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACxF,CAAA,MAAO;AACL,MAAA,KAAK,OAAA,CAAQ,MAAM,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA;AAEA,EAAA,GAAA,CAAI,cAAc,MAAM;AACtB,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,2EAAA,EAA+DA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC7F,MAAA,KAAK,GAAA,CACF,IAAA,CAAK,QAAQ,CAAA,CACb,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA,CACd,IAAA,CAAK,MAAM,aAAa,CAAA;AAAA,IAC7B,WAAW,IAAA,EAAM;AAEf,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,IAAA,GAAO,KAAA;AACP,MAAA,WAAA,CAAY,KAAA,EAAM;AAClB,MAAA,OAAA,GAAU,CAAA;AACV,MAAA,GAAA,CAAI,WAAW,KAAK,CAAA;AACpB,MAAA,aAAA,EAAc;AACd,MAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,qBAAA,EAAwBA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACtD,MAAA,KAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACxC;AAAA,EACF,CAAA;AAIA,EAAA,GAAA,CAAI,YAAY,MAAM;AACpB,IAAA,KAAK,cAAA,CAAe,GAAA,EAAK,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAChD,CAAA;AAKA,EAAA,GAAA,CAAI,YAAY,MAAM;AACpB,IAAA,IAAI,GAAA,CAAI,UAAS,CAAE,IAAA,MAAU,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,KAAA;AACzD,IAAA,MAAM,CAAA,GAAI,OAAO,GAAA,EAAI;AACrB,IAAA,GAAA,CAAI,cAAA,CAAe,OAAO,MAAM,CAAA;AAChC,IAAA,aAAA,GAAgB,IAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAA,CAAO,OAAA,EAAQ;AACf,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAI,SAAS,CAAC,MAAA,CAAO,OAAA,EAAS,IAAI,EAAC,EAAI,MAAA,CAAO,OAAA,EAAS,CAAC,CAAA;AAI3E,EAAA,MAAM,gBAAgB,MAAA,GAAS,MAAM,MAAA,CAAO,kBAAA,CAAmB,GAAI,CAAA,GAAI,KAAA;AAGvE,EAAA,KAAK,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,MAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AAErE,EAAA,SAAA,CAAU,IAAA,EAAK;AACf,EAAA,GAAA,CAAI,MAAA;AAAA,IACF,MAAA,GACI;AAAA,MACE,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAGA,GAAE,OAAO,CAAA,aAAA,EAAgBA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,mBAAA,EAAiBA,GAAE,KAAK,CAAA,CAAA;AAAA,MAC7E,GAAGA,EAAAA,CAAE,IAAI,CAAA,QAAA,EAAWA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAA,IAAc,GAAG,IAAIA,EAAAA,CAAE,IAAI,MAAM,UAAU,CAAA,EAAGA,GAAE,KAAK,CAAA,CAAA;AAAA,MAC5F,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,QAAA,EAAWA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,6CAAA,EAAgD,OAAO,CAAA,CAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,GAAA,EAAMA,EAAAA,CAAE,IAAI,CAAA,OAAA,EAAUA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,KAC3K,GACA;AAAA,MACE,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAGA,GAAE,OAAO,CAAA,aAAA,EAAgBA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,mBAAA,EAAiBA,GAAE,KAAK,CAAA,CAAA;AAAA,MAC7E,GAAGA,EAAAA,CAAE,IAAI,WAAWA,EAAAA,CAAE,KAAK,IAAI,UAAU,CAAA,CAAA;AAAA,MACzC,GAAGA,EAAAA,CAAE,IAAI,WAAWA,EAAAA,CAAE,KAAK,IAAI,OAAO,CAAA,GAAA,EAAMA,GAAE,IAAI,CAAA,OAAA,EAAUA,GAAE,KAAK,CAAA,CAAA,EAAI,SAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA;AAC7F,GACN;AACA,EAAA,IAAI,CAAC,MAAA,IAAU,OAAA,CAAQ,oBAAA,IAAwB,OAAA,CAAQ,aAAa,OAAA,IAAW,CAAC,aAAA,EAAc,CAAE,SAAA,EAAW;AACzG,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,mCAAA,EAAsCA,EAAAA,CAAE,KAAK,CAAA,2BAAA,EAA8BA,EAAAA,CAAE,GAAG,CAAA,kDAAA,EAAqDA,EAAAA,CAAE,KAAK,CAAA;AAAA,KACtJ;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS,MAAM,YAAA,CAAa,GAAA,EAAK,UAAU,GAAG,CAAA;AAGlD,EAAA,IAAI;AACF,IAAA,CAAC,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,EAAU,GAAG,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,KAAW,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,EAC/E,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,YAAA,GAAA,CAAgB,MAAM,QAAA,CAAS,IAAA,EAAK,EAAG,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA;AACjF,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,OAAA,EAAK,aAAa,MAAM,CAAA,mBAAA,EAAsB,YAAA,CAAa,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,SAAA,EAAYA,GAAE,KAAK,CAAA;AAAA,KACjH;AACA,IAAA,KAAA,MAAW,KAAK,YAAA,EAAc,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAA,EAAK,EAAE,WAAA,IAAe,CAAA,CAAE,OAAO,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACvG;AACA,EAAA,cAAA,EAAe;AAOf,EAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,CAAK,wBAAA,EAAyB,EAAG;AACvD,MAAA,IAAI,IAAI,EAAA,EAAI;AACV,QAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,YAAA,EAAU,IAAI,IAAI,CAAA,WAAA,EAAcA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,CAAA,KAAA,EAAQ,GAAA,CAAI,KAAA,KAAU,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,MAClI,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,YAAA,EAAU,GAAA,CAAI,IAAI,CAAA,SAAA,EAAYA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,MAC3F;AAAA,IACF;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,KAAA,EAAM;AAOV,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAC1C,EAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,EAAA,MAAM,iBAAiB,YAA2B;AAIhD,IAAA,MAAM,QAAA,GAAW,MAAA,KAAW,MAAA,GAAS,CAAC,OAAO,OAAA,GAAU,KAAA,CAAA;AACvD,IAAA,IAAI,CAAC,YAAY,kBAAA,EAAoB;AACrC,IAAA,MAAM,UAAU,oBAAA,CAAqB,MAAM,IAAI,KAAA,CAAM,QAAA,EAAU,oBAAoB,CAAC,CAAA;AACpF,IAAA,IAAI,CAAC,OAAA,IAAW,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC7D,IAAA,kBAAA,GAAqB,IAAA;AACrB,IAAA,IAAI;AAGF,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAM,GAAA,CAAI,QAAA;AAAA,QACnC,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,EAAG,QAAQ,UAAA,GAAa;AAAA,EAAKA,EAAAA,CAAE,IAAI,CAAA,KAAA,EAAQ,OAAA,CAAQ,UAAU,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,GAAK,EAAE;AAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,QAAA,EAAW,OAAA,CAAQ,WAAW,UAAU,CAAA,EAAGA,GAAE,KAAK,CAAA,CAAA;AAAA,QAC5J,OAAA,CAAQ;AAAA,OACV;AACA,MAAA,iBAAA,CAAkB,GAAA,CAAI,QAAQ,YAAY,CAAA;AAC1C,MAAA,MAAM,qBAAA,CAAsB,KAAK,QAAA,EAAU;AAAA,QACzC,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,MAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA,EAAY,KAAK,GAAA;AAAI,OACtB,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,kBAAA,GAAqB,KAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,OAAO,YAAY;AACvB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,EAAU,EAAE,CAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAI,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,UAAA,IAAc,CAAA,KAAM,CAAA,CAAE,cAAc,CAAA,CAAE,CAAA;AACjF,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,SAAS,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA,CAAE,WAAW,SAAA,EAAW;AAClD,MAAA,QAAA,CAAS,GAAA,CAAI,EAAE,EAAE,CAAA;AACjB,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,CAAE,OAAO,EAAE,IAAA,EAAK;AAIzC,MAAA,MAAM,SAAU,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,EAAE,KAAA,IAAU,IAAA;AAC3D,MAAA,IAAI,MAAA,IAAU,mBAAA,CAAoB,MAAM,CAAA,EAAG;AACzC,QAAA,KAAK,YAAA,CAAa,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAChC,QAAA;AAAA,MACF;AAIA,MAAA,IAAI,CAAA,CAAE,UAAU,YAAA,EAAc;AAC5B,QAAA,iBAAA;AAAA,UACE,GAAA;AAAA,UACA,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA;AAAA,UAC/B,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,MAAA,IAAU,IAAI,CAAA;AAAA,UAChC,CAAA,CAAE,SAAS,EAAA,KAAO;AAAA,SACpB;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAE,IAAA,KAAS,WAAA,IAAe,IAAA,EAAM,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,WAAA,IACnD,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,IAAA,MAAU,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,EAAG,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,WAAA,IAClE,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,IAAA,EAAM;AAClC,QAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA;AACzC,QAAA,IAAI,UAAU,CAAA,EAAG;AAEf,UAAA,IAAI,OAAA,KAAY,CAAA,EAAG,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,eACrC,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,OAAA,GAAU,CAAC,CAAA;AAAA,QACxC,CAAA,MAAO;AAEL,UAAA,GAAA,CAAI,iBAAiB,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,WAAW,IAAI,CAAA;AAGlC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAI,CAAC,YAAY,YAAA,GAAe,KAAA;AAChC,MAAA,IAAA,GAAO,KAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,UAAA;AAAA,IACT;AACA,IAAA,GAAA,CAAI,WAAW,IAAI,CAAA;AACnB,IAAA,IAAI,CAAC,IAAA,EAAM;AAET,MAAA,IAAI,WAAA,CAAY,IAAA,EAAM,WAAA,CAAY,KAAA,EAAM;AACxC,MAAA,OAAA,GAAU,CAAA;AACV,MAAA,aAAA,EAAc;AACd,MAAA,IAAI,OAAO,MAAA,GAAS,CAAA,IAAK,CAAC,aAAA,QAAqB,WAAA,EAAY;AAAA,IAC7D;AACA,IAAA,cAAA,EAAe;AACf,IAAA,KAAK,cAAA,EAAe,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAGpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,OAAA,CAAQ,UAAU,GAAG,CAAA;AAC5C,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AAGpB,QAAA,IAAI,CAAC,EAAE,WAAA,EAAa;AACpB,QAAA,MAAM,EAAA,GAAK,EAAE,EAAA,IAAM,CAAA,EAAG,EAAE,UAAU,CAAA,CAAA,EAAI,EAAE,YAAY,CAAA,CAAA;AACpD,QAAA,IAAI,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,QAAA,WAAA,CAAY,IAAI,EAAE,CAAA;AAClB,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,CAAE,YAAY,CAAA,IAAK,CAAA;AACtC,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,aAAa,CAAA,IAAK,CAAA;AACxC,QAAA,QAAA,IAAY,GAAA;AACZ,QAAA,SAAA,IAAa,IAAA;AACb,QAAA,MAAA,IAAU,IAAA;AAAA,MACZ;AACA,MAAA,IAAI,MAAA,GAAS,GAAG,OAAA,GAAU,CAAA;AAC1B,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA,CAAA,MAAQ;AAAA,IAER;AAQA,IAAA,MAAM,2BAAA,GAA8B,GAAA;AAGpC,IAAA,MAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAM,MAAM,GAAA,CAAI,KAAA,CAAM,UAAU,eAAe,CAAA;AAGrD,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,EAAA,EAAI,WAAW,CAAA,IAAK,CAAA;AACxC,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AAAA,QAAA,CACd,MAAA,CAAO,EAAA,EAAI,gBAAgB,CAAA,IAAK,KAAK,2BAAA,IAA+B,QAAA;AAAA,QACrE;AAAA,OACF;AACA,MAAA,GAAA,CAAI,aAAA,CAAc,MAAM,CAAA,IAAK,IAAA,GAAO,IAAK,IAAA,GAAO,GAAA,GAAO,MAAM,IAAI,CAAA;AAAA,IACnE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AACA,EAAA,MAAM,YAAY,WAAA,CAAY,MAAM,KAAK,IAAA,EAAK,CAAE,MAAM,MAAM;AAAA,EAAC,CAAC,GAAG,IAAI,CAAA;AAIrE,EAAA,MAAM,YAAA;AAGN,EAAA,aAAA,CAAc,SAAS,CAAA;AACvB,EAAA,aAAA,CAAc,aAAa,CAAA;AAK3B,EAAA,MAAM,OAAA,GAAW,QAAQ,OAAA,IAAW,KAAA,GAChC,IAAI,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA,GACjC,OAAA,CAAQ,OAAA,EAAQ;AACpB,EAAA,MAAM,YAAA,GAAe,IAAA,GAAO,IAAA,CAAK,qBAAA,EAAsB,CAAE,KAAA,CAAM,MAAM,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAC3F,EAAA,MAAA,EAAQ,KAAA,EAAM;AACd,EAAA,MAAA,CAAO,KAAA,EAAM;AACb,EAAA,MAAA,CAAO,KAAA,EAAM;AACb,EAAA,WAAA,CAAY,QAAA,EAAS;AACrB,EAAA,GAAA,EAAK,QAAA,EAAS;AACd,EAAA,MAAM,GAAG,MAAM,CAAA,GAAI,MAAM,QAAQ,IAAA,CAAK;AAAA,IACpC,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAA,EAAS,YAAY,CAAC,CAAA;AAAA,IACnC,IAAI,OAAA,CAA2B,CAAC,CAAA,KAAM,UAAA,CAAW,MAAM,CAAA,CAAE,CAAC,MAAA,EAAW,CAAC,CAAC,CAAA,EAAG,IAAI,CAAC;AAAA,GAChF,CAAA;AAGD,EAAA,GAAA,CAAI,WAAW,KAAK,CAAA;AACpB,EAAA,GAAA,CAAI,YAAA,CAAa,EAAE,CAAA;AACnB,EAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AAChB,EAAA,GAAA,CAAI,eAAe,CAAC,CAAA;AACpB,EAAA,GAAA,CAAI,cAAc,IAAI,CAAA;AACtB,EAAA,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAC,CAAA;AACnB,EAAA,GAAA,CAAI,mBAAmB,CAAC,CAAA;AACxB,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,SAAIA,EAAAA,CAAE,KAAK,CAAA,SAAA,EAAY,MAAM,CAAA,mBAAA,EAAsB,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACnG;AACA,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,8EAAA,EAAwDA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACrF;AAoBA,eAAe,aAAA,CAAc,KAAU,MAAA,EAAyC;AAC9E,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,OAAO,IAAA,EAAK;AAAA,EAC3B,SAAS,CAAA,EAAG;AACV,IAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,GAAG,+BAA0BA,EAAAA,CAAE,KAAK,IAAIA,EAAAA,CAAE,IAAI,GAAG,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACtH,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,aAAA;AAChB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC7B,OAAO,CAAA,CAAE,IAAA;AAAA,IACT,MAAM,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,SAAA,GAAY,UAAU,CAAA,MAAA,EAAM,CAAA,CAAE,KAAA,CAAM,MAAM,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAAA,IACtG,OAAO,CAAA,CAAE;AAAA,GACX,CAAE,CAAA;AACF,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,8BAAA,EAAsB,MAAM,gBAAA,EAAkB,KAAA,EAAO,SAAS,CAAA;AAElF,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA;AAAA,IACvB,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,YAAA,EAAeA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,4CAAA,EAA+BA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAAA,IAC/E;AAAA,GACF;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,MAAA;AAAA,MACtB,oCAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AAChD,EAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,GAAG,KAAA,CAAM,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,IAAIA,EAAAA,CAAE,GAAG,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,EAAGA,EAAAA,CAAE,KAAK,KAAK,EAAE,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,UAAK,KAAA,CAAM,WAAW,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACpJ,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAG,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI;AAAA,IAC9D,KAAA,CAAM,OAAA,GACF,EAAE,KAAA,EAAO,+BAAA,EAAiC,KAAA,EAAO,SAAA,EAAmB,GACpE,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAkB;AAAA,IAChD,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,OAAA,EAAiB;AAAA,IAC/C,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,QAAA,EAAkB;AAAA,IACvD,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAgB,GACzC,CAAA;AAED,EAAA,IAAI;AACF,IAAA,IAAI,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,SAAA,EAAW;AAC/C,MAAA,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,EAAQ,MAAA,KAAW,QAAQ,CAAA;AACnD,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACrD,CAAA,MAAA,IAAW,WAAW,OAAA,EAAS;AAC7B,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAA,EAAKA,EAAAA,CAAE,IAAI,CAAA,EAAG,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACpE,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,MAAA,CAAO,OAAO,MAAM,CAAA;AAC1B,MAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,WAAW,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IAClD;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,UAAK,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAC/E;AACF;AAiBA,eAAe,YAAA,CAAa,KAAU,IAAA,EAAsC;AAC1E,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA;AAAA,IACvB,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,iBAAA,EAAoBA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,gDAAA,EAAmCA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAAA,IACxF,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACjB,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,MACnB,IAAA,EAAM,CAAA,KAAM,GAAA,CAAI,KAAA,GAAQ,SAAA,GAAY,EAAA;AAAA,MACpC,KAAA,EAAO;AAAA,KACT,CAAE;AAAA,GACJ;AACA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,GAAA,CAAI,SAAS,MAAM,CAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,EACf;AACF;AASA,eAAe,eAAA,CAAgB,GAAA,EAAU,GAAA,EAAgB,IAAA,EAAsC;AAC7F,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,aAAa,GAAG,CAAA;AAAA,EACnC,SAAS,CAAA,EAAG;AACV,IAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,GAAG,iCAA4BA,EAAAA,CAAE,KAAK,IAAIA,EAAAA,CAAE,IAAI,GAAG,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACxH,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,iGAAA,EAAoGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAChI,IAAA;AAAA,EACF;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,UAAA,IAAc,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,CAAA;AAEjE,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA;AAAA,IACvB,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,aAAA,EAAgBA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,mCAAA,EAAsBA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAAA,IACvE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AAClB,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,UAAA;AAC7B,MAAA,MAAM,MAAA,GAAS,aAAa,CAAC,CAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,CAAA,CAAE,MAAA,GAAU,MAAA,GAAS,kBAAkB,gBAAA,GAAoB,WAAA;AAC7E,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA;AACtC,MAAA,OAAO;AAAA,QACL,OAAO,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,MAAA,GAAS,oBAAoB,EAAE,CAAA,CAAA;AAAA,QAClD,IAAA,EAAM,GAAG,CAAA,CAAE,QAAQ,SAAM,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,OAAA,EAAO,EAAE,OAAA,IAAW,GAAG,SAAM,SAAS,CAAA,MAAA,EAAM,KAAK,CAAA,QAAA,EAAW,KAAA,KAAU,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA;AAAA,QAC/H,OAAO,CAAA,CAAE;AAAA,OACX;AAAA,IACF,CAAC;AAAA,GACH;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AACpD,EAAA,MAAM,aAAA,CAAc,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA;AAC7C;AAGA,eAAe,aAAA,CACb,GAAA,EACA,GAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,EAAA,KAAO,IAAA,CAAK,UAAA;AACnC,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AAInC,EAAA,MAAM,cAAA,GAAiB,MAAA,IAAU,CAAC,CAAC,OAAA,CAAQ,MAAA;AAE3C,EAAA,MAAM,OAAA,GAA6D;AAAA,IACjE,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS,GACrC;AACA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,EAAE,KAAA,EAAO,qBAAA,EAAuB,IAAA,EAAM,CAAA,CAAA,EAAI,QAAQ,OAAA,IAAW,GAAG,CAAA,cAAA,CAAA,EAAa,KAAA,EAAO,QAAA,EAAS;AAAA,MAC7F,EAAE,KAAA,EAAO,iBAAA,EAAmB,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,OAAO,UAAA;AAAW,KACjG;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAE7C,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,CAAQ,MAAA,EAAQ;AAC9B,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,CAAA,EAAGA,GAAE,GAAG,CAAA,EAAG,QAAQ,IAAI,CAAA,mGAAA,EAAiGA,GAAE,KAAK,CAAA;AAAA,KACjI;AAAA,EACF,WAAW,CAAC,MAAA,IAAU,OAAA,CAAQ,MAAA,IAAU,CAAC,MAAA,EAAQ;AAC/C,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,CAAA,EAAGA,GAAE,GAAG,CAAA,EAAG,QAAQ,IAAI,CAAA,2EAAA,EAAyEA,GAAE,KAAK,CAAA;AAAA,KACzG;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO,GAAGA,EAAAA,CAAE,IAAI,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,IAAI,OAAO,CAAA;AAC7E,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,KAAW,MAAA,EAAQ;AAIlC,EAAA,MAAM,QAAA,GAAW,OACf,IAAA,EACA,IAAA,KACkB;AAClB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,mBAAA,CAAoB,GAAA,EAAK,IAAA,EAAM,EAAe,IAAA,EAAM,IAA+B,CAAC,CAAA;AAAA,IAC5F,CAAA,MAAO;AACL,MAAA,MAAM,qBAAA,CAAsB,GAAA,EAAK,OAAA,CAAQ,EAAA,EAAI,MAAM,IAAI,CAAA;AAAA,IACzD;AAAA,EACF,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,MAAA,GACd,SAAA,GACA,CAAA,cAAA,EAAY,QAAQ,IAAI,CAAA,mCAAA,CAAA;AAE5B,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,MAAA,CAAO,gBAAgB,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA;AAC1E,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAK,EAAG;AAGnC,IAAA,MAAM,eAAe,GAAA,EAAK,OAAA,CAAQ,EAAA,EAAI,IAAA,CAAK,MAAM,CAAA;AACjD,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,SAAA,EAAYA,EAAAA,CAAE,IAAI,CAAA,EAAG,OAAA,CAAQ,IAAI,GAAGA,EAAAA,CAAE,KAAK,CAAA,QAAA,EAAMA,EAAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACnH,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,MAAM,iBAAiB,GAAG,CAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,MAAM,KAAK,MAAM,GAAA,CAAI,OAAO,CAAA,MAAA,EAAS,OAAA,CAAQ,IAAI,CAAA,4BAAA,CAAA,EAAgC;AAAA,QAC/E,EAAE,KAAA,EAAO,kCAAA,EAAoC,KAAA,EAAO,KAAA,EAAe;AAAA,QACnE,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,IAAA;AAAc,OACzC,CAAA;AACD,MAAA,IAAI,OAAO,KAAA,EAAO;AAClB,MAAA,MAAM,SAAS,QAAQ,CAAA;AACvB,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,SAAIA,EAAAA,CAAE,KAAK,CAAA,QAAA,EAAWA,EAAAA,CAAE,IAAI,CAAA,EAAG,SAAS,CAAA,sDAAA,EAAyDA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IAChI;AAAA,EACF,CAAA,MAAA,IAAW,WAAW,UAAA,EAAY;AAChC,IAAA,MAAM,sBAAsB,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,EAC1E;AACF;AAGA,eAAe,sBACb,GAAA,EACA,GAAA,EACA,IAAA,EACA,OAAA,EACA,UACA,SAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAM,SAAA;AACZ,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,IAAA,EAAK;AACjD,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA;AAAA,IACvB,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,YAAA,EAAe,QAAQ,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,0BAAA,EAA0BA,GAAE,KAAK,CAAA,CAAA;AAAA,IACzF;AAAA,MACE,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,iBAAA,EAAmB,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,MACrE,EAAE,KAAA,EAAO,sCAAA,EAA8B,IAAA,EAAM,eAAA,EAAiB,OAAO,GAAA;AAAI;AAC3E,GACF;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,MAAMV,MAAAA,GAAO,MAAM,GAAA,CAAI,MAAA;AAAA,MACrB,CAAA,yBAAA,EAA4B,QAAQ,IAAI,CAAA,CAAA;AAAA,MACxC,QAAQ,EAAA,KAAO,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,KAAI,GAAI;AAAA,KACnD;AACA,IAAA,IAAI,CAACA,MAAAA,IAAQ,CAACA,MAAAA,CAAK,MAAK,EAAG;AAC3B,IAAA,MAAM,OAAA,GAAUA,OAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,QAAQ,UAAA,CAAW,GAAG,KAAK,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACxD,MAAA,GAAA,CAAI,MAAM,CAAA,EAAGU,EAAAA,CAAE,MAAM,CAAA,4CAAA,EAA+CA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC7E,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,CAAS,aAAA,EAAe,EAAE,IAAA,EAAM,SAAS,CAAA;AAC/C,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,GAAE,KAAK,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAA,EAAIA,GAAE,IAAI,CAAA,EAAG,SAAS,CAAA,CAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACnF,CAAA,MAAO;AACL,IAAA,MAAM,QAAA,CAAS,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAQ,CAAA;AACjD,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,MAAA,EAAIA,GAAE,KAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,EAAIA,GAAE,IAAI,CAAA,EAAG,SAAS,CAAA,CAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACrF;AACF;AAQA,SAAS,cAAA,CAAe,KAAU,OAAA,EAAgC;AAChE,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,MAAA,EAAQ;AAC/C,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,oBAAA,EAAuBA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,EAAG,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,uCAAA,EAAqCA,EAAAA,CAAE,KAAK,CAAA;AAAA,KACpK;AAAA,EACF,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,kCAAA,EAAqCA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACnE;AACA,EAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,EAAA,GAAA,CAAI,KAAA;AAAA,IACF,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,uBAAA,EAA0BA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,MAAA,GAAS,eAAe,CAAA;AAAA,GAClG;AACA,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,2DAAA,EAA8DA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,2BAAA,EAA8BA,EAAAA,CAAE,KAAK,CAAA;AAAA,KAC/H;AACA,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,iJAAA,EAA+IA,GAAE,KAAK,CAAA;AAAA,KAChK;AAAA,EACF,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,2EAAA,EAA8EA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAC3G;AACF;AAGA,SAAS,gBAAgB,GAAA,EAAgB;AACvC,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,UAAA,EAAaA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACzC,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,WAAA,EAAcA,EAAAA,CAAE,KAAK,CAAA,oCAAA,CAAiC,CAAA;AACzE,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,GAAA,EAAMA,EAAAA,CAAE,KAAK,CAAA,mDAAA,CAAqD,CAAA;AACrF,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,MAAA,EAASA,EAAAA,CAAE,KAAK,CAAA,sFAAA,CAAwF,CAAA;AAC3H,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,QAAA,EAAWA,EAAAA,CAAE,KAAK,CAAA,mDAAA,CAAqD,CAAA;AAC1F,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,iBAAA,EAAUA,EAAAA,CAAE,KAAK,CAAA,mDAAA,CAAqD,CAAA;AACzF,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,QAAA,EAAMA,EAAAA,CAAE,KAAK,CAAA,sFAAA,CAAmF,CAAA;AACnH,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,QAAA,EAAWA,EAAAA,CAAE,KAAK,CAAA,SAAA,CAAW,CAAA;AAClD;AAGA,eAAe,iBAAiB,GAAA,EAAyB;AACvD,EAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,EAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,OAAO,CAAA;AAChD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,SAAIA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,oBAAA,EAAuBA,EAAAA,CAAE,KAAK,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAA,CAAG,CAAA;AACrG,IAAA;AAAA,EACF;AACA,EAAA,MAAM,EAAE,QAAO,GAAI,MAAA;AACnB,EAAA,GAAA,CAAI,KAAA,CAAM;AAAA,EAAA,EAAOA,EAAAA,CAAE,MAAM,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,mBAAA,EAAsBA,EAAAA,CAAE,IAAI,CAAA,CAAA,EAAI,OAAO,GAAGA,EAAAA,CAAE,KAAK,WAAMA,EAAAA,CAAE,KAAK,IAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAGxH,EAAA,MAAM,KAAK,oBAAA,EAAqB;AAChC,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,GAAA,CAAI,MAAM,CAAA,EAAA,EAAKA,EAAAA,CAAE,IAAI,CAAA,yDAAA,EAAuDA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACrF,IAAA;AAAA,EACF;AACA,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,aAAA,CAAc,EAAE,CAAA;AACpC,EAAA,MAAM,SAAS,MAAM,GAAA,CAAI,MAAA,CAAO,CAAA,kBAAA,EAAqB,OAAO,CAAA,GAAA,CAAA,EAAO;AAAA,IACjE,EAAE,KAAA,EAAO,iBAAA,EAAmB,KAAA,EAAO,KAAA,EAAe;AAAA,IAClD,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,IAAA;AAAc,GAC3C,CAAA;AACD,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,GAAA,CAAI,KAAA,CAAM,KAAKA,EAAAA,CAAE,IAAI,WAAW,OAAO,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACpD,IAAA,MAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,UAAS,GAAI,MAAM,UAAU,EAAE,CAAA;AACnD,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,GAAA,CAAI,KAAA,CAAM,KAAKA,EAAAA,CAAE,KAAK,SAAIA,EAAAA,CAAE,KAAK,CAAA,aAAA,EAAgB,MAAM,CAAA,iCAAA,CAAmC,CAAA;AAAA,IAC5F,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,MAAM,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,MAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,eAAA,CAAiB,CAAA;AAChD,MAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,EAAG;AACxD,QAAA,GAAA,CAAI,KAAA,CAAM,KAAKA,EAAAA,CAAE,GAAG,GAAG,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,MAAM,CAAA,EAAA,EAAKA,EAAAA,CAAE,IAAI,CAAA,2BAAA,EAA8BA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAC9D;AACF;AAGA,eAAe,cAAA,CAAe,KAAU,EAAA,EAA8B;AACpE,EAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,IAAA,EAAK;AAC5B,EAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,yCAAA,EAA4CA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACxE,IAAA;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,IAAA,MAAM,MAAA,GACJ,CAAA,CAAE,MAAA,KAAW,SAAA,GACT,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,OAAA,EAAUA,EAAAA,CAAE,KAAK,CAAA,CAAA,GAC3B,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,CAAA,OAAA,EAAU,CAAA,CAAE,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAGA,GAAE,KAAK,CAAA,CAAA;AACpG,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,WAAA,IAAe,EAAE,OAAO,CAAA,CAAA;AAAA,MACpC,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,EAAE,SAAM,MAAM,CAAA,CAAA;AAAA,MACzB,OAAO,CAAA,CAAE;AAAA,KACX;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA;AAAA,IACvB,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,oBAAA,EAAuBA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,sDAAA,EAAyCA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAAA,IACjG;AAAA,GACF;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAC9C,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,SAAA,EAAW;AACtC,IAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,GAAG,MAAM,CAAA,gBAAA,EAAmBA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACxD,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO,GAAGA,EAAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,eAAe,IAAA,CAAK,OAAO,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI;AAAA,IACxF,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,MAAA,EAAgB;AAAA,IACrD,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,OAAA;AAAiB,GACtD,CAAA;AACD,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,EAAA,CAAG,KAAK,MAAM,CAAA;AACpB,IAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,WAAW,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAClD;AACF;AAGA,eAAe,gBAAA,CAAiB,GAAA,EAAU,IAAA,EAAuB,IAAA,EAAiC;AAChG,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAW,EAAE,IAAA,EAAK;AAChD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,MAAM,MAAA,EAAQ;AAClC,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,qHAAA,EAAwHA,GAAE,KAAK,CAAA;AAAA,KAC1I;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA,EAAI,MAAM,gBAAA,EAAkB,KAAA,EAAO,CAAA,KAAA,EAAQ,CAAC,IAAG,CAAE,CAAA;AAAA,IACzF,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,WAAA,EAAc,CAAC,CAAA,UAAA,CAAA,EAAc,MAAM,eAAA,EAAiB,KAAA,EAAO,CAAA,KAAA,EAAQ,CAAC,IAAG,CAAE,CAAA;AAAA,IACvG,EAAE,KAAA,EAAO,qBAAA,EAAuB,IAAA,EAAM,EAAA,EAAI,OAAO,OAAA;AAAQ,GAC3D;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA;AAAA,IACvB,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,iBAAA,EAAoBA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,mCAAA,EAAmCA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAAA,IACxF;AAAA,GACF;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,qBAAA,EAAwBA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACtD,CAAA,MAAA,IAAW,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AACxB,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,CAAC,CAAA;AACzB,IAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,gBAAgB,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAClD,CAAA,MAAA,IAAW,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AACvB,IAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,iBAAiB,CAAC,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,IAAA,EAAK;AACP;AAOA,eAAe,UAAA,CAAW,KAAU,GAAA,EAAmC;AACrE,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,EAAW;AAClC,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,GAAA,CAAI,gBAAgB,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,IAAI,OAAA,EAAQ;AAExB,EAAA,MAAM,OAAA,GAAU,aAAA;AAChB,EAAA,MAAM,UAAA,GAAa,YAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAI,CAAA;AACvD,IAAA,MAAM,SAAS,CAAC,CAAA,CAAE,UACd,UAAA,GACA,SAAA,CAAU,IAAI,CAAA,CAAE,IAAI,CAAA,GAClB,CAAA,eAAA,EAAe,OAAO,KAAA,CAAM,MAAA,IAAU,CAAC,CAAA,MAAA,CAAA,GACvC,KAAA,EAAO,QACL,OAAA,GACA,cAAA;AACR,IAAA,OAAO,EAAE,OAAO,CAAA,CAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,IAAA,EAAK;AAAA,EACtD,CAAC,CAAA;AACD,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,uCAAA,EAA+B,MAAM,gBAAA,EAAkB,KAAA,EAAO,SAAS,CAAA;AAC3F,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,oCAAA,EAAiC,MAAM,UAAA,EAAY,KAAA,EAAO,YAAY,CAAA;AAE1F,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA;AAAA,IACvB,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,WAAA,EAAcA,EAAAA,CAAE,KAAK,CAAA,EAAA,EAAKA,EAAAA,CAAE,GAAG,CAAA,4CAAA,EAA+BA,EAAAA,CAAE,KAAK,CAAA,CAAA;AAAA,IAC9E;AAAA,GACF;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,MAAM,oBAAA,CAAqB,KAAK,GAAG,CAAA;AACnC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,MAAM,YAAA,CAAa,KAAK,GAAG,CAAA;AAC3B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAExC,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAG,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAI;AAAA,IAC9D,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,OAAA,EAAiB;AAAA,IAC/C,WAAA,GACI,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,YAAA,EAAsB,GACpD,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAmB;AAAA,IAClD,MAAA,CAAO,OAAA,GACH,EAAE,KAAA,EAAO,8BAAA,EAAgC,KAAA,EAAO,SAAA,EAAmB,GACnE,EAAE,KAAA,EAAO,gCAAA,EAAkC,KAAA,EAAO,QAAA,EAAkB;AAAA,IACxE,EAAE,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAO,QAAA,EAAkB;AAAA,IACxD,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAgB,GACzC,CAAA;AAED,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,EAAQ,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA;AACjE,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,WAAA,EAAa;AAC1C,MAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,GAAG,MAAM,CAAA,kDAAA,EAAgDA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACrF,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,MAAA,MAAY,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,EAAG,MAAM,CAAA,kBAAA,EAAqBA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACnF,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAA,EAAKA,EAAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,EAAG,CAAA,CAAE,WAAA,GAAc,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,OAAA,EAAK,CAAA,CAAE,WAAW,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AACvI,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,EAAA,EAAKA,EAAAA,CAAE,IAAI,CAAA,EAAG,MAAM,SAAA,CAAU,MAAM,CAAA,YAAA,EAAeA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACpG,CAAA,MAAA,IAAW,WAAW,SAAA,EAAW;AAC/B,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AACpC,IAAA,GAAA,CAAI,KAAA,CAAM,IAAI,EAAA,GAAK,CAAA,EAAGA,GAAE,IAAI,CAAA,kBAAA,EAAgB,GAAA,CAAI,KAAK,CAAA,OAAA,EAAUA,EAAAA,CAAE,KAAK,CAAA,CAAA,GAAK,CAAA,EAAGA,GAAE,GAAG,CAAA,OAAA,EAAK,IAAI,KAAK,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAC/G,CAAA,MAAA,IAAW,WAAW,YAAA,EAAc;AAClC,IAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AACrB,IAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,gBAAgB,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACvD,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,GAAA,CAAI,UAAA,CAAW,QAAQ,IAAI,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AACpC,IAAA,GAAA,CAAI,KAAA,CAAM,IAAI,EAAA,GAAK,CAAA,EAAGA,GAAE,IAAI,CAAA,4BAAA,EAA0B,GAAA,CAAI,KAAK,CAAA,OAAA,EAAUA,EAAAA,CAAE,KAAK,CAAA,CAAA,GAAK,CAAA,EAAGA,GAAE,GAAG,CAAA,2BAAA,EAAyB,IAAI,KAAK,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAC7I,CAAA,MAAA,IAAW,WAAW,SAAA,EAAW;AAC/B,IAAA,GAAA,CAAI,UAAA,CAAW,QAAQ,KAAK,CAAA;AAC5B,IAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AACrB,IAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,2BAA2B,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAClE,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,GAAA,CAAI,OAAO,MAAM,CAAA;AACjB,IAAA,GAAA,CAAI,KAAA,CAAM,GAAGA,EAAAA,CAAE,IAAI,WAAW,MAAM,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EAClD;AACF;AAGA,eAAe,YAAA,CAAa,KAAU,GAAA,EAAmC;AACvE,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,MAAA;AAAA,IACrB,4DAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,MAAM,GAAA,GAAM,gBAAgB,IAAI,CAAA;AAChC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,MAAM,CAAA,8CAAA,EAAiDA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC/E,IAAA;AAAA,EACF;AACA,EAAA,GAAA,CAAI,MAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,gBAAA,EAAmB,GAAA,CAAI,IAAI,CAAA,GAAA,EAAM,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,OAAA,EAAKA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACnG,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC7B,EAAA,IAAI,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,IAAI,CAAA,YAAA,EAAU,GAAA,CAAI,IAAI,CAAA,WAAA,EAAcA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,CAAA,KAAA,EAAQ,GAAA,CAAI,KAAA,KAAU,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,EAAIA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,OACvI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,EAAAA,CAAE,GAAG,CAAA,YAAA,EAAU,GAAA,CAAI,IAAI,CAAA,SAAA,EAAYA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,IAAI,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAGA,EAAAA,CAAE,KAAK,CAAA,CAAA,EAAIA,EAAAA,CAAE,GAAG,CAAA,gCAAA,EAAmCA,EAAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACnJ;AASA,eAAe,oBAAA,CAAqB,KAAU,GAAA,EAAmC;AAC/E,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,MAAA;AAAA,IACtB,yCAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,GAAA,CAAI,eAAe,KAAK,CAAA;AAC1B;AAEA,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACpB,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,EAAK,GAAA,YAAe,QAAQ,GAAA,CAAI,KAAA,IAAS,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AAC3F,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB,CAAC,CAAA","file":"index.js","sourcesContent":["/** Minimal REST client for the Standard Agents instance. */\nimport type { ThreadSummary } from \"./types.ts\";\n\n/** Outcome of an endpoint+token check, with a human-precise failure story. */\nexport type VerifyResult =\n | { ok: true }\n | { ok: false; reason: string; hint?: string };\n\n/** A parallel-session upgrade quote from the billing service. */\nexport interface SessionQuote {\n current: number; // sessions in use / currently paid for\n max: number; // hard ceiling\n sessions: number; // the target this quote is for\n amount_cents: number | null; // what Confirm charges now (null = figure unavailable)\n currency: string;\n ends_trial: boolean; // true when confirming ends the $5 trial and converts to paid\n status: string; // subscription status (trialing / active / …)\n}\n\n/**\n * Turn a fetch() failure into a precise, human explanation. Node reports the\n * real cause (DNS, refused, timeout, TLS, offline) as error codes buried in\n * the `cause` chain — surface them instead of a generic \"didn't work\".\n */\nfunction classifyConnectError(err: unknown, endpoint: string): VerifyResult {\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/.*$/, \"\");\n // Collect codes + messages across the cause chain (undici nests them).\n const codes = new Set<string>();\n const messages: string[] = [];\n for (let e: any = err; e; e = e.cause) {\n if (typeof e.code === \"string\") codes.add(e.code);\n if (typeof e.message === \"string\") messages.push(e.message);\n if (Array.isArray(e.errors)) {\n for (const sub of e.errors) {\n if (typeof sub?.code === \"string\") codes.add(sub.code);\n if (typeof sub?.message === \"string\") messages.push(sub.message);\n }\n }\n }\n const text = messages.join(\" | \");\n const has = (...wanted: string[]) => wanted.some((w) => codes.has(w));\n\n if (has(\"ENOTFOUND\", \"EAI_AGAIN\")) {\n return {\n ok: false,\n reason: `Can't resolve ${host} — no such hostname from this machine.`,\n hint: \"The endpoint URL is probably wrong (typo, or that server isn't running). Check the URL, your VPN, and local DNS.\",\n };\n }\n if (has(\"ECONNREFUSED\")) {\n return {\n ok: false,\n reason: `${host} refused the connection — nothing is listening there.`,\n hint: \"The instance looks stopped. Start it (or check the port in the endpoint URL).\",\n };\n }\n if (has(\"EHOSTUNREACH\", \"ENETUNREACH\", \"ENETDOWN\")) {\n return {\n ok: false,\n reason: `No route to ${host} — the network looks down or unreachable.`,\n hint: \"Check your internet connection / VPN.\",\n };\n }\n if (has(\"ETIMEDOUT\", \"UND_ERR_CONNECT_TIMEOUT\", \"UND_ERR_HEADERS_TIMEOUT\") || (err as any)?.name === \"TimeoutError\") {\n return {\n ok: false,\n reason: `${host} didn't answer in time.`,\n hint: \"The server may be overloaded or a firewall is eating the traffic. Try again.\",\n };\n }\n if (\n has(\n \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\n \"DEPTH_ZERO_SELF_SIGNED_CERT\",\n \"SELF_SIGNED_CERT_IN_CHAIN\",\n \"CERT_HAS_EXPIRED\",\n \"ERR_TLS_CERT_ALTNAME_INVALID\"\n ) || /certificate|TLS|SSL/i.test(text)\n ) {\n return {\n ok: false,\n reason: `TLS problem talking to ${host}: ${text.slice(0, 120)}`,\n hint: \"For local/self-signed endpoints, use the http:// URL or trust the local CA.\",\n };\n }\n return {\n ok: false,\n reason: `Couldn't reach ${host}${text ? ` (${text.slice(0, 120)})` : \"\"}.`,\n hint: \"This is a connection problem, not a token problem — check the endpoint URL and your network.\",\n };\n}\n\n/** A subagent child thread with its current lifecycle status. */\nexport interface SubagentInfo {\n id: string;\n agent_name: string | null;\n title: string | null;\n threadName: string | null;\n status: string; // \"running\" | \"idle\" | \"terminated\" | custom\n}\n\n/** An installed Agent Skill's registry metadata. */\nexport interface SkillInfo {\n name: string;\n description: string;\n version?: string;\n enabled: boolean;\n files: string[];\n}\n\n/** A file attachment on an outgoing message (the instance's message-POST shape). */\nexport interface MessageAttachment {\n name: string;\n mimeType: string;\n data: string; // base64 encoded\n width?: number;\n height?: number;\n}\n\nexport interface GoalStep {\n step: string;\n status?: string; // \"pending\" | \"in_progress\" | \"done\"\n}\nexport interface GoalData {\n summary: string | null; // short ~5-word label shown while the goal is pursued\n description: string | null;\n steps: GoalStep[];\n}\n\nexport class ApiClient {\n constructor(\n private endpoint: string,\n private token: string\n ) {}\n\n get wsEndpoint(): string {\n return this.endpoint.replace(/^http/, \"ws\");\n }\n\n /** The instance origin (used to build admin-UI links). */\n get origin(): string {\n return this.endpoint;\n }\n\n get bearer(): string {\n return this.token;\n }\n\n private async json<T>(pathname: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${this.endpoint}${pathname}`, {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.token}`,\n ...(init?.headers || {}),\n },\n });\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`${init?.method || \"GET\"} ${pathname} -> ${res.status}: ${text.slice(0, 300)}`);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n }\n\n async verify(): Promise<boolean> {\n return (await this.verifyDetailed()).ok;\n }\n\n /**\n * Check the endpoint + token and say PRECISELY what's wrong when they\n * fail. \"That token didn't work\" is a lie when the real problem is a typo'd\n * hostname, a stopped server, or a dead network — sign-in errors must let\n * the user tell those apart from an actually-rejected key.\n */\n async verifyDetailed(): Promise<VerifyResult> {\n let res: Response;\n try {\n res = await fetch(`${this.endpoint}/api/auth/me`, {\n headers: { Authorization: `Bearer ${this.token}` },\n signal: AbortSignal.timeout(15_000),\n });\n } catch (err) {\n return classifyConnectError(err, this.endpoint);\n }\n if (res.ok) return { ok: true };\n if (res.status === 401) {\n return {\n ok: false,\n reason: \"The instance rejected this token — it's invalid, expired, or was revoked.\",\n hint: \"Create a fresh API key in the instance settings (or press Enter to sign in with your browser). Keys only work on the instance that minted them.\",\n };\n }\n if (res.status === 403) {\n return {\n ok: false,\n reason: \"The token was recognized, but this account isn't allowed to use the API here.\",\n hint: \"Ask an instance admin to grant access, or use a different account's key.\",\n };\n }\n if (res.status === 404 || res.status === 405) {\n return {\n ok: false,\n reason: `${this.endpoint} answered, but it doesn't look like a Standard Agents instance (no /api/auth/me).`,\n hint: \"Double-check the endpoint URL — this may be a different service.\",\n };\n }\n if (res.status >= 500) {\n return {\n ok: false,\n reason: `The instance hit an error while checking the token (HTTP ${res.status}).`,\n hint: \"That's a server-side problem — check the instance's logs and try again.\",\n };\n }\n return { ok: false, reason: `The instance answered HTTP ${res.status} while checking the token.` };\n }\n\n /** Agent name → display title map (best effort; for labeling subagents). */\n async listAgents(): Promise<{ name: string; title: string }[]> {\n const res = await this.json<{ agents?: any[] } | any[]>(\"/api/agents\");\n const arr = Array.isArray(res) ? res : res.agents || [];\n return arr\n .filter((a) => a && typeof a.name === \"string\")\n .map((a) => ({ name: a.name, title: typeof a.title === \"string\" ? a.title : a.name }));\n }\n\n async createThread(agentId: string, tags: string[]): Promise<string> {\n const res = await this.json<{ threadId?: string; id?: string }>(\"/api/threads\", {\n method: \"POST\",\n body: JSON.stringify({ agent_id: agentId, tags }),\n });\n const id = res.threadId || res.id;\n if (!id) throw new Error(\"Thread create returned no id\");\n return id;\n }\n\n /**\n * List threads for an agent (or several variants of it), optionally\n * filtering to those carrying all given tags. Multiple ids exist because\n * the instance's model gearbox hands a session between agent variants — a\n * thread that last ran in another gear must still show up for resume.\n */\n async listThreads(agentId: string | string[], requireTags: string[]): Promise<ThreadSummary[]> {\n const ids = Array.isArray(agentId) ? agentId : [agentId];\n const pages = await Promise.all(\n ids.map((id) =>\n this.json<{ threads?: any[] } | any[]>(\n `/api/threads?agent_id=${encodeURIComponent(id)}&limit=100`\n ).catch(() => [] as any[])\n )\n );\n const arr = pages.flatMap((res) => (Array.isArray(res) ? res : (res as { threads?: any[] }).threads || []));\n return arr\n .map((t) => ({\n id: t.id,\n tags: Array.isArray(t.tags) ? t.tags : [],\n created_at: t.created_at,\n title: t.title,\n preview: t.preview || t.last_message,\n }))\n .filter((t: ThreadSummary) => requireTags.every((tag) => t.tags.includes(tag)));\n }\n\n /**\n * Subagent child threads of a thread, each with its current lifecycle status\n * (`running`/`idle`/`terminated`). Sourced from the parent's child registry,\n * which the live `/api/events` stream doesn't carry — so the CLI reads this to\n * learn which subagents are *actually running* (vs idle or finished), both on\n * (re)connect and whenever a subagent thread changes.\n */\n async listSubagents(threadId: string): Promise<SubagentInfo[]> {\n const res = await this.json<{ subagents?: any[] } | any[]>(\n `/api/threads/${threadId}/subagents`\n );\n const arr = Array.isArray(res) ? res : res.subagents || [];\n return arr\n .filter((s) => s && (s.id ?? s.reference))\n .map((s) => ({\n id: s.id ?? s.reference,\n agent_name: s.agent_name ?? s.name ?? null,\n title: s.title ?? null,\n threadName: s.threadName ?? s.thread_name ?? null,\n status: typeof s.status === \"string\" ? s.status : \"running\",\n }));\n }\n\n /**\n * Send a user message, optionally with attachments (e.g. pasted images).\n * Attachments use the instance's message-POST shape — base64 `data` +\n * `mimeType` — which the server stores in the thread filesystem and injects\n * into the LLM's vision context as real image content blocks.\n */\n async sendMessage(threadId: string, content: string, attachments?: MessageAttachment[]): Promise<void> {\n const body: Record<string, unknown> = { role: \"user\", content };\n if (attachments && attachments.length > 0) body.attachments = attachments;\n await this.json(`/api/threads/${threadId}/messages`, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async getMessages(threadId: string, limit = 50, order?: \"asc\" | \"desc\"): Promise<any[]> {\n const orderParam = order ? `&order=${order}` : \"\";\n const res = await this.json<{ messages?: any[] } | any[]>(\n `/api/threads/${threadId}/messages?limit=${limit}${orderParam}`\n );\n return Array.isArray(res) ? res : res.messages || [];\n }\n\n async getLogs(threadId: string, limit = 100): Promise<any[]> {\n const res = await this.json<{ logs?: any[] } | any[]>(\n `/api/threads/${threadId}/logs?limit=${limit}&order=desc`\n );\n return Array.isArray(res) ? res : res.logs || [];\n }\n\n /**\n * Deliver a durable forwarded tool result to the thread, resuming the turn.\n * Retries with backoff — this is the durable delivery path, so it must land\n * even if the connection is briefly flaky after a permission wait.\n */\n async postToolResult(\n threadId: string,\n toolCallId: string,\n ok: boolean,\n result?: string,\n error?: string,\n executor?: { clientId: string; generation?: number }\n ): Promise<boolean> {\n const body = JSON.stringify({\n tool_call_id: toolCallId,\n ok,\n result,\n error,\n // Ownership fence: calls dispatched to a specific execution owner are\n // only accepted back from that owner at that generation.\n ...(executor ? { client_id: executor.clientId, generation: executor.generation ?? 0 } : {}),\n });\n for (let attempt = 0; attempt < 6; attempt++) {\n try {\n await this.json(`/api/threads/${threadId}/tool-result`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n });\n return true;\n } catch {\n await new Promise((r) => setTimeout(r, Math.min(500 * 2 ** attempt, 8000)));\n }\n }\n return false;\n }\n\n /**\n * Download raw file bytes from the thread's filesystem (e.g. an\n * /attachments/* asset a subagent generated). Returns null on any failure.\n */\n async fetchFile(threadId: string, fsPath: string): Promise<Buffer | null> {\n const clean = fsPath.startsWith(\"/\") ? fsPath : `/${fsPath}`;\n try {\n const res = await fetch(`${this.endpoint}/api/threads/${threadId}/fs${clean}`, {\n headers: { Authorization: `Bearer ${this.token}` },\n });\n if (!res.ok) return null;\n return Buffer.from(await res.arrayBuffer());\n } catch {\n return null;\n }\n }\n\n // ── account-wide user KV (per-user, spans every thread) ───────────────────\n // Backed by the instance's /api/users/me/kv store. This is where the machine\n // registry lives: which machines (laptops / VPS daemons) belong to this\n // account, and which projects each machine has.\n\n /** Read one value from the signed-in user's account-wide KV (null if absent). */\n async userKvGet(key: string): Promise<unknown> {\n try {\n const res = await this.json<{ value?: unknown }>(\n `/api/users/me/kv?key=${encodeURIComponent(key)}`\n );\n return res?.value ?? null;\n } catch {\n return null;\n }\n }\n\n /** Write one value to the signed-in user's account-wide KV (null deletes). */\n async userKvSet(key: string, value: unknown): Promise<void> {\n await this.json(`/api/users/me/kv`, {\n method: \"POST\",\n body: JSON.stringify({ key, value }),\n });\n }\n\n /** List the signed-in user's account-wide KV entries under a key prefix. */\n async userKvList(prefix: string): Promise<Array<{ key: string; value: unknown; updated_at: number }>> {\n try {\n const res = await this.json<{ entries?: Array<{ key: string; value: unknown; updated_at: number }> }>(\n `/api/users/me/kv?prefix=${encodeURIComponent(prefix)}&limit=200`\n );\n return Array.isArray(res?.entries) ? res.entries : [];\n } catch {\n return [];\n }\n }\n\n /** Read a value from the thread's durable KV store (null if absent). */\n async kvGet(threadId: string, key: string): Promise<unknown> {\n try {\n const res = await this.json<{ value?: unknown }>(\n `/api/threads/${threadId}/kv?key=${encodeURIComponent(key)}`\n );\n return res?.value ?? null;\n } catch {\n return null; // 404 = key not yet set\n }\n }\n\n /** Write a value to the thread's durable KV store. */\n async kvSet(threadId: string, key: string, value: unknown): Promise<void> {\n try {\n await this.json(`/api/threads/${threadId}/kv`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ key, value }),\n });\n } catch {\n // best effort\n }\n }\n\n /** Mint a pre-authed standardcode.ai account-dashboard URL for this thread's\n * user. Returns null when the chain is unavailable — the caller falls back\n * to the plain dashboard URL (sign-in by inbox link). */\n async accountLink(threadId: string): Promise<{ url: string; preauthed: boolean } | null> {\n try {\n const res = await this.json<{ url?: string; preauthed?: boolean }>(\n `/api/threads/${threadId}/account_link`,\n { method: \"POST\" }\n );\n return res?.url ? { url: res.url, preauthed: res.preauthed === true } : null;\n } catch {\n return null;\n }\n }\n\n /** Preview the cost of changing to `sessions` parallel sessions (default +1).\n * Returns null when billing is unavailable / there's no subscription. */\n async sessionsQuote(threadId: string, sessions?: number): Promise<SessionQuote | null> {\n try {\n return await this.json<SessionQuote>(`/api/threads/${threadId}/sessions_quote`, {\n method: \"POST\",\n body: JSON.stringify(typeof sessions === \"number\" ? { sessions } : {}),\n });\n } catch {\n return null;\n }\n }\n\n /** Apply a parallel-session change (charges via Stripe). Throws on failure. */\n async sessionsUpgrade(threadId: string, sessions: number): Promise<{ ok?: boolean; sessions?: number; error?: string }> {\n return this.json(`/api/threads/${threadId}/sessions_upgrade`, {\n method: \"POST\",\n body: JSON.stringify({ sessions }),\n });\n }\n\n // ── skills (instance-global Agent Skills library) ─────────────────────────\n\n /** Installed skills — metadata only. Includes disabled skills. */\n async listSkills(): Promise<SkillInfo[]> {\n const res = await this.json<{ skills?: SkillInfo[] }>(`/api/skills?all=1`);\n return Array.isArray(res?.skills) ? res.skills : [];\n }\n\n /** Enable/disable an installed skill. */\n async setSkillEnabled(name: string, enabled: boolean): Promise<void> {\n await this.json(`/api/skills/${encodeURIComponent(name)}`, {\n method: \"PATCH\",\n body: JSON.stringify({ enabled }),\n });\n }\n\n /** Uninstall a skill. */\n async removeSkill(name: string): Promise<void> {\n await this.json(`/api/skills/${encodeURIComponent(name)}`, { method: \"DELETE\" });\n }\n\n /**\n * Kick off background conversation compaction now. Spawns the compaction\n * subagent directly server-side (so it fires even while the thread is idle).\n */\n async compact(threadId: string): Promise<void> {\n await this.json(`/api/threads/${threadId}/compact`, { method: \"POST\" });\n }\n\n async stop(threadId: string): Promise<void> {\n try {\n await this.json(`/api/threads/${threadId}/stop`, { method: \"POST\" });\n } catch {\n // best effort\n }\n }\n\n /**\n * Run a user-typed `!command` on the thread's execution owner (wherever the\n * session runs — e.g. a remote VPS daemon). The instance forwards it over\n * the bridge, records it in history, and returns the combined output.\n */\n async runCommand(\n threadId: string,\n command: string\n ): Promise<{ ok: boolean; output?: string; error?: string; messageId?: string }> {\n try {\n return await this.json<{ ok: boolean; output?: string; error?: string; messageId?: string }>(\n `/api/threads/${threadId}/run_command`,\n { method: \"POST\", body: JSON.stringify({ command }) }\n );\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n }\n\n /** The thread's current goal (set via set_goal / update_goal_step). */\n async getGoal(threadId: string): Promise<GoalData> {\n try {\n const r = await this.json<Partial<GoalData>>(`/api/threads/${threadId}/goal`);\n return {\n summary: r?.summary ?? null,\n description: r?.description ?? null,\n steps: Array.isArray(r?.steps) ? r.steps : [],\n };\n } catch {\n return { summary: null, description: null, steps: [] };\n }\n }\n}\n","/**\n * Permission engine. Combines the current mode with the model-supplied risk\n * (1–5) to decide whether a forwarded tool runs automatically, needs the user's\n * approval, or is blocked outright.\n */\nimport type { Level } from \"./types.ts\";\n\nexport type Decision = \"allow\" | \"ask\" | \"deny\";\n\nexport interface PermissionState {\n /** Auto-accept level 1–5: calls at risk ≤ level run automatically; riskier ones ask. */\n level: Level;\n /** Tool names the user chose to always allow this session. */\n alwaysAllow: Set<string>;\n /**\n * Risk levels the user granted this session (\"allow level N\"). Risk is a\n * GRADIENT, not distinct buckets: a grant at level N auto-accepts everything\n * at risk ≤ N — approving installs (3) obviously covers safe writes (2).\n * Kept as a Set (not a single ceiling) only for persisted-approval\n * compatibility; decide() always reads it as max().\n */\n allowRisk: Set<number>;\n}\n\n/** The effective auto-accept ceiling: base level raised by any risk grants. */\nexport function riskCeiling(state: PermissionState): number {\n let ceiling: number = state.level;\n for (const granted of state.allowRisk) {\n if (granted > ceiling) ceiling = granted;\n }\n return ceiling;\n}\n\nexport function decide(\n state: PermissionState,\n tool: string,\n risk: number | null,\n hasPermissionRequest: boolean\n): Decision {\n const effectiveRisk = typeof risk === \"number\" ? Math.min(5, Math.max(1, risk)) : hasPermissionRequest ? 3 : 1;\n\n // Standing tool approvals the user granted this session.\n if (state.alwaysAllow.has(tool)) return \"allow\";\n\n // One gradient: anything at or below the effective ceiling (base level,\n // raised by session risk grants) runs without asking.\n return effectiveRisk <= riskCeiling(state) ? \"allow\" : \"ask\";\n}\n\n/**\n * Catastrophic-command guard that applies regardless of mode. These are blocked\n * even in bypass mode — a coding agent should never be able to wipe the machine.\n */\nconst CATASTROPHIC_PATTERNS: RegExp[] = [\n /\\brm\\s+(-[a-z]*\\s+)*-[a-z]*f[a-z]*\\s+(-[a-z]*\\s+)*(\\/|~|\\$HOME|\\/\\*|\\.\\s*$|\\/\\s*$)/i, // rm -rf / , rm -rf ~\n /\\brm\\s+-rf\\s+--no-preserve-root/i,\n /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\}\\s*;:/, // fork bomb\n /\\bmkfs(\\.\\w+)?\\b/i, // format filesystem\n /\\bdd\\b[^\\n]*\\bof=\\/dev\\/(sd|disk|nvme|hd)/i, // overwrite raw disk\n /\\b(shutdown|reboot|halt|poweroff)\\b/i,\n />\\s*\\/dev\\/(sd|disk|nvme|hd)/i,\n /\\bchmod\\s+-R\\s+(000|777)\\s+\\/(?:\\s|$)/i,\n];\n\nexport function isCatastrophic(command: string): boolean {\n return CATASTROPHIC_PATTERNS.some((re) => re.test(command));\n}\n","/**\n * Session approvals — the permission mode plus the tools and risk levels the\n * user has pre-approved — persisted in the THREAD's KV store (server-side), so\n * they resume with the session and a server hook can show the agent what's\n * already approved. Nothing is stored on the client.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport type { Level } from \"./types.ts\";\n\nconst KEY = \"approvals\";\n\nexport interface ApprovalsKV {\n level?: Level;\n allowTools: string[];\n allowRisk: number[];\n}\n\nexport async function loadApprovals(api: ApiClient, threadId: string): Promise<ApprovalsKV> {\n const v = await api.kvGet(threadId, KEY);\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const n = Number(o.level);\n const level = n >= 1 && n <= 5 ? (n as Level) : undefined;\n return {\n level,\n allowTools: Array.isArray(o.allowTools) ? (o.allowTools as string[]) : [],\n allowRisk: Array.isArray(o.allowRisk) ? (o.allowRisk as number[]) : [],\n };\n }\n return { allowTools: [], allowRisk: [] };\n}\n\n/** Persist the current approvals to the thread KV (fire-and-forget). */\nexport function saveApprovals(api: ApiClient, threadId: string, perm: PermissionState): void {\n const payload: ApprovalsKV = {\n level: perm.level,\n allowTools: Array.from(perm.alwaysAllow).sort(),\n allowRisk: Array.from(perm.allowRisk).sort((a, b) => a - b),\n };\n void api.kvSet(threadId, KEY, payload);\n}\n","/**\n * App-level keepalive + half-open detection for a WebSocket.\n *\n * Node's WebSocket (and the server) won't promptly report a connection that died\n * silently — an idle NAT/proxy timeout drops the TCP without a close frame, so\n * the socket sits in `OPEN` forever and `send()` never throws. We defend against\n * that by pinging the server on an interval (it answers \"pong\") and treating the\n * connection as dead if no frame arrives within {@link CONNECTION_SILENCE_TIMEOUT_MS}.\n *\n * The owner calls `start()` once the socket opens, `markAlive()` on every frame\n * it receives, and `stop()` when the socket closes. `onDead` fires at most once\n * per heartbeat and should drop + reconnect the socket.\n */\n\n/** How often to ping the server (which replies \"pong\"). */\nexport const HEARTBEAT_INTERVAL_MS = 5000;\n\n/**\n * If the server sends nothing — no pong, no data — for this long, the socket is\n * dead even if `readyState` still says OPEN. Kept comfortably under the server's\n * own liveness timeout so the client detects the drop and reconnects first.\n */\nexport const CONNECTION_SILENCE_TIMEOUT_MS = 15000;\n\nexport interface HeartbeatOptions {\n /** Ping cadence in ms. Defaults to {@link HEARTBEAT_INTERVAL_MS}. */\n intervalMs?: number;\n /** Silence-before-dead window in ms. Defaults to {@link CONNECTION_SILENCE_TIMEOUT_MS}. */\n silenceMs?: number;\n}\n\nexport class Heartbeat {\n private timer: ReturnType<typeof setInterval> | null = null;\n private lastRecvAt = 0;\n private readonly intervalMs: number;\n private readonly silenceMs: number;\n\n constructor(\n private ws: Pick<WebSocket, \"readyState\" | \"send\" | \"close\">,\n private onDead: () => void,\n options: HeartbeatOptions = {}\n ) {\n this.intervalMs = options.intervalMs ?? HEARTBEAT_INTERVAL_MS;\n this.silenceMs = options.silenceMs ?? CONNECTION_SILENCE_TIMEOUT_MS;\n }\n\n start(): void {\n this.stop();\n this.lastRecvAt = Date.now();\n this.timer = setInterval(() => this.tick(), this.intervalMs);\n }\n\n /** Record that a frame was received — proof the connection is alive. */\n markAlive(): void {\n this.lastRecvAt = Date.now();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n private tick(): void {\n if (Date.now() - this.lastRecvAt > this.silenceMs) {\n this.fail();\n return;\n }\n try {\n if (this.ws.readyState === WebSocket.OPEN) this.ws.send(\"ping\");\n else this.fail();\n } catch {\n this.fail();\n }\n }\n\n private fail(): void {\n this.stop();\n try {\n this.ws.close();\n } catch {\n // already closing/closed\n }\n this.onDead();\n }\n}\n","/**\n * Transcript renderers for tool activity: git-style truncated diffs for\n * edits/writes and light syntax highlighting for bash commands.\n *\n * These produce PERMANENT transcript lines (printed above the run area), so\n * they may wrap in the scrollback without breaking any redraw math — but each\n * line is still clamped to the terminal width so a big hunk doesn't flood the\n * screen. Colors follow git/Claude/Codex conventions: dark green background\n * for added lines, dark red for removed.\n */\n\nconst RESET = \"\\x1b[0m\";\nconst DIM = \"\\x1b[2m\";\nconst ADD_BG = \"\\x1b[48;5;22m\\x1b[38;5;254m\"; // dark green bg, pale text\nconst DEL_BG = \"\\x1b[48;5;52m\\x1b[38;5;254m\"; // dark red bg, pale text\n\n// Shared budget: a diff shows at most this many content rows per side before\n// truncating to a \"… +n more\" line — enough to see the shape of a change\n// without drowning the transcript.\nconst MAX_SIDE_LINES = 4;\n\nfunction clamp(s: string, max: number): string {\n return s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n}\n\nfunction cols(): number {\n return Math.max(20, process.stdout.columns || 80);\n}\n\n/** Expand tabs (a tab under a colored bg renders unpredictably wide). */\nfunction flat(line: string): string {\n return line.replace(/\\t/g, \" \");\n}\n\n/**\n * A truncated git-style hunk for an exact-string edit: the lines removed\n * (red background, `-`) then the lines added (green background, `+`).\n * Common leading/trailing lines between old and new are trimmed away so the\n * hunk shows just the changed core. Returns [] when nothing visibly changed.\n */\nexport function diffLines(oldStr: string, newStr: string): string[] {\n let oldLines = oldStr.split(\"\\n\");\n let newLines = newStr.split(\"\\n\");\n // Trim shared prefix/suffix lines so only the real change shows.\n while (oldLines.length && newLines.length && oldLines[0] === newLines[0]) {\n oldLines.shift();\n newLines.shift();\n }\n while (\n oldLines.length &&\n newLines.length &&\n oldLines[oldLines.length - 1] === newLines[newLines.length - 1]\n ) {\n oldLines.pop();\n newLines.pop();\n }\n const width = cols() - 2;\n const out: string[] = [];\n const side = (lines: string[], bg: string, sign: string) => {\n const shown = lines.slice(0, MAX_SIDE_LINES);\n for (const l of shown) out.push(`${bg}${sign} ${clamp(flat(l), width)}${RESET}`);\n const hidden = lines.length - shown.length;\n if (hidden > 0) out.push(`${DIM} … +${hidden} more line${hidden === 1 ? \"\" : \"s\"}${RESET}`);\n };\n side(oldLines, DEL_BG, \"-\");\n side(newLines, ADD_BG, \"+\");\n return out;\n}\n\n/** A truncated all-added hunk for a newly written file. */\nexport function newFileLines(content: string): string[] {\n const lines = content.split(\"\\n\");\n const width = cols() - 2;\n const shown = lines.slice(0, MAX_SIDE_LINES);\n const out = shown.map((l) => `${ADD_BG}+ ${clamp(flat(l), width)}${RESET}`);\n const hidden = lines.length - shown.length;\n if (hidden > 0) out.push(`${DIM} … +${hidden} more line${hidden === 1 ? \"\" : \"s\"}${RESET}`);\n return out;\n}\n\n/**\n * Muted shell rendering for a command shown in the transcript: program words\n * (start / after a control operator) at normal intensity, EVERYTHING else —\n * arguments, strings, flags, operators, comments — dim. The transcript should\n * read as a quiet activity log, not a syntax rainbow; the program names are\n * enough to scan what ran. Quote-aware single-pass tokenizer; falls back to\n * dim text on anything it doesn't understand.\n */\nexport function highlightBash(cmd: string): string {\n let out = \"\";\n let i = 0;\n let expectProgram = true; // next bare word is a program name (start / after an operator)\n while (i < cmd.length) {\n const ch = cmd[i];\n if (ch === \"'\" || ch === '\"') {\n // Whole quoted string (including quotes), dim; honor backslash escapes in \"\".\n let j = i + 1;\n while (j < cmd.length && cmd[j] !== ch) {\n if (ch === '\"' && cmd[j] === \"\\\\\") j++;\n j++;\n }\n out += `${DIM}${cmd.slice(i, Math.min(j + 1, cmd.length))}${RESET}`;\n i = j + 1;\n continue;\n }\n if (ch === \"#\") {\n out += `${DIM}${cmd.slice(i)}${RESET}`;\n break;\n }\n const op = cmd.slice(i).match(/^(\\|\\||&&|\\||;|>>|>|<)/);\n if (op) {\n out += `${DIM}${op[1]}${RESET}`;\n i += op[1].length;\n expectProgram = true;\n continue;\n }\n const word = cmd.slice(i).match(/^[^\\s'\"#|;&<>]+/);\n if (word) {\n const w = word[0];\n if (expectProgram && !w.startsWith(\"-\")) {\n out += w; // program name at normal intensity — the only non-dim ink\n expectProgram = false;\n } else {\n out += `${DIM}${w}${RESET}`;\n }\n i += w.length;\n continue;\n }\n out += `${DIM}${ch}${RESET}`;\n i++;\n }\n return out;\n}\n\n/**\n * Collapse a (possibly multi-line, heredoc-y) command into one calm\n * transcript line: newlines become ⏎, runs of whitespace collapse, and the\n * result is clamped so it can't flood the transcript. Multi-line command\n * bodies belong in the child process, not the activity log.\n */\nexport function oneLineCommand(cmd: string, max: number): string {\n const collapsed = cmd.replace(/\\s*\\n+\\s*/g, \" ⏎ \").replace(/[ \\t]{2,}/g, \" \").trim();\n return clamp(collapsed, max);\n}\n\n// ── brand gradient ───────────────────────────────────────────────────────────\n\n/**\n * The Standard Code brand gradient (amber → coral → violet), applied per\n * character with 24-bit ANSI color. `phase` shifts the gradient's starting\n * point (0..1) so multi-line art can sweep diagonally. Terminals without\n * truecolor get a 256-color approximation — never plain text, the brand\n * moments should always land.\n */\nconst GRAD_STOPS: Array<[number, number, number]> = [\n [0xff, 0xb3, 0x5c], // amber\n [0xff, 0x5c, 0x87], // coral\n [0x8b, 0x6c, 0xff], // violet\n];\nconst GRAD_256 = [215, 210, 204, 176, 141]; // amber→pink→violet approximation\n\nfunction truecolor(): boolean {\n const ct = process.env.COLORTERM ?? \"\";\n if (/truecolor|24bit/i.test(ct)) return true;\n // Common truecolor terminals that don't always set COLORTERM.\n return /iterm|kitty|wezterm|ghostty|alacritty/i.test(process.env.TERM_PROGRAM ?? \"\");\n}\n\nfunction gradAt(t: number): [number, number, number] {\n const clamped = Math.max(0, Math.min(1, t));\n const seg = clamped * (GRAD_STOPS.length - 1);\n const i = Math.min(GRAD_STOPS.length - 2, Math.floor(seg));\n const k = seg - i;\n const [a, b] = [GRAD_STOPS[i], GRAD_STOPS[i + 1]];\n return [\n Math.round(a[0] + (b[0] - a[0]) * k),\n Math.round(a[1] + (b[1] - a[1]) * k),\n Math.round(a[2] + (b[2] - a[2]) * k),\n ];\n}\n\n/** Ping-pong a time/position value through [0,1] so a looping animation sweeps\n * amber→coral→violet→coral→amber with no seam at the wrap point. */\nfunction cyclePos(t: number): number {\n const p = t - Math.floor(t);\n return p < 0.5 ? p * 2 : 2 - p * 2;\n}\n\nfunction colorAtCycle(tri: number, tc: boolean): string {\n if (tc) {\n const [r, g, b] = gradAt(tri);\n return `\\x1b[38;2;${r};${g};${b}m`;\n }\n return `\\x1b[38;5;${GRAD_256[Math.min(GRAD_256.length - 1, Math.floor(tri * GRAD_256.length))]}m`;\n}\n\n/** ANSI fg escape that cycles through the brand gradient over time — for\n * animated glyphs like the working spinner. `ms` is a clock (Date.now()). */\nexport function brandCycleColor(ms: number, periodMs = 1200): string {\n return colorAtCycle(cyclePos(ms / periodMs), truecolor());\n}\n\n/**\n * Seamless looping brand gradient sample (amber → coral → violet → amber).\n * `t` is any real; only the fractional part matters. Used for rotating border\n * highlights so the sweep has no hard seam.\n */\nexport function brandLoopFg(t: number): string {\n const p = t - Math.floor(t);\n // 4 stops with wrap-back to amber so the loop is continuous.\n const stops: Array<[number, number, number]> = [\n GRAD_STOPS[0],\n GRAD_STOPS[1],\n GRAD_STOPS[2],\n GRAD_STOPS[0],\n ];\n const seg = p * (stops.length - 1);\n const i = Math.min(stops.length - 2, Math.floor(seg));\n const k = seg - i;\n const a = stops[i];\n const b = stops[i + 1];\n const r = Math.round(a[0] + (b[0] - a[0]) * k);\n const g = Math.round(a[1] + (b[1] - a[1]) * k);\n const bl = Math.round(a[2] + (b[2] - a[2]) * k);\n if (truecolor()) return `\\x1b[38;2;${r};${g};${bl}m`;\n // 256-color: pick the nearest stop by segment.\n const approx = [215, 210, 204, 141, 215];\n return `\\x1b[38;5;${approx[Math.min(approx.length - 1, Math.round(p * (approx.length - 1)))]}m`;\n}\n\n/** Apply the brand gradient across a single line of text. */\nexport function gradientText(text: string, phase = 0): string {\n const chars = [...text];\n const visible = chars.filter((ch) => ch.trim().length > 0).length;\n if (!visible) return text;\n const tc = truecolor();\n let seen = 0;\n let out = \"\";\n for (const ch of chars) {\n if (ch.trim().length === 0) { out += ch; continue; }\n const t = Math.min(1, phase + (seen / Math.max(1, visible - 1)) * (1 - phase * 0.4));\n seen++;\n if (tc) {\n const [r, g, b] = gradAt(t);\n out += `\\x1b[38;2;${r};${g};${b}m${ch}`;\n } else {\n out += `\\x1b[38;5;${GRAD_256[Math.min(GRAD_256.length - 1, Math.floor(t * GRAD_256.length))]}m${ch}`;\n }\n }\n return out + \"\\x1b[0m\";\n}\n\n/**\n * Muted brand-tinted chrome for HUD box borders — warm amber-ink that sits\n * with the amber→coral→violet palette without competing with content.\n * Matches the dim line colors on standardcode.ai.\n */\nexport function brandChromeColor(): string {\n if (truecolor()) return \"\\x1b[38;2;120;100;88m\"; // muted amber\n return \"\\x1b[38;5;180m\";\n}\n\n/** Solid brand stop (amber / coral / violet) for small chrome labels. */\nexport function brandStopColor(stop: \"amber\" | \"coral\" | \"violet\"): string {\n if (truecolor()) {\n const [r, g, b] =\n stop === \"amber\" ? GRAD_STOPS[0] : stop === \"coral\" ? GRAD_STOPS[1] : GRAD_STOPS[2];\n return `\\x1b[38;2;${r};${g};${b}m`;\n }\n return stop === \"amber\"\n ? \"\\x1b[38;5;215m\"\n : stop === \"coral\"\n ? \"\\x1b[38;5;204m\"\n : \"\\x1b[38;5;141m\";\n}\n\n","/**\n * The client-tool bridge: holds a WebSocket open to the instance, receives\n * forwarded tool requests, runs them through the permission engine + safety\n * guard, executes the approved ones on the host, and returns results.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport type { HostTools } from \"./host-tools.ts\";\nimport { decide, isCatastrophic, type PermissionState } from \"./permissions.ts\";\nimport { saveApprovals } from \"./approvals.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\nimport type {\n BridgeClientIdentity,\n ExecutionOwnerInfo,\n HostResult,\n ToolRequest,\n} from \"./types.ts\";\nimport { diffLines, newFileLines, highlightBash, oneLineCommand } from \"./render.ts\";\n\nexport type ApprovalChoice = \"allow\" | \"deny\" | \"always\" | \"always_risk\";\n/** Approval outcome plus, for a denial, an optional reason the user typed for the agent. */\nexport type ApprovalResult = { choice: ApprovalChoice; reason?: string };\n\nexport type ConnectionState = \"connected\" | \"reconnecting\" | \"reconnected\";\n\nexport interface BridgeHooks {\n /** Print a permanent line (a finished/denied/blocked tool). `detail` lines are\n * pre-styled extra rows (e.g. a truncated diff) printed verbatim beneath it. */\n onActivity(line: string, detail?: string[]): void;\n /** Update the live working status (the currently-running tool, or null = idle). */\n /** A host tool started (`summary`) or finished (`null`) executing, keyed by its\n * tool-call id. The CLI is the source of truth for what is running on the host —\n * the server's stream events can be missed (reconnects), leaving a stale label. */\n onStatus?(id: string, summary: string | null): void;\n /** Report connection lifecycle so the UI can show disconnect/reconnect state. */\n onConnection?(state: ConnectionState, attempt: number): void;\n /** Execution ownership changed: whether THIS client now executes forwarded\n * tools, plus who the current owner is (from bridge_ready / owner_changed). */\n onOwnership?(isOwner: boolean, owner: ExecutionOwnerInfo | null): void;\n /** The instance refused this client's ownership claim (e.g. \"in_flight\" —\n * the current owner is mid-tool-call; execution can't move safely yet). */\n onClaimRefused?(reason: string): void;\n /** The instance closed this socket because a NEWER connection presented the\n * same client identity (close code 4001). The bridge will NOT reconnect —\n * reconnecting would ping-pong the socket between the two processes. */\n onSuperseded?(): void;\n /** Re-sync the permission state before each decision. A headless daemon's\n * approvals are edited by OTHER clients (through the thread KV), so its\n * in-memory copy must be refreshed per request; the interactive CLI owns\n * its own state and omits this. */\n refreshPermissions?(): Promise<void>;\n /** Ask the user to approve a tool; resolve with their choice. */\n requestApproval(req: ToolRequest, summary: string, effectiveRisk: number): Promise<ApprovalResult>;\n}\n\n/** Tools that mutate or execute (used to deny in plan mode cleanly). */\nconst PATH_ARG_TOOLS = new Set([\"read_file\", \"grep\", \"glob\", \"write_file\", \"edit_file\"]);\n\nexport class Bridge {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private resolveConnected: (() => void) | null = null;\n // Durable forwarded calls we've started handling, so a server re-send (after a\n // reconnect) doesn't prompt or run them twice.\n private handledDurable = new Set<string>();\n // Whether this client currently holds execution ownership. Starts true so an\n // instance that predates the owner concept (no owner field in bridge_ready)\n // behaves exactly as before; an owner-aware instance sets it on every connect.\n private owner = true;\n // Ownership generation from the last bridge_ready/owner_changed (echoed in\n // durable deliveries so the server's fence can match).\n private ownerGeneration = 0;\n // Resolved once the first owner-aware bridge_ready arrives (or never, on a\n // legacy instance — callers pair this with a timeout).\n private ownershipKnownResolve: (() => void) | null = null;\n private ownershipKnownPromise = new Promise<void>((resolve) => {\n this.ownershipKnownResolve = resolve;\n });\n\n constructor(\n private api: ApiClient,\n private threadId: string,\n private host: HostTools,\n private perm: PermissionState,\n private hooks: BridgeHooks,\n /** Identity for execution-owner election. Omitted = legacy anonymous bridge. */\n private identity?: BridgeClientIdentity\n ) {}\n\n /** Whether this client currently executes forwarded tool calls. */\n get isOwner(): boolean {\n return this.owner;\n }\n\n /** Adjust the ownership claim used on the NEXT (re)connect — e.g. an\n * interactive session that became owner reasserts with `takeover` after a\n * brief drop, instead of silently losing execution to a daemon's\n * stale-claim probe. */\n setClaim(claim: BridgeClientIdentity[\"claim\"]): void {\n if (this.identity) this.identity.claim = claim;\n }\n\n /**\n * Resolve once the instance has said whether this client owns execution\n * (the first owner-aware bridge_ready). Legacy instances never say — the\n * timeout resolves to the current (assumed-owner) state so callers can gate\n * owner-only side effects like session_info/mcp_catalog writes.\n */\n async whenOwnershipKnown(timeoutMs = 3000): Promise<boolean> {\n await Promise.race([\n this.ownershipKnownPromise,\n new Promise<void>((resolve) => setTimeout(resolve, timeoutMs)),\n ]);\n return this.owner;\n }\n\n /**\n * Connect and keep the bridge connected. Resolves on the first successful\n * open; thereafter any drop is reconnected automatically with exponential\n * backoff (disconnections are expected — e.g. a dev-server reload — so this\n * must be rock solid). A short safety timeout resolves startup even if the\n * very first attempt is slow, since reconnection continues in the background.\n */\n connect(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n this.resolveConnected = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n // Don't hang startup forever if the first attempt is slow.\n setTimeout(() => this.resolveConnected?.(), 8000);\n this.openSocket();\n });\n }\n\n private openSocket(): void {\n if (this.closed) return;\n let url = `${this.api.wsEndpoint}/api/threads/${this.threadId}/bridge?token=${encodeURIComponent(this.api.bearer)}`;\n if (this.identity) {\n url +=\n `&client_id=${encodeURIComponent(this.identity.clientId)}` +\n `&client_kind=${encodeURIComponent(this.identity.clientKind)}` +\n `&claim=${encodeURIComponent(this.identity.claim)}`;\n if (this.identity.clientName) {\n url += `&client_name=${encodeURIComponent(this.identity.clientName)}`;\n }\n }\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n\n ws.addEventListener(\"open\", () => {\n const wasReconnecting = this.reconnectAttempt > 0;\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.hooks.onConnection?.(wasReconnecting ? \"reconnected\" : \"connected\", 0);\n this.resolveConnected?.();\n });\n\n ws.addEventListener(\"message\", (ev) => {\n // Any frame (pong, bridge_ready, tool_request) proves the link is alive.\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n\n // A socket that fails to open fires 'error' but may never fire 'close', so\n // both must drive reconnection. handleDrop dedupes via the current-socket check.\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", (ev) => {\n // 4001 = a newer connection presented OUR client identity. Do not\n // reconnect (the two processes would ping-pong the socket) — hand the\n // session to the newer process and tell the app.\n if ((ev as { code?: number }).code === 4001 && this.ws === ws) {\n this.closed = true;\n this.owner = false;\n this.ws = null;\n this.stopHeartbeat();\n this.hooks.onSuperseded?.();\n return;\n }\n this.handleDrop(ws);\n });\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return; // stale event from a superseded socket\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n this.hooks.onConnection?.(\"reconnecting\", this.reconnectAttempt);\n // Exponential backoff with jitter, capped — keep trying indefinitely.\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n // Heartbeat so the server can tell a live client (mid-build or awaiting an\n // approval) from a dead one and never freeze a thread on us — and so WE\n // notice when the server goes silent (a half-open TCP that never fires\n // 'close'/'error') and reconnect instead of looking connected forever.\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n\n /**\n * Force a reconnect now. Ownership claims are evaluated at bridge connect,\n * so a non-owner that wants to re-check (e.g. the daemon probing whether a\n * disconnected interactive owner has gone stale) cycles its socket.\n */\n refresh(): void {\n if (this.closed) return;\n const ws = this.ws;\n if (ws) {\n try {\n ws.close();\n } catch {\n // handleDrop still runs via the close event\n }\n this.handleDrop(ws);\n } else {\n this.scheduleReconnect();\n }\n }\n\n private send(payload: object): void {\n try {\n this.ws?.send(JSON.stringify(payload));\n } catch {\n // socket gone; the server will time the call out\n }\n }\n\n private async onMessage(raw: string): Promise<void> {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n // Execution ownership: bridge_ready tells us whether WE execute forwarded\n // tools for this thread; owner_changed announces a takeover by another\n // client. Instances that predate the owner concept send neither field and\n // this client keeps its historical sole-executor behavior.\n if (msg.type === \"bridge_ready\") {\n if (typeof msg.owner === \"boolean\") {\n this.owner = msg.owner;\n const owner = parseOwnerInfo(msg.current_owner);\n this.ownerGeneration = owner?.generation ?? 0;\n if (typeof msg.claim_refused === \"string\") {\n this.hooks.onClaimRefused?.(msg.claim_refused);\n }\n this.hooks.onOwnership?.(msg.owner, owner);\n this.ownershipKnownResolve?.();\n }\n return;\n }\n if (msg.type === \"owner_changed\") {\n const owner = parseOwnerInfo(msg.owner);\n this.owner = !!owner && !!this.identity && owner.client_id === this.identity.clientId;\n this.ownerGeneration = owner?.generation ?? 0;\n this.hooks.onOwnership?.(this.owner, owner);\n return;\n }\n if (msg.type === \"superseded\") {\n // A newer connection presented OUR client identity (see the 4001 close\n // path below — this frame covers runtimes that drop close codes).\n this.closed = true;\n this.owner = false;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n try {\n this.ws?.close();\n } catch {\n // server closes it anyway\n }\n this.ws = null;\n this.hooks.onSuperseded?.();\n return;\n }\n if (msg.type !== \"tool_request\") return;\n // Belt & braces: a non-owner must never execute — the server doesn't\n // dispatch to non-owners, but a frame racing an ownership change could.\n if (!this.owner) return;\n const req = msg as ToolRequest;\n await this.handleToolRequest(req);\n }\n\n /**\n * Reply to a tool request. Durable calls (the agent parked them) deliver the\n * result over HTTP so it lands even if this socket later drops; legacy calls\n * reply over the WebSocket.\n */\n private respond(req: ToolRequest, ok: boolean, result?: string, error?: string): void {\n if (req.durable && req.toolCallId) {\n // Echo the ownership stamp so the server's generation fence can verify\n // this delivery comes from the client the call was dispatched to.\n const executor = this.identity\n ? {\n clientId: this.identity.clientId,\n generation: typeof req.generation === \"number\" ? req.generation : this.ownerGeneration,\n }\n : undefined;\n void this.api.postToolResult(this.threadId, req.toolCallId, ok, result, error, executor);\n } else {\n this.send({ type: \"tool_response\", id: req.id, ok, result, error });\n }\n }\n\n private async handleToolRequest(req: ToolRequest): Promise<void> {\n // Durable calls may be re-sent by the server after a reconnect — only handle\n // each once (prompt + run), so the user isn't asked twice.\n if (req.durable && req.toolCallId) {\n if (this.handledDurable.has(req.toolCallId)) return;\n this.handledDurable.add(req.toolCallId);\n }\n\n const summary = describe(req);\n\n // Compute an effective risk, escalating anything that touches paths outside\n // the project directory (the agent is told to stay inside it).\n let effectiveRisk = typeof req.risk === \"number\" ? req.risk : req.requestPermission ? 3 : 1;\n if (PATH_ARG_TOOLS.has(req.tool) && this.host.isOutsideProject(req.args.path as string | undefined)) {\n effectiveRisk = Math.max(effectiveRisk, 4);\n }\n\n // Hard safety: never run catastrophic shell commands, even in bypass mode.\n if (req.tool === \"bash\" && isCatastrophic(String(req.args.command || \"\"))) {\n this.hooks.onActivity(`⛔ blocked dangerous command: ${summary}`);\n this.respond(req, false, undefined, \"Blocked: this command is considered catastrophic and was refused by the client safety guard.\");\n return;\n }\n\n // Permission key: normally the tool name, but MCP calls are gated at the\n // finer `mcp:<server>/<tool>` granularity so \"always allow this tool\" approves\n // one server's tool rather than every MCP call.\n await this.hooks.refreshPermissions?.().catch(() => {});\n const permKey = permissionKey(req);\n const decision = decide(this.perm, permKey, effectiveRisk, !!req.requestPermission);\n\n if (decision === \"deny\") {\n this.hooks.onActivity(`⛔ ${summary} — blocked (risk ${effectiveRisk})`);\n this.respond(req, false, undefined, `Denied by policy (risk ${effectiveRisk}).`);\n return;\n }\n\n if (decision === \"ask\") {\n const { choice, reason } = await this.hooks.requestApproval(req, summary, effectiveRisk);\n if (choice === \"deny\") {\n const why = reason?.trim();\n this.hooks.onActivity(`⛔ ${summary} — you declined${why ? `: ${why}` : \"\"}`);\n this.respond(\n req,\n false,\n undefined,\n why\n ? `The user declined to run this operation. Their reason: ${why}`\n : \"The user declined to run this operation.\"\n );\n return;\n }\n if (choice === \"always\") this.perm.alwaysAllow.add(permKey);\n if (choice === \"always_risk\") this.perm.allowRisk.add(effectiveRisk);\n if (choice === \"always\" || choice === \"always_risk\") {\n saveApprovals(this.api, this.threadId, this.perm);\n }\n }\n\n // Show the running tool in the live status, then leave a permanent line. The\n // status is keyed by the tool-call id and cleared in a `finally`, so the\n // \"Working …\" label can never get stuck on a tool that already finished even\n // if execution throws or the server's done event is dropped.\n const callKey = req.toolCallId ?? req.id ?? `${req.tool}:${summary}`;\n this.hooks.onStatus?.(callKey, summary);\n let result: HostResult;\n try {\n result = await this.host.execute(req.tool, req.args);\n } finally {\n this.hooks.onStatus?.(callKey, null);\n }\n if (result.ok) {\n const { display, detail } = activityPresentation(req, summary);\n this.hooks.onActivity(`✓ ${display}${detailSuffix(req.tool, result.result)}`, detail);\n this.respond(req, true, result.result ?? \"\");\n } else {\n this.hooks.onActivity(`✗ ${summary} — ${result.error}`);\n this.respond(req, false, undefined, result.error);\n }\n }\n}\n\n/** Parse an owner payload from a bridge frame (best effort). */\nfunction parseOwnerInfo(value: unknown): ExecutionOwnerInfo | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const r = value as Record<string, unknown>;\n if (typeof r.client_id !== \"string\" || r.client_id.length === 0) return null;\n return {\n client_id: r.client_id,\n client_name: typeof r.client_name === \"string\" ? r.client_name : null,\n client_kind: typeof r.client_kind === \"string\" ? r.client_kind : null,\n generation: typeof r.generation === \"number\" ? r.generation : undefined,\n };\n}\n\n/**\n * Stable permission key for a request. For MCP, gate on the specific server +\n * tool/resource so approvals are fine-grained; for everything else, the tool name.\n */\nexport function permissionKey(req: ToolRequest): string {\n if (req.tool !== \"mcp\") return req.tool;\n const a = req.args;\n const server = String(a.server || \"?\");\n const action = String(a.action || \"call\");\n if (action === \"read_resource\") return `mcp:${server}/resource`;\n if (action === \"list_tools\") return `mcp:${server}/list`;\n return `mcp:${server}/${String(a.tool || \"?\")}`;\n}\n\nconst DIM = \"\\x1b[2m\";\nconst RESET = \"\\x1b[0m\";\n\n/**\n * Activity-feed presentation for a finished tool call: the ✓-line text plus\n * optional indented sub-lines. Bash gets its command syntax-highlighted;\n * edits/writes get a truncated git-style hunk beneath the summary so the\n * change is visible at a glance; background_process reads as its action with\n * the command/description as a dim sub-line — never raw JSON args.\n */\nexport function activityPresentation(\n req: ToolRequest,\n summary: string\n): { display: string; detail?: string[] } {\n const a = req.args;\n const cols = Math.max(40, process.stdout.columns || 80);\n if (req.tool === \"bash\") {\n return { display: `bash: ${highlightBash(oneLineCommand(String(a.command ?? \"\"), cols - 20))}` };\n }\n if (req.tool === \"edit_file\") {\n return { display: summary, detail: diffLines(String(a.old_string ?? \"\"), String(a.new_string ?? \"\")) };\n }\n if (req.tool === \"write_file\") {\n return { display: summary, detail: newFileLines(String(a.content ?? \"\")) };\n }\n if (req.tool === \"background_process\") {\n const action = String(a.action || \"list\");\n const id = a.id ? ` ${String(a.id)}` : \"\";\n const display = action === \"start\" ? \"bg start\" : `bg ${action}${id}`;\n const detail: string[] = [];\n if (action === \"start\" && a.command) {\n detail.push(` ${DIM}${oneLineCommand(String(a.command), cols - 8)}${RESET}`);\n }\n if (typeof a.description === \"string\" && a.description.trim()) {\n detail.push(` ${DIM}${oneLineCommand(a.description, cols - 8)}${RESET}`);\n }\n return { display, detail: detail.length ? detail : undefined };\n }\n return { display: summary };\n}\n\n/** One-line human summary of a tool request for the activity feed. */\nexport function describe(req: ToolRequest): string {\n const a = req.args;\n switch (req.tool) {\n case \"mcp\": {\n const server = String(a.server || \"?\");\n const action = String(a.action || \"call\");\n if (action === \"list_tools\") return `mcp ${server}: list tools`;\n if (action === \"read_resource\") return `mcp ${server}: read ${a.uri}`;\n return `mcp ${server}: ${a.tool}`;\n }\n case \"read_file\":\n return `read ${a.path}`;\n case \"grep\":\n return `grep \"${a.pattern}\"${a.glob ? ` in ${a.glob}` : \"\"}`;\n case \"glob\":\n return `find ${a.pattern}`;\n case \"write_file\":\n return `write ${a.path}`;\n case \"edit_file\":\n return `edit ${a.path}`;\n case \"save_to_disk\":\n return `save ${a.source_path} → ${a.dest_path}`;\n case \"run_skill_script\":\n return `skill ${a.skill}: run ${a.entry}`;\n case \"bash\":\n return `bash: ${oneLineCommand(String(a.command ?? \"\"), 80)}`;\n case \"background_process\": {\n // The approval prompt sees only this summary, so `start` must carry the\n // command; the activity feed re-presents it as an indented sub-line.\n const action = String(a.action || \"list\");\n if (action === \"start\") return `bg start: ${oneLineCommand(String(a.command ?? \"\"), 80)}`;\n if (action === \"list\") return \"bg list\";\n return `bg ${action}${a.id ? ` ${String(a.id)}` : \"\"}`;\n }\n default:\n return `${req.tool} ${JSON.stringify(a).slice(0, 80)}`;\n }\n}\n\n/** A short parenthetical hint appended to a finished read-style tool line. */\nfunction detailSuffix(tool: string, result?: string): string {\n if (!result) return \"\";\n // Mutations already read clearly from their summary; don't pile on.\n if (tool === \"write_file\" || tool === \"edit_file\") return \"\";\n if (tool === \"bash\") {\n const m = result.match(/\\[exit code (\\d+)\\]\\s*$/);\n return m ? ` (exit ${m[1]})` : \"\";\n }\n const lines = result.split(\"\\n\").length;\n return ` (${lines} line${lines === 1 ? \"\" : \"s\"})`;\n}\n","/**\n * Registry of long-running background processes the agent spawns.\n *\n * The metadata lives in the THREAD's durable key-value store (server-side), not\n * on this client — so the process list resumes from any machine, at any time,\n * and nothing about it is kept on the client. (The process *output* logs are the\n * one host-local thing: a detached process writes its stdout to a file on the\n * machine it runs on; that file can only live there.)\n *\n * Liveness is re-derived from the OS for this machine's processes — a recorded\n * \"running\" entry is verified with a signal-0 probe — so the registry self-heals\n * if a process died while we weren't watching. Processes on other machines show\n * their last-known status (we can't probe a PID we don't own).\n */\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { ApiClient } from \"./api.ts\";\n\n/** Process *output* logs are host-local (the process writes its stdout here). */\nexport const LOG_DIR = path.join(os.homedir(), \".standardagents\", \"process-logs\");\n\n/** The thread KV key under which the process list is stored. */\nconst KEY = \"bg_processes\";\n\nexport type ProcessStatus = \"running\" | \"exited\" | \"stopped\";\n\nexport interface ProcessEntry {\n id: string;\n pid: number;\n command: string;\n description?: string;\n cwd: string;\n machine: string;\n logPath: string;\n startedAt: number;\n status: ProcessStatus;\n exitCode?: number | null;\n endedAt?: number;\n}\n\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n // EPERM means the process exists but isn't ours; ESRCH means it's gone.\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nexport class ProcessRegistry {\n constructor(\n private api: ApiClient,\n private threadId: string,\n private machine: string\n ) {}\n\n private async read(): Promise<ProcessEntry[]> {\n const value = await this.api.kvGet(this.threadId, KEY);\n return Array.isArray(value) ? (value as ProcessEntry[]) : [];\n }\n\n private async write(entries: ProcessEntry[]): Promise<void> {\n await this.api.kvSet(this.threadId, KEY, entries);\n }\n\n /** Mark this machine's dead \"running\" entries as exited. Returns true if any changed. */\n private reconcileLiveness(entries: ProcessEntry[]): boolean {\n let changed = false;\n for (const e of entries) {\n if (e.machine === this.machine && e.status === \"running\" && !isAlive(e.pid)) {\n e.status = \"exited\";\n e.endedAt = Date.now();\n changed = true;\n }\n }\n return changed;\n }\n\n /** All tracked processes, newest first, with liveness re-checked + persisted. */\n async list(): Promise<ProcessEntry[]> {\n const entries = await this.read();\n if (this.reconcileLiveness(entries)) await this.write(entries);\n return entries.sort((a, b) => b.startedAt - a.startedAt);\n }\n\n async runningCount(): Promise<number> {\n const entries = await this.list();\n return entries.filter((e) => e.status === \"running\").length;\n }\n\n async get(id: string): Promise<ProcessEntry | null> {\n return (await this.read()).find((e) => e.id === id) ?? null;\n }\n\n async add(entry: ProcessEntry): Promise<void> {\n const entries = await this.read();\n entries.push(entry);\n await this.write(entries);\n }\n\n async markExited(id: string, exitCode: number | null): Promise<void> {\n const entries = await this.read();\n const e = entries.find((x) => x.id === id);\n if (e && e.status === \"running\") {\n e.status = \"exited\";\n e.exitCode = exitCode;\n e.endedAt = Date.now();\n await this.write(entries);\n }\n }\n\n async markStopped(id: string): Promise<void> {\n const entries = await this.read();\n const e = entries.find((x) => x.id === id);\n if (e) {\n e.status = \"stopped\";\n e.endedAt = Date.now();\n await this.write(entries);\n }\n }\n}\n","/**\n * MCP server configuration — the list of Model Context Protocol servers this\n * CLI can launch locally and negotiate with. Stored in `~/.standardagents/mcp.json`\n * so it persists across sessions and machines (per-user, not per-thread).\n *\n * Each server is a local process the CLI spawns and speaks JSON-RPC 2.0 to over\n * stdio (see `mcp.ts`). The CLI is the MCP *host*: it owns the connection, does\n * the capability handshake, and forwards the agent's tool calls to the server.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\n/**\n * Resolve the config file path at call time (not module load) so it honors an\n * override. `STANDARDAGENTS_MCP_CONFIG` points at an explicit mcp.json — tests\n * set it to a throwaway temp file so they never read or clobber the user's real\n * `~/.standardagents/mcp.json`.\n */\nfunction configFile(): string {\n return process.env.STANDARDAGENTS_MCP_CONFIG || path.join(os.homedir(), \".standardagents\", \"mcp.json\");\n}\n\n/** A locally-launchable MCP server (stdio transport). */\nexport interface McpServerConfig {\n /** Stable, human-readable id (used to namespace tools, e.g. `mcp:<name>/<tool>`). */\n name: string;\n /** Executable to spawn (e.g. `node`, `npx`, `uvx`, an absolute path). */\n command: string;\n /** Arguments passed to the command. */\n args: string[];\n /** Extra environment variables for the server process (merged over the CLI's env). */\n env?: Record<string, string>;\n /** Working directory for the server process (defaults to the project dir). */\n cwd?: string;\n /** When false, the server is remembered but not connected on startup. */\n enabled: boolean;\n}\n\nexport interface McpConfigFile {\n servers: Record<string, McpServerConfig>;\n}\n\nexport function loadMcpConfig(): McpConfigFile {\n try {\n const raw = fs.readFileSync(configFile(), \"utf8\");\n const parsed = JSON.parse(raw) as McpConfigFile;\n if (!parsed.servers || typeof parsed.servers !== \"object\") parsed.servers = {};\n return parsed;\n } catch {\n return { servers: {} };\n }\n}\n\nexport function listMcpServers(): McpServerConfig[] {\n const cfg = loadMcpConfig();\n return Object.values(cfg.servers).sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function saveMcpServer(server: McpServerConfig): void {\n const cfg = loadMcpConfig();\n cfg.servers[server.name] = server;\n write(cfg);\n}\n\nexport function removeMcpServer(name: string): void {\n const cfg = loadMcpConfig();\n delete cfg.servers[name];\n write(cfg);\n}\n\nexport function setMcpServerEnabled(name: string, enabled: boolean): void {\n const cfg = loadMcpConfig();\n const s = cfg.servers[name];\n if (!s) return;\n s.enabled = enabled;\n write(cfg);\n}\n\nfunction write(cfg: McpConfigFile): void {\n const file = configFile();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify(cfg, null, 2), { mode: 0o600 });\n}\n\n/**\n * Parse a server definition from a CLI-style command string, e.g.\n * `weather: npx -y @modelcontextprotocol/server-weather`\n * The part before the first `:` is the server name; the rest is the command +\n * args. Returns null if the shape is unusable.\n */\nexport function parseServerSpec(spec: string): McpServerConfig | null {\n const trimmed = spec.trim();\n const colon = trimmed.indexOf(\":\");\n if (colon <= 0) return null;\n const name = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n if (!name || !rest) return null;\n const parts = tokenize(rest);\n if (!parts.length) return null;\n const [command, ...args] = parts;\n return { name, command, args, enabled: true };\n}\n\n/**\n * Build a server config from a short name + a full command line, e.g.\n * serverFromCommand(\"playwright\", \"npx -y @playwright/mcp@latest\")\n * Returns null if the name or command is unusable.\n */\nexport function serverFromCommand(\n name: string,\n commandLine: string,\n env?: Record<string, string>\n): McpServerConfig | null {\n const cleanName = name.trim();\n const parts = tokenize(commandLine.trim());\n if (!cleanName || !parts.length) return null;\n const [command, ...args] = parts;\n return { name: cleanName, command, args, env, enabled: true };\n}\n\n/** Minimal shell-ish tokenizer that honours single/double quotes (no expansion). */\nfunction tokenize(input: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let quote: '\"' | \"'\" | null = null;\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n if (quote) {\n if (ch === quote) quote = null;\n else cur += ch;\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n } else if (/\\s/.test(ch)) {\n if (cur) {\n out.push(cur);\n cur = \"\";\n }\n } else {\n cur += ch;\n }\n }\n if (cur) out.push(cur);\n return out;\n}\n","/**\n * Host-side executors for forwarded coding tools. These run on the user's\n * machine. Paths are resolved relative to the project directory; everything is\n * best-effort and returns a structured {@link HostResult} rather than throwing.\n */\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport type { HostResult } from \"./types.ts\";\nimport { ProcessRegistry, LOG_DIR, type ProcessEntry } from \"./process-registry.ts\";\nimport type { McpManager } from \"./mcp.ts\";\nimport type { ApiClient } from \"./api.ts\";\nimport { saveMcpServer, removeMcpServer, serverFromCommand } from \"./mcp-config.ts\";\n\n/**\n * How long to watch a freshly-started background process before declaring it\n * \"running\". Fast failures (port already in use, missing binary, bad flag) exit\n * within milliseconds; this window catches them so we never report or track a\n * process that never actually came up.\n */\nconst STARTUP_GRACE_MS = 600;\n\n/** True if a pid is still alive (signal-0 probe; EPERM = alive but not ours). */\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\n/** Read the last `n` non-empty lines of a log file (empty string if unreadable). */\nasync function readLogTail(logPath: string, n: number): Promise<string> {\n try {\n const content = await fsp.readFile(logPath, \"utf8\");\n return content.split(\"\\n\").filter(Boolean).slice(-n).join(\"\\n\");\n } catch {\n return \"\";\n }\n}\n\nexport class HostTools {\n constructor(\n private projectDir: string,\n private registry?: ProcessRegistry,\n private threadId?: string,\n private machine?: string,\n private mcp?: McpManager,\n /** Called after the MCP server set changes so the catalog can be re-published. */\n private onMcpCatalogChange?: () => void,\n /** Instance API access — used by save_to_disk to download thread-fs bytes. */\n private api?: ApiClient\n ) {}\n\n /** Resolve a user/model-supplied path against the project directory. */\n resolve(p: string | undefined): string {\n if (!p || p === \".\") return this.projectDir;\n return path.resolve(this.projectDir, p);\n }\n\n /** True when the resolved path escapes the project directory. */\n isOutsideProject(p: string | undefined): boolean {\n const abs = this.resolve(p);\n const rel = path.relative(this.projectDir, abs);\n return rel.startsWith(\"..\") || path.isAbsolute(rel);\n }\n\n async execute(tool: string, args: Record<string, unknown>): Promise<HostResult> {\n try {\n switch (tool) {\n case \"read_file\":\n return await this.readFile(args);\n case \"grep\":\n return await this.grep(args);\n case \"glob\":\n return await this.glob(args);\n case \"write_file\":\n return await this.writeFile(args);\n case \"edit_file\":\n return await this.editFile(args);\n case \"bash\":\n return await this.bash(args);\n case \"save_to_disk\":\n return await this.saveToDisk(args);\n case \"run_skill_script\":\n return await this.runSkillScript(args);\n case \"background_process\": {\n // One tool, dispatched by action: start launches + verifies a process;\n // list/logs/stop inspect or terminate tracked ones.\n const action = String(args.action || \"list\");\n if (action === \"start\") return await this.runBackground(args);\n return await this.backgroundProcesses(args);\n }\n case \"mcp\": {\n // Forwarded MCP tool: the CLI is the MCP host, so the negotiation and\n // execution happen here against the locally-connected server.\n if (!this.mcp) {\n return { ok: false, error: \"MCP is not available in this session.\" };\n }\n // Removing a server also drops it from the stored config and republishes\n // the catalog, so it doesn't linger or reconnect.\n if (String(args.action) === \"remove\") {\n const name = String(args.server || \"\");\n if (!name) return { ok: false, error: \"remove requires a 'server' name.\" };\n this.mcp.disconnect(name);\n removeMcpServer(name);\n this.onMcpCatalogChange?.();\n return { ok: true, result: JSON.stringify({ removed: name }) };\n }\n return await this.mcp.dispatch(args);\n }\n case \"install_mcp\":\n return await this.installMcp(args);\n default:\n return { ok: false, error: `Unknown tool: ${tool}` };\n }\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n }\n\n private async readFile(args: Record<string, unknown>): Promise<HostResult> {\n const file = this.resolve(String(args.path || \"\"));\n const stat = await fsp.stat(file).catch(() => null);\n if (!stat) return { ok: false, error: `File not found: ${args.path}` };\n if (stat.isDirectory()) return { ok: false, error: `${args.path} is a directory` };\n if (stat.size > 2_000_000) return { ok: false, error: `File too large (${stat.size} bytes)` };\n\n const content = await fsp.readFile(file, \"utf8\");\n const lines = content.split(\"\\n\");\n const offset = typeof args.offset === \"number\" ? Math.max(1, args.offset) : 1;\n const limit = typeof args.limit === \"number\" ? args.limit : lines.length;\n const slice = lines.slice(offset - 1, offset - 1 + limit);\n const numbered = slice.map((l, i) => `${offset + i}\\t${l}`).join(\"\\n\");\n return { ok: true, result: numbered || \"(empty file)\" };\n }\n\n private async grep(args: Record<string, unknown>): Promise<HostResult> {\n const pattern = String(args.pattern || \"\");\n if (!pattern) return { ok: false, error: \"pattern is required\" };\n const searchPath = this.resolve(args.path ? String(args.path) : undefined);\n const rgArgs = [\"--line-number\", \"--no-heading\", \"--color\", \"never\", \"--max-count\", \"200\"];\n if (args.ignore_case) rgArgs.push(\"-i\");\n if (args.glob) rgArgs.push(\"--glob\", String(args.glob));\n rgArgs.push(\"--\", pattern, searchPath);\n const rg = await this.run(\"rg\", rgArgs, this.projectDir, 30000);\n if (rg.code === 127) {\n return { ok: false, error: \"ripgrep (rg) not found on host; install it for grep.\" };\n }\n // rg exits 1 with no matches — treat as a successful empty result.\n const out = rg.stdout.trim();\n return { ok: true, result: out || \"(no matches)\" };\n }\n\n private async glob(args: Record<string, unknown>): Promise<HostResult> {\n const pattern = String(args.pattern || \"\");\n if (!pattern) return { ok: false, error: \"pattern is required\" };\n const base = this.resolve(args.path ? String(args.path) : undefined);\n const rg = await this.run(\"rg\", [\"--files\", \"--glob\", pattern, base], this.projectDir, 30000);\n if (rg.code === 127) {\n // Fallback: native recursive walk with a simple glob match.\n const matches = await this.walkGlob(base, pattern);\n return { ok: true, result: matches.slice(0, 300).join(\"\\n\") || \"(no files)\" };\n }\n const rel = rg.stdout\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((p) => path.relative(this.projectDir, p))\n .slice(0, 300);\n return { ok: true, result: rel.join(\"\\n\") || \"(no files)\" };\n }\n\n private async writeFile(args: Record<string, unknown>): Promise<HostResult> {\n const file = this.resolve(String(args.path || \"\"));\n const content = String(args.content ?? \"\");\n await fsp.mkdir(path.dirname(file), { recursive: true });\n const existed = fs.existsSync(file);\n await fsp.writeFile(file, content, \"utf8\");\n return {\n ok: true,\n result: `${existed ? \"Overwrote\" : \"Created\"} ${path.relative(this.projectDir, file)} (${Buffer.byteLength(content)} bytes)`,\n };\n }\n\n private async editFile(args: Record<string, unknown>): Promise<HostResult> {\n const file = this.resolve(String(args.path || \"\"));\n const oldStr = String(args.old_string ?? \"\");\n const newStr = String(args.new_string ?? \"\");\n const replaceAll = args.replace_all === true;\n const stat = await fsp.stat(file).catch(() => null);\n if (!stat) return { ok: false, error: `File not found: ${args.path}` };\n\n const content = await fsp.readFile(file, \"utf8\");\n if (oldStr === \"\") return { ok: false, error: \"old_string cannot be empty\" };\n const count = content.split(oldStr).length - 1;\n if (count === 0) return { ok: false, error: \"old_string not found in file (it must match exactly).\" };\n if (count > 1 && !replaceAll) {\n return { ok: false, error: `old_string is not unique (${count} matches). Add more context or set replace_all.` };\n }\n const updated = replaceAll ? content.split(oldStr).join(newStr) : content.replace(oldStr, newStr);\n await fsp.writeFile(file, updated, \"utf8\");\n return { ok: true, result: `Edited ${path.relative(this.projectDir, file)} (${count} replacement${count === 1 ? \"\" : \"s\"})` };\n }\n\n /**\n * Copy a file from the THREAD filesystem (e.g. a generated /attachments/*\n * asset) onto the project disk: download the bytes from the instance API and\n * write them at the destination. The bytes never pass through the model.\n */\n private async saveToDisk(args: Record<string, unknown>): Promise<HostResult> {\n const source = String(args.source_path || \"\");\n const destArg = String(args.dest_path || \"\");\n if (!source || !destArg) return { ok: false, error: \"source_path and dest_path are required\" };\n if (!this.api || !this.threadId) {\n return { ok: false, error: \"No instance API available for thread file downloads.\" };\n }\n const bytes = await this.api.fetchFile(this.threadId, source);\n if (!bytes) return { ok: false, error: `Could not download ${source} from the thread filesystem.` };\n const dest = this.resolve(destArg);\n await fsp.mkdir(path.dirname(dest), { recursive: true });\n const existed = fs.existsSync(dest);\n await fsp.writeFile(dest, bytes);\n return {\n ok: true,\n result: `${existed ? \"Overwrote\" : \"Saved\"} ${path.relative(this.projectDir, dest)} (${bytes.length} bytes) from ${source}`,\n };\n }\n\n /**\n * Execute a SKILL script on the host. Skills live in the instance (cloud is\n * the source of truth); the server forwards the skill's files with the call\n * and we materialize them into a content-addressed temp dir — nothing about\n * a skill is stored on this machine beyond an ephemeral cache. The script\n * runs with cwd = the PROJECT (so it can operate on the user's files) and\n * SKILL_DIR pointing at the materialized folder (so it can read its own\n * references/assets).\n */\n private async runSkillScript(args: Record<string, unknown>): Promise<HostResult> {\n const skill = String(args.skill || \"skill\");\n const entry = String(args.entry || \"\");\n if (!entry) return { ok: false, error: \"entry (the script path within the skill) is required\" };\n let files: { path: string; content: string }[];\n try {\n const parsed = JSON.parse(String(args.files_json || \"[]\"));\n if (!Array.isArray(parsed)) throw new Error(\"not an array\");\n files = parsed.map((f) => ({ path: String(f.path), content: String(f.content ?? \"\") }));\n } catch {\n return { ok: false, error: \"files_json must be a JSON array of {path, content}\" };\n }\n if (!files.some((f) => f.path === entry)) {\n return { ok: false, error: `entry \"${entry}\" is not among the provided skill files` };\n }\n let scriptArgs: string[] = [];\n if (args.args_json) {\n try {\n const parsed = JSON.parse(String(args.args_json));\n if (!Array.isArray(parsed)) throw new Error(\"not an array\");\n scriptArgs = parsed.map(String);\n } catch {\n return { ok: false, error: \"args_json must be a JSON array of strings\" };\n }\n }\n\n // Content-addressed materialization: same skill content → same dir, no rewrite.\n const hash = crypto.createHash(\"sha256\").update(JSON.stringify(files)).digest(\"hex\").slice(0, 12);\n const skillDir = path.join(os.tmpdir(), \"standardcode-skills\", `${skill}-${hash}`);\n for (const f of files) {\n const dest = path.resolve(skillDir, f.path);\n if (path.relative(skillDir, dest).startsWith(\"..\")) {\n return { ok: false, error: `Skill file escapes its directory: ${f.path}` };\n }\n await fsp.mkdir(path.dirname(dest), { recursive: true });\n await fsp.writeFile(dest, f.content, \"utf8\");\n }\n const entryPath = path.resolve(skillDir, entry);\n\n // Interpreter: shebang wins; otherwise by extension.\n const entryContent = files.find((f) => f.path === entry)!.content;\n let cmd: string;\n let argv: string[];\n if (entryContent.startsWith(\"#!\")) {\n await fsp.chmod(entryPath, 0o755);\n cmd = entryPath;\n argv = scriptArgs;\n } else {\n const ext = path.extname(entry).toLowerCase();\n const interp: Record<string, string[]> = {\n \".py\": [\"python3\"],\n \".sh\": [\"bash\"],\n \".js\": [\"node\"],\n \".mjs\": [\"node\"],\n \".ts\": [\"npx\", \"tsx\"],\n };\n const found = interp[ext];\n if (!found) return { ok: false, error: `No interpreter for \"${ext}\" — add a shebang line to the script.` };\n cmd = found[0];\n argv = [...found.slice(1), entryPath, ...scriptArgs];\n }\n\n const timeoutMs = typeof args.timeout_ms === \"number\" ? Math.min(args.timeout_ms, 300_000) : 120_000;\n return await new Promise<HostResult>((resolvePromise) => {\n const child = spawn(cmd, argv, {\n cwd: this.projectDir,\n env: { ...process.env, SKILL_DIR: skillDir },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let out = \"\";\n const cap = (chunk: Buffer) => {\n if (out.length < 200_000) out += chunk.toString(\"utf8\");\n };\n child.stdout.on(\"data\", cap);\n child.stderr.on(\"data\", cap);\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n resolvePromise({ ok: false, error: `Skill script timed out after ${timeoutMs}ms.\\n${out.slice(-4000)}` });\n }, timeoutMs);\n child.on(\"error\", (err) => {\n clearTimeout(timer);\n resolvePromise({ ok: false, error: `Could not launch ${cmd}: ${err.message}` });\n });\n child.on(\"exit\", (code) => {\n clearTimeout(timer);\n const body = out.trim() || \"(no output)\";\n if (code === 0) resolvePromise({ ok: true, result: body });\n else resolvePromise({ ok: false, error: `Script exited with code ${code}:\\n${body.slice(-6000)}` });\n });\n });\n }\n\n private async bash(args: Record<string, unknown>): Promise<HostResult> {\n const command = String(args.command || \"\");\n if (!command.trim()) return { ok: false, error: \"command is required\" };\n const cwd = args.cwd ? this.resolve(String(args.cwd)) : this.projectDir;\n const timeout = typeof args.timeout_ms === \"number\" ? args.timeout_ms : 120000;\n const res = await this.run(\"bash\", [\"-lc\", command], cwd, timeout);\n const combined = [res.stdout, res.stderr].filter(Boolean).join(\"\\n\").trim();\n const truncated = combined.length > 30000 ? combined.slice(0, 30000) + \"\\n…(truncated)\" : combined;\n if (res.timedOut) {\n return { ok: false, error: `Command timed out after ${timeout}ms.\\n${truncated}` };\n }\n const status = `exit code ${res.code}`;\n return {\n ok: res.code === 0,\n result: `${truncated || \"(no output)\"}\\n[${status}]`,\n error: res.code === 0 ? undefined : `Command failed (${status}).\\n${truncated}`,\n };\n }\n\n /** Start a tracked long-running process, detached, with output to a log file. */\n private async runBackground(args: Record<string, unknown>): Promise<HostResult> {\n const command = String(args.command || \"\");\n if (!command.trim()) return { ok: false, error: \"command is required\" };\n const cwd = args.cwd ? this.resolve(String(args.cwd)) : this.projectDir;\n // spawn() reports a missing cwd as an ASYNC 'error' event (\"spawn bash\n // ENOENT\"), not a throw — check up front so the agent gets a clear error.\n if (!fs.existsSync(cwd)) {\n return { ok: false, error: `cwd does not exist: ${cwd}` };\n }\n const id = crypto.randomUUID().slice(0, 8);\n const logPath = path.join(LOG_DIR, `${id}.log`);\n\n let out: number;\n try {\n await fsp.mkdir(LOG_DIR, { recursive: true });\n out = fs.openSync(logPath, \"a\");\n } catch (err) {\n return { ok: false, error: `Could not open log file: ${err instanceof Error ? err.message : String(err)}` };\n }\n\n let child;\n try {\n child = spawn(\"bash\", [\"-lc\", command], { cwd, detached: true, stdio: [\"ignore\", out, out] });\n } catch (err) {\n fs.closeSync(out);\n return { ok: false, error: `Failed to start: ${err instanceof Error ? err.message : String(err)}` };\n }\n // spawn failures (bad cwd, missing binary) arrive as an async 'error'\n // event; without a listener Node throws it as an uncaught exception and\n // takes the whole CLI down. Capture it and fold it into the early-exit\n // check below.\n let spawnError: Error | null = null;\n child.on(\"error\", (err) => {\n spawnError = err;\n });\n fs.closeSync(out); // the child holds its own copy of the fd\n const pid = child.pid;\n\n // Verify the process actually STAYED UP before we record it. A command that\n // fails fast (a port already in use, a missing binary, a bad flag) exits\n // within milliseconds — we don't want to report a phantom \"running\" process\n // or persist it to the registry. Watch for an early exit during a short\n // grace window, then surface the captured output so the agent can see why.\n let earlyExit: number | null | undefined;\n const onEarlyExit = (code: number | null) => {\n earlyExit = code;\n };\n child.on(\"exit\", onEarlyExit);\n await new Promise((r) => setTimeout(r, STARTUP_GRACE_MS));\n\n if (spawnError) {\n return { ok: false, error: `Failed to start: ${(spawnError as Error).message}` };\n }\n if (!pid) return { ok: false, error: \"Process failed to start (no pid).\" };\n\n if (earlyExit !== undefined || !isAlive(pid)) {\n const tail = await readLogTail(logPath, 15);\n const code = earlyExit ?? \"unknown\";\n return {\n ok: false,\n error:\n `The process exited immediately (exit code ${code}) — it did not stay running, ` +\n `so nothing was started or tracked.` +\n (tail ? `\\n\\nOutput:\\n${tail}` : \" No output was captured.\"),\n };\n }\n\n // It survived the grace window — now it's safe to detach and record it.\n child.removeListener(\"exit\", onEarlyExit);\n child.unref();\n\n if (this.registry) {\n const entry: ProcessEntry = {\n id,\n pid,\n command,\n description: typeof args.description === \"string\" ? args.description : undefined,\n cwd,\n machine: this.machine ?? \"\",\n logPath,\n startedAt: Date.now(),\n status: \"running\",\n };\n // Persist to the thread's KV (server-side) so the process is visible on\n // resume from any machine.\n await this.registry.add(entry);\n child.on(\"exit\", (code) => void this.registry?.markExited(id, code));\n }\n\n return {\n ok: true,\n result: JSON.stringify(\n {\n id,\n pid,\n status: \"running\",\n logPath,\n note: `Started in the background as process ${id} (pid ${pid}) and confirmed running. Output is logged to ${logPath}. Use background_process (list/logs/stop) to check on it or stop it.`,\n },\n null,\n 2\n ),\n };\n }\n\n /**\n * Install + connect an MCP server from a name + launch command (e.g.\n * \"npx -y @playwright/mcp@latest\"). Saves it to the user's MCP config,\n * launches it, runs the handshake, and republishes the catalog on success so\n * the agent immediately sees its tools. The connect IS the install — for `npx`\n * commands the package is fetched on first run.\n */\n private async installMcp(args: Record<string, unknown>): Promise<HostResult> {\n if (!this.mcp) return { ok: false, error: \"MCP is not available in this session.\" };\n const name = String(args.name || \"\");\n const command = String(args.command || \"\");\n if (!name || !command) {\n return { ok: false, error: \"install_mcp needs a `name` and a `command` (e.g. \\\"npx -y @playwright/mcp@latest\\\").\" };\n }\n\n let env: Record<string, string> | undefined;\n if (typeof args.env_json === \"string\" && args.env_json.trim()) {\n try {\n const parsed = JSON.parse(args.env_json);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) env = parsed as Record<string, string>;\n else return { ok: false, error: \"env_json must encode a JSON object of environment variables.\" };\n } catch (e) {\n return { ok: false, error: `env_json is not valid JSON: ${e instanceof Error ? e.message : String(e)}` };\n }\n }\n\n const cfg = serverFromCommand(name, command, env);\n if (!cfg) return { ok: false, error: `Could not parse the command: \"${command}\".` };\n\n saveMcpServer(cfg);\n try {\n const client = await this.mcp.connect(cfg);\n this.onMcpCatalogChange?.();\n const tools = client.tools.map((t) => t.name);\n return {\n ok: true,\n result: JSON.stringify(\n {\n server: cfg.name,\n command: `${cfg.command} ${cfg.args.join(\" \")}`.trim(),\n connected: true,\n toolCount: tools.length,\n tools,\n note:\n `Installed and connected MCP server \"${cfg.name}\" with ${tools.length} tool${tools.length === 1 ? \"\" : \"s\"}` +\n `${tools.length ? `: ${tools.join(\", \")}` : \"\"}. They are available now and will auto-connect next session.`,\n },\n null,\n 2\n ),\n };\n } catch (err) {\n this.onMcpCatalogChange?.();\n return {\n ok: false,\n error: `Saved MCP server \"${cfg.name}\" but it failed to start: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n /** List / inspect logs of / stop tracked background processes. */\n private async backgroundProcesses(args: Record<string, unknown>): Promise<HostResult> {\n const action = String(args.action || \"list\");\n if (!this.registry) {\n return { ok: true, result: \"Background-process tracking is not available in this session.\" };\n }\n\n if (action === \"list\") {\n const procs = await this.registry.list();\n if (!procs.length) return { ok: true, result: \"No background processes for this session.\" };\n const lines = procs.map((p) => {\n const age = relativeAge(p.startedAt);\n const status =\n p.status === \"running\"\n ? \"running\"\n : `${p.status}${typeof p.exitCode === \"number\" ? ` (exit ${p.exitCode})` : \"\"}`;\n return `${p.id} [${status}] pid ${p.pid} started ${age}\\n ${p.command}`;\n });\n return { ok: true, result: lines.join(\"\\n\") };\n }\n\n const id = String(args.id || \"\");\n const proc = await this.registry.get(id);\n if (!proc) return { ok: false, error: `No background process with id ${id}` };\n\n if (action === \"logs\") {\n const maxLines = typeof args.lines === \"number\" ? args.lines : 60;\n let content = \"\";\n try {\n content = await fsp.readFile(proc.logPath, \"utf8\");\n } catch {\n return { ok: true, result: `(no output captured yet for ${id})` };\n }\n const tail = content.split(\"\\n\").slice(-maxLines).join(\"\\n\");\n return { ok: true, result: tail || `(no output yet for ${id})` };\n }\n\n if (action === \"stop\") {\n if (proc.status !== \"running\") {\n return { ok: true, result: `Process ${id} is already ${proc.status}.` };\n }\n try {\n process.kill(-proc.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n process.kill(-proc.pid, \"SIGKILL\");\n } catch {\n // already gone\n }\n }, 3000);\n } catch {\n try {\n process.kill(proc.pid, \"SIGKILL\");\n } catch {\n // already gone\n }\n }\n await this.registry.markStopped(id);\n return { ok: true, result: `Stopped background process ${id} (pid ${proc.pid}).` };\n }\n\n return { ok: false, error: `Unknown action: ${action}` };\n }\n\n /**\n * Terminate every still-running background process this machine started, so\n * detached children don't outlive the CLI when the session quits. Sends\n * SIGTERM to each process group, waits a brief grace, then SIGKILL any\n * straggler, and records them stopped. Best effort and bounded so quitting\n * stays snappy. Returns the number of running processes it signaled.\n */\n async stopAllLocalProcesses(): Promise<number> {\n if (!this.registry) return 0;\n let running: ProcessEntry[] = [];\n try {\n const procs = await this.registry.list();\n running = procs.filter((p) => p.status === \"running\" && p.machine === (this.machine ?? \"\"));\n } catch {\n return 0;\n }\n if (!running.length) return 0;\n\n // Negative pid targets the whole process group — detached children are\n // their own group leader, so this kills the process tree, not just bash.\n const signal = (pid: number, sig: NodeJS.Signals) => {\n try {\n process.kill(-pid, sig);\n } catch {\n try {\n process.kill(pid, sig);\n } catch {\n // already gone\n }\n }\n };\n\n for (const proc of running) signal(proc.pid, \"SIGTERM\");\n await new Promise((r) => setTimeout(r, 300));\n for (const proc of running) signal(proc.pid, \"SIGKILL\");\n await Promise.allSettled(running.map((proc) => this.registry!.markStopped(proc.id)));\n return running.length;\n }\n\n private run(\n cmd: string,\n args: string[],\n cwd: string,\n timeoutMs: number\n ): Promise<{ stdout: string; stderr: string; code: number; timedOut: boolean }> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let exitCode = 0;\n let settled = false;\n // Cap captured output so a chatty/looping command can't grow memory\n // without bound (which previously could take the whole CLI down).\n const MAX_OUTPUT = 256 * 1024;\n\n let child;\n try {\n // Own process group so a timeout can kill the whole tree, and so a\n // backgrounded server keeps running after the CLI exits.\n child = spawn(cmd, args, { cwd, detached: true });\n } catch {\n resolve({ stdout: \"\", stderr: \"\", code: 127, timedOut: false });\n return;\n }\n child.unref();\n\n let graceTimer: ReturnType<typeof setTimeout> | null = null;\n const settle = (code: number) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (graceTimer) clearTimeout(graceTimer);\n resolve({ stdout, stderr, code, timedOut });\n };\n\n const timer = setTimeout(() => {\n timedOut = true;\n try {\n if (child.pid) process.kill(-child.pid, \"SIGKILL\");\n } catch {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // already gone\n }\n }\n // Settle even if `close` never arrives (a detached child may hold stdio).\n setTimeout(() => settle(exitCode), 250);\n }, timeoutMs);\n\n child.stdout?.on(\"data\", (d) => {\n if (stdout.length < MAX_OUTPUT) stdout += d.toString();\n });\n child.stderr?.on(\"data\", (d) => {\n if (stderr.length < MAX_OUTPUT) stderr += d.toString();\n });\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (!stderr) stderr = String(err);\n settle(err.code === \"ENOENT\" ? 127 : 1);\n });\n // Normal completion: stdio drained.\n child.on(\"close\", (code) => settle(code ?? exitCode));\n // The process exited but stdio may stay open if it backgrounded a child\n // that inherited the pipes (e.g. `server &`). Resolve shortly after exit\n // so background commands return promptly instead of hanging on `close`.\n child.on(\"exit\", (code) => {\n exitCode = code ?? 0;\n graceTimer = setTimeout(() => settle(exitCode), 250);\n });\n });\n }\n\n private async walkGlob(base: string, pattern: string): Promise<string[]> {\n const re = globToRegExp(pattern);\n const out: string[] = [];\n const walk = async (dir: string) => {\n const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const e of entries) {\n if (e.name === \".git\" || e.name === \"node_modules\") continue;\n const full = path.join(dir, e.name);\n if (e.isDirectory()) await walk(full);\n else {\n const rel = path.relative(this.projectDir, full);\n if (re.test(rel) || re.test(e.name)) out.push(rel);\n }\n }\n };\n await walk(base);\n return out;\n }\n}\n\nfunction relativeAge(startedAt: number): string {\n const diff = (Date.now() - startedAt) / 1000;\n if (diff < 60) return `${Math.floor(diff)}s ago`;\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`;\n return `${Math.floor(diff / 86400)}d ago`;\n}\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \" \")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/ /g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(`^${escaped}$`);\n}\n","/**\n * Model Context Protocol (MCP) client + manager.\n *\n * The CLI is the MCP **host**: for each configured server it spawns the process\n * locally and speaks JSON-RPC 2.0 over stdio (newline-delimited UTF-8 frames, as\n * the MCP stdio transport specifies). It performs the real capability handshake\n * (`initialize` → `notifications/initialized`), discovers tools and resources\n * (`tools/list`, `resources/list`), and executes the agent's forwarded calls\n * (`tools/call`, `resources/read`).\n *\n * Nothing here talks to the Standard Agents instance — the instance only ever\n * forwards an `mcp` tool request down the bridge; this module is what turns that\n * into a genuine MCP exchange on the user's machine and returns the result.\n *\n * Zero-dependency: Node globals only.\n */\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport type { McpServerConfig } from \"./mcp-config.ts\";\n\n/** MCP protocol revision this client implements/negotiates. */\nexport const MCP_PROTOCOL_VERSION = \"2025-06-18\";\n/** Protocol versions we know how to speak, newest first (for negotiation fallback). */\nconst SUPPORTED_PROTOCOL_VERSIONS = [\"2025-06-18\", \"2025-03-26\", \"2024-11-05\"];\n\nconst CLIENT_INFO = { name: \"standard-code\", version: \"0.1.0\" };\n\ninterface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: unknown;\n}\ninterface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\ninterface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: number;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport interface McpToolDef {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nexport interface McpResourceDef {\n uri: string;\n name?: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface McpServerInfo {\n name: string;\n version?: string;\n}\n\n/** A signed-ish provenance record proving which server produced a result. */\nexport interface McpAttestation {\n /** Configured server id. */\n server: string;\n /** Server's self-reported identity from `initialize`. */\n serverInfo: McpServerInfo;\n /** Negotiated protocol version. */\n protocolVersion: string;\n /** Tool or resource invoked. */\n target: string;\n /** sha256 of the canonicalized arguments. */\n argsSha256: string;\n /** sha256 of the returned content. */\n resultSha256: string;\n /** Random per-call nonce. */\n nonce: string;\n /** Whether the server flagged the result as an error. */\n isError: boolean;\n /** Unix ms when the result was received. */\n at: number;\n}\n\nexport interface McpCallResult {\n ok: boolean;\n /** Flattened text content from the server's response. */\n text: string;\n attestation: McpAttestation;\n}\n\n/** Public, JSON-serializable view of a connected server (for the KV catalog). */\nexport interface McpServerCatalogEntry {\n name: string;\n status: \"connected\" | \"error\" | \"disabled\";\n serverInfo?: McpServerInfo;\n protocolVersion?: string;\n instructions?: string;\n capabilities?: Record<string, unknown>;\n tools: McpToolDef[];\n resources: McpResourceDef[];\n error?: string;\n}\n\nconst RPC_TIMEOUT_MS = 30_000;\n// Generous: a first `npx -y <server>` cold-start downloads the package before the\n// server even speaks, which can take a while on a slow network.\nconst INIT_TIMEOUT_MS = 90_000;\n\n/**\n * One live connection to a single MCP server process. Owns the child process,\n * the JSON-RPC framing, the pending-request map, and the handshake.\n */\nexport class McpClient {\n private child: ChildProcessWithoutNullStreams | null = null;\n private nextId = 1;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }>();\n private buffer = \"\";\n private closed = false;\n\n serverInfo: McpServerInfo;\n protocolVersion = MCP_PROTOCOL_VERSION;\n capabilities: Record<string, unknown> = {};\n instructions = \"\";\n tools: McpToolDef[] = [];\n resources: McpResourceDef[] = [];\n lastError: string | null = null;\n\n constructor(private config: McpServerConfig) {\n this.serverInfo = { name: config.name };\n }\n\n /** Spawn the server, run the initialize handshake, and discover capabilities. */\n async connect(defaultCwd: string): Promise<void> {\n const child = spawn(this.config.command, this.config.args, {\n cwd: this.config.cwd || defaultCwd,\n env: { ...process.env, ...(this.config.env || {}) },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n this.child = child;\n\n child.on(\"error\", (err) => this.failAll(new Error(`MCP server '${this.config.name}' failed to start: ${err.message}`)));\n child.on(\"exit\", (code) => {\n if (!this.closed) this.failAll(new Error(`MCP server '${this.config.name}' exited (code ${code ?? \"unknown\"}).`));\n });\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => this.onData(chunk));\n // Surface server stderr only on failure; many servers log freely to stderr.\n child.stderr.setEncoding(\"utf8\");\n let stderrTail = \"\";\n child.stderr.on(\"data\", (d: string) => {\n stderrTail = (stderrTail + d).slice(-2000);\n });\n\n try {\n const initResult = (await this.request(\n \"initialize\",\n {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: { tools: {}, resources: {} },\n clientInfo: CLIENT_INFO,\n },\n INIT_TIMEOUT_MS\n )) as {\n protocolVersion?: string;\n capabilities?: Record<string, unknown>;\n serverInfo?: McpServerInfo;\n instructions?: string;\n };\n\n const negotiated = initResult.protocolVersion || MCP_PROTOCOL_VERSION;\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(negotiated)) {\n // The server insists on a revision we don't implement. Per the spec the\n // host should disconnect rather than guess at an incompatible wire format.\n throw new Error(\n `Server requires unsupported MCP protocol version '${negotiated}' (this client speaks ${SUPPORTED_PROTOCOL_VERSIONS.join(\", \")}).`\n );\n }\n this.protocolVersion = negotiated;\n this.capabilities = initResult.capabilities || {};\n this.serverInfo = initResult.serverInfo || { name: this.config.name };\n this.instructions = initResult.instructions || \"\";\n\n // Tell the server the handshake is complete before issuing other calls.\n this.notify(\"notifications/initialized\");\n\n // Discover what the server offers (guarded by advertised capabilities).\n if (this.capabilities.tools) await this.refreshTools();\n if (this.capabilities.resources) await this.refreshResources();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.lastError = stderrTail ? `${msg}\\n${stderrTail.trim()}` : msg;\n this.close();\n throw new Error(this.lastError);\n }\n }\n\n async refreshTools(): Promise<void> {\n const res = (await this.request(\"tools/list\", {})) as { tools?: McpToolDef[] };\n this.tools = Array.isArray(res?.tools) ? res.tools : [];\n }\n\n async refreshResources(): Promise<void> {\n try {\n const res = (await this.request(\"resources/list\", {})) as { resources?: McpResourceDef[] };\n this.resources = Array.isArray(res?.resources) ? res.resources : [];\n } catch {\n this.resources = []; // resources are optional; tolerate servers that decline\n }\n }\n\n /** Call a tool and return its flattened text + a provenance attestation. */\n async callTool(name: string, args: Record<string, unknown>): Promise<McpCallResult> {\n const res = (await this.request(\"tools/call\", { name, arguments: args })) as {\n content?: Array<Record<string, unknown>>;\n isError?: boolean;\n structuredContent?: unknown;\n };\n const text = flattenContent(res?.content, res?.structuredContent);\n return this.attest(name, args, text, !!res?.isError);\n }\n\n /** Read a resource and return its flattened text + attestation. */\n async readResource(uri: string): Promise<McpCallResult> {\n const res = (await this.request(\"resources/read\", { uri })) as {\n contents?: Array<Record<string, unknown>>;\n };\n const text = flattenResourceContents(res?.contents);\n return this.attest(uri, { uri }, text, false);\n }\n\n private attest(target: string, args: Record<string, unknown>, text: string, isError: boolean): McpCallResult {\n const attestation: McpAttestation = {\n server: this.config.name,\n serverInfo: this.serverInfo,\n protocolVersion: this.protocolVersion,\n target,\n argsSha256: sha256(canonicalJson(args)),\n resultSha256: sha256(text),\n nonce: crypto.randomBytes(8).toString(\"hex\"),\n isError,\n at: Date.now(),\n };\n return { ok: !isError, text, attestation };\n }\n\n catalogEntry(): McpServerCatalogEntry {\n return {\n name: this.config.name,\n status: this.lastError ? \"error\" : \"connected\",\n serverInfo: this.serverInfo,\n protocolVersion: this.protocolVersion,\n instructions: this.instructions || undefined,\n capabilities: this.capabilities,\n tools: this.tools,\n resources: this.resources,\n error: this.lastError || undefined,\n };\n }\n\n close(): void {\n this.closed = true;\n this.failAll(new Error(\"connection closed\"));\n try {\n this.child?.stdin.end();\n } catch {\n /* ignore */\n }\n try {\n this.child?.kill(\"SIGTERM\");\n } catch {\n /* ignore */\n }\n this.child = null;\n }\n\n // ── JSON-RPC plumbing ─────────────────────────────────────────────────────\n\n private request(method: string, params: unknown, timeoutMs = RPC_TIMEOUT_MS): Promise<unknown> {\n return new Promise((resolve, reject) => {\n if (!this.child || this.closed) {\n reject(new Error(`MCP server '${this.config.name}' is not connected.`));\n return;\n }\n const id = this.nextId++;\n const payload: JsonRpcRequest = { jsonrpc: \"2.0\", id, method, params };\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`MCP request '${method}' to '${this.config.name}' timed out after ${timeoutMs}ms.`));\n }, timeoutMs);\n this.pending.set(id, { resolve, reject, timer });\n this.write(payload);\n });\n }\n\n private notify(method: string, params?: unknown): void {\n const payload: JsonRpcNotification = { jsonrpc: \"2.0\", method, params };\n this.write(payload);\n }\n\n private write(payload: JsonRpcRequest | JsonRpcNotification | JsonRpcResponse): void {\n if (!this.child) return;\n try {\n // Newline-delimited JSON: one message per line, no embedded newlines.\n this.child.stdin.write(JSON.stringify(payload) + \"\\n\");\n } catch (err) {\n this.failAll(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n let nl: number;\n while ((nl = this.buffer.indexOf(\"\\n\")) >= 0) {\n const line = this.buffer.slice(0, nl).trim();\n this.buffer = this.buffer.slice(nl + 1);\n if (!line) continue;\n let msg: JsonRpcResponse & JsonRpcRequest & JsonRpcNotification;\n try {\n msg = JSON.parse(line);\n } catch {\n continue; // ignore non-JSON noise (some servers print banners)\n }\n this.dispatch(msg);\n }\n }\n\n private dispatch(msg: JsonRpcResponse & Partial<JsonRpcRequest>): void {\n // A response to one of our requests.\n if (typeof msg.id === \"number\" && ((\"result\" in msg) || (\"error\" in msg)) && msg.method === undefined) {\n const entry = this.pending.get(msg.id);\n if (!entry) return;\n this.pending.delete(msg.id);\n clearTimeout(entry.timer);\n if (msg.error) entry.reject(new Error(`${msg.error.message} (code ${msg.error.code})`));\n else entry.resolve(msg.result);\n return;\n }\n // A request FROM the server to us. We don't offer sampling/roots, so reply\n // politely: answer pings, decline everything else with method-not-found so\n // the server never hangs waiting on us.\n if (msg.method && typeof msg.id === \"number\") {\n if (msg.method === \"ping\") {\n this.write({ jsonrpc: \"2.0\", id: msg.id, result: {} });\n } else {\n this.write({\n jsonrpc: \"2.0\",\n id: msg.id,\n error: { code: -32601, message: `Method not supported by host: ${msg.method}` },\n });\n }\n return;\n }\n // A notification from the server (e.g. tools/list_changed) — refresh lazily.\n if (msg.method && msg.id === undefined) {\n if (msg.method === \"notifications/tools/list_changed\") void this.refreshTools().catch(() => {});\n if (msg.method === \"notifications/resources/list_changed\") void this.refreshResources().catch(() => {});\n }\n }\n\n private failAll(err: Error): void {\n for (const [, entry] of this.pending) {\n clearTimeout(entry.timer);\n entry.reject(err);\n }\n this.pending.clear();\n }\n}\n\n/**\n * Manages every configured MCP server connection for a session: connects the\n * enabled ones, exposes a catalog for context injection, and dispatches the\n * agent's forwarded `mcp` tool calls to the right client.\n */\nexport class McpManager {\n private clients = new Map<string, McpClient>();\n /** Last attestations produced this session (most recent last). */\n private attestations: McpAttestation[] = [];\n\n constructor(private defaultCwd: string) {}\n\n /** Connect one server (replacing any existing client of the same name). */\n async connect(config: McpServerConfig): Promise<McpClient> {\n this.disconnect(config.name);\n const client = new McpClient(config);\n this.clients.set(config.name, client);\n await client.connect(this.defaultCwd);\n return client;\n }\n\n disconnect(name: string): void {\n const existing = this.clients.get(name);\n if (existing) {\n existing.close();\n this.clients.delete(name);\n }\n }\n\n closeAll(): void {\n for (const [, c] of this.clients) c.close();\n this.clients.clear();\n }\n\n get(name: string): McpClient | undefined {\n return this.clients.get(name);\n }\n\n connectedNames(): string[] {\n return Array.from(this.clients.keys()).sort();\n }\n\n toolCount(): number {\n let n = 0;\n for (const [, c] of this.clients) n += c.tools.length;\n return n;\n }\n\n /** A JSON-serializable catalog of every connected server for the KV/context. */\n catalog(): { servers: McpServerCatalogEntry[]; generatedAt: number } {\n return {\n servers: Array.from(this.clients.values()).map((c) => c.catalogEntry()),\n generatedAt: Date.now(),\n };\n }\n\n recentAttestations(n = 10): McpAttestation[] {\n return this.attestations.slice(-n);\n }\n\n /** Execute a forwarded `mcp` tool request and return host-shaped text. */\n async dispatch(args: Record<string, unknown>): Promise<{ ok: boolean; result?: string; error?: string }> {\n const action = String(args.action || \"call\");\n const serverName = typeof args.server === \"string\" ? args.server : \"\";\n\n if (action === \"list\") {\n // A concise inventory of connected MCP servers (name + tool count) — what\n // the agent should consult to answer \"which MCP servers are installed?\".\n const servers = this.catalog().servers.map((s) => ({\n name: s.name,\n tools: s.tools.length,\n resources: s.resources?.length ?? 0,\n }));\n return {\n ok: true,\n result: servers.length\n ? JSON.stringify({ servers }, null, 2)\n : \"No MCP servers are connected. The user can add one with the /mcp command, or you can install one with the mcp tool (action \\\"install\\\").\",\n };\n }\n\n if (action === \"list_tools\") {\n // No server → list everything; a server → just that one.\n const cat = this.catalog().servers.filter((s) => !serverName || s.name === serverName);\n if (!cat.length) return { ok: false, error: serverName ? `No connected MCP server named '${serverName}'.` : \"No MCP servers are connected. The user can add one with the /mcp command.\" };\n return { ok: true, result: JSON.stringify(cat, null, 2) };\n }\n\n const client = this.clients.get(serverName);\n if (!client) {\n const avail = this.connectedNames();\n return {\n ok: false,\n error: avail.length\n ? `No connected MCP server named '${serverName}'. Connected servers: ${avail.join(\", \")}.`\n : `No MCP servers are connected. The user can add one with the /mcp command.`,\n };\n }\n\n try {\n let res: McpCallResult;\n if (action === \"read_resource\") {\n const uri = String(args.uri || \"\");\n if (!uri) return { ok: false, error: \"read_resource requires a 'uri'.\" };\n res = await client.readResource(uri);\n } else {\n const toolName = String(args.tool || \"\");\n if (!toolName) return { ok: false, error: \"call requires a 'tool' name.\" };\n const callArgs = parseArgs(args.arguments_json);\n if (callArgs instanceof Error) return { ok: false, error: callArgs.message };\n res = await client.callTool(toolName, callArgs);\n }\n\n this.attestations.push(res.attestation);\n const footer = formatAttestation(res.attestation);\n if (!res.ok) {\n return { ok: false, error: `${res.text || \"The MCP tool reported an error.\"}\\n${footer}` };\n }\n return { ok: true, result: `${res.text}\\n${footer}` };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction parseArgs(raw: unknown): Record<string, unknown> | Error {\n if (raw == null || raw === \"\") return {};\n if (typeof raw === \"object\") return raw as Record<string, unknown>;\n if (typeof raw !== \"string\") return new Error(\"arguments_json must be a JSON object string.\");\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) return parsed as Record<string, unknown>;\n return new Error(\"arguments_json must encode a JSON object.\");\n } catch (e) {\n return new Error(`arguments_json is not valid JSON: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n/** Flatten MCP tool-call `content` blocks into a single text string. */\nfunction flattenContent(content: Array<Record<string, unknown>> | undefined, structured: unknown): string {\n const parts: string[] = [];\n for (const block of content || []) {\n if (block.type === \"text\" && typeof block.text === \"string\") parts.push(block.text);\n else if (block.type === \"resource\" && block.resource && typeof block.resource === \"object\") {\n const r = block.resource as Record<string, unknown>;\n if (typeof r.text === \"string\") parts.push(r.text);\n else parts.push(`[resource ${String(r.uri ?? \"\")}]`);\n } else if (block.type === \"image\") parts.push(`[image ${String(block.mimeType ?? \"\")}]`);\n else if (block.type === \"audio\") parts.push(`[audio ${String(block.mimeType ?? \"\")}]`);\n else parts.push(JSON.stringify(block));\n }\n if (!parts.length && structured !== undefined) parts.push(JSON.stringify(structured, null, 2));\n return parts.join(\"\\n\").trim();\n}\n\nfunction flattenResourceContents(contents: Array<Record<string, unknown>> | undefined): string {\n const parts: string[] = [];\n for (const c of contents || []) {\n if (typeof c.text === \"string\") parts.push(c.text);\n else if (typeof c.blob === \"string\") parts.push(`[binary resource ${String(c.uri ?? \"\")} (${c.blob.length} b64 chars)]`);\n }\n return parts.join(\"\\n\").trim();\n}\n\nfunction formatAttestation(a: McpAttestation): string {\n const id = `${a.serverInfo.name}${a.serverInfo.version ? `@${a.serverInfo.version}` : \"\"}`;\n return (\n `[attestation] server=${a.server} (${id}) protocol=${a.protocolVersion} ` +\n `target=${a.target} args_sha256=${a.argsSha256.slice(0, 16)} ` +\n `result_sha256=${a.resultSha256.slice(0, 16)} nonce=${a.nonce}`\n );\n}\n\n/** Stable JSON for hashing (sorted keys) so identical args hash identically. */\nfunction canonicalJson(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(value as Record<string, unknown>).sort()) {\n out[k] = sortKeys((value as Record<string, unknown>)[k]);\n }\n return out;\n }\n return value;\n}\nfunction sha256(input: string): string {\n return crypto.createHash(\"sha256\").update(input).digest(\"hex\");\n}\n","/**\n * The execution session — the ONE wiring of the tool-execution stack, shared\n * by the interactive CLI and the daemon.\n *\n * Both are the same client: registry + MCP host + HostTools executors +\n * permission engine + bridge. The only intended difference between them is\n * the I/O adapter (the BridgeHooks: TUI dialogs vs. daemon log + approval\n * relay). Keeping the wiring here means a new tool, safety rule, or setup\n * step lands in both by construction — they cannot drift.\n *\n * PRIME DIRECTIVE — state lives on the thread, not in the client. Any\n * interface (another terminal, a watcher on a different machine, a future\n * web UI) can attach to a thread and even take over execution, so every\n * piece of session state an interface could need MUST live centrally on\n * api.standardcode.ai: thread KV for session-scoped state (approvals,\n * bg_processes, mcp_catalog, session_info, input_history, execution_owner,\n * the approval relay keys), user KV for account-scoped state (the machine\n * registry). In-memory copies (like PermissionState) are CACHES of that\n * central state with a defined refresh rule — never the source of truth.\n * The only sanctioned client-local files are machine-inherent: credentials,\n * machine identity, and MCP launch commands.\n */\nimport { ApiClient } from \"./api.ts\";\nimport { Bridge, type BridgeHooks } from \"./bridge.ts\";\nimport { HostTools } from \"./host-tools.ts\";\nimport { McpManager } from \"./mcp.ts\";\nimport { listMcpServers } from \"./mcp-config.ts\";\nimport { ProcessRegistry } from \"./process-registry.ts\";\nimport { loadApprovals, type ApprovalsKV } from \"./approvals.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport type { BridgeClientIdentity } from \"./types.ts\";\n\nexport interface ExecutionSessionOptions {\n api: ApiClient;\n threadId: string;\n /** Absolute project directory tools execute in. */\n projectDir: string;\n /** Display name for this machine (session_info, process-registry entries). */\n machineName: string;\n /** The permission engine state; the caller owns its default level. */\n perm: PermissionState;\n /** The I/O adapter — the ONLY part meant to differ between clients. */\n hooks: BridgeHooks;\n /** Bridge identity for execution-owner election. */\n identity: BridgeClientIdentity;\n}\n\n/** One MCP server's connect outcome (for the caller's own presentation). */\nexport interface McpConnectResult {\n name: string;\n ok: boolean;\n tools?: number;\n error?: string;\n}\n\nexport class ExecutionSession {\n readonly registry: ProcessRegistry;\n readonly mcp: McpManager;\n readonly host: HostTools;\n readonly bridge: Bridge;\n\n private readonly api: ApiClient;\n private readonly threadId: string;\n private readonly projectDir: string;\n private readonly machineName: string;\n private readonly perm: PermissionState;\n\n constructor(options: ExecutionSessionOptions) {\n this.api = options.api;\n this.threadId = options.threadId;\n this.projectDir = options.projectDir;\n this.machineName = options.machineName;\n this.perm = options.perm;\n\n // Background-process metadata lives in the thread's KV (server-side), so\n // the list resumes from any machine; nothing about it is stored locally.\n this.registry = new ProcessRegistry(options.api, options.threadId, options.machineName);\n // MCP host: this client negotiates with locally-launched MCP servers and\n // forwards the agent's `mcp` tool calls to them. The discovered catalog is\n // mirrored into the thread KV so a context hook shows the agent what's\n // available — and so watchers can see it too.\n this.mcp = new McpManager(options.projectDir);\n this.host = new HostTools(\n options.projectDir,\n this.registry,\n options.threadId,\n options.machineName,\n this.mcp,\n () => this.publishMcpCatalog(),\n options.api\n );\n this.bridge = new Bridge(\n options.api,\n options.threadId,\n this.host,\n options.perm,\n options.hooks,\n options.identity\n );\n }\n\n /** Mirror the MCP catalog into the thread KV (fire-and-forget). */\n publishMcpCatalog(): void {\n void this.api.kvSet(this.threadId, \"mcp_catalog\", this.mcp.catalog()).catch(() => {});\n }\n\n /**\n * Load the thread's saved approvals (level + pre-approved tools/risk) from\n * the thread KV into the permission engine. Returns the saved record so an\n * interactive caller can also reflect the level in its UI.\n */\n async loadApprovals(): Promise<ApprovalsKV> {\n const saved = await loadApprovals(this.api, this.threadId);\n this.perm.alwaysAllow = new Set(saved.allowTools);\n this.perm.allowRisk = new Set(saved.allowRisk);\n if (saved.level) this.perm.level = saved.level;\n return saved;\n }\n\n /**\n * Tell the agent where its shell lives (`session_info` in thread KV): the\n * instance's context hook renders it as a synthetic opening pwd exchange.\n * OWNER-ONLY — a watcher must never overwrite the executing client's truth.\n */\n writeSessionInfo(): void {\n void this.api\n .kvSet(this.threadId, \"session_info\", { cwd: this.projectDir, machine: this.machineName })\n .catch(() => {});\n }\n\n /**\n * Connect every enabled MCP server and publish the catalog so the agent\n * sees the tools on its very first step. Returns per-server outcomes for\n * the caller to present (TUI lines / daemon log).\n */\n async connectEnabledMcpServers(): Promise<McpConnectResult[]> {\n const results: McpConnectResult[] = [];\n for (const server of listMcpServers().filter((s) => s.enabled)) {\n try {\n const client = await this.mcp.connect(server);\n results.push({ name: server.name, ok: true, tools: client.tools.length });\n } catch (e) {\n results.push({\n name: server.name,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n this.publishMcpCatalog();\n return results;\n }\n\n /** Tear down the connection + local MCP servers (processes are the caller's\n * call — an owner kills its own spawned processes, a watcher has none). */\n stop(): void {\n this.bridge.close();\n this.mcp.closeAll();\n }\n}\n","/**\n * Subscribes to a thread's message WebSocket to render streamed assistant text\n * and detect end-of-turn (an assistant message with non-empty text content,\n * which under stopOnResponse means the agent has finished its turn).\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\n\nexport interface StreamHooks {\n /** A streamed fragment of the assistant's visible answer. `messageId` lets the\n * consumer reset its live buffer when a new message starts. */\n onChunk(text: string, messageId?: string): void;\n /**\n * A streamed fragment of the model's internal reasoning. This is the opt-in\n * `reasoning_chunk` channel (we subscribe with `?reasoning=1`); the backend\n * only sends it to sockets that ask. See the spec `ThreadReasoningChunkEvent`.\n */\n onReasoningChunk?(text: string, messageId?: string): void;\n /**\n * A complete assistant message. `hasToolCalls` is true for narration that\n * precedes tool calls (the turn continues) and false for the final answer\n * (the turn is over).\n */\n onAssistantText(content: string, hasToolCalls: boolean): void;\n /**\n * A custom thread event (the `{ type: \"event\", eventType, data }` channel) —\n * e.g. `tool_call_started`, `tool_call_done`, `generation`.\n */\n onEvent?(eventType: string, data: any): void;\n onError(err: string): void;\n}\n\nexport class MessageStream {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private resolveConnected: (() => void) | null = null;\n\n constructor(\n private api: ApiClient,\n private threadId: string,\n private hooks: StreamHooks\n ) {}\n\n /**\n * Connect and stay connected. Resolves on first open; reconnects on any drop\n * with exponential backoff. Silent — the bridge surfaces the user-facing\n * connection status; completion is detected via HTTP polling regardless, so a\n * dropped stream only affects live display, not correctness.\n */\n connect(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n this.resolveConnected = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n setTimeout(() => this.resolveConnected?.(), 8000);\n this.openSocket();\n });\n }\n\n private openSocket(): void {\n if (this.closed) return;\n // `reasoning=1` opts into the internal-reasoning channel (off by default).\n const url = `${this.api.wsEndpoint}/api/threads/${this.threadId}/stream?token=${encodeURIComponent(this.api.bearer)}&reasoning=1`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n ws.addEventListener(\"open\", () => {\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.resolveConnected?.();\n });\n ws.addEventListener(\"message\", (ev) => {\n // Any frame proves the link is alive; a silent stream would otherwise\n // freeze the live indicators without ever reconnecting.\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n // Both 'error' (failed open) and 'close' must drive reconnection.\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return;\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n\n private onMessage(raw: string): void {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg.type === \"event\" && typeof msg.eventType === \"string\") {\n this.hooks.onEvent?.(msg.eventType, msg.data);\n return;\n }\n if (msg.type === \"message_chunk\" && (msg.depth ?? 0) === 0) {\n if (typeof msg.chunk === \"string\") this.hooks.onChunk(msg.chunk, msg.message_id);\n return;\n }\n if (msg.type === \"reasoning_chunk\" && (msg.depth ?? 0) === 0) {\n if (typeof msg.chunk === \"string\") this.hooks.onReasoningChunk?.(msg.chunk, msg.message_id);\n return;\n }\n if (msg.type === \"message_data\" && (msg.depth ?? 0) === 0) {\n const data = msg.data || {};\n if (data.role === \"assistant\" && typeof data.content === \"string\" && data.content.trim()) {\n // tool_calls is serialized as a JSON string, not an array.\n const tc = data.tool_calls;\n const hasToolCalls = Array.isArray(tc)\n ? tc.length > 0\n : typeof tc === \"string\" && tc.trim() !== \"\" && tc.trim() !== \"null\" && tc.trim() !== \"[]\";\n this.hooks.onAssistantText(data.content, hasToolCalls);\n }\n if (data.role === \"assistant\" && data.status === \"failed\" && data.error) {\n this.hooks.onError(String(data.error));\n }\n }\n }\n}\n","/**\n * Subscribes to the instance-wide system events channel (`GET /api/events`) to\n * learn when threads are created, updated, or terminated. We use it to track\n * *subagents*: a subagent runs in its own child thread, so the only live signal\n * of \"a subagent is working\" is its child thread appearing here with our thread\n * as its `parent` (and disappearing/terminating when it finishes).\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\n\n/** The subset of a thread registry entry we care about. */\nexport interface ThreadEntry {\n id: string;\n agent_name?: string | null;\n tags?: string[] | null;\n parent?: string | null;\n terminated?: number | null;\n created_at?: number;\n}\n\nexport interface SystemEventHooks {\n onThreadCreated(thread: ThreadEntry): void;\n onThreadUpdated(thread: ThreadEntry): void;\n onThreadDeleted(threadId: string): void;\n /** Fired whenever the socket (re)connects, so the consumer can re-snapshot\n * state that live deltas alone can't reconstruct after a gap. */\n onOpen?(): void;\n}\n\nexport class SystemEvents {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private api: ApiClient,\n private hooks: SystemEventHooks\n ) {}\n\n connect(): void {\n this.openSocket();\n }\n\n private openSocket(): void {\n if (this.closed) return;\n const url = `${this.api.wsEndpoint}/api/events?token=${encodeURIComponent(this.api.bearer)}`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n ws.addEventListener(\"open\", () => {\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.hooks.onOpen?.();\n });\n ws.addEventListener(\"message\", (ev) => {\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n private onMessage(raw: string): void {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg?.type === \"thread_created\" && msg.thread) this.hooks.onThreadCreated(msg.thread);\n else if (msg?.type === \"thread_updated\" && msg.thread) this.hooks.onThreadUpdated(msg.thread);\n else if (msg?.type === \"thread_deleted\" && typeof msg.threadId === \"string\") {\n this.hooks.onThreadDeleted(msg.threadId);\n }\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return;\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n}\n","/**\n * Live activity labels for the per-subagent HUD lines.\n *\n * The parent thread's child registry only says a subagent EXISTS and is\n * `running` — the work itself is a black box. But every subagent runs in its\n * own thread, and that thread's `/stream` WebSocket carries the same live\n * signals the main thread's does: `tool_call_started` events (with the tool's\n * one-line `progress` text, e.g. \"reading the Hermes MCP README\"), completion\n * events, and streamed reasoning/answer chunks. This module holds ONE\n * MessageStream per active subagent and folds those signals into a short\n * \"what it's doing right now\" phrase for the subagent's line:\n *\n * ⣯ Research Assistant — reading the Cloudflare email docs\n *\n * Lifecycle: `sync(ids)` is called after every subagent reconcile with the\n * authoritative set of running child thread ids — newcomers get a stream,\n * departed ids are closed and forgotten, so sockets never outlive their\n * subagent line. `closeAll()` tears everything down at session end.\n *\n * Fault tolerance is inherited from MessageStream: heartbeat + half-open\n * detection + exponential-backoff reconnect. A dropped socket therefore\n * degrades to a stale (or absent) phrase — never a crash, and never a stuck\n * line, because the line itself lives or dies by the registry reconcile, not\n * by this stream.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { MessageStream, type StreamHooks } from \"./stream.ts\";\n\n/** What we need from a stream — MessageStream in production; tests inject a\n * fake to drive the hooks directly. */\nexport interface ActivityStream {\n connect(): Promise<void>;\n close(): void;\n}\nexport type ActivityStreamFactory = (threadId: string, hooks: StreamHooks) => ActivityStream;\n\n/** Longest phrase we keep — the TUI clamps to the terminal width anyway; this\n * just bounds what we store and hand over. */\nconst MAX_PHRASE = 120;\n\ninterface Entry {\n stream: ActivityStream;\n /** tool call id → progress phrase, insertion-ordered (last = most recent). */\n steps: Map<string, string>;\n /** Last phrase shown. Sticky: between tools we keep the previous phrase\n * until a chunk/tool replaces it, so the line never flickers empty. */\n phrase: string | null;\n}\n\n/** One-line, bounded, human phrase from an event's progress text. The TUI\n * sanitizes again at render time; this keeps stored state sane. */\nfunction cleanPhrase(raw: string): string {\n const s = raw.replace(/\\s+/g, \" \").trim();\n return s.length > MAX_PHRASE ? `${s.slice(0, MAX_PHRASE - 1)}…` : s;\n}\n\n/** \"web_search\" → \"web search\" — a readable fallback when a tool has no\n * progress text. */\nfunction prettyToolName(name: string): string {\n return name.replace(/^provider:/, \"\").replace(/[_:-]+/g, \" \").trim();\n}\n\nexport class SubagentActivity {\n private entries = new Map<string, Entry>();\n\n constructor(\n api: ApiClient,\n /** Fired when a subagent's phrase changes; the consumer re-pushes the\n * subagent lines to the TUI. */\n private onChange: (threadId: string) => void,\n /** Test seam — production always uses a real MessageStream. */\n private makeStream: ActivityStreamFactory = (threadId, hooks) => new MessageStream(api, threadId, hooks)\n ) {}\n\n /** The current activity phrase for a subagent's child thread, if any. */\n phraseFor(threadId: string): string | null {\n return this.entries.get(threadId)?.phrase ?? null;\n }\n\n /**\n * Reconcile the open streams against the authoritative set of RUNNING\n * subagent child-thread ids (from the parent's registry): open newcomers,\n * close and forget departed ones.\n */\n sync(activeIds: Iterable<string>): void {\n const want = new Set(activeIds);\n for (const [id, entry] of [...this.entries]) {\n if (!want.has(id)) {\n entry.stream.close();\n this.entries.delete(id);\n }\n }\n for (const id of want) {\n if (!this.entries.has(id)) this.open(id);\n }\n }\n\n private open(threadId: string): void {\n const entry: Entry = { stream: null as unknown as ActivityStream, steps: new Map(), phrase: null };\n\n const setPhrase = (phrase: string | null) => {\n if (phrase === entry.phrase) return;\n entry.phrase = phrase;\n this.onChange(threadId);\n };\n /** The most recently started still-active tool wins; with no active tool\n * the previous phrase stays (sticky) rather than blinking empty. */\n const phraseFromSteps = (): string | null => {\n let last: string | null = null;\n for (const v of entry.steps.values()) last = v;\n return last ?? entry.phrase;\n };\n\n entry.stream = this.makeStream(threadId, {\n // Streamed output with no tool in flight means the model is composing —\n // reasoning reads as \"thinking\", visible answer text as \"writing\". These\n // only fire on TRANSITIONS (phrase comparison), not per chunk.\n onChunk: () => {\n if (entry.steps.size === 0) setPhrase(\"writing\");\n },\n onReasoningChunk: () => {\n if (entry.steps.size === 0) setPhrase(\"thinking\");\n },\n onAssistantText: () => {},\n onEvent: (eventType, data) => {\n if (eventType === \"tool_call_started\" && data?.id) {\n entry.steps.set(String(data.id), cleanPhrase(String(data.progress || prettyToolName(String(data.name || \"\")) || \"working\")));\n setPhrase(phraseFromSteps());\n } else if (eventType === \"tool_call_done\" && data?.id) {\n entry.steps.delete(String(data.id));\n setPhrase(phraseFromSteps());\n }\n },\n onError: () => {},\n });\n this.entries.set(threadId, entry);\n // Fire-and-forget: the stream resolves its own connection lifecycle\n // (reconnects with backoff); a subagent that finishes first is cleaned up\n // by the next sync().\n void entry.stream.connect();\n }\n\n /** Close every stream (session teardown). */\n closeAll(): void {\n for (const entry of this.entries.values()) entry.stream.close();\n this.entries.clear();\n }\n}\n","/**\n * WordMill — the working indicator's slot-machine word morph.\n *\n * The status line's \"Working\" label holds steady for a few seconds, then\n * decomposes and re-forms into another working word (some earnest, some\n * fun): each character is a slot that starts flipping through random\n * letters/symbols — lazily at first, then every frame — before landing on\n * the target word's character and sticking. Longer targets grow new slots\n * mid-morph; shorter ones let trailing slots flip out and vanish. The new\n * word then holds, and the cycle repeats for as long as the turn runs.\n *\n * Pure logic, driven entirely by the caller's clock (`text(now)` once per\n * frame): no timers of its own, deterministic per (slot, time-bucket) while\n * flipping so a re-render within the same bucket shows the same glyph.\n */\n\nexport const MILL_WORDS = [\n \"Working\",\n \"Thinking\",\n \"Building\",\n \"Brewing\",\n \"Crafting\",\n \"Scheming\",\n \"Tinkering\",\n \"Noodling\",\n \"Pondering\",\n \"Wrangling\",\n \"Conjuring\",\n \"Percolating\",\n \"Assembling\",\n \"Cogitating\",\n \"Hatching\",\n \"Forging\",\n // The silly shelf — irreverent, never profane.\n \"Pickling\",\n \"Spooning\",\n \"Marinating\",\n \"Squishing\",\n \"Wiggling\",\n \"Frolicking\",\n \"Moisturizing\",\n \"Bamboozling\",\n \"Skedaddling\",\n \"Discombobulating\",\n \"Waffling\",\n \"Yodeling\",\n \"Shimmying\",\n \"Galumphing\",\n \"Snorkeling\",\n \"Bedazzling\",\n] as const;\n\n// What the slots flip through — letters plus the punctuation \"debris\" that\n// sells the decomposing look.\nconst FLIP_POOL = \"abcdefghjkmnopqrstuvwxyz#$%&@!*+=.:~\";\n\nconst HOLD_MS = 2600; // how long a landed word stays intact\n// Per-slot flip cadence: a slot flips lazily right after it starts\n// (LAZY_PERIOD per glyph), then per-frame once it has been flipping a while.\nconst LAZY_MS = 320;\nconst LAZY_PERIOD = 200;\nconst FAST_PERIOD = 70;\n\nconst BOLD = \"\\x1b[1m\";\nconst DIM = \"\\x1b[2m\";\nconst OFF = \"\\x1b[22m\"; // clears bold + dim\n\n/** Deterministic small hash → pool glyph, stable within one flip bucket. */\nfunction glyphAt(slot: number, bucket: number): string {\n let h = (slot + 1) * 2654435761 ^ (bucket + 1) * 40503;\n h = Math.imul(h ^ (h >>> 13), 1274126177);\n h ^= h >>> 16;\n return FLIP_POOL[(h >>> 0) % FLIP_POOL.length];\n}\n\ninterface Slot {\n start: number; // ms into the morph when this slot begins flipping\n land: number; // ms into the morph when it locks onto the target char\n}\n\nexport class WordMill {\n private word: string = MILL_WORDS[0];\n private target: string | null = null; // non-null while morphing\n private phaseAt = 0; // clock time the current phase began\n private slots: Slot[] = [];\n private morphLen = 0;\n private rng: () => number;\n\n constructor(rng: () => number = Math.random) {\n this.rng = rng;\n }\n\n /** Restart at \"Working\" (called when a turn begins). */\n reset(now: number): void {\n this.word = MILL_WORDS[0];\n this.target = null;\n this.phaseAt = now;\n }\n\n /** The plain word currently displayed or being formed (for tests). */\n get current(): string {\n return this.target ?? this.word;\n }\n\n /** The styled label for this frame (contains only bold/dim ANSI). */\n text(now: number): string {\n if (this.phaseAt === 0) this.phaseAt = now;\n if (!this.target) {\n if (now - this.phaseAt >= HOLD_MS) this.beginMorph(now);\n else return `${BOLD}${this.word}${OFF}`;\n }\n return this.morphFrame(now);\n }\n\n private beginMorph(now: number): void {\n const options = MILL_WORDS.filter((w) => w !== this.word);\n this.target = options[Math.floor(this.rng() * options.length)];\n this.phaseAt = now;\n const n = Math.max(this.word.length, this.target.length);\n this.slots = [];\n let maxLand = 0;\n for (let i = 0; i < n; i++) {\n // Staggered starts sell the \"one by one it comes apart\" ramp; lands\n // sweep loosely left→right with jitter so letters lock in one at a\n // time rather than all at once.\n const start = this.rng() * 500;\n const land = 750 + i * 90 + this.rng() * 350;\n this.slots.push({ start, land });\n if (land > maxLand) maxLand = land;\n }\n this.morphLen = maxLand + 60;\n }\n\n private morphFrame(now: number): string {\n const target = this.target!;\n const t = now - this.phaseAt;\n if (t >= this.morphLen) {\n // Morph complete — the target becomes the held word.\n this.word = target;\n this.target = null;\n this.phaseAt = now;\n return `${BOLD}${this.word}${OFF}`;\n }\n let out = \"\";\n for (let i = 0; i < this.slots.length; i++) {\n const s = this.slots[i];\n if (t < s.start) {\n // Still intact: shows the OLD word's char (a slot the old word\n // doesn't have simply hasn't appeared yet).\n const ch = this.word[i];\n if (ch) out += `${BOLD}${ch}${OFF}`;\n } else if (t < s.land) {\n // Flipping: lazy cadence right after start, per-frame once warm.\n const age = t - s.start;\n const period = age < LAZY_MS ? LAZY_PERIOD : FAST_PERIOD;\n out += `${DIM}${glyphAt(i, Math.floor(t / period))}${OFF}`;\n } else {\n // Landed: shows the NEW word's char (or vanishes for shrunk slots).\n const ch = target[i];\n if (ch) out += `${BOLD}${ch}${OFF}`;\n }\n }\n return out;\n }\n}\n","/** Bridge protocol + shared CLI types. */\n\n/** A forwarded tool request the instance sends down the bridge. */\nexport interface ToolRequest {\n type: \"tool_request\";\n /** In-memory await id (non-durable calls reply over the WebSocket with this). */\n id?: string;\n /**\n * Durable calls: the agent parked this call and is awaiting the result over\n * HTTP. Reply by POSTing to /tool-result with `toolCallId` instead of the WS.\n */\n durable?: boolean;\n toolCallId?: string;\n tool: string;\n args: Record<string, unknown>;\n requestPermission: string | null;\n risk: number | null;\n /** Ownership generation this call was dispatched under; echoed back in the\n * durable HTTP delivery so a superseded owner's late result is refused. */\n generation?: number;\n}\n\n/** The CLI's reply to a tool request. */\nexport interface ToolResponse {\n type: \"tool_response\";\n id: string;\n ok: boolean;\n result?: string;\n error?: string;\n}\n\n/** Result of executing a tool on the host. */\nexport interface HostResult {\n ok: boolean;\n result?: string;\n error?: string;\n}\n\n/**\n * Permission is a single auto-accept LEVEL 1–5: every tool call at risk ≤ level\n * runs automatically; anything riskier asks. (The catastrophic-command guard\n * still blocks dangerous commands at every level.) shift-tab cycles the level.\n */\nexport type Level = 1 | 2 | 3 | 4 | 5;\n\nexport const LEVELS: Level[] = [1, 2, 3, 4, 5];\n\n/** What each level lets run without asking (risk meanings: 1 read · 2 safe writes/builds · 3 installs/project edits · 4 outside-project/git-history · 5 destructive). */\nconst LEVEL_DETAIL: Record<Level, string> = {\n 1: \"only safe reads run automatically\",\n 2: \"+ safe writes & builds\",\n 3: \"+ installs & project edits\",\n 4: \"+ outside-project & git-history\",\n 5: \"everything — never ask\",\n};\n\nexport function levelLabel(level: Level): string {\n return `auto-accept level ${level} (${LEVEL_DETAIL[level]})`;\n}\n\n/** Stored credential for one instance. */\nexport interface InstanceCredential {\n endpoint: string;\n access_token: string;\n token_type: string;\n user?: { id: string; username: string; role: string };\n saved_at: number;\n}\n\nexport interface CredentialsFile {\n default_endpoint?: string;\n instances: Record<string, InstanceCredential>;\n}\n\nexport interface ThreadSummary {\n id: string;\n tags: string[];\n created_at?: number;\n title?: string;\n preview?: string;\n}\n\n/**\n * The thread's execution owner — the ONE client that runs forwarded tool\n * calls, even when several clients are connected to the thread. Recorded by\n * the instance in the thread KV under `execution_owner` and echoed in the\n * bridge's `bridge_ready` / `owner_changed` frames.\n */\nexport interface ExecutionOwnerInfo {\n client_id: string;\n client_name?: string | null;\n client_kind?: string | null;\n /** Monotonic ownership generation (bumped when ownership moves between clients). */\n generation?: number;\n}\n\n/** How a connecting bridge claims execution ownership (see the instance's\n * bridge-owner semantics): never / only-if-free / also-if-stale / always. */\nexport type BridgeClaim = \"none\" | \"if_unowned\" | \"if_stale\" | \"takeover\";\n\n/** The identity a bridge connection presents for execution-owner election. */\nexport interface BridgeClientIdentity {\n clientId: string;\n clientName?: string;\n clientKind: \"interactive\" | \"daemon\";\n claim: BridgeClaim;\n}\n","/**\n * Best-effort system-clipboard image reader (zero-dependency).\n *\n * Used by the TUI's Ctrl+V handler: terminals only deliver *text* through\n * bracketed paste, so an image on the clipboard never reaches the input by\n * itself. When the user explicitly asks (Ctrl+V), we shell out to the\n * platform's clipboard utility and pull the image as PNG bytes.\n *\n * Per platform:\n * - macOS: `osascript` — first the raw PNG flavour («class PNGf», what\n * screenshots put on the clipboard), then a copied-file fallback\n * («class furl», what Finder ⌘C puts there) read from disk.\n * - Linux: `wl-paste` (Wayland) then `xclip` (X11), asking for image/png.\n * - Windows: PowerShell's Windows.Forms clipboard, saved as PNG.\n *\n * All paths are best-effort: any missing utility or non-image clipboard\n * resolves to null, never throws.\n */\nimport { execFile } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface ClipboardImage {\n data: string; // base64-encoded image bytes\n mime: string; // e.g. \"image/png\"\n}\n\nconst FILE_MIMES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n};\n\n/** Cap pasted images at 8 MB — larger than any reasonable screenshot, small\n * enough that a base64 body stays well within request limits. */\nconst MAX_IMAGE_BYTES = 8 * 1024 * 1024;\n\nfunction run(cmd: string, args: string[], maxBuffer = MAX_IMAGE_BYTES * 2): Promise<{ ok: boolean; stdout: Buffer }> {\n return new Promise((resolve) => {\n execFile(cmd, args, { encoding: \"buffer\", maxBuffer }, (err, stdout) => {\n resolve({ ok: !err, stdout: stdout ?? Buffer.alloc(0) });\n });\n });\n}\n\nfunction fromFile(filePath: string): ClipboardImage | null {\n const mime = FILE_MIMES[path.extname(filePath).toLowerCase()];\n if (!mime) return null;\n try {\n const stat = fs.statSync(filePath);\n if (!stat.isFile() || stat.size === 0 || stat.size > MAX_IMAGE_BYTES) return null;\n return { data: fs.readFileSync(filePath).toString(\"base64\"), mime };\n } catch {\n return null;\n }\n}\n\nasync function readDarwin(): Promise<ClipboardImage | null> {\n // Raw image data (screenshots, \"Copy Image\" from a browser) → PNG flavour.\n const tmp = path.join(os.tmpdir(), `sc-clip-${process.pid}-${Date.now()}.png`);\n const script = [\n `set d to the clipboard as «class PNGf»`,\n `set f to open for access POSIX file \"${tmp}\" with write permission`,\n `set eof f to 0`,\n `write d to f`,\n `close access f`,\n ].join(\"\\n\");\n const png = await run(\"osascript\", [\"-e\", script]);\n if (png.ok) {\n const img = fromFile(tmp);\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n if (img) return img;\n }\n // A file copied in Finder → resolve the file URL and read the image from disk.\n const furl = await run(\"osascript\", [\"-e\", \"POSIX path of (the clipboard as «class furl»)\"]);\n if (furl.ok) {\n const p = furl.stdout.toString(\"utf8\").trim();\n if (p) return fromFile(p);\n }\n return null;\n}\n\nasync function readLinux(): Promise<ClipboardImage | null> {\n for (const [cmd, args] of [\n [\"wl-paste\", [\"--type\", \"image/png\"]],\n [\"xclip\", [\"-selection\", \"clipboard\", \"-t\", \"image/png\", \"-o\"]],\n ] as [string, string[]][]) {\n const res = await run(cmd, args);\n // PNG magic bytes guard against utilities that print an error to stdout.\n if (res.ok && res.stdout.length > 8 && res.stdout.length <= MAX_IMAGE_BYTES && res.stdout[0] === 0x89 && res.stdout[1] === 0x50) {\n return { data: res.stdout.toString(\"base64\"), mime: \"image/png\" };\n }\n }\n return null;\n}\n\nasync function readWindows(): Promise<ClipboardImage | null> {\n const tmp = path.join(os.tmpdir(), `sc-clip-${process.pid}-${Date.now()}.png`);\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms;\",\n \"$img = [System.Windows.Forms.Clipboard]::GetImage();\",\n `if ($img -ne $null) { $img.Save('${tmp.replace(/'/g, \"''\")}', [System.Drawing.Imaging.ImageFormat]::Png) }`,\n ].join(\" \");\n await run(\"powershell\", [\"-NoProfile\", \"-STA\", \"-Command\", ps]);\n const img = fromFile(tmp);\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n return img;\n}\n\n/** Read an image from the system clipboard, or null when there isn't one. */\nexport async function readClipboardImage(): Promise<ClipboardImage | null> {\n try {\n if (process.platform === \"darwin\") return await readDarwin();\n if (process.platform === \"win32\") return await readWindows();\n return await readLinux();\n } catch {\n return null;\n }\n}\n","/**\n * Terminal UI with a persistent bottom input region.\n *\n * A side-margined expanding input box stays anchored at the bottom and is always\n * editable — you can type while the agent works. Working status and subagent\n * lines render directly above the box; the permission level sits in the box's\n * top border (far right). All transcript output is printed ABOVE the work area\n * via print(). Approvals and menus temporarily take over the bottom.\n */\nimport readline from \"node:readline\";\nimport { gradientText, brandCycleColor } from \"./render.ts\";\nimport { WordMill } from \"./wordmill.ts\";\nimport { LEVELS, levelLabel, type Level } from \"./types.ts\";\nimport type { GoalData } from \"./api.ts\";\nimport { readClipboardImage } from \"./clipboard.ts\";\n\n/**\n * An image pasted into the input (Ctrl+V). `seq` ties it to its `[#Image N]`\n * placeholder in the text: only images whose placeholder survives editing are\n * sent with the message.\n */\nexport interface PastedImage {\n seq: number;\n data: string; // base64\n mime: string;\n}\n\n/** The `[#Image N]` placeholder text for a pasted image. */\nexport function imagePlaceholder(seq: number): string {\n return `[#Image ${seq}]`;\n}\n\n// ── boxed input chrome (pure, testable layout builders) ───────────────────────\n//\n// Mirrors the Grok Build bottom HUD: side-margined expanding box with the\n// permission/level label in the top border far right. No model chrome.\n\n/** Outer side margin for the boxed input (cells on left and right). */\nexport const INPUT_BOX_MARGIN = 1;\n\n/**\n * Neutral grey border chrome (Grok-style) — not brand amber. Soft enough to\n * sit behind content; bright enough to read the box edge.\n */\nexport function inputBoxBorderColor(): string {\n return \"\\x1b[38;5;240m\";\n}\n\n/**\n * Permission level as five dots for the box border (filled = active ceiling).\n * Plain string for width math; pair with `borderLevelDotsStyled` for colour.\n * e.g. level 3 → `●●●○○`\n */\nexport function borderLevelDots(level: Level): string {\n const n = Math.max(1, Math.min(5, level));\n return \"●\".repeat(n) + \"○\".repeat(5 - n);\n}\n\n/** Styled dots: filled in `levelColor`, empty in muted grey. */\nexport function borderLevelDotsStyled(\n level: Level,\n levelColor: string,\n emptyColor = \"\\x1b[38;5;240m\",\n reset = \"\\x1b[0m\"\n): string {\n const n = Math.max(1, Math.min(5, level));\n let out = \"\";\n for (let i = 1; i <= 5; i++) {\n out += i <= n ? `${levelColor}●${reset}` : `${emptyColor}○${reset}`;\n }\n return out;\n}\n\n/** @deprecated use borderLevelDots — kept name for call-site greps during transition */\nexport function borderLevelLabel(level: Level): string {\n return borderLevelDots(level);\n}\n\n/**\n * Geometry of the boxed input at a given terminal width.\n * `boxW` is border-to-border width; `contentW` is the wrap width inside.\n * `leftPad` is the screen column where content begins (margin + │ + space).\n */\nexport function inputBoxGeometry(cols: number): {\n margin: number;\n boxW: number;\n contentW: number;\n leftPad: number;\n} {\n const margin = INPUT_BOX_MARGIN;\n // Fit inside the HUD row cap (cols - 1): margin + boxW <= cols - 1.\n const boxW = Math.max(12, cols - 1 - margin);\n // │ + space + content + space + │\n const contentW = Math.max(4, boxW - 4);\n const leftPad = margin + 2;\n return { margin, boxW, contentW, leftPad };\n}\n\n/** Visible width helper used by pure box builders (ANSI-aware, wide glyphs). */\nfunction boxVisibleWidth(s: string): number {\n // eslint-disable-next-line no-control-regex\n let w = 0;\n for (const ch of s.replace(/\\x1b\\[[0-9;]*m/g, \"\")) {\n const cp = ch.codePointAt(0)!;\n w += isWideCodePoint(cp) ? 2 : 1;\n }\n return w;\n}\n\n/**\n * Top border with the level dots right-aligned in the border:\n * `╭──────────── ●●●○○ ─╮`\n *\n * `levelText` is the plain-width form (e.g. `●●●○○`); `levelStyled` is the\n * coloured form drawn in its place. When omitted, `levelText` is painted with\n * `levelColor` as a single run.\n */\nexport function buildBoxTop(\n boxW: number,\n levelText: string,\n borderColor: string,\n levelColor: string,\n reset = \"\\x1b[0m\",\n levelStyled?: string\n): string {\n const labelPlain = ` ${levelText} `;\n const rightFill = 1;\n const budget = Math.max(1, boxW - 2 - rightFill); // corners + right dashes\n const plain =\n labelPlain.length > budget ? labelPlain.slice(0, Math.max(1, budget)) : labelPlain;\n const leftFill = Math.max(1, boxW - 2 - plain.length - rightFill);\n // Styled dots keep the surrounding spaces unstyled so visible width matches.\n const mid =\n levelStyled !== undefined\n ? ` ${levelStyled} `\n : `${levelColor}${plain}${reset}`;\n return (\n `${borderColor}╭${\"─\".repeat(leftFill)}${reset}` +\n mid +\n `${borderColor}${\"─\".repeat(rightFill)}╮${reset}`\n );\n}\n\n/** Bottom border: `╰────────────────╯` */\nexport function buildBoxBottom(boxW: number, borderColor: string, reset = \"\\x1b[0m\"): string {\n return `${borderColor}╰${\"─\".repeat(Math.max(1, boxW - 2))}╯${reset}`;\n}\n\n/** Plain top border with no level chrome: `╭────────────────╮` (menus, pickers). */\nexport function buildBoxTopPlain(boxW: number, borderColor: string, reset = \"\\x1b[0m\"): string {\n return `${borderColor}╭${\"─\".repeat(Math.max(1, boxW - 2))}╮${reset}`;\n}\n\n/**\n * Top border with a LEFT-aligned label in the rim — building block for the\n * {@link Tui.boxedPrompt} component:\n * `╭ Denial feedback ────────────────╮`\n */\nexport function buildBoxTopLeftLabel(\n boxW: number,\n label: string,\n borderColor: string,\n labelColor = \"\\x1b[90m\",\n reset = \"\\x1b[0m\"\n): string {\n const plain = ` ${label} `;\n const budget = Math.max(1, boxW - 3); // ╭ + ≥1 dash + ╮\n const lab = plain.length > budget ? plain.slice(0, Math.max(1, budget)) : plain;\n const fill = Math.max(1, boxW - 2 - lab.length);\n return (\n `${borderColor}╭${reset}` +\n `${labelColor}${lab}${reset}` +\n `${borderColor}${\"─\".repeat(fill)}╮${reset}`\n );\n}\n\n// ── Boxed prompt component ──────────────────────────────────────────────────\n//\n// Reusable single-line free-text capture that reuses the main input box chrome\n// (side margin, grey rounded rim, `❯` carrot, real caret). The only chrome\n// difference is a left-aligned label in the top border instead of level dots.\n//\n// Used today for denial feedback; also the right shape for any other short\n// free-text “tell the agent / tell the system” moment (e.g. reject-with-note,\n// handoff reason, rename). Prefer this over ad-hoc `prompt()` bars when the\n// capture should feel continuous with the HUD.\n//\n// Layout:\n// ╭ <borderLabel> ─────────────────────────╮\n// │ ❯ typed text… │\n// ╰─────────────────────────────────────────╯\n//\n// Keys: Enter submits (may be empty), Esc clears a non-empty draft then\n// cancels on a second Esc (empty buffer). Gradient text is intentionally\n// unused here — brand gradient is reserved for success moments.\n\n/** Options for {@link Tui.boxedPrompt}. */\nexport interface BoxedPromptOptions {\n /**\n * Left-aligned label painted into the top border rim\n * (e.g. `\"Denial feedback\"`, `\"Handoff note\"`).\n */\n borderLabel: string;\n /** ANSI colour for the border label. Default: dim grey (`\\x1b[90m`). */\n labelColor?: string;\n /** Seed the buffer (e.g. to re-edit a previous note). */\n initial?: string;\n /**\n * When true (default), the first Esc on a non-empty buffer clears it; Esc on\n * an empty buffer cancels (resolves `null`). When false, Esc always cancels.\n */\n escClearsFirst?: boolean;\n /**\n * When true, the caller already owns the keyboard via a takeover (e.g. the\n * approval dialog chaining into feedback). Skips begin/end takeover so the\n * parent can finish its own cleanup. Default false.\n */\n nested?: boolean;\n}\n\n/**\n * One body row of the input box: `│ content… │` padded to contentW.\n * `content` may include ANSI (prompt colour); padding uses visible width.\n */\nexport function buildBoxBody(\n content: string,\n contentW: number,\n borderColor: string,\n reset = \"\\x1b[0m\"\n): string {\n const vw = boxVisibleWidth(content);\n const pad = Math.max(0, contentW - vw);\n return `${borderColor}│${reset} ${content}${\" \".repeat(pad)} ${borderColor}│${reset}`;\n}\n\n/**\n * Wrap prompt + multi-line input into physical body content lines at contentW.\n *\n * Grok-style indent: only the first physical row carries the real prompt; every\n * subsequent row (soft wrap OR hard newline) is indented by `prefixWidth`\n * spaces so text lines up under the first line's content (after `❯ `).\n *\n * Pure: no terminal I/O. Returns at least one line (the bare prefix when empty).\n */\nexport function wrapInputBodyLines(\n inputBuffer: string,\n prefix: string,\n prefixWidth: number,\n contentW: number\n): string[] {\n const indent = \" \".repeat(Math.max(0, prefixWidth));\n const lines = inputBuffer.split(\"\\n\");\n const out: string[] = [];\n let isFirstPhysical = true;\n for (let i = 0; i < lines.length; i++) {\n const text = lines[i];\n let remaining = text;\n // Always emit at least one physical row per logical line.\n do {\n const lead = isFirstPhysical ? prefix : indent;\n const avail = Math.max(0, contentW - prefixWidth);\n let take = Math.min(remaining.length, avail);\n if (take === 0 && avail === 0 && remaining.length > 0) take = 1;\n const chunk = remaining.slice(0, take);\n remaining = remaining.slice(take);\n out.push(lead + chunk);\n isFirstPhysical = false;\n if (remaining.length === 0) break;\n } while (remaining.length > 0);\n }\n if (out.length === 0) out.push(prefix);\n return out;\n}\n\n/**\n * Greyscale highlight for the working border sweep.\n * intensity 0 = rest grey, 1 = near-white head. No brand hues — just contrast.\n */\nexport function borderHighlightGrey(intensity: number): string {\n const t = Math.max(0, Math.min(1, intensity));\n // Ease so the head reads as a bright “bead” and the trail softens quickly.\n const e = t * t;\n const lo = 88; // rest-adjacent\n const hi = 236; // soft white\n const v = Math.round(lo + (hi - lo) * e);\n // Prefer truecolor greys when available; 256 greyscale ramp otherwise.\n const ct = process.env.COLORTERM ?? \"\";\n const tc =\n /truecolor|24bit/i.test(ct) ||\n /iterm|kitty|wezterm|ghostty|alacritty/i.test(process.env.TERM_PROGRAM ?? \"\");\n if (tc) return `\\x1b[38;2;${v};${v};${v}m`;\n // xterm 256 greyscale: 232 (dark) … 255 (white)\n return `\\x1b[38;5;${232 + Math.round(23 * e)}m`;\n}\n\n/**\n * Color a perimeter cell for the rotating working highlight.\n * `phase` 0..1 is the head position (clockwise from top-left corner).\n * A short bright grey/white trail rides the rim; the rest stays dull grey.\n */\nexport function rotatingBorderCellColor(\n index: number,\n perimeter: number,\n phase: number,\n trailFrac = 0.2\n): string {\n const P = Math.max(1, perimeter);\n const pos = index / P;\n // Distance behind the head along the travel direction (0 at head → 1 full lap).\n const dBehind = ((phase - pos) % 1 + 1) % 1;\n if (dBehind <= trailFrac) {\n // 1 at head, 0 at tail end\n return borderHighlightGrey(1 - dBehind / trailFrac);\n }\n return inputBoxBorderColor();\n}\n\n/**\n * Clockwise perimeter index for a border cell.\n * Path: top L→R, right T→B (body only), bottom R→L, left B→T (body only).\n * Corners live on the top/bottom edges only (not duplicated on the sides).\n */\nexport function perimeterIndex(\n edge: \"top\" | \"right\" | \"bottom\" | \"left\",\n offset: number,\n boxW: number,\n bodyH: number\n): number {\n const W = boxW;\n const H = Math.max(1, bodyH);\n // top: 0..W-1, right: W..W+H-1, bottom: W+H..2W+H-1, left: 2W+H..2W+2H-1\n if (edge === \"top\") return Math.max(0, Math.min(W - 1, offset));\n if (edge === \"right\") return W + Math.max(0, Math.min(H - 1, offset));\n if (edge === \"bottom\") return W + H + Math.max(0, Math.min(W - 1, offset));\n return 2 * W + H + Math.max(0, Math.min(H - 1, offset));\n}\n\n/**\n * Full boxed-input row set (top + body + bottom), each pre-prefixed with the\n * side margin. Pure builder for tests and `renderBottom`.\n *\n * When `borderPhase` is a finite number, a grey/white highlight sweeps the\n * border clockwise (working state). Otherwise the border is static grey.\n */\nexport function buildInputBoxRows(opts: {\n cols: number;\n inputBuffer: string;\n prefix: string;\n prefixWidth: number;\n level: Level;\n levelColor: string;\n borderColor?: string;\n /** 0..1 head position for the rotating border highlight; omit/null when idle. */\n borderPhase?: number | null;\n}): string[] {\n const { cols, inputBuffer, prefix, prefixWidth, level, levelColor } = opts;\n const borderColor = opts.borderColor ?? inputBoxBorderColor();\n const geo = inputBoxGeometry(cols);\n const body = wrapInputBodyLines(inputBuffer, prefix, prefixWidth, geo.contentW);\n const pad = \" \".repeat(geo.margin);\n const phase = opts.borderPhase;\n\n if (phase == null || !Number.isFinite(phase)) {\n const dots = borderLevelDots(level);\n const dotsStyled = borderLevelDotsStyled(level, levelColor);\n const top = buildBoxTop(geo.boxW, dots, borderColor, levelColor, \"\\x1b[0m\", dotsStyled);\n const bottom = buildBoxBottom(geo.boxW, borderColor);\n return [pad + top, ...body.map((b) => pad + buildBoxBody(b, geo.contentW, borderColor)), pad + bottom];\n }\n\n // ── animated perimeter (one continuous clockwise loop) ────────────────────\n //\n // 0 ── top L→R ──▶ W-1\n // ▲ │\n // left B→T right T→B\n // │ ▼\n // 2W+2H-1 ◀─ bottom R→L ─ W+H\n //\n const W = geo.boxW;\n const bodyH = Math.max(1, body.length);\n const P = 2 * W + 2 * bodyH;\n const reset = \"\\x1b[0m\";\n const colorAt = (i: number) => rotatingBorderCellColor(i, P, phase);\n\n // Top: every column 0..W-1 is a perimeter step. Level dots keep their own\n // colours but still occupy indices so the head travels through that span.\n const dots = borderLevelDots(level);\n const dotsStyled = borderLevelDotsStyled(level, levelColor);\n const labelPlain = ` ${dots} `;\n const rightFillN = 1;\n const budget = Math.max(1, W - 2 - rightFillN);\n const plain = labelPlain.length > budget ? labelPlain.slice(0, Math.max(1, budget)) : labelPlain;\n const leftFill = Math.max(1, W - 2 - plain.length - rightFillN);\n // Layout: [╭][─×leftFill][plain][─×rightFill][╮] length = W\n let top = \"\";\n let xi = 0;\n top += colorAt(perimeterIndex(\"top\", xi++, W, bodyH)) + \"╭\" + reset;\n for (let k = 0; k < leftFill; k++) {\n top += colorAt(perimeterIndex(\"top\", xi++, W, bodyH)) + \"─\" + reset;\n }\n // Dots block: advance indices for each visible column, paint spaces with the\n // sweep colour and leave the glyph colours from dotsStyled.\n // plain is \" ●●●○○ \" — rebuild so each cell gets the right perimeter colour\n // under the fixed glyphs.\n {\n const plainChars = [...plain];\n const styledInner = dotsStyled; // just the 5 dots, no surrounding spaces\n let di = 0; // index into filled/empty dots\n for (const ch of plainChars) {\n const c = colorAt(perimeterIndex(\"top\", xi++, W, bodyH));\n if (ch === \"●\" || ch === \"○\") {\n // Keep level colour on the glyph; still count the step for travel.\n // Prefer level-styled sequence if available.\n const levelN = Math.max(1, Math.min(5, level));\n const filled = di < levelN;\n di++;\n top +=\n (filled ? levelColor || c : \"\\x1b[38;5;240m\") +\n (filled ? \"●\" : \"○\") +\n reset;\n void styledInner;\n } else {\n top += c + ch + reset;\n }\n }\n }\n for (let k = 0; k < rightFillN; k++) {\n top += colorAt(perimeterIndex(\"top\", xi++, W, bodyH)) + \"─\" + reset;\n }\n top += colorAt(perimeterIndex(\"top\", Math.min(xi, W - 1), W, bodyH)) + \"╮\" + reset;\n\n // Body: right edge T→B (offset y), left edge B→T (offset bodyH-1-y).\n const bodyRows: string[] = [];\n for (let y = 0; y < bodyH; y++) {\n const leftC = colorAt(perimeterIndex(\"left\", bodyH - 1 - y, W, bodyH));\n const rightC = colorAt(perimeterIndex(\"right\", y, W, bodyH));\n const vw = boxVisibleWidth(body[y]);\n const sp = Math.max(0, geo.contentW - vw);\n bodyRows.push(\n `${pad}${leftC}│${reset} ${body[y]}${\" \".repeat(sp)} ${rightC}│${reset}`\n );\n }\n\n // Bottom: clockwise means RIGHT → LEFT after finishing the right edge.\n // offset 0 = bottom-right ╯, offset W-1 = bottom-left ╰.\n let bottom = \"\";\n for (let x = 0; x < W; x++) {\n // visual column from right to left for index, but we emit left-to-right:\n // visual x maps to clockwise offset (W-1-x)\n const idx = perimeterIndex(\"bottom\", W - 1 - x, W, bodyH);\n const c = colorAt(idx);\n if (x === 0) bottom += c + \"╰\" + reset;\n else if (x === W - 1) bottom += c + \"╯\" + reset;\n else bottom += c + \"─\" + reset;\n }\n\n return [pad + top, ...bodyRows, pad + bottom];\n}\n\nconst C = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n teal: \"\\x1b[38;5;37m\",\n};\n\n// Dense braille frames — they fill more of the cell, so the spinner reads\n// clearly instead of looking like faint dots.\nconst FRAMES = [\"⣷\", \"⣯\", \"⣟\", \"⡿\", \"⢿\", \"⣻\", \"⣽\", \"⣾\"];\n// Animation tick for the spinners (frame advance + redraw interval). Snappier\n// than the old 100ms without burning noticeable CPU on redraws.\nconst SPINNER_MS = 70;\n\n// Distinct hues cycled across concurrent subagents so each one reads as its own\n// stream (loader + label share the colour). Cyan is reserved for the main\n// working loader and orange for the compaction agent, so both are intentionally\n// absent here.\nconst SUBAGENT_COLORS = [\n \"\\x1b[35m\", // magenta\n \"\\x1b[38;5;39m\", // azure\n \"\\x1b[38;5;75m\", // blue\n \"\\x1b[32m\", // green\n \"\\x1b[38;5;141m\", // violet\n \"\\x1b[38;5;177m\", // orchid\n];\n\n// The compaction subagent is ALWAYS orange — a fixed signature colour so the\n// user instantly recognizes background context compaction, session after\n// session, regardless of what else is running.\nconst COMPACTION_COLOR = \"\\x1b[38;5;208m\";\nconst COMPACTION_AGENT = \"compaction_agent\";\n\ntype KeyHandler = (str: string | undefined, key: readline.Key) => void;\n\n/**\n * Approximate wcwidth: code points that render TWO terminal columns — CJK,\n * Hangul, fullwidth forms, and the emoji blocks. Everything else (including\n * ambiguous-width glyphs like box drawing, arrows, and the ⚙/⏳ badges, which\n * the terminals we target render narrow by default) counts one. Used by the\n * HUD width math so a wide character can't silently push a row past the\n * terminal edge and desync the redraw.\n */\nfunction isWideCodePoint(cp: number): boolean {\n return (\n (cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo\n (cp >= 0x2e80 && cp <= 0xa4cf) || // CJK radicals … Yi\n (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul syllables\n (cp >= 0xf900 && cp <= 0xfaff) || // CJK compatibility ideographs\n (cp >= 0xfe30 && cp <= 0xfe4f) || // CJK compatibility forms\n (cp >= 0xff00 && cp <= 0xff60) || // fullwidth forms\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x1f300 && cp <= 0x1faff) || // emoji\n cp >= 0x20000 // CJK extension planes\n );\n}\n\n/**\n * Neutralize control characters in a HUD row. An embedded newline (e.g. a\n * garbled multi-line step label when an upstream tool-call parse fails) makes\n * one \"row\" occupy several physical rows; the region-height math counts one,\n * so every subsequent redraw stamps the region's top rows into the scrollback\n * — the \"same two lines repeated for pages\" failure mode. Tabs are just as\n * bad (the terminal expands them to an uncounted width). Every control char\n * except the SGR escapes becomes a single space, and a stray ESC that isn't\n * starting a CSI sequence is dropped entirely.\n */\nfunction sanitizeHudRow(s: string): string {\n // eslint-disable-next-line no-control-regex\n return s.replace(/\\x1b(?!\\[)/g, \"\").replace(/[\\x00-\\x1a\\x1c-\\x1f\\x7f]/g, \" \");\n}\n\n/**\n * A slash command shown in the inline command palette. `name` is the word typed\n * after `/` (e.g. \"compact\"); typing filters the list by it. `hint` may be a\n * function so dynamic state (counts, level) stays fresh as the palette redraws.\n */\nexport interface SlashCommand {\n name: string;\n label: string;\n hint?: string | (() => string);\n run: () => void | Promise<void>;\n}\n\nexport class Tui {\n // input + indicators\n private inputBuffer = \"\";\n private cursorPos = 0; // caret index within inputBuffer (0..length)\n private lastCursorRow = 0; // caret's row offset from the input region top, last render\n private working = false;\n private workingStart = 0;\n // Slot-machine morph for the working label (Working → Brewing → …).\n private wordMill = new WordMill();\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n private bgCount = 0;\n // The `[⚙ n bg]` prompt badge can be selected with ← from the start of the\n // input (rendered inverted); Enter then opens the background-process panel.\n private bgBadgeSelected = false;\n private queuedCount = 0;\n private subagents: { id: string; label: string; agentName?: string }[] = []; // active subagents (one line each)\n private subagentColorByID = new Map<string, number>(); // subagent id → SUBAGENT_COLORS index\n private tokensIn = 0; // cumulative input tokens\n private tokensOut = 0; // cumulative output tokens (includes the in-progress live count)\n private contextPct: number | null = null; // % of the model context window currently used\n\n // Live streaming preview, shown just above the status line while a turn runs:\n // the model's internal reasoning (dim italic) until the answer starts, then the\n // answer text (plain). Bounded to a tail; cleared when the message commits.\n private streamThinking = \"\";\n private streamResponse = \"\";\n private streamMessageId: string | null = null; // the message currently previewing\n private streamRedrawTimer: ReturnType<typeof setTimeout> | null = null;\n private streamIdleTimer: ReturnType<typeof setTimeout> | null = null; // wipes a stale preview\n\n // Live goal checklist, fixed below the status bar. Driven by the goal_updated\n // thread event (+ an initial fetch). null = nothing to show.\n private goal: GoalData | null = null;\n // Set true the moment every step of a goal is done: the goal area is cleared\n // and the status line shows \"Goal complete.\" until the next turn starts.\n private goalComplete = false;\n\n // Inline slash-command palette: when the input starts with \"/\", the filtered\n // command list renders above the prompt and arrows/enter/tab drive it.\n private commands: SlashCommand[] = [];\n private slashIdx = 0; // highlighted index within the FILTERED command list\n private step: string | null = null; // current step label (e.g. \"writing index.html\")\n private stepStart = 0; // when the current step began (for the step's own elapsed)\n private stepOut = 0; // output tokens produced during the current step\n private connected = true;\n private bottomDrawn = false;\n private started = false;\n // Resize bookkeeping. When the terminal width changes, previously drawn HUD\n // rows re-wrap (a full-width ruler becomes 2+ physical rows when narrowed),\n // so the caret-relative move-up from the last paint is stale. We store the\n // visible width of EVERY region row (not just above the body) plus the caret\n // row index so moveToRegionTop can recompute physical height under the new\n // wrap. Resize events are debounced — drag-resizing fires dozens of events\n // and redrawing each one desyncs and leaves ghost chrome.\n private lastDrawnCols = 0;\n /** Visible width of every HUD row from the last paint, top → bottom. */\n private drawnRegionWidths: number[] = [];\n /** Index into drawnRegionWidths of the row the caret sat on last paint. */\n private lastCaretRegionIndex = 0;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n /** True between a resize event and the debounced repaint — spinner ticks no-op. */\n private resizePending = false;\n /** @deprecated kept as alias during paint — prefer drawnRegionWidths */\n private drawnHudWidths: number[] = [];\n\n // takeover (approval / menu) state\n private takeoverHandler: KeyHandler | null = null;\n private bufferedPrints: string[] = [];\n\n // double-press-to-quit state: the first ctrl-c arms a brief window and shows a\n // transient hint; a second ctrl-c within the window actually quits.\n private quitArmed = false;\n private quitTimer: ReturnType<typeof setTimeout> | null = null;\n\n // bracketed-paste state\n private pasting = false;\n private pasteTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Images pasted into the CURRENT input (Ctrl+V). Each got a `[#Image N]`\n // placeholder at the caret; on submit only images whose placeholder is still\n // present in the text are handed to onSubmit. Cleared with the input.\n private pendingImages: PastedImage[] = [];\n private imagePasteBusy = false; // one clipboard read at a time\n\n // Sent-message history for ↑/↓ recall (oldest → newest). `historyIdx` is the\n // entry currently shown (null = not browsing); the in-progress draft is\n // stashed so cycling past the newest entry restores it. Any edit exits\n // browsing and keeps the recalled text as the new draft.\n private history: string[] = [];\n private historyIdx: number | null = null;\n private historyDraft = \"\";\n private historyDraftImages: PastedImage[] = [];\n\n // event hooks (wired by index.ts)\n onSubmit: (text: string, images: PastedImage[]) => void = () => {};\n onInterrupt: () => void = () => {};\n /** Up on the top row: return true to consume it (e.g. pull a queued message)\n * before history recall gets a chance. */\n onUpArrow: () => boolean = () => false;\n /** Enter while the `[⚙ n bg]` badge is selected — opens the bg process panel. */\n onBgBadge: () => void = () => {};\n private onQuit: () => void = () => process.exit(0);\n private levelListeners: ((l: Level) => void)[] = [];\n\n constructor(public level: Level = 1) {\n readline.emitKeypressEvents(process.stdin);\n if (process.stdin.isTTY) process.stdin.setRawMode(true);\n process.stdin.on(\"keypress\", (str, key) => this.dispatch(str, key));\n process.stdin.resume();\n // Enable bracketed paste so a paste arrives atomically (newlines inside a\n // paste don't fire a premature submit) and restore it on exit.\n process.stdout.write(\"\\x1b[?2004h\");\n // Restore bracketed paste + the cursor on exit (e.g. ctrl-c mid-menu).\n process.on(\"exit\", () => process.stdout.write(\"\\x1b[?2004l\\x1b[?25h\"));\n // Debounced resize redraw — see scheduleResizeRedraw().\n process.stdout.on(\"resize\", () => this.scheduleResizeRedraw());\n }\n\n /**\n * Terminal resize fires continuously while the user drags. Redrawing on every\n * event desyncs the region-height math (each paint uses a half-rewrapped\n * intermediate width) and stamps ghost boxes into the scrollback. Wait for\n * the size to settle (~1–2 frames), then do one clean clear+repaint. While\n * pending, spinner ticks skip paint so they don't thrash mid-drag.\n */\n private scheduleResizeRedraw(): void {\n this.resizePending = true;\n if (this.resizeTimer) clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.resizeTimer = null;\n this.resizePending = false;\n if (!this.started || this.takeoverHandler) return;\n this.renderBottom();\n }, 40);\n }\n\n get colors() {\n return C;\n }\n\n setQuitHandler(fn: () => void): void {\n this.onQuit = fn;\n }\n\n /**\n * Handle a ctrl-c. The first press arms a 2-second window and surfaces a\n * transient \"Press Control-C again to exit\" hint in the bottom region; a\n * second press within the window quits. After the window lapses the hint\n * clears and the next ctrl-c starts over — so it always takes two.\n */\n requestQuit(): void {\n if (this.quitArmed) {\n if (this.quitTimer) clearTimeout(this.quitTimer);\n this.quitTimer = null;\n this.quitArmed = false;\n this.onQuit();\n return;\n }\n this.quitArmed = true;\n this.renderBottom();\n this.quitTimer = setTimeout(() => {\n this.quitArmed = false;\n this.quitTimer = null;\n this.renderBottom();\n }, 2000);\n }\n\n /** Tear down the bottom region and restore the terminal (called on quit). */\n end(): void {\n // Freeze first so any in-flight spinner / stream / quit timers cannot\n // re-paint the boxed HUD after we clear it (quit is async and awaits\n // backend stop for up to ~1.5s — a 70ms spinner tick would otherwise\n // redraw the input box and garble the farewell message into it).\n this.started = false;\n this.working = false;\n this.subagents = [];\n if (this.quitTimer) clearTimeout(this.quitTimer);\n this.quitTimer = null;\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\n if (this.streamRedrawTimer) {\n clearTimeout(this.streamRedrawTimer);\n this.streamRedrawTimer = null;\n }\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n }\n this.clearBottom();\n process.stdout.write(\"\\x1b[?2004l\\x1b[?25h\");\n }\n onLevelChange(fn: (l: Level) => void): void {\n this.levelListeners.push(fn);\n }\n\n /** Carrot colour by level — cooler/safer (low) to warmer/permissive (high). */\n levelColor(): string {\n return { 1: C.cyan, 2: C.green, 3: C.yellow, 4: C.magenta, 5: C.red }[this.level];\n }\n\n // ─── key dispatch ──────────────────────────────────────────────────────────\n\n private dispatch(str: string | undefined, key: readline.Key): void {\n const seq = (key && key.sequence) || str || \"\";\n\n // Shift+Enter inserts a newline instead of submitting. The robust signal is a\n // bare LF (\"\\n\"): Ghostty/iTerm2/WezTerm and many others send \"\\n\" for\n // Shift+Enter (often by default, otherwise configurable) while plain Enter\n // sends CR (\"\\r\"). We also accept the Kitty (\"\\x1b[13;2u\") and\n // modifyOtherKeys (\"\\x1b[27;2;13~\") forms for terminals that emit those.\n // Checked before any other key logic (including paste detection) — and a raw\n // \"\\n\" never reaches the Enter/submit handler below.\n if (seq === \"\\n\" || seq === \"\\x1b[13;2u\" || seq === \"\\x1b[27;2;13~\") {\n this.insertAtCursor(\"\\n\");\n return;\n }\n\n if (key && key.ctrl && key.name === \"c\") {\n this.requestQuit();\n return;\n }\n if (key && key.name === \"tab\" && key.shift) {\n this.cycleLevel();\n return;\n }\n\n // Bracketed paste: everything between the start/end markers is literal text,\n // even newlines. Handle it before any other key logic so a pasted Return\n // doesn't submit and a pasted \"/\" doesn't open the menu.\n if (!this.pasting && seq.includes(\"\\x1b[200~\")) {\n this.pasting = true;\n this.armPasteSafety();\n this.handlePasteChunk(seq.slice(seq.indexOf(\"\\x1b[200~\") + 6));\n return;\n }\n if (this.pasting) {\n this.armPasteSafety();\n this.handlePasteChunk(seq);\n return;\n }\n\n // A takeover (approval/menu) owns the keyboard while active.\n if (this.takeoverHandler) {\n this.takeoverHandler(str, key);\n return;\n }\n if (!key) return;\n\n // While the `[⚙ n bg]` badge is selected, Enter opens the background-process\n // panel, → / Escape step back into the input, ← stays put (nothing further\n // left), and any other key deselects and is handled as normal input.\n if (this.bgBadgeSelected) {\n if (key.name === \"return\" || key.name === \"enter\") {\n this.bgBadgeSelected = false;\n this.renderBottom();\n this.onBgBadge();\n return;\n }\n if (key.name === \"left\") return;\n this.bgBadgeSelected = false;\n if (key.name === \"right\" || key.name === \"escape\") {\n this.renderBottom();\n return;\n }\n this.renderBottom();\n // fall through: the key edits/moves as usual\n }\n\n // Inline slash-command palette owns navigation while the input starts with\n // \"/\". Editing keys (printable/backspace/left/right) fall through to the\n // normal input logic below, which re-filters the palette on the next render.\n if (this.paletteOpen()) {\n const matches = this.filteredCommands();\n const cur = matches.length ? Math.min(this.slashIdx, matches.length - 1) : 0;\n if (key.name === \"up\") {\n if (matches.length) {\n this.slashIdx = (cur - 1 + matches.length) % matches.length;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"down\") {\n if (matches.length) {\n this.slashIdx = (cur + 1) % matches.length;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"tab\") {\n if (matches.length) {\n this.inputBuffer = \"/\" + matches[cur].name;\n this.cursorPos = this.inputBuffer.length;\n this.slashIdx = 0;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"return\" || key.name === \"enter\") {\n // Shift+Enter inserts a newline instead of running the command\n if (key.shift) {\n this.insertAtCursor(\"\\n\");\n return;\n }\n if (matches.length) this.runCommand(matches[cur]);\n return; // never submit a \"/…\" line as a chat message\n }\n if (key.name === \"escape\") {\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.slashIdx = 0;\n this.renderBottom();\n return;\n }\n // any other key falls through to normal editing (palette re-filters live)\n }\n\n if (key.name === \"escape\") {\n this.onInterrupt();\n return;\n }\n // Caret movement within the (possibly wrapped) input.\n if (key.name === \"left\") {\n if (this.cursorPos > 0) {\n this.cursorPos--;\n this.renderBottom();\n } else if (this.bgCount > 0) {\n // Caret already at the start — ← \"selects\" the [⚙ n bg] badge.\n this.bgBadgeSelected = true;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"right\") {\n if (this.cursorPos < this.inputBuffer.length) {\n this.cursorPos++;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"home\" || (key.ctrl && key.name === \"a\")) {\n this.cursorPos = 0;\n this.renderBottom();\n return;\n }\n if (key.name === \"end\" || (key.ctrl && key.name === \"e\")) {\n this.cursorPos = this.inputBuffer.length;\n this.renderBottom();\n return;\n }\n // Up: move the caret up a visual row when it isn't on the top one —\n // history recall must never hijack cursor movement inside multi-line text.\n // On the TOP row: first offer the key to onUpArrow (pulling a queued\n // message back), then recall the previous history entry.\n if (key.name === \"up\") {\n const { caretRow } = this.inputLayout();\n if (caretRow > 0) {\n this.moveCaretVertical(-1);\n return;\n }\n if (this.onUpArrow()) return;\n this.historyPrev();\n return;\n }\n // Down mirrors up: move the caret down a row unless it's on the bottom\n // one; from the bottom row, step forward through history (past the newest\n // entry restores whatever was being typed).\n if (key.name === \"down\") {\n const { caretRow, rowCount } = this.inputLayout();\n if (caretRow < rowCount - 1) {\n this.moveCaretVertical(1);\n return;\n }\n this.historyNext();\n return;\n }\n if (key.name === \"return\" || key.name === \"enter\") {\n // Shift+Enter inserts a newline instead of submitting.\n // Detection: some terminals set key.shift, others send a distinct escape sequence.\n // Protocol-based Shift+Enter is already handled at the top of dispatch();\n // this catches terminals that natively set the shift modifier on Return.\n if (key.shift) {\n this.insertAtCursor(\"\\n\");\n return;\n }\n const text = this.inputBuffer;\n // Only images whose placeholder survived editing ride along.\n const images = this.pendingImages.filter((img) => text.includes(imagePlaceholder(img.seq)));\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.pendingImages = [];\n this.historyIdx = null;\n this.historyDraft = \"\";\n this.historyDraftImages = [];\n this.renderBottom();\n if (text.trim()) {\n this.addHistoryEntry(text.trim());\n this.onSubmit(text.trim(), images);\n }\n return;\n }\n // Ctrl+V: paste an image from the system clipboard. Terminals only deliver\n // TEXT through bracketed paste, so an image needs this explicit ask — we\n // read the clipboard and drop an `[#Image N]` placeholder at the caret.\n if (key.ctrl && key.name === \"v\") {\n void this.pasteClipboardImage();\n return;\n }\n if (key.name === \"backspace\") {\n if (this.cursorPos > 0) {\n this.inputBuffer =\n this.inputBuffer.slice(0, this.cursorPos - 1) + this.inputBuffer.slice(this.cursorPos);\n this.cursorPos--;\n this.slashIdx = 0;\n this.historyIdx = null;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"delete\") {\n if (this.cursorPos < this.inputBuffer.length) {\n this.inputBuffer =\n this.inputBuffer.slice(0, this.cursorPos) + this.inputBuffer.slice(this.cursorPos + 1);\n this.slashIdx = 0;\n this.historyIdx = null;\n this.renderBottom();\n }\n return;\n }\n if (key.ctrl || key.meta || key.name === \"tab\") return;\n if (str && str >= \" \") {\n this.insertAtCursor(str);\n }\n }\n\n private insertAtCursor(text: string): void {\n this.inputBuffer = this.inputBuffer.slice(0, this.cursorPos) + text + this.inputBuffer.slice(this.cursorPos);\n this.cursorPos += text.length;\n this.slashIdx = 0; // re-anchor the palette highlight to the top match as the filter changes\n this.historyIdx = null; // an edit exits history browsing; the text is the new draft\n this.renderBottom();\n }\n\n /** Insert a paste fragment at the caret; collapse newlines (single-line input). */\n private handlePasteChunk(chunk: string): void {\n const end = chunk.indexOf(\"\\x1b[201~\");\n const content = (end >= 0 ? chunk.slice(0, end) : chunk).replace(/[\\r\\n]+/g, \" \");\n if (content) {\n this.inputBuffer =\n this.inputBuffer.slice(0, this.cursorPos) + content + this.inputBuffer.slice(this.cursorPos);\n this.cursorPos += content.length;\n this.historyIdx = null;\n }\n if (end >= 0) {\n this.pasting = false;\n if (this.pasteTimer) {\n clearTimeout(this.pasteTimer);\n this.pasteTimer = null;\n }\n }\n this.renderBottom();\n }\n\n /** Never let a missed end-marker wedge the input: clear paste mode shortly. */\n private armPasteSafety(): void {\n if (this.pasteTimer) clearTimeout(this.pasteTimer);\n this.pasteTimer = setTimeout(() => {\n this.pasting = false;\n this.pasteTimer = null;\n this.renderBottom();\n }, 2000);\n }\n\n // ─── input layout + vertical caret movement ────────────────────────────────\n\n /**\n * The input's physical rows (same wrapping math as the boxed input body:\n * logical lines split on \"\\n\", line 0 led by the prompt prefix, each wrapping\n * at the box content width) plus where the caret sits among them. Each row\n * records the buffer index of its first character, its character count, and\n * the visual column its first character renders at (only the first physical\n * row of line 0 is offset, by the prompt). Drives ↑/↓: row 0 is \"the top\n * line\" (history recall territory), anything below moves the caret instead.\n */\n private inputLayout(): {\n rows: { start: number; len: number; colOffset: number }[];\n caretRow: number;\n caretCol: number;\n rowCount: number;\n } {\n const cols = process.stdout.columns || 80;\n const { contentW } = inputBoxGeometry(cols);\n const pw = this.visibleWidth(this.promptPrefix());\n const lines = this.inputBuffer.split(\"\\n\");\n const rows: { start: number; len: number; colOffset: number }[] = [];\n let offset = 0;\n for (let i = 0; i < lines.length; i++) {\n const len = lines[i].length;\n // Match wrapInputBodyLines: every physical row reserves prefixWidth at the\n // left (real prompt on the first row, spaces on later rows) so hard\n // newlines and soft wraps line up under the first line's text.\n let remaining = len;\n let charStart = 0;\n do {\n const avail = Math.max(0, contentW - pw);\n let take = Math.min(remaining, avail);\n if (take === 0 && avail === 0 && remaining > 0) take = 1;\n rows.push({ start: offset + charStart, len: take, colOffset: pw });\n charStart += take;\n remaining -= take;\n } while (remaining > 0);\n offset += len + 1; // +1 consumes the \"\\n\"\n }\n // Locate the caret among the physical rows.\n let caretRow = 0;\n let caretCol = 0;\n let found = false;\n for (let r = 0; r < rows.length; r++) {\n const row = rows[r];\n const rowEnd = row.start + row.len;\n const isLast = r === rows.length - 1;\n // Caret lands on this row when it falls inside [start, end), or at `end`\n // when this is the last row OR the next row starts after end (hard newline\n // gap — next row.start === end+1 after the \"\\n\").\n const nextStart = isLast ? rowEnd : rows[r + 1].start;\n if (this.cursorPos < rowEnd || (this.cursorPos === rowEnd && (isLast || nextStart > rowEnd))) {\n caretRow = r;\n caretCol = row.colOffset + (this.cursorPos - row.start);\n found = true;\n break;\n }\n }\n if (!found && rows.length) {\n caretRow = rows.length - 1;\n const row = rows[caretRow];\n caretCol = row.colOffset + row.len;\n }\n // Caret exactly on a wrap boundary past the last row — synthesize an empty\n // trailing row so vertical movement stays in bounds.\n while (caretRow >= rows.length) {\n rows.push({ start: this.inputBuffer.length, len: 0, colOffset: 0 });\n }\n return { rows, caretRow, caretCol, rowCount: rows.length };\n }\n\n /** Move the caret one visual row up/down, keeping the column when possible. */\n private moveCaretVertical(delta: -1 | 1): void {\n const { rows, caretRow, caretCol } = this.inputLayout();\n const target = caretRow + delta;\n if (target < 0 || target >= rows.length) return;\n const row = rows[target];\n const within = Math.max(0, Math.min(caretCol - row.colOffset, row.len));\n this.cursorPos = Math.min(row.start + within, this.inputBuffer.length);\n this.renderBottom();\n }\n\n // ─── sent-message history (↑/↓ recall) ─────────────────────────────────────\n\n /** Seed the recall history (oldest → newest), e.g. from the on-disk file. */\n setHistory(entries: string[]): void {\n this.history = entries.filter((e) => e.trim() !== \"\");\n }\n\n /** Record a sent message (skipping a consecutive duplicate). */\n private addHistoryEntry(text: string): void {\n if (this.history[this.history.length - 1] === text) return;\n this.history.push(text);\n }\n\n /** Recall the previous (older) history entry; stashes the draft first. */\n private historyPrev(): void {\n if (!this.history.length) return;\n if (this.historyIdx === null) {\n this.historyDraft = this.inputBuffer;\n this.historyDraftImages = this.pendingImages;\n this.historyIdx = this.history.length - 1;\n } else if (this.historyIdx > 0) {\n this.historyIdx--;\n } else {\n return; // already at the oldest entry\n }\n this.pendingImages = [];\n this.inputBuffer = this.history[this.historyIdx];\n this.cursorPos = this.inputBuffer.length;\n this.slashIdx = 0;\n this.renderBottom();\n }\n\n /** Step toward the newest entry; past it, restore the stashed draft. */\n private historyNext(): void {\n if (this.historyIdx === null) return; // not browsing — down does nothing\n if (this.historyIdx < this.history.length - 1) {\n this.historyIdx++;\n this.pendingImages = [];\n this.inputBuffer = this.history[this.historyIdx];\n } else {\n this.historyIdx = null;\n this.inputBuffer = this.historyDraft;\n this.pendingImages = this.historyDraftImages;\n this.historyDraft = \"\";\n this.historyDraftImages = [];\n }\n this.cursorPos = this.inputBuffer.length;\n this.slashIdx = 0;\n this.renderBottom();\n }\n\n // ─── clipboard image paste (Ctrl+V) ────────────────────────────────────────\n\n /**\n * Read an image off the system clipboard and drop an `[#Image N]`\n * placeholder at the caret. The bytes ride along with the message on submit\n * (as a real attachment) as long as the placeholder is still in the text —\n * delete the placeholder and the image is dropped too.\n */\n private async pasteClipboardImage(): Promise<void> {\n if (this.imagePasteBusy) return;\n this.imagePasteBusy = true;\n try {\n const img = await readClipboardImage();\n if (!img) {\n this.print(`${C.dim}No image on the clipboard.${C.reset}`);\n return;\n }\n const seq = this.pendingImages.reduce((m, i) => Math.max(m, i.seq), 0) + 1;\n this.pendingImages.push({ seq, data: img.data, mime: img.mime });\n this.insertAtCursor(imagePlaceholder(seq));\n } finally {\n this.imagePasteBusy = false;\n }\n }\n\n private cycleLevel(): void {\n const idx = LEVELS.indexOf(this.level);\n this.setLevel(LEVELS[(idx + 1) % LEVELS.length]);\n }\n\n setLevel(level: Level): void {\n if (level === this.level) return;\n this.level = level;\n this.levelListeners.forEach((fn) => fn(this.level));\n this.print(`${this.levelColor()}${levelLabel(this.level)}${C.reset}`);\n }\n\n // ─── bottom input line ───────────────────────────────────────────────────\n\n /** Begin showing the persistent input line. */\n start(): void {\n this.started = true;\n this.renderBottom();\n }\n\n /** Format an elapsed millisecond span as 45s / 2m 05s / 1h 05m. */\n private formatElapsed(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${String(s % 60).padStart(2, \"0\")}s`;\n const h = Math.floor(m / 60);\n return `${h}h ${String(m % 60).padStart(2, \"0\")}m`;\n }\n\n /** Compact token count: 945 → \"945\", 12345 → \"12.35k\", 1_250_000 → \"1.25M\". */\n private fmtTokens(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(2)}k`;\n return `${(n / 1_000_000).toFixed(2)}M`;\n }\n\n private spinnerFrame(): string {\n // The main loader is a brand moment: the glyph spins fast and its colour\n // drifts through the brand gradient in step with the shimmering label.\n const now = Date.now();\n return `${C.bold}${brandCycleColor(now)}${FRAMES[Math.floor(now / SPINNER_MS) % FRAMES.length]}${C.reset}`;\n }\n\n /** \"↑X ↓Y\" cumulative token totals (greyed — low-priority). */\n private tokensText(): string {\n const parts: string[] = [];\n if (this.tokensIn > 0) parts.push(`↑${this.fmtTokens(this.tokensIn)}`);\n if (this.tokensOut > 0) parts.push(`↓${this.fmtTokens(this.tokensOut)}`);\n return parts.length ? `${C.gray}${parts.join(\" \")}${C.reset}` : \"\";\n }\n\n /**\n * Context-to-compaction gauge, right-aligned on the status line: just \"N%\"\n * in dull grey. Shown whenever we know a value (any fill — 5%, 10%, 20%…).\n * The percentage is scaled so 100% = where background compaction triggers,\n * not the raw model window.\n */\n private contextGaugeText(): string {\n if (this.contextPct == null) return \"\";\n // Soft 256-grey — readable but never competing with spinner / tokens.\n return `\\x1b[38;5;240m${this.contextPct}%${C.reset}`;\n }\n\n /**\n * Set the context-window fill percentage (0–100), or null to hide it.\n * Driven by the runtime's `context_usage` KV, scaled to the compaction\n * trigger (see index.ts poll). Always painted on the status line far right.\n */\n setContextPct(pct: number | null): void {\n const next = pct == null ? null : Math.max(0, Math.min(100, Math.round(pct)));\n if (next === this.contextPct) return;\n this.contextPct = next;\n this.renderBottom();\n }\n\n /** Plain context label (no ANSI) for menu hints, or \"\" when unknown. */\n contextPctLabel(): string {\n return this.contextPct == null ? \"\" : `context ${this.contextPct}%`;\n }\n\n /** Register the slash commands shown in the inline `/` palette. */\n setCommands(commands: SlashCommand[]): void {\n this.commands = commands;\n }\n\n /** Is the `/` command palette currently showing? (input starts with \"/\".) */\n private paletteOpen(): boolean {\n return this.started && !this.takeoverHandler && this.commands.length > 0 && this.inputBuffer.startsWith(\"/\");\n }\n\n /** Commands matching the text typed after \"/\", in declared order. */\n private filteredCommands(): SlashCommand[] {\n if (!this.inputBuffer.startsWith(\"/\")) return [];\n const q = this.inputBuffer.slice(1).trim().toLowerCase();\n if (q === \"\") return this.commands;\n return this.commands.filter(\n (c) => c.name.startsWith(q) || c.name.includes(q) || c.label.toLowerCase().includes(q)\n );\n }\n\n private runCommand(cmd: SlashCommand): void {\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.slashIdx = 0;\n this.renderBottom();\n void Promise.resolve(cmd.run()).catch(() => {});\n }\n\n /**\n * The summary line ABOVE the prompt. While working it reads\n * `⣷ Working <step> <elapsed> ↑in ↓out`; when idle it keeps the cumulative\n * token totals visible (`↑in ↓out`) so they live in the summary rather than\n * crowding the prompt. Null when idle with nothing counted yet.\n */\n private statusLineText(cols: number): string | null {\n const tk = this.tokensText();\n const gauge = this.contextGaugeText();\n // Reserve room on the right for the context gauge so it can sit flush\n // against the terminal edge without ever wrapping the row.\n const gaugeReserve = gauge ? this.visibleWidth(gauge) + 1 : 0;\n let line: string | null;\n if (this.working) {\n const el = this.formatElapsed(Date.now() - this.workingStart);\n const right = `${C.dim}${el}${C.reset}${tk ? \" \" + tk : \"\"}`;\n const head = `${this.spinnerFrame()} ${this.wordMill.text(Date.now())}`;\n const avail = Math.max(\n 0,\n cols - this.visibleWidth(head) - this.visibleWidth(right) - 2 - gaugeReserve\n );\n let stepPart = \"\";\n if (this.step && avail > 1) {\n let s = this.step;\n if (s.length > avail) s = s.slice(0, avail - 1) + \"…\";\n stepPart = ` ${C.dim}${s}${C.reset}`;\n }\n line = `${head}${stepPart} ${right}`;\n } else if (this.goalComplete) {\n // Idle. Once a goal's every step is done we surface \"Goal complete.\" here\n // (the goal area itself is cleared) until the next turn begins.\n const done = `${C.bold}${gradientText(\"✓ Goal complete.\")}${C.reset}`;\n line = tk ? `${done} ${tk}` : done;\n } else {\n line = tk ? tk : null;\n }\n if (!gauge) return line;\n const base = line ?? \"\";\n const pad = Math.max(1, cols - 1 - this.visibleWidth(base) - this.visibleWidth(gauge));\n return `${base}${\" \".repeat(pad)}${gauge}`;\n }\n\n /** The prompt line prefix (with ANSI colour) that precedes the typed text. */\n private promptPrefix(): string {\n // Queue/bg badges + level-tinted carrot. Permission level also appears in\n // the box top-border (far right); metrics live on the status line above.\n const q = this.queuedCount > 0 ? `${C.yellow}[⏳ ${this.queuedCount} queued]${C.reset} ` : \"\";\n // The bg badge renders inverted (reverse video) while selected via ←.\n const bgText = `[⚙ ${this.bgCount} bg]`;\n const bg =\n this.bgCount > 0\n ? this.bgBadgeSelected\n ? `${C.cyan}\\x1b[7m${bgText}\\x1b[27m${C.reset} `\n : `${C.cyan}${bgText}${C.reset} `\n : \"\";\n return `${q}${bg}${this.levelColor()}❯${C.reset} `;\n }\n\n private visibleWidth(s: string): number {\n // eslint-disable-next-line no-control-regex\n let w = 0;\n for (const ch of s.replace(/\\x1b\\[[0-9;]*m/g, \"\")) {\n w += isWideCodePoint(ch.codePointAt(0)!) ? 2 : 1;\n }\n return w;\n }\n\n /**\n * Truncate a styled string to at most `max` VISIBLE columns, copying ANSI\n * escape sequences through without counting them and appending a reset if it\n * cut mid-style. The redraw's whole height math assumes every HUD row is\n * exactly ONE physical terminal row — true only while each row's visible\n * width is strictly less than `cols`. A row of width == cols hits the\n * terminal's auto-wrap boundary: many terminals push the cursor to the next\n * line, so the following CR/LF yields an EXTRA physical row we didn't count,\n * and the region marches down the screen leaving a trail on every tick. Every\n * HUD row is clamped through here to keep that invariant no matter what any\n * individual line builder produces.\n */\n private clampVisible(s: string, max: number): string {\n let out = \"\";\n let width = 0;\n let i = 0;\n let truncated = false;\n while (i < s.length) {\n if (s[i] === \"\\x1b\" && s[i + 1] === \"[\") {\n let j = i + 2;\n while (j < s.length && !/[a-zA-Z]/.test(s[j])) j++;\n out += s.slice(i, j + 1); // copy the full escape sequence verbatim\n i = j + 1;\n continue;\n }\n // Advance by code point, counting terminal COLUMNS (a CJK/emoji glyph\n // occupies two) so a wide character can't sneak the row past `max`.\n const cp = s.codePointAt(i)!;\n const chLen = cp > 0xffff ? 2 : 1;\n const chWidth = isWideCodePoint(cp) ? 2 : 1;\n if (width + chWidth > max) {\n truncated = true;\n break;\n }\n out += s.slice(i, i + chLen);\n width += chWidth;\n i += chLen;\n }\n if (truncated) out += C.reset;\n return out;\n }\n\n /**\n * The slash-palette block rendered BELOW the input. While the palette is open\n * we reserve a fixed number of rows — one per available command — padding with\n * blank rows so the region height never changes as the filter narrows. That\n * pins the input: the region scrolls into place once when the palette opens,\n * then nothing below the input resizes, so the text you're typing never jumps.\n * Returns `[]` when the palette is closed (no reservation, input sits at the\n * bottom as usual).\n */\n private paletteBlockLines(cols: number): string[] {\n if (!this.paletteOpen()) return [];\n const rows = this.paletteLines(cols).map((r) => this.clampVisible(r, Math.max(1, cols - 1)));\n const reserved = Math.max(this.commands.length, rows.length);\n while (rows.length < reserved) rows.push(\"\"); // blank padding holds the height\n return rows;\n }\n\n /**\n * Build the slash-palette rows for the current filter. Each row is clamped to\n * ONE physical line (a wrapped row would desync the move-up redraw), with the\n * `/name` highlighted, the label dimmed, and the hint right-aligned.\n */\n private paletteLines(cols: number): string[] {\n if (!this.paletteOpen()) return [];\n const matches = this.filteredCommands();\n if (matches.length === 0) return [` ${C.gray}no matching command${C.reset}`];\n const cur = Math.min(this.slashIdx, matches.length - 1);\n const pointerW = 2;\n return matches.map((cmd, i) => {\n const sel = i === cur;\n const hint = (typeof cmd.hint === \"function\" ? cmd.hint() : cmd.hint) ?? \"\";\n const hintW = hint.length;\n const name = `/${cmd.name}`;\n let visible = `${name} ${cmd.label}`;\n const labelMax = Math.max(6, cols - pointerW - (hintW ? hintW + 2 : 0));\n if (visible.length > labelMax) visible = visible.slice(0, labelMax - 1) + \"…\";\n const desc = visible.slice(name.length); // \" <label…>\" (or \"…\" if name was clipped)\n const pointer = sel ? `${C.magenta}❯${C.reset} ` : \" \";\n const nameStyled = sel ? `${C.bold}${C.cyan}${name}${C.reset}` : `${C.cyan}${name}${C.reset}`;\n let line = `${pointer}${nameStyled}${C.gray}${desc}${C.reset}`;\n if (hintW) {\n const gap = Math.max(2, cols - pointerW - visible.length - hintW);\n line += `${\" \".repeat(gap)}${C.gray}${hint}${C.reset}`;\n }\n return line;\n });\n }\n\n /**\n * Physical rows a previously painted line of visible width `w` occupies after\n * the terminal rewraps it to `cols`. Hard-written HUD lines reflow this way.\n */\n private rewrapRows(w: number, cols: number): number {\n return Math.max(1, Math.ceil(Math.max(w, 1) / Math.max(1, cols)));\n }\n\n /**\n * Move the cursor to the top-left of the current bottom region.\n *\n * Same width as the last draw → the caret's recorded row offset is exact.\n * Width CHANGED (terminal resized) → previously drawn rows re-wrapped, so\n * that offset is stale. Recompute using every stored region row width under\n * the NEW wrap: rows above the caret row + (caret row's rewrap − 1) so we\n * prefer a slight over-move (clean wipe) over under-move (ghost chrome).\n */\n private moveToRegionTop(): void {\n process.stdout.write(\"\\r\");\n if (!this.bottomDrawn) return;\n const cols = process.stdout.columns || 80;\n let up: number;\n if (cols !== this.lastDrawnCols && this.lastDrawnCols > 0 && this.drawnRegionWidths.length) {\n // Prefer the full-region width list; fall back to the legacy above-body list.\n const widths =\n this.drawnRegionWidths.length > 0 ? this.drawnRegionWidths : this.drawnHudWidths;\n const caretIdx = Math.max(\n 0,\n Math.min(this.lastCaretRegionIndex, Math.max(0, widths.length - 1))\n );\n let above = 0;\n for (let i = 0; i < caretIdx; i++) above += this.rewrapRows(widths[i], cols);\n // Caret row may itself soft-wrap under the new width. Terminals usually\n // keep the cursor on the last physical segment when the line grew longer\n // than the new width at the caret column — use (rewrap − 1) so we never\n // under-move and leave a ghost top border above the clear.\n const caretPhysical = this.rewrapRows(widths[caretIdx] ?? 1, cols);\n up = above + Math.max(0, caretPhysical - 1);\n // Safety pad on resize only: one extra row absorbs off-by-one rewrap\n // disagreements across terminals (some count the wrap boundary differently).\n up += 1;\n } else {\n up = this.lastCursorRow;\n }\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n }\n\n /**\n * Render the bottom region: status + subagents above a side-margined expanding\n * input box (level in the top border far right), with the caret on the input\n * body. Uses only relative cursor moves so it survives terminal scrolling when\n * the region grows near the bottom of the screen.\n *\n * Layout (top → bottom):\n * preview · ruler · notice · quit · status · subagents · goal ·\n * box top (level) · box body · box bottom · palette\n */\n private renderBottom(): void {\n if (!this.started || this.takeoverHandler) return; // not yet active, or a takeover owns the bottom\n // Mid-drag: terminal width is in flux — don't paint until the debounced\n // resize handler fires one authoritative clear+repaint.\n if (this.resizePending) return;\n const cols = process.stdout.columns || 80;\n\n this.moveToRegionTop(); // position cursor at the old region's top\n\n // Visible width of every HUD row this draw (full region). Resize path uses\n // the full list so body / bottom border / palette rewraps are counted too.\n const hudWidths: number[] = [];\n // Buffer every row into one string and flush in a single write() —\n // flushing each row separately makes the redraw flicker on every tick.\n const hudRows: string[] = [];\n // Clamp EVERY row to one column short of the terminal width so it can never\n // hit the auto-wrap boundary and silently consume a second physical row\n // (see clampVisible). This is what keeps the region-height math exact.\n const rowCap = Math.max(1, cols - 1);\n const writeHudRow = (line: string) => {\n // Sanitize BEFORE clamping: an embedded newline or tab (a garbled step\n // label, a multi-line subagent status) would add physical rows/columns\n // the region math doesn't count, and the redraw would then stamp the\n // region's top rows into the scrollback on every tick.\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n hudWidths.push(this.visibleWidth(row));\n hudRows.push(row);\n };\n\n // ── output zone (above the work-area ruler) ──────────────────────────────\n // Live streaming preview (reasoning dim-italic, then the answer plain),\n // bounded to a tail. This is model OUTPUT, so it belongs with the transcript\n // ABOVE the ruler — never interleaved between the status and subagent lines.\n // Cleared on commit.\n const previewLines = this.streamPreviewLines(cols);\n for (const line of previewLines) writeHudRow(line);\n\n // ── work area (the pinned HUD, below a full-width ruler) ──────────────────\n // The ruler is the TOP line of the work area: a full-width divider ALWAYS\n // drawn between the plain output above and the constantly-redrawn run area\n // below. It's part of the redrawn region (not printed into the scrollback).\n writeHudRow(`${C.dim}${\"─\".repeat(cols)}${C.reset}`);\n\n // Work-area left pad matches the input box outer edge (not the inner\n // content). Status, subagents, and goal share this inset with the box.\n const geo = inputBoxGeometry(cols);\n const workPad = \" \".repeat(geo.margin);\n // Width available for status/subagent content after the shared left inset.\n const workCols = Math.max(8, cols - geo.margin);\n\n // Transient disconnect notice (one row).\n const noticeLine = this.connected\n ? null\n : `${C.yellow}⚠ lost connection to the workspace — reconnecting…${C.reset}`;\n if (noticeLine) writeHudRow(workPad + noticeLine);\n\n // Transient \"press again to exit\" hint (one row).\n const quitLine = this.quitArmed ? `${C.dim}Press Control-C again to exit${C.reset}` : null;\n if (quitLine) writeHudRow(workPad + quitLine);\n\n // Status line FIRST (working spinner / tokens / goal-complete) — sits with\n // the subagents directly above the input box, same left pad as the box.\n const statusLine = this.statusLineText(workCols);\n if (statusLine) writeHudRow(workPad + statusLine);\n\n // Subagent lines (one per active subagent), just under the status line.\n // Each subagent gets its own hue (loader + label).\n const frame = FRAMES[Math.floor(Date.now() / SPINNER_MS) % FRAMES.length];\n for (const sub of this.subagents) {\n const color =\n sub.agentName === COMPACTION_AGENT\n ? COMPACTION_COLOR\n : SUBAGENT_COLORS[this.subagentColorByID.get(sub.id) ?? 0];\n // Clamp the label so the whole line stays within ONE physical row.\n const budget = workCols - 10;\n let label = sub.label;\n if (budget < 1) label = \"\";\n else if (label.length > budget) label = label.slice(0, Math.max(0, budget - 1)) + \"…\";\n const line = `${color}${frame}${C.reset} ${color}${label}${C.reset} ${C.dim}working${C.reset}`;\n writeHudRow(workPad + line);\n }\n\n // Live goal checklist, just below status/subagents: header + indented todos.\n const goalLines = this.goalLines(workCols);\n for (const line of goalLines) writeHudRow(workPad + line);\n\n // ── boxed input (side margins, expanding body, level in top-right border) ─\n const prefix = this.promptPrefix();\n const pw = this.visibleWidth(prefix);\n // Rotating greyscale border only while the MAIN agent is working (status\n // spinner showing). Subagent-only activity keeps a static grey rim so the\n // highlight always means \"the primary turn is in flight\".\n const borderAnimating = this.working;\n // Full lap ~1.4s; phase is head position 0..1 along the perimeter.\n const borderPhase = borderAnimating ? (Date.now() % 1400) / 1400 : null;\n const boxRows = buildInputBoxRows({\n cols,\n inputBuffer: this.inputBuffer,\n prefix,\n prefixWidth: pw,\n level: this.level,\n levelColor: this.levelColor(),\n borderColor: inputBoxBorderColor(),\n borderPhase,\n });\n // boxRows = [top, ...body, bottom]\n const boxTop = boxRows[0];\n const boxBottom = boxRows[boxRows.length - 1];\n const boxBody = boxRows.slice(1, -1);\n writeHudRow(boxTop);\n\n const bodyStartIdx = hudWidths.length; // first body row index in the region\n for (const row of boxBody) writeHudRow(row);\n writeHudRow(boxBottom);\n\n // Inline slash-command palette BELOW the box (input never shifts as it\n // filters). Fixed reserved height while open so the box stays pinned.\n const paletteBlock = this.paletteBlockLines(cols);\n for (const line of paletteBlock) writeHudRow(line);\n\n // Caret: place on the matching body row at content column + left pad.\n const layout = this.inputLayout();\n const bodyRowCount = Math.max(1, boxBody.length);\n const caretBodyRow = Math.max(0, Math.min(layout.caretRow, bodyRowCount - 1));\n const caretRegionRow = bodyStartIdx + caretBodyRow;\n const caretScreenCol = Math.min(rowCap - 1, geo.leftPad + layout.caretCol);\n\n this.lastCursorRow = caretRegionRow;\n this.lastCaretRegionIndex = caretRegionRow;\n // Full region widths — resize rewrap must count body, bottom, and palette.\n this.drawnRegionWidths = hudWidths.slice();\n this.drawnHudWidths = hudWidths.slice(0, bodyStartIdx); // legacy above-body slice\n this.lastDrawnCols = cols;\n this.bottomDrawn = true;\n\n // ── single flush ────────────────────────────────────────────────────────\n // One write() for the entire region + caret reposition. Always clear from\n // the region top first (`\\x1b[J`) so a resize never leaves ghost chrome\n // below/around the new paint. On resize we already over-moved slightly in\n // moveToRegionTop so the clear reaches any rewrapped leftover rows.\n const totalRows = hudRows.length;\n const up = Math.max(0, totalRows - 1 - caretRegionRow);\n let out = \"\\x1b[J\" + hudRows.join(\"\\r\\n\");\n if (totalRows > 0) {\n out += \"\\r\";\n if (up > 0) out += `\\x1b[${up}A`;\n if (caretScreenCol > 0) out += `\\x1b[${caretScreenCol}C`;\n }\n process.stdout.write(out);\n }\n\n private clearBottom(): void {\n if (!this.bottomDrawn) return;\n this.moveToRegionTop();\n process.stdout.write(\"\\x1b[J\");\n this.bottomDrawn = false;\n }\n\n // ── live streaming preview ────────────────────────────────────────────────\n // An ephemeral tail of the model's output above the status line: reasoning in\n // dim italic until the answer begins, then the answer plain. clearStream()\n // wipes it right before the finished message is committed to the transcript\n // (which renders full markdown), so there's no double-render.\n\n private static readonly STREAM_TAIL = 20;\n // How long a preview may sit untouched before it's wiped. The model often\n // reasons and then calls a tool without ever emitting an answer, so without\n // this the reasoning tail would linger on screen until the *next* thought (or\n // message) arrives. Re-armed on every delta → fires this long after the last.\n private static readonly STREAM_IDLE_MS = 10_000;\n\n /** Append a fragment of streamed answer text (rendered plain). */\n streamResponseDelta(delta: string, messageId?: string): void {\n this.beginStreamMessage(messageId);\n this.streamResponse += delta;\n this.scheduleStreamRedraw();\n this.armStreamIdleExpiry();\n }\n\n /**\n * Append a fragment of streamed internal reasoning (rendered dim italic).\n * Ignored once the answer has started, since reasoning precedes the answer.\n */\n streamThinkingDelta(delta: string, messageId?: string): void {\n this.beginStreamMessage(messageId);\n if (this.streamResponse) return;\n this.streamThinking += delta;\n this.scheduleStreamRedraw();\n this.armStreamIdleExpiry();\n }\n\n /** Reset the preview when a new message starts, so two messages' output (e.g.\n * one that only reasons then calls a tool, then the next) never blend. */\n private beginStreamMessage(messageId?: string): void {\n if (messageId !== undefined && messageId !== this.streamMessageId) {\n this.streamMessageId = messageId;\n this.streamThinking = \"\";\n this.streamResponse = \"\";\n }\n }\n\n /** Wipe the live preview — call right before committing the final message. */\n clearStream(): void {\n if (this.streamRedrawTimer) {\n clearTimeout(this.streamRedrawTimer);\n this.streamRedrawTimer = null;\n }\n if (this.streamIdleTimer) {\n clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\n }\n this.streamMessageId = null;\n if (!this.streamThinking && !this.streamResponse) return;\n this.streamThinking = \"\";\n this.streamResponse = \"\";\n this.renderBottom();\n }\n\n private scheduleStreamRedraw(): void {\n if (this.streamRedrawTimer || this.takeoverHandler || !this.started) return;\n // Batch rapid deltas into ~25fps redraws so streaming stays smooth.\n this.streamRedrawTimer = setTimeout(() => {\n this.streamRedrawTimer = null;\n this.renderBottom();\n }, 40);\n }\n\n /** Re-armed on every streamed delta: once the model goes quiet for a beat, the\n * preview is stale, so wipe it instead of letting it sit until the next\n * message. The committed message (if any) still renders in full via\n * clearStream(), so nothing is lost. */\n private armStreamIdleExpiry(): void {\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = setTimeout(() => {\n this.streamIdleTimer = null;\n if (!this.streamThinking && !this.streamResponse) return;\n this.streamThinking = \"\";\n this.streamResponse = \"\";\n this.renderBottom();\n }, Tui.STREAM_IDLE_MS);\n }\n\n /**\n * The preview's physical rows: a tail of reasoning (dim italic) before the\n * answer starts, otherwise a tail of the answer (plain). Each row is clamped to\n * one terminal line so the bottom-region redraw math stays correct.\n *\n * Rows match the committed transcript formatting so a finished message doesn't\n * visibly \"snap\" into shape: the answer's first line carries the grey gutter\n * dot (as long as it hasn't scrolled out of the tail) and the body indents two\n * spaces beneath it; reasoning aligns at the same indent, dotless.\n */\n private streamPreviewLines(cols: number): string[] {\n // Reasoning gets a distinct, low-contrast voice: italic + a dark grey that\n // recedes well behind the plain (default-color) answer text.\n const thinkStyle = \"\\x1b[3m\\x1b[38;5;240m\";\n // 2-col gutter lead + clamp to one physical row.\n const clamp = (s: string, wrap: string, lead: string): string => {\n const max = cols - 2;\n const t = s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n return wrap ? `${lead}${wrap}${t}${C.reset}` : `${lead}${t}`;\n };\n // Drop blank lines — streamed leading/internal newlines (e.g. a leading\n // \"\\n\\n\") must not render as a pile of empty rows. Also drop lines of\n // leaked tool-call serialization (DSML tags / stray session markers a\n // model emits as text when its tool call fails to parse upstream): the\n // backend discards them from the committed message, so the live preview\n // must not flash them either.\n const leakedMarkup = /<\\/?[||]DSML[||]|^\\s*\\[\\/?SESSION\\]\\s*<?\\s*$/;\n const realLines = (text: string): string[] =>\n text\n .replace(/\\r/g, \"\")\n .split(\"\\n\")\n .filter((l) => l.trim() !== \"\" && !leakedMarkup.test(l));\n if (this.streamResponse) {\n const all = realLines(this.streamResponse);\n const shown = all.slice(-Tui.STREAM_TAIL);\n const firstVisible = all.length <= Tui.STREAM_TAIL; // response's first line still in the tail\n return shown.map((l, i) =>\n clamp(l, \"\", i === 0 && firstVisible ? `${C.gray}•${C.reset} ` : \" \")\n );\n }\n if (this.streamThinking) {\n return realLines(this.streamThinking)\n .slice(-Tui.STREAM_TAIL)\n .map((l) => clamp(l, thinkStyle, \" \"));\n }\n return [];\n }\n\n // ── live goal checklist ───────────────────────────────────────────────────\n\n /**\n * Update the goal from the goal_updated event (or the initial fetch). When\n * every step is done, the goal is fully achieved: we clear the goal area and\n * flip on the \"Goal complete.\" status badge instead of leaving a finished\n * checklist sitting there.\n */\n setGoal(goal: GoalData | null): void {\n const steps = goal?.steps;\n if (steps && Array.isArray(steps) && steps.length) {\n const allDone = steps.every((s) => s.status === \"done\");\n if (allDone) {\n this.goal = null;\n this.goalComplete = true;\n } else {\n this.goal = goal;\n this.goalComplete = false;\n }\n } else {\n this.goal = null;\n }\n this.renderBottom();\n }\n\n /**\n * The goal's physical rows: a header (the short summary + progress) then one\n * row per step, indented two spaces beneath it so the todos clearly belong to\n * the goal — ○ pending / ▸ in-progress / ✓ done — each clamped to a line.\n */\n private goalLines(cols: number): string[] {\n const steps = this.goal?.steps;\n if (!steps?.length) return [];\n const oneLine = (s: string) => s.replace(/\\s+/g, \" \").trim();\n const clamp = (s: string, max: number) =>\n s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n const calmGreen = \"\\x1b[38;5;65m\"; // muted, low-contrast done check\n const out: string[] = [];\n const done = steps.filter((s) => s.status === \"done\").length;\n const summary = oneLine(this.goal?.summary || this.goal?.description || \"Goal\");\n // Clamp the visible summary (not the ANSI-laden head) so we never cut an\n // escape sequence. Prefix is \"Goal N/M \" in visible characters.\n const prefix = `Goal ${done}/${steps.length} `;\n const sum = clamp(summary, Math.max(1, cols - prefix.length));\n out.push(`${C.bold}Goal${C.reset} ${C.gray}${done}/${steps.length}${C.reset} ${sum}`);\n for (const s of steps) {\n // Two-space indent under the goal, then the marker + step text.\n const text = clamp(oneLine(s.step || \"\"), Math.max(1, cols - 4));\n if (s.status === \"done\") out.push(` ${calmGreen}✓${C.reset} ${C.dim}${text}${C.reset}`);\n else if (s.status === \"in_progress\") out.push(` ${C.cyan}▸${C.reset} ${text}`);\n else out.push(` ${C.gray}○ ${text}${C.reset}`);\n }\n return out;\n }\n\n /**\n * Transcript gutter: content starts at column 1, so the far-left column is a\n * clean strip where only status glyphs (✓ ✗ ⛔ …) land — scanning down the\n * left edge reads as a ledger of what happened. Lines already led by a\n * gutter glyph or whitespace (indented blocks, the user-message bar) pass\n * through untouched.\n */\n private gutterize(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) => {\n const plain = line.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n if (plain === \"\" || /^[\\s✓✗⛔⚠⚙⚡⏳↪›❯◇─•]/.test(plain)) return line;\n return \" \" + line;\n })\n .join(\"\\n\");\n }\n\n /** Print a line of transcript above the persistent input. */\n print(text: string): void {\n const line = this.gutterize(text);\n if (this.takeoverHandler) {\n this.bufferedPrints.push(line);\n return;\n }\n this.clearBottom();\n process.stdout.write(line + \"\\n\");\n this.renderBottom();\n }\n\n /** Multi-line convenience. */\n printLines(lines: string[]): void {\n for (const l of lines) this.print(l);\n }\n\n /**\n * Print a user message as a highlighted block so it stands out in the\n * transcript (à la Codex). The bar is sized to the text (not full width, which\n * would wrap awkwardly), padded with a space on each side and a blank line\n * above and below, and a teal `›` marks the first row.\n */\n printUserMessage(text: string): void {\n const cols = Math.max(20, process.stdout.columns || 80);\n const bg = \"\\x1b[48;5;238m\"; // dark-gray background bar (visible against the terminal)\n const limit = Math.max(8, cols - 6); // wrap width, leaving room for padding\n // Word-wrap ONE logical line to `limit`; returns [\"\"] for a blank line so a\n // paragraph separator survives as a blank row in the bar.\n const wrapLine = (logical: string): string[] => {\n const words = logical.replace(/[^\\S\\n]+/g, \" \").trim().split(\" \").filter(Boolean);\n if (!words.length) return [\"\"];\n const out: string[] = [];\n let cur = \"\";\n for (let w of words) {\n while (w.length > limit) {\n if (cur) {\n out.push(cur);\n cur = \"\";\n }\n out.push(w.slice(0, limit));\n w = w.slice(limit);\n }\n if (!cur) cur = w;\n else if (cur.length + 1 + w.length <= limit) cur += \" \" + w;\n else {\n out.push(cur);\n cur = w;\n }\n }\n if (cur || !out.length) out.push(cur);\n return out;\n };\n // Preserve the user's own line breaks (multi-line prompts, blank-line\n // paragraph separators) instead of collapsing everything into one block;\n // wrap each line independently to the bar width.\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\").flatMap(wrapLine);\n // Width the bar to the longest line + the 2-col marker/indent.\n const innerW = 2 + Math.max(1, ...lines.map((l) => l.length));\n this.print(\"\"); // padding above\n lines.forEach((line, i) => {\n const rowText = (i === 0 ? \"❯ \" : \" \") + line;\n const padded = rowText.padEnd(innerW);\n // recolor the leading marker; one space of padding inside the bar each side\n const inner = i === 0 ? `${C.teal}❯${C.reset}${bg}${padded.slice(1)}` : padded;\n this.print(`${bg} ${inner} ${C.reset}`);\n });\n this.print(\"\"); // padding below\n }\n\n // ─── working indicator (turn state) ───────────────────────────────────────\n\n setWorking(on: boolean): void {\n if (on && !this.working) {\n this.working = true;\n this.workingStart = Date.now();\n // Every turn's label starts back at \"Working\" before the word morphs.\n this.wordMill.reset(this.workingStart);\n // A new turn supersedes the previous \"Goal complete.\" badge.\n this.goalComplete = false;\n } else if (!on) {\n this.working = false;\n }\n this.syncSpinner();\n this.renderBottom();\n }\n\n /** The subagents currently working, one persistent line each. Each keeps a\n * stable, distinct colour for as long as it's active; the compaction agent\n * is always orange (its colour never comes from the shared pool). */\n setSubagents(subagents: { id: string; label: string; agentName?: string }[]): void {\n this.subagents = subagents;\n // Release colours held by subagents that have finished.\n const active = new Set(subagents.map((s) => s.id));\n for (const id of [...this.subagentColorByID.keys()]) {\n if (!active.has(id)) this.subagentColorByID.delete(id);\n }\n // Give each newcomer the lowest colour index not currently in use, so\n // concurrent subagents never share a hue (until the palette is exhausted).\n for (const s of subagents) {\n if (s.agentName === COMPACTION_AGENT) continue; // fixed orange, not pooled\n if (this.subagentColorByID.has(s.id)) continue;\n const used = new Set(this.subagentColorByID.values());\n let idx = 0;\n while (used.has(idx) && idx < SUBAGENT_COLORS.length - 1) idx++;\n this.subagentColorByID.set(s.id, idx);\n }\n this.syncSpinner();\n this.renderBottom();\n }\n\n /** Run the spinner animation while anything (the agent or a subagent) is active. */\n private syncSpinner(): void {\n const spinning = this.working || this.subagents.length > 0;\n if (spinning && !this.spinnerTimer) {\n this.spinnerTimer = setInterval(() => this.renderBottom(), SPINNER_MS);\n } else if (!spinning && this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n }\n }\n\n get isWorking(): boolean {\n return this.working;\n }\n\n setBackgroundCount(n: number): void {\n this.bgCount = n;\n if (n === 0) this.bgBadgeSelected = false; // badge gone → nothing to select\n this.renderBottom();\n }\n setQueuedCount(n: number): void {\n this.queuedCount = n;\n this.renderBottom();\n }\n setConnected(connected: boolean): void {\n this.connected = connected;\n this.renderBottom();\n }\n\n // ─── input buffer access (for up-arrow editing of queued messages) ─────────\n\n getInput(): string {\n return this.inputBuffer;\n }\n /** Replace the input (and any pasted images tied to placeholders in it). */\n setInput(text: string, images: PastedImage[] = []): void {\n this.inputBuffer = text;\n this.cursorPos = text.length;\n this.pendingImages = images;\n this.historyIdx = null;\n this.renderBottom();\n }\n\n /** Cumulative token totals shown on the prompt line (`outTokens` includes live). */\n setTokens(inTokens: number, outTokens: number): void {\n this.tokensIn = inTokens;\n this.tokensOut = outTokens;\n this.renderBottom();\n }\n\n /**\n * Current step the agent is working on, shown on the line above the prompt.\n * `outTokens` is the output produced during this step. The step's own timer\n * resets whenever the label changes.\n */\n setStep(label: string | null, outTokens: number): void {\n // Collapse to one line: the label comes from server-sent tool progress\n // text, which can be multi-line garbage when an upstream parse goes wrong.\n const next = label && label.trim() ? label.replace(/\\s+/g, \" \").trim() : null;\n if (next !== this.step) {\n this.step = next;\n this.stepStart = Date.now();\n }\n this.stepOut = outTokens;\n this.renderBottom();\n }\n\n // ─── takeover helpers (approval / menus) ───────────────────────────────────\n\n private beginTakeover(): void {\n this.bgBadgeSelected = false; // a menu/prompt owns the bottom now\n this.clearBottom();\n process.stdout.write(\"\\r\\x1b[K\");\n process.stdout.write(\"\\x1b[?25l\"); // hide the text cursor while a menu/prompt owns the screen\n this.bottomDrawn = false;\n }\n\n private endTakeover(): void {\n this.takeoverHandler = null;\n process.stdout.write(\"\\x1b[?25h\"); // restore the cursor\n const buffered = this.bufferedPrints;\n this.bufferedPrints = [];\n for (const t of buffered) {\n process.stdout.write(t + \"\\n\");\n }\n this.renderBottom();\n }\n\n /**\n * ## Boxed prompt — reusable HUD free-text component\n *\n * Single-line free-text capture using the **same chrome as the main input\n * box** (side margin, grey rounded rim, level-tinted `❯`, real caret). A\n * left-aligned label sits in the top border rim instead of the permission\n * level dots.\n *\n * Prefer this over {@link Tui.prompt} whenever the capture should feel like\n * part of the HUD rather than a legacy bar — denial feedback, handoff notes,\n * reject-with-reason, rename, or any other short free-text moment.\n *\n * ```\n * ╭ Denial feedback ────────────────────────╮\n * │ ❯ the user-typed note │\n * ╰──────────────────────────────────────────╯\n * ```\n *\n * **Keys**\n * - Enter — submit (resolves the trimmed string; may be `\"\"`)\n * - Esc — clear a non-empty draft; Esc again (empty) cancels → `null`\n * (override with `escClearsFirst: false` to always cancel)\n *\n * **Nested mode** (`nested: true`) — call from inside another takeover\n * (e.g. approval → feedback) so this component only steals the key handler\n * and paints/erases its own three rows; the parent still owns begin/end.\n *\n * Do **not** use brand-gradient text for the label — gradient is reserved\n * for success moments (`✓ Goal complete.`, farewell, etc.).\n *\n * @returns trimmed text on Enter, or `null` if the user cancelled with Esc\n */\n boxedPrompt(opts: BoxedPromptOptions): Promise<string | null> {\n return new Promise((resolve) => {\n const nested = !!opts.nested;\n const escClearsFirst = opts.escClearsFirst !== false;\n const borderLabel = opts.borderLabel || \"Feedback\";\n const labelColor = opts.labelColor ?? \"\\x1b[90m\";\n let buf = opts.initial ?? \"\";\n\n if (!nested) this.beginTakeover();\n process.stdout.write(\"\\x1b[?25h\"); // real caret, same as main input\n\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n const reset = C.reset;\n const prompt = `${this.levelColor()}❯${reset} `;\n const promptW = 2; // \"❯ \"\n\n const writeRow = (line: string) => {\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n process.stdout.write(`\\r\\x1b[K${row}\\n`);\n };\n\n // Frame is 3 rows (top / body / bottom). After three writeRow newlines\n // the cursor sits one row BELOW the bottom, so: 2A → body, 3A → top.\n const draw = () => {\n writeRow(pad + buildBoxTopLeftLabel(geo.boxW, borderLabel, border, labelColor));\n writeRow(pad + buildBoxBody(prompt + buf, geo.contentW, border));\n writeRow(pad + buildBoxBottom(geo.boxW, border));\n // Park the real caret after the typed text on the body row.\n process.stdout.write(\"\\r\\x1b[2A\");\n const col = geo.leftPad + promptW + buf.length;\n if (col > 0) process.stdout.write(`\\x1b[${Math.min(rowCap - 1, col)}C`);\n };\n\n const clearFrame = () => {\n // Caret is on the body row → step to the top, then clear down.\n process.stdout.write(\"\\r\\x1b[1A\\x1b[J\");\n };\n\n const redraw = () => {\n // Caret is on body; step to top, then repaint the whole frame.\n process.stdout.write(\"\\r\\x1b[1A\");\n draw();\n };\n\n const finish = (value: string | null) => {\n clearFrame();\n if (!nested) this.endTakeover();\n else this.takeoverHandler = null;\n resolve(value);\n };\n\n draw();\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"escape\") {\n if (escClearsFirst && buf.length > 0) {\n buf = \"\";\n redraw();\n return;\n }\n finish(null);\n return;\n }\n if (key?.name === \"return\" || key?.name === \"enter\") {\n finish(buf.trim());\n return;\n }\n if (key?.name === \"backspace\") {\n if (!buf.length) return;\n buf = buf.slice(0, -1);\n redraw();\n return;\n }\n if (str && !key?.ctrl && !key?.meta && str >= \" \") {\n if (buf.length < Math.max(8, geo.contentW - promptW - 1)) {\n buf += str;\n redraw();\n }\n }\n };\n });\n }\n\n /**\n * Permission prompt: boxed chrome matching the HUD, arrow-navigable options\n * with shortcuts. Includes \"Deny with feedback\" — choosing it (or Tab)\n * opens {@link Tui.boxedPrompt} so the reason can ride back to the agent.\n */\n approval(\n question: string,\n risk: number\n ): Promise<{ choice: \"allow\" | \"deny\" | \"always\" | \"always_risk\"; reason?: string }> {\n return new Promise((resolve) => {\n type Choice = \"allow\" | \"always\" | \"always_risk\" | \"deny\" | \"deny_feedback\";\n const options: { value: Choice; label: string; shortcut: string; color: string; hint?: string }[] = [\n { value: \"allow\", label: \"Allow once\", shortcut: \"y\", color: C.green },\n { value: \"always\", label: \"Always allow this tool\", shortcut: \"a\", color: C.cyan },\n {\n value: \"always_risk\",\n label: `Allow level ${risk} and below this session`,\n shortcut: \"l\",\n color: C.cyan,\n },\n { value: \"deny\", label: \"Deny\", shortcut: \"n\", color: C.red },\n {\n value: \"deny_feedback\",\n label: \"Deny with feedback\",\n shortcut: \"d\",\n color: C.magenta,\n hint: \"tell the agent why\",\n },\n ];\n let idx = 0;\n const riskLevel = Math.max(1, Math.min(5, Math.round(risk))) as Level;\n // Filled dots in warm risk colour, empty dull.\n const riskBar = borderLevelDotsStyled(riskLevel, C.yellow, \"\\x1b[38;5;240m\");\n\n this.beginTakeover();\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n const reset = C.reset;\n\n // Clamp a line of content to the box interior; hard-wrap long summaries.\n const wrapContent = (text: string): string[] => {\n const flat = text.replace(/\\s+/g, \" \").trim();\n if (!flat) return [\"\"];\n const out: string[] = [];\n let rest = flat;\n while (rest.length > geo.contentW) {\n out.push(rest.slice(0, geo.contentW - 1) + \"…\");\n rest = rest.slice(geo.contentW - 1);\n if (out.length >= 4) {\n // Cap summary height so a huge command doesn't flood the dialog.\n break;\n }\n }\n if (out.length < 4) out.push(rest);\n return out.length ? out : [\"\"];\n };\n\n // Question may include a \"why:\" line from the agent — keep each logical\n // line, wrap each, strip any caller ANSI so the box paints cleanly.\n const summaryLines = question.split(\"\\n\").flatMap((line) => {\n // eslint-disable-next-line no-control-regex\n const plain = line.replace(/\\x1b\\[[0-9;]*m/g, \"\").trim();\n if (!plain) return [];\n const isWhy = /^why:/i.test(plain);\n return wrapContent(plain).map((l) => (isWhy ? `${C.dim}${l}${reset}` : l));\n });\n if (!summaryLines.length) summaryLines.push(`${C.dim}(no details)${reset}`);\n\n const writeRow = (line: string) => {\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n process.stdout.write(`\\r\\x1b[K${row}\\n`);\n };\n\n // Full frame height: blank + title + top + summary… + blank + options… + bottom\n const optionCount = options.length;\n const summaryCount = summaryLines.length;\n const boxRows = 1 /*top*/ + summaryCount + 1 /*blank*/ + optionCount + 1 /*bottom*/;\n const titleRows = 2; // blank + title\n const totalRows = titleRows + boxRows;\n\n const renderOptionContent = (i: number): string => {\n const o = options[i];\n const sel = i === idx;\n const pointer = sel ? `${o.color}❯${reset} ` : \" \";\n const label = sel ? `${C.bold}${o.color}${o.label}${reset}` : `${C.dim}${o.label}${reset}`;\n const shortcut = `${C.gray}(${o.shortcut})${reset}`;\n const hint = o.hint && sel ? `${C.dim} ${o.hint}${reset}` : \"\";\n // pointer(2) + label + \" \" + (x) + hint\n const plainLabel = o.label;\n const used = 2 + plainLabel.length + 1 + 3 + (o.hint && sel ? 2 + o.hint.length : 0);\n const gap = Math.max(1, geo.contentW - used);\n return `${pointer}${label}${\" \".repeat(gap)}${shortcut}${hint}`;\n };\n\n const drawFrame = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${totalRows}A`);\n // Title above the box — plain bold (gradient is reserved for success).\n writeRow(\"\");\n writeRow(\n `${pad}${C.bold}Permission needed${reset} ${C.dim}risk${reset} ${riskBar}`\n );\n writeRow(pad + buildBoxTopPlain(geo.boxW, border));\n for (const line of summaryLines) {\n writeRow(pad + buildBoxBody(line, geo.contentW, border));\n }\n // Spacer row inside the box\n writeRow(pad + buildBoxBody(\"\", geo.contentW, border));\n for (let i = 0; i < optionCount; i++) {\n writeRow(pad + buildBoxBody(renderOptionContent(i), geo.contentW, border));\n }\n writeRow(pad + buildBoxBottom(geo.boxW, border));\n };\n\n drawFrame(false);\n\n const erase = () => {\n process.stdout.write(\"\\r\");\n if (totalRows > 0) process.stdout.write(`\\x1b[${totalRows}A`);\n process.stdout.write(\"\\x1b[J\");\n };\n\n const done = (choice: \"allow\" | \"deny\" | \"always\" | \"always_risk\", reason?: string) => {\n erase();\n this.endTakeover();\n resolve(reason !== undefined ? { choice, reason } : { choice });\n };\n\n // Feedback reuses the boxed-prompt component (same chrome as main input,\n // left rim label). Nested so we keep ownership of begin/end takeover.\n const collectFeedback = () => {\n erase();\n void this.boxedPrompt({ borderLabel: \"Denial feedback\", nested: true }).then((why) => {\n this.endTakeover();\n if (why) resolve({ choice: \"deny\", reason: why });\n else resolve({ choice: \"deny\" });\n });\n };\n\n const pick = (value: Choice) => {\n if (value === \"deny_feedback\") collectFeedback();\n else done(value);\n };\n\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"up\" || str === \"k\") {\n idx = (idx - 1 + optionCount) % optionCount;\n drawFrame(true);\n } else if (key?.name === \"down\" || str === \"j\") {\n idx = (idx + 1) % optionCount;\n drawFrame(true);\n } else if (key?.name === \"tab\") {\n // Tab = deny with feedback (legacy + discoverable).\n pick(\"deny_feedback\");\n } else if (key?.name === \"return\" || key?.name === \"enter\") {\n pick(options[idx].value);\n } else if (key?.name === \"escape\") {\n done(\"deny\");\n } else {\n const k = (str || \"\").toLowerCase();\n if (k === \"y\") pick(\"allow\");\n else if (k === \"a\") pick(\"always\");\n else if (k === \"l\") pick(\"always_risk\");\n else if (k === \"n\") pick(\"deny\");\n else if (k === \"d\" || k === \"f\") pick(\"deny_feedback\");\n }\n };\n });\n }\n\n /**\n * Arrow-key selection menu (slash menu, process menu, resume). Pauses input.\n * Boxed chrome matches the bottom input HUD: side margin + grey rounded\n * border, selected row with a brand-tinted pointer.\n */\n select<T>(title: string, items: { label: string; hint?: string; value: T }[]): Promise<T | undefined> {\n return new Promise((resolve) => {\n let idx = 0;\n this.beginTakeover();\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n // Title sits above the box (same left edge as the border).\n // Layout: blank · title · top · items… · bottom → cursor below bottom.\n if (title) process.stdout.write(`\\n${pad}${title}\\n`);\n else process.stdout.write(\"\\n\");\n\n // Each item is ONE physical row inside the box (preview left, hint right)\n // so a long session preview can't wrap and desync the move-up redraw.\n const renderItemContent = (i: number): string => {\n const it = items[i];\n const sel = i === idx;\n const hint = it.hint ?? \"\";\n const hintW = hint.length;\n const pointerW = 2; // \"❯ \" or \" \"\n const labelMax = Math.max(4, geo.contentW - pointerW - (hintW ? hintW + 2 : 0));\n let label = it.label.replace(/\\s+/g, \" \").trim();\n if (label.length > labelMax) label = label.slice(0, Math.max(0, labelMax - 1)) + \"…\";\n const pointer = sel ? `${C.magenta}❯${C.reset} ` : \" \";\n const styledLabel = sel ? `${C.bold}${C.cyan}${label}${C.reset}` : `${C.dim}${label}${C.reset}`;\n let content = `${pointer}${styledLabel}`;\n if (hintW) {\n // Visible width of pointer+label (pointer is 2, label is plain length).\n const used = pointerW + label.length;\n const gap = Math.max(1, geo.contentW - used - hintW);\n content += `${\" \".repeat(gap)}${sel ? C.gray : C.dim}${hint}${C.reset}`;\n }\n return content;\n };\n\n const writeRow = (line: string) => {\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n process.stdout.write(`\\r\\x1b[K${row}\\n`);\n };\n\n // Box frame rows: top + N items + bottom. Redraw rewrites items + bottom\n // (top stays put) so we move up items.length + 1 from below the bottom.\n const draw = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${items.length + 1}A`);\n else writeRow(pad + buildBoxTopPlain(geo.boxW, border));\n for (let i = 0; i < items.length; i++) {\n writeRow(pad + buildBoxBody(renderItemContent(i), geo.contentW, border));\n }\n writeRow(pad + buildBoxBottom(geo.boxW, border));\n };\n draw(false);\n\n // Erase title + full box when the menu closes.\n // title present: blank + title = 2; absent: just the leading blank = 1.\n const titleRows = title ? 2 : 1;\n const boxRows = 1 + items.length + 1; // top + items + bottom\n const erase = () => {\n process.stdout.write(\"\\r\");\n const up = titleRows + boxRows;\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n process.stdout.write(\"\\x1b[J\");\n };\n const close = (value: T | undefined) => {\n erase();\n this.endTakeover();\n resolve(value);\n };\n this.takeoverHandler = (str, key) => {\n if (!key) return;\n if (key.name === \"up\" || str === \"k\") {\n idx = (idx - 1 + items.length) % items.length;\n draw(true);\n } else if (key.name === \"down\" || str === \"j\") {\n idx = (idx + 1) % items.length;\n draw(true);\n } else if (key.name === \"return\" || key.name === \"enter\") {\n close(items[idx].value);\n } else if (key.name === \"escape\") {\n close(undefined);\n }\n };\n });\n }\n\n /**\n * Free-text prompt (single line). Pauses the main input and reads a line —\n * used where a menu can't, e.g. entering an MCP server command. Enter submits,\n * Escape (or empty submit) cancels with null.\n */\n prompt(question: string, placeholder = \"\"): Promise<string | null> {\n return new Promise((resolve) => {\n let buf = \"\";\n this.beginTakeover();\n process.stdout.write(\"\\x1b[?25h\"); // we want a visible caret while typing\n process.stdout.write(`\\n${C.cyan}┃${C.reset} ${question}\\n`);\n if (placeholder) process.stdout.write(`${C.gray}┃ e.g. ${placeholder}${C.reset}\\n`);\n const draw = () => {\n process.stdout.write(`\\r\\x1b[K${C.cyan}┃${C.reset} ${C.bold}›${C.reset} ${buf}`);\n };\n draw();\n const finish = (value: string | null) => {\n process.stdout.write(\"\\n\");\n this.endTakeover();\n resolve(value);\n };\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"escape\") return finish(null);\n if (key?.name === \"return\" || key?.name === \"enter\") return finish(buf.trim() || null);\n if (key?.name === \"backspace\") {\n buf = buf.slice(0, -1);\n draw();\n return;\n }\n // Ignore control keys; accept printable input (including pasted text).\n if (str && !key?.ctrl && !key?.meta && str >= \" \") {\n buf += str;\n draw();\n }\n };\n });\n }\n\n banner(lines: string[]): void {\n this.clearBottom();\n process.stdout.write(\"\\n\");\n for (const l of lines) process.stdout.write(l + \"\\n\");\n }\n}\n","/**\n * Sent-message history, stored in the THREAD KV (key `input_history`) — not on\n * the local filesystem. Session state lives server-side as a rule (like\n * approvals and the process registry) so it resumes from any machine and\n * leaves nothing behind on the host.\n *\n * KV is per-thread, but recall should feel per-project: when a NEW session\n * starts, the caller passes the project's newest prior thread as a seed and\n * the history carries over (and is copied to the new thread's KV). Oldest →\n * newest; capped so the value can't grow without bound. All IO is best-effort.\n */\n\nexport const HISTORY_KEY = \"input_history\";\nconst MAX_ENTRIES = 100;\n\n/** The KV surface history needs (satisfied by ApiClient). */\nexport interface HistoryStore {\n kvGet(threadId: string, key: string): Promise<unknown>;\n kvSet(threadId: string, key: string, value: unknown): Promise<void>;\n}\n\nfunction clean(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((e): e is string => typeof e === \"string\" && e.trim() !== \"\").slice(-MAX_ENTRIES);\n}\n\n/**\n * Load the thread's sent-message history. When the thread has none yet (a\n * fresh session) and a seed thread is given, inherit the seed's history and\n * persist it onto this thread so the chain continues from here.\n */\nexport async function loadHistory(\n store: HistoryStore,\n threadId: string,\n seedThreadId?: string\n): Promise<string[]> {\n const own = clean(await store.kvGet(threadId, HISTORY_KEY));\n if (own.length) return own;\n if (seedThreadId && seedThreadId !== threadId) {\n const seeded = clean(await store.kvGet(seedThreadId, HISTORY_KEY));\n if (seeded.length) {\n void store.kvSet(threadId, HISTORY_KEY, seeded);\n return seeded;\n }\n }\n return [];\n}\n\n/**\n * Append a sent message to the in-memory history (skipping a consecutive\n * duplicate), cap it, and persist the whole list to the thread KV. Returns\n * the same array, mutated, so the caller's reference stays current.\n */\nexport function appendHistory(\n store: HistoryStore,\n threadId: string,\n history: string[],\n text: string\n): string[] {\n const t = text.trim();\n if (!t || history[history.length - 1] === t) return history;\n history.push(t);\n if (history.length > MAX_ENTRIES) history.splice(0, history.length - MAX_ENTRIES);\n void store.kvSet(threadId, HISTORY_KEY, [...history]);\n return history;\n}\n","/**\n * A light-touch Markdown → ANSI formatter for the transcript. Deliberately not a\n * full Markdown engine: it adds color/emphasis hints (bold, inline code,\n * headings, links), tidy list bullets, basic aligned tables, and fenced code\n * gutters — enough to make agent replies readable without fighting the terminal.\n * Zero dependencies; returns an array of ready-to-print lines.\n */\n\nconst ESC = \"\\x1b[\";\nconst R = ESC + \"0m\";\nconst BOLD = ESC + \"1m\";\nconst DIM = ESC + \"2m\";\nconst ITAL = ESC + \"3m\";\nconst UNDER = ESC + \"4m\";\nconst TEAL = ESC + \"38;5;37m\";\nconst CYAN = ESC + \"36m\";\nconst GRAY = ESC + \"90m\";\n\n/** Visible width of a string, ignoring ANSI SGR sequences. */\n// eslint-disable-next-line no-control-regex\nconst ANSI = /\\x1b\\[[0-9;]*m/g;\nfunction visibleWidth(s: string): number {\n return s.replace(ANSI, \"\").length;\n}\nfunction padEndVisible(s: string, width: number): string {\n const pad = width - visibleWidth(s);\n return pad > 0 ? s + \" \".repeat(pad) : s;\n}\n\n/** Apply inline emphasis: code spans, links, bold, italic, strikethrough. */\nfunction inline(s: string): string {\n // Protect inline code first so its contents aren't re-formatted. NUL sentinels\n // never appear in real text, so they can't collide with digits in the prose.\n const codes: string[] = [];\n s = s.replace(/`([^`]+)`/g, (_, code) => {\n codes.push(code);\n return \"\\x00\" + (codes.length - 1) + \"\\x00\";\n });\n // Links: [text](url) → underlined text + dim url.\n s = s.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g,\n (_, text, url) => `${CYAN}${UNDER}${text}${R} ${DIM}${url}${R}`\n );\n // Bold then italic (asterisk forms only — underscores are common in code/ids).\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, (_, t) => `${BOLD}${t}${R}`);\n s = s.replace(/\\*([^*\\n]+)\\*/g, (_, t) => `${ITAL}${t}${R}`);\n s = s.replace(/~~([^~]+)~~/g, (_, t) => `${DIM}${t}${R}`);\n // Restore code spans in teal. Spaces inside a code span become non-breaking\n // (NBSP) so word-wrapping never splits a command/path like `curl | bash`.\n // eslint-disable-next-line no-control-regex\n s = s.replace(/\\x00(\\d+)\\x00/g, (_, i) => `${TEAL}${codes[+i].replace(/ /g, String.fromCharCode(160))}${R}`);\n return s;\n}\n\n/**\n * Word-wrap styled text to a visible width. ANSI-aware (escape sequences don't\n * count toward width), splits only on regular spaces (so NBSP-protected code\n * spans stay intact). A single word longer than the width is left to overflow\n * rather than split mid-token.\n */\nfunction wrapStyled(text: string, width: number): string[] {\n if (width < 4 || visibleWidth(text) <= width) return [text];\n const words = text.split(\" \");\n const lines: string[] = [];\n let cur = \"\";\n let curLen = 0;\n for (const w of words) {\n const wLen = visibleWidth(w);\n if (cur === \"\") {\n cur = w;\n curLen = wLen;\n } else if (curLen + 1 + wLen <= width) {\n cur += \" \" + w;\n curLen += 1 + wLen;\n } else {\n lines.push(cur);\n cur = w;\n curLen = wLen;\n }\n }\n if (cur !== \"\" || lines.length === 0) lines.push(cur);\n return lines;\n}\n\n/**\n * Emit a block (paragraph/list item/quote) word-wrapped to `cols`, with a lead\n * on the first line and an aligned hanging indent of the same visible width on\n * the rest. `leadWidth` is the visible width of both leads.\n */\nfunction wrapBlock(\n out: string[],\n cols: number,\n leadFirst: string,\n leadRest: string,\n leadWidth: number,\n text: string\n): void {\n const wrapped = wrapStyled(text, Math.max(8, cols - leadWidth));\n wrapped.forEach((ln, idx) => out.push((idx === 0 ? leadFirst : leadRest) + ln));\n}\n\n/** Split a table row \"| a | b |\" into trimmed cells. */\nfunction tableCells(row: string): string[] {\n let r = row.trim();\n if (r.startsWith(\"|\")) r = r.slice(1);\n if (r.endsWith(\"|\")) r = r.slice(0, -1);\n return r.split(\"|\").map((c) => c.trim());\n}\n\nconst SEPARATOR = /^[\\s|:-]+$/;\nfunction isTableSeparator(line: string): boolean {\n return SEPARATOR.test(line) && line.includes(\"-\") && line.includes(\"|\");\n}\n\n/** Render a collected table block (header row + body rows) as aligned columns. */\nfunction renderTable(rows: string[][]): string[] {\n const cols = Math.max(...rows.map((r) => r.length));\n const widths: number[] = [];\n for (let c = 0; c < cols; c++) {\n widths[c] = Math.max(...rows.map((r) => visibleWidth(inline(r[c] ?? \"\"))));\n }\n const sep = `${GRAY} │ ${R}`;\n const out: string[] = [];\n rows.forEach((r, ri) => {\n const cells = [];\n for (let c = 0; c < cols; c++) {\n const raw = r[c] ?? \"\";\n const styled = ri === 0 ? `${BOLD}${inline(raw)}${R}` : inline(raw);\n cells.push(padEndVisible(styled, widths[c]));\n }\n out.push((\" \" + cells.join(sep)).replace(/\\s+$/, \"\"));\n if (ri === 0) {\n // A thin underline beneath the header row.\n const rule = widths.map((w) => `${GRAY}${\"─\".repeat(w)}${R}`).join(`${GRAY}─┼─${R}`);\n out.push(\" \" + rule);\n }\n });\n return out;\n}\n\n/** Format Markdown source into an array of ANSI-styled, word-wrapped terminal lines. */\nexport function renderMarkdown(src: string, cols = 80): string[] {\n const lines = src.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const out: string[] = [];\n let inFence = false;\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Fenced code block: render with a dim gutter, no inline formatting.\n if (/^\\s*```/.test(line)) {\n inFence = !inFence;\n i++;\n continue;\n }\n if (inFence) {\n out.push(`${GRAY}│${R} ${line}`);\n i++;\n continue;\n }\n\n // Table: a row containing \"|\" immediately followed by a separator row.\n if (line.includes(\"|\") && i + 1 < lines.length && isTableSeparator(lines[i + 1])) {\n const block: string[][] = [tableCells(line)];\n i += 2; // skip header + separator\n while (i < lines.length && lines[i].includes(\"|\") && lines[i].trim()) {\n block.push(tableCells(lines[i]));\n i++;\n }\n out.push(...renderTable(block));\n continue;\n }\n\n // Heading.\n const heading = line.match(/^(#{1,6})\\s+(.*)$/);\n if (heading) {\n for (const ln of wrapStyled(heading[2].trim(), cols)) out.push(`${BOLD}${TEAL}${ln}${R}`);\n i++;\n continue;\n }\n\n // Horizontal rule → a short, subtle divider (never full width).\n if (/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(line)) {\n out.push(`${GRAY}──────${R}`);\n i++;\n continue;\n }\n\n // Blockquote.\n const quote = line.match(/^\\s*>\\s?(.*)$/);\n if (quote) {\n for (const ln of wrapStyled(inline(quote[1]), Math.max(8, cols - 2))) {\n out.push(`${GRAY}│${R} ${DIM}${ln}${R}`);\n }\n i++;\n continue;\n }\n\n // Bullet list (-, *, +) with indentation preserved; continuation hangs under the text.\n const bullet = line.match(/^(\\s*)[-*+]\\s+(.*)$/);\n if (bullet) {\n const leadWidth = bullet[1].length + 2;\n wrapBlock(out, cols, `${bullet[1]}${TEAL}•${R} `, \" \".repeat(leadWidth), leadWidth, inline(bullet[2]));\n i++;\n continue;\n }\n\n // Numbered list — keep the number, embolden the marker.\n const numbered = line.match(/^(\\s*)(\\d+)([.)])\\s+(.*)$/);\n if (numbered) {\n const marker = `${numbered[2]}${numbered[3]}`;\n const leadWidth = numbered[1].length + marker.length + 1;\n wrapBlock(out, cols, `${numbered[1]}${BOLD}${marker}${R} `, \" \".repeat(leadWidth), leadWidth, inline(numbered[4]));\n i++;\n continue;\n }\n\n // Plain paragraph line (blank lines pass through as spacing).\n if (line.trim()) wrapBlock(out, cols, \"\", \"\", 0, inline(line));\n else out.push(\"\");\n i++;\n }\n\n return out;\n}\n","/** Read/write ~/.standardagents/credentials. */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { CredentialsFile, InstanceCredential } from \"./types.ts\";\n\nconst DIR = path.join(os.homedir(), \".standardagents\");\nconst FILE = path.join(DIR, \"credentials\");\n\nexport function normalizeEndpoint(endpoint: string): string {\n let e = endpoint.trim();\n if (!/^https?:\\/\\//i.test(e)) e = \"http://\" + e;\n return e.replace(/\\/+$/, \"\");\n}\n\nexport function loadCredentials(): CredentialsFile {\n try {\n const raw = fs.readFileSync(FILE, \"utf8\");\n const parsed = JSON.parse(raw) as CredentialsFile;\n if (!parsed.instances) parsed.instances = {};\n return parsed;\n } catch {\n return { instances: {} };\n }\n}\n\nexport function getCredential(endpoint: string): InstanceCredential | null {\n const creds = loadCredentials();\n return creds.instances[normalizeEndpoint(endpoint)] ?? null;\n}\n\nexport function saveCredential(\n cred: InstanceCredential,\n options: { updateDefault?: boolean } = {}\n): void {\n const creds = loadCredentials();\n const endpoint = normalizeEndpoint(cred.endpoint);\n creds.instances[endpoint] = { ...cred, endpoint };\n if (options.updateDefault ?? true) {\n creds.default_endpoint = endpoint;\n }\n fs.mkdirSync(DIR, { recursive: true });\n // Credentials contain a bearer token — keep them private.\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n\n/** Remove the saved token for an endpoint (the `/logout` command). */\nexport function deleteCredential(endpoint: string): void {\n const creds = loadCredentials();\n delete creds.instances[normalizeEndpoint(endpoint)];\n fs.mkdirSync(DIR, { recursive: true });\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n\nexport function defaultEndpoint(): string | null {\n return loadCredentials().default_endpoint ?? null;\n}\n\nexport function saveDefaultEndpoint(endpoint: string): void {\n const creds = loadCredentials();\n creds.default_endpoint = normalizeEndpoint(endpoint);\n fs.mkdirSync(DIR, { recursive: true });\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n","/**\n * Device-code browser sign-in + browser-open helper, shared by the interactive\n * CLI and `standardcode daemon install` (a VPS install prints the URL for the\n * user to open elsewhere — the flow is Wrangler-style: URL first, then a\n * best-effort local browser open).\n */\nimport { spawn } from \"node:child_process\";\nimport { stdout as output } from \"node:process\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n teal: \"\\x1b[38;5;37m\",\n};\n\n/**\n * Device-code browser sign-in: start a device login on the instance, open the\n * approval URL in the browser (hosted instances route an anonymous visit\n * through the Standard Agents platform login first), and poll until the\n * approval mints our personal API key. Throws with a plain message on\n * timeout or failure.\n */\nexport async function deviceLogin(endpoint: string): Promise<string> {\n const start = await fetch(`${endpoint}/api/auth/device/start`, { method: \"POST\" });\n if (!start.ok) throw new Error(`This instance does not support browser sign-in (HTTP ${start.status}). Paste an API token instead.`);\n const info = (await start.json()) as { code: string; verify_url: string; poll_url: string; interval?: number; expires_in?: number };\n // Wrangler-style: the URL is printed FIRST (copy-pasteable if the browser\n // doesn't open — SSH sessions, containers), then we try to open it.\n output.write(`${c.dim}Opening your browser to sign in. If it doesn't open, visit:${c.reset}\\n`);\n output.write(`\\n ${c.teal}${info.verify_url}${c.reset}\\n\\n`);\n output.write(`${c.dim}Waiting for sign-in to complete… (Ctrl-C to cancel)${c.reset}\\n`);\n openUrl(info.verify_url);\n const deadline = Date.now() + (info.expires_in ?? 600) * 1000;\n const interval = Math.max(2, info.interval ?? 2) * 1000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, interval));\n const res = await fetch(info.poll_url).catch(() => null);\n if (!res) continue;\n if (res.status === 404) throw new Error(\"The sign-in link expired. Try again.\");\n const body = (await res.json().catch(() => ({}))) as { status?: string; token?: string };\n if (body.status === \"approved\" && body.token) return body.token;\n if (body.status === \"denied\") throw new Error(\"Sign-in was denied in the browser.\");\n }\n throw new Error(\"Timed out waiting for browser approval. Try again.\");\n}\n\n/** Open a URL in the system browser (best effort). */\nexport function openUrl(url: string): void {\n const platform = process.platform;\n const cmd = platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n try {\n const child = spawn(cmd, args, { stdio: \"ignore\", detached: true });\n child.unref();\n } catch {\n // ignore — the URL is also printed for manual opening\n }\n}\n","/** Product constants + small environment helpers shared by the interactive\n * CLI (index.ts) and the daemon (daemon.ts). */\nimport fs from \"node:fs\";\n\nexport const AGENT_ID = \"standard_code_agent\";\n// The instance's model gearbox hands sessions between agent variants; a\n// thread parked in another gear must still be resumable (and daemon-servable).\n// Includes historical gear names so old threads keep appearing.\nexport const AGENT_ID_VARIANTS = [\n AGENT_ID,\n \"standard_code_low_agent\",\n \"standard_code_high_agent\",\n];\n// The hosted Standard Code instance — where every normal user's session\n// lives. Only `--endpoint` (rare: local dev, self-hosted) points elsewhere.\nexport const PRODUCTION_ENDPOINT = \"https://api.standardcode.ai\";\n\n/** Read this package's version from package.json (best effort). */\nexport function readVersion(): string {\n try {\n const pkg = JSON.parse(fs.readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\"));\n return typeof pkg.version === \"string\" ? pkg.version : \"\";\n } catch {\n return \"\";\n }\n}\n\n/** Whether a hostname is a local/private dev address (loopback, .local, RFC-1918). */\nexport function isLocalHost(host: string): boolean {\n return (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host.endsWith(\".local\") ||\n host.endsWith(\".localhost\") ||\n /^10\\./.test(host) ||\n /^192\\.168\\./.test(host) ||\n /^172\\.(1[6-9]|2\\d|3[01])\\./.test(host)\n );\n}\n\n/**\n * Relax TLS verification for local/private endpoints only. OrbStack (and other\n * local dev setups) serve HTTPS with a CA installed in the system keychain —\n * which curl and browsers trust, but Node's `fetch`/`WebSocket` do not, so they\n * fail with SELF_SIGNED_CERT_IN_CHAIN and every token \"doesn't work\". For a\n * loopback/`.local`/RFC-1918 host we disable verification (covering fetch and\n * the bridge/stream WebSockets); public endpoints keep full verification.\n * Returns true when verification was relaxed.\n */\nexport function relaxTlsForLocalEndpoint(endpoint: string): boolean {\n let host = \"\";\n try {\n host = new URL(endpoint).hostname;\n } catch {\n return false;\n }\n if (!endpoint.startsWith(\"https:\") || !isLocalHost(host)) return false;\n // Filter out Node's global \"insecure TLS\" warning; we surface our own note.\n const origEmit = process.emitWarning.bind(process);\n process.emitWarning = ((warning: string | Error, ...args: unknown[]) => {\n const msg = typeof warning === \"string\" ? warning : warning?.message ?? \"\";\n if (msg.includes(\"NODE_TLS_REJECT_UNAUTHORIZED\")) return;\n return (origEmit as (...a: unknown[]) => void)(warning, ...args);\n }) as typeof process.emitWarning;\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = \"0\";\n return true;\n}\n","/**\n * Stable machine identity for this host (~/.standardagents/machine.json).\n *\n * Every machine that runs Standard Code — a laptop's interactive CLI or a\n * VPS daemon — gets one durable random id. The id keys this machine's record\n * in the account-wide machine registry (see registry.ts) and forms the\n * client identities the bridge uses for execution ownership:\n *\n * daemon:<machine_id> — the daemon (stable across restarts, so a\n * rebooted VPS reclaims its threads)\n * cli:<machine_id>:<random> — one interactive CLI process (unique per\n * process, so two terminals never both own)\n */\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\n// Resolved lazily (not cached at import) so a changed HOME is always honored —\n// this is what lets tests isolate to a temp home and keeps a long-lived daemon\n// correct if its home ever changes.\nconst dir = () => path.join(os.homedir(), \".standardagents\");\nconst file = () => path.join(dir(), \"machine.json\");\n\n/**\n * machine.json holds ONLY this host's hardware identity — a stable random id.\n * The user-facing NAME is NOT here: a machine's name is a label the user\n * assigns in THEIR account, so it lives on the instance (the machine registry\n * record in user KV), not on the machine's disk. See registry.ts\n * `getMachineName` / `setMachineName`.\n */\nexport interface MachineIdentity {\n machine_id: string;\n created_at: number;\n}\n\n/** Load this host's machine identity, creating one on first use. */\nexport function loadMachineIdentity(): MachineIdentity {\n try {\n const parsed = JSON.parse(fs.readFileSync(file(), \"utf8\")) as MachineIdentity;\n if (typeof parsed.machine_id === \"string\" && parsed.machine_id.length > 0) {\n // machine.json may carry a legacy `name` from before names moved to the\n // account — we keep only the id + created_at (the name migrates via the\n // registry record's fallback; see registry.ts).\n return { machine_id: parsed.machine_id, created_at: parsed.created_at ?? Date.now() };\n }\n } catch {\n // first run (or corrupt file) — mint a fresh identity below\n }\n const identity: MachineIdentity = {\n machine_id: crypto.randomUUID(),\n created_at: Date.now(),\n };\n saveMachineIdentity(identity);\n return identity;\n}\n\nexport function saveMachineIdentity(identity: MachineIdentity): void {\n fs.mkdirSync(dir(), { recursive: true });\n fs.writeFileSync(file(), JSON.stringify(identity, null, 2), { mode: 0o600 });\n}\n\n/** The daemon's stable bridge client id for this machine. */\nexport function daemonClientId(identity: MachineIdentity): string {\n return `daemon:${identity.machine_id}`;\n}\n\n/** A per-process interactive bridge client id for this machine. */\nexport function interactiveClientId(identity: MachineIdentity): string {\n return `cli:${identity.machine_id}:${crypto.randomBytes(4).toString(\"hex\")}`;\n}\n\n/** The machine id inside a daemon client id, or null for any other id. */\nexport function machineIdFromDaemonClientId(clientId: string | null | undefined): string | null {\n if (typeof clientId !== \"string\") return null;\n return clientId.startsWith(\"daemon:\") ? clientId.slice(\"daemon:\".length) : null;\n}\n","/**\n * The account-wide machine registry.\n *\n * Every machine on the account (laptop CLIs and VPS daemons) keeps one record\n * in the user's account-wide KV on the instance, keyed\n * `standardcode.machine.<machine_id>`. The record carries the machine's\n * identity, its known project directories, and — when a daemon is installed —\n * a heartbeat, so the session-start picker can offer \"run this session on\n * <machine>\" with live daemons only.\n *\n * Records are per-machine keys (not one big document) so concurrent daemons\n * heartbeating from different machines never clobber each other.\n */\nimport os from \"node:os\";\nimport crypto from \"node:crypto\";\nimport { execFileSync } from \"node:child_process\";\nimport type { ApiClient } from \"./api.ts\";\nimport type { MachineIdentity } from \"./machine.ts\";\nimport { readVersion } from \"./product.ts\";\n\nconst KEY_PREFIX = \"standardcode.machine.\";\n/** Per-machine command queue lives at `<machine key>.cmd` (a separate user-KV\n * key so a client enqueueing a command never races the daemon's heartbeat\n * read-modify-write of the machine record itself). */\nconst CMD_SUFFIX = \".cmd\";\n/**\n * The user-assigned machine NAME lives at `<machine key>.name` — a dedicated\n * account key that ONLY the user edits (via /machines rename) and the daemon\n * NEVER writes. This is why renaming a machine is a direct account write from\n * any client (no daemon round-trip) and can't be reverted by the daemon's\n * heartbeat. The base record's `name` is a machine-reported default (hostname)\n * and the migration fallback for installs whose name predates this split.\n */\nconst NAME_SUFFIX = \".name\";\n\n/** How recent a daemon heartbeat must be to count as \"online\". Heartbeats are\n * every 30s, so 3 missed beats = offline. */\nexport const DAEMON_ONLINE_WINDOW_MS = 90 * 1000;\n\nexport interface MachineProjectRecord {\n /** Short display name (the directory's basename). */\n name: string;\n last_used_at: number;\n /** The project's git origin URL, when the directory is a git repo. */\n repository?: string | null;\n}\n\nexport interface DaemonRecord {\n version: string;\n installed_at: number;\n last_seen_at: number;\n pid?: number;\n}\n\nexport interface MachineRecord {\n id: string;\n name: string;\n hostname: string;\n platform: string;\n arch: string;\n /** The @standardagents/code version this machine last ran (any client). */\n version?: string;\n daemon?: DaemonRecord | null;\n /** Absolute project path → record. */\n projects: Record<string, MachineProjectRecord>;\n created_at: number;\n updated_at: number;\n}\n\n/**\n * A management command a client queues for a machine's daemon to apply.\n * (Renaming is NOT here — a name is account data, so a rename is a direct\n * user-KV write via {@link setMachineName}, no daemon needed.)\n */\nexport interface MachineCommand {\n id: string;\n kind: \"update\" | \"add_project\" | \"remove_project\";\n args?: Record<string, unknown>;\n requested_at: number;\n}\n\nexport function machineKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}`;\n}\n\nfunction commandKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${CMD_SUFFIX}`;\n}\n\nfunction nameKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${NAME_SUFFIX}`;\n}\n\n/** A machine's display name: the user's account-set name, else the machine's\n * reported hostname, else its id. Takes a record (already name-overlaid by\n * loadMachine/loadMachines) or any object with these fields. */\nexport function machineDisplayName(record: {\n name?: string | null;\n hostname?: string | null;\n id?: string | null;\n}): string {\n return (record.name?.trim() || \"\") || (record.hostname || \"\") || (record.id || \"\") || \"machine\";\n}\n\n/** Read a machine's user-assigned name from the account (null if unset). */\nexport async function getMachineName(api: ApiClient, machineId: string): Promise<string | null> {\n const v = await api.userKvGet(nameKey(machineId));\n return typeof v === \"string\" && v.trim() ? v.trim() : null;\n}\n\n/**\n * Set (or clear) a machine's name in the ACCOUNT — a direct user-KV write that\n * any client can make for any of the user's machines. The daemon never writes\n * this key, so a remote rename is authoritative and can't be reverted by a\n * heartbeat. Passing an empty name clears it (reverts to the hostname default).\n */\nexport async function setMachineName(api: ApiClient, machineId: string, name: string): Promise<void> {\n const trimmed = name.trim();\n await api.userKvSet(nameKey(machineId), trimmed || null);\n}\n\nfunction parseMachineRecord(value: unknown): MachineRecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const r = value as Record<string, unknown>;\n if (typeof r.id !== \"string\" || r.id.length === 0) return null;\n return {\n id: r.id,\n name: typeof r.name === \"string\" && r.name ? r.name : String(r.hostname ?? r.id),\n hostname: typeof r.hostname === \"string\" ? r.hostname : \"\",\n platform: typeof r.platform === \"string\" ? r.platform : \"\",\n arch: typeof r.arch === \"string\" ? r.arch : \"\",\n version: typeof r.version === \"string\" ? r.version : undefined,\n daemon:\n r.daemon && typeof r.daemon === \"object\" && !Array.isArray(r.daemon)\n ? (r.daemon as unknown as DaemonRecord)\n : null,\n projects:\n r.projects && typeof r.projects === \"object\" && !Array.isArray(r.projects)\n ? (r.projects as Record<string, MachineProjectRecord>)\n : {},\n created_at: typeof r.created_at === \"number\" ? r.created_at : 0,\n updated_at: typeof r.updated_at === \"number\" ? r.updated_at : 0,\n };\n}\n\n/** The base record only (no account name overlay) — used by the write path so\n * a heartbeat never folds the user's name into the daemon-written record. */\nasync function loadRawMachine(api: ApiClient, machineId: string): Promise<MachineRecord | null> {\n return parseMachineRecord(await api.userKvGet(machineKey(machineId)));\n}\n\n/**\n * All machine records on the account, each with its account NAME overlaid.\n * The `standardcode.machine.` prefix also covers the `.name` and `.cmd`\n * sibling keys, so we partition: base records, name overrides, command queues.\n */\nexport async function loadMachines(api: ApiClient): Promise<MachineRecord[]> {\n const entries = await api.userKvList(KEY_PREFIX);\n const records: MachineRecord[] = [];\n const names = new Map<string, string>();\n for (const e of entries) {\n const rest = e.key.slice(KEY_PREFIX.length);\n if (rest.endsWith(CMD_SUFFIX)) continue;\n if (rest.endsWith(NAME_SUFFIX)) {\n const id = rest.slice(0, -NAME_SUFFIX.length);\n if (typeof e.value === \"string\" && e.value.trim()) names.set(id, e.value.trim());\n continue;\n }\n const rec = parseMachineRecord(e.value);\n if (rec) records.push(rec);\n }\n for (const rec of records) {\n const override = names.get(rec.id);\n if (override) rec.name = override;\n }\n return records;\n}\n\n/** One machine record with its account NAME overlaid, or null. */\nexport async function loadMachine(api: ApiClient, machineId: string): Promise<MachineRecord | null> {\n const rec = await loadRawMachine(api, machineId);\n if (!rec) return null;\n const override = await getMachineName(api, machineId);\n if (override) rec.name = override;\n return rec;\n}\n\n/** Whether a machine has a daemon that heartbeated recently. */\nexport function daemonOnline(record: MachineRecord, now = Date.now()): boolean {\n return !!record.daemon && now - record.daemon.last_seen_at < DAEMON_ONLINE_WINDOW_MS;\n}\n\n/** A fresh record for this machine (used when none exists yet). The `name`\n * here is the machine-reported default (hostname); the user's chosen name\n * lives in the account `.name` key and is overlaid on read. */\nfunction newRecord(identity: MachineIdentity): MachineRecord {\n const now = Date.now();\n return {\n id: identity.machine_id,\n name: os.hostname(),\n hostname: os.hostname(),\n platform: process.platform,\n arch: process.arch,\n version: readVersion() || undefined,\n daemon: null,\n projects: {},\n created_at: now,\n updated_at: now,\n };\n}\n\n/**\n * Upsert this machine's record with fresh host facts and (optionally) mutate\n * it. Read-modify-write on this machine's OWN key only, so machines never\n * race each other.\n */\nexport async function updateOwnMachineRecord(\n api: ApiClient,\n identity: MachineIdentity,\n mutate?: (record: MachineRecord) => void\n): Promise<MachineRecord> {\n // Operate on the RAW base record (no name overlay): the daemon must never\n // fold the user's account-set name into the record it writes, or its next\n // heartbeat could revert a rename. The user's name lives in the `.name` key.\n const existing = await loadRawMachine(api, identity.machine_id);\n const record = existing ?? newRecord(identity);\n // Preserve the base record's `name` (a hostname default, or a legacy synced\n // name that serves as the migration fallback) — never overwrite it here.\n record.hostname = os.hostname();\n record.platform = process.platform;\n record.arch = process.arch;\n record.version = readVersion() || record.version;\n mutate?.(record);\n record.updated_at = Date.now();\n await api.userKvSet(machineKey(identity.machine_id), record);\n return record;\n}\n\n/** The directory's git origin URL, or null (best effort, never throws). */\nexport function projectRepository(projectDir: string): string | null {\n try {\n const url = execFileSync(\"git\", [\"-C\", projectDir, \"remote\", \"get-url\", \"origin\"], {\n encoding: \"utf8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n return url || null;\n } catch {\n return null;\n }\n}\n\n/** Record that this machine has (just used) a project directory. */\nexport async function registerProject(\n api: ApiClient,\n identity: MachineIdentity,\n projectDir: string\n): Promise<void> {\n const repository = projectRepository(projectDir);\n await updateOwnMachineRecord(api, identity, (record) => {\n record.projects[projectDir] = {\n name: projectDir.split(\"/\").filter(Boolean).pop() || projectDir,\n last_used_at: Date.now(),\n repository,\n };\n });\n}\n\n/** Remove a project directory from this machine's record. */\nexport async function unregisterProject(\n api: ApiClient,\n identity: MachineIdentity,\n projectDir: string\n): Promise<void> {\n await updateOwnMachineRecord(api, identity, (record) => {\n delete record.projects[projectDir];\n });\n}\n\n/** Daemon heartbeat: refresh `daemon.last_seen_at` (creating the block). */\nexport async function touchDaemon(\n api: ApiClient,\n identity: MachineIdentity,\n version: string\n): Promise<void> {\n await updateOwnMachineRecord(api, identity, (record) => {\n const now = Date.now();\n record.daemon = {\n version,\n installed_at: record.daemon?.installed_at ?? now,\n last_seen_at: now,\n pid: process.pid,\n };\n });\n}\n\n/** Mark this machine's daemon uninstalled (clears the heartbeat block). */\nexport async function clearDaemon(api: ApiClient, identity: MachineIdentity): Promise<void> {\n await updateOwnMachineRecord(api, identity, (record) => {\n record.daemon = null;\n });\n}\n\n// ── management command channel ────────────────────────────────────────────────\n// A client manages a REMOTE machine (rename / update / add-remove projects) by\n// queueing a command in that machine's `.cmd` user-KV key; the machine's daemon\n// drains and applies it. (Managing the LOCAL machine is done directly, since\n// the client is on that filesystem — see the /machines command.)\n\nfunction parseCommands(value: unknown): MachineCommand[] {\n if (!Array.isArray(value)) return [];\n return value.filter(\n (c): c is MachineCommand =>\n !!c &&\n typeof c === \"object\" &&\n typeof (c as MachineCommand).id === \"string\" &&\n typeof (c as MachineCommand).kind === \"string\"\n );\n}\n\n/** Queue a management command for a machine's daemon. Returns the command id. */\nexport async function enqueueMachineCommand(\n api: ApiClient,\n machineId: string,\n kind: MachineCommand[\"kind\"],\n args?: Record<string, unknown>\n): Promise<string> {\n const key = commandKey(machineId);\n const queue = parseCommands(await api.userKvGet(key));\n const cmd: MachineCommand = {\n id: crypto.randomBytes(6).toString(\"hex\"),\n kind,\n args,\n requested_at: Date.now(),\n };\n queue.push(cmd);\n await api.userKvSet(key, queue);\n return cmd.id;\n}\n\n/** The daemon's view of its own pending commands. */\nexport async function readMachineCommands(\n api: ApiClient,\n machineId: string\n): Promise<MachineCommand[]> {\n return parseCommands(await api.userKvGet(commandKey(machineId)));\n}\n\n/** Remove applied commands (by id) from a machine's queue. */\nexport async function clearMachineCommands(\n api: ApiClient,\n machineId: string,\n appliedIds: string[]\n): Promise<void> {\n if (appliedIds.length === 0) return;\n const key = commandKey(machineId);\n const remaining = parseCommands(await api.userKvGet(key)).filter(\n (c) => !appliedIds.includes(c.id)\n );\n await api.userKvSet(key, remaining.length ? remaining : null);\n}\n\n/**\n * Apply one management command to THIS machine (daemon side): mutate local\n * identity/registry to match. Returns a short human result for the log.\n * `add_project`/`remove_project` only touch the registry record — the daemon\n * validates the directory exists when it later attaches a session there.\n */\nexport async function applyMachineCommand(\n api: ApiClient,\n identity: MachineIdentity,\n cmd: MachineCommand\n): Promise<string> {\n switch (cmd.kind) {\n case \"add_project\": {\n const path = typeof cmd.args?.path === \"string\" ? cmd.args.path : \"\";\n if (!path) return \"add_project: ignored (no path)\";\n await registerProject(api, identity, path);\n return `added project ${path}`;\n }\n case \"remove_project\": {\n const path = typeof cmd.args?.path === \"string\" ? cmd.args.path : \"\";\n if (!path) return \"remove_project: ignored (no path)\";\n await unregisterProject(api, identity, path);\n return `removed project ${path}`;\n }\n case \"update\":\n // Handled specially by the daemon (it must run the package-manager\n // update and restart); nothing to mutate here.\n return \"update requested\";\n default:\n return `unknown command ${(cmd as MachineCommand).kind}`;\n }\n}\n","/**\n * The approval relay — how a headless daemon asks a human for permission.\n *\n * When the daemon owns execution and a forwarded tool call needs approval,\n * there is no TTY on the VPS to ask at. Instead the daemon parks an\n * `approval_request` record in the thread KV; any watching client (the\n * laptop CLI attached to the same thread) renders its normal approval prompt\n * and writes an `approval_response`; the daemon applies the decision and\n * clears both keys. The turn itself is already durably parked server-side,\n * so a slow human costs nothing.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport type { ApprovalChoice } from \"./bridge.ts\";\n\nexport const APPROVAL_REQUEST_KEY = \"approval_request\";\nexport const APPROVAL_RESPONSE_KEY = \"approval_response\";\n\nexport interface ApprovalRequestKV {\n tool_call_id: string;\n tool: string;\n summary: string;\n permission: string | null;\n risk: number;\n machine: string;\n requested_at: number;\n}\n\nexport interface ApprovalResponseKV {\n tool_call_id: string;\n choice: ApprovalChoice;\n reason?: string;\n decided_at: number;\n}\n\nexport function parseApprovalRequest(value: unknown): ApprovalRequestKV | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const r = value as Record<string, unknown>;\n if (typeof r.tool_call_id !== \"string\" || typeof r.tool !== \"string\") return null;\n return {\n tool_call_id: r.tool_call_id,\n tool: r.tool,\n summary: typeof r.summary === \"string\" ? r.summary : r.tool,\n permission: typeof r.permission === \"string\" ? r.permission : null,\n risk: typeof r.risk === \"number\" ? r.risk : 3,\n machine: typeof r.machine === \"string\" ? r.machine : \"\",\n requested_at: typeof r.requested_at === \"number\" ? r.requested_at : 0,\n };\n}\n\nexport function parseApprovalResponse(value: unknown): ApprovalResponseKV | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const r = value as Record<string, unknown>;\n if (typeof r.tool_call_id !== \"string\" || typeof r.choice !== \"string\") return null;\n if (![\"allow\", \"deny\", \"always\", \"always_risk\"].includes(r.choice)) return null;\n return {\n tool_call_id: r.tool_call_id,\n choice: r.choice as ApprovalChoice,\n reason: typeof r.reason === \"string\" ? r.reason : undefined,\n decided_at: typeof r.decided_at === \"number\" ? r.decided_at : 0,\n };\n}\n\n/** Watcher side: answer a pending approval request. */\nexport async function writeApprovalResponse(\n api: ApiClient,\n threadId: string,\n response: ApprovalResponseKV\n): Promise<void> {\n await api.kvSet(threadId, APPROVAL_RESPONSE_KEY, response);\n}\n\n/**\n * Daemon side: publish a request and wait for a watcher's response, polling\n * the thread KV. Resolves `null` on timeout (the caller denies safely). The\n * keys are cleared before resolving either way.\n */\nexport async function awaitApprovalViaRelay(\n api: ApiClient,\n threadId: string,\n request: ApprovalRequestKV,\n options: { pollMs?: number; timeoutMs?: number } = {}\n): Promise<ApprovalResponseKV | null> {\n const pollMs = options.pollMs ?? 2000;\n const timeoutMs = options.timeoutMs ?? 24 * 60 * 60 * 1000;\n await api.kvSet(threadId, APPROVAL_REQUEST_KEY, request);\n const deadline = Date.now() + timeoutMs;\n try {\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, pollMs));\n const response = parseApprovalResponse(await api.kvGet(threadId, APPROVAL_RESPONSE_KEY));\n if (response && response.tool_call_id === request.tool_call_id) {\n return response;\n }\n }\n return null;\n } finally {\n await api.kvSet(threadId, APPROVAL_REQUEST_KEY, null).catch(() => {});\n await api.kvSet(threadId, APPROVAL_RESPONSE_KEY, null).catch(() => {});\n }\n}\n","/**\n * Update check + auto-update for Standard Code.\n *\n * Periodically queries the npm registry for the latest available version of\n * @standardagents/code, caches the result locally (6h TTL), and — when the\n * CLI is a real installed copy (not a dev checkout) — installs the new\n * version in a DETACHED background process so the next launch simply runs it.\n * The install goes through the SAME package manager that installed the CLI\n * (npm/pnpm/yarn/bun, detected from the running module's path): updating a\n * pnpm-managed global with npm would fork the install into two competing\n * copies.\n *\n * State about the background attempt is persisted so a failed install\n * degrades to the manual hint instead of retrying on every launch. All\n * checks fall silently on network errors or timeouts so the CLI startup is\n * never delayed or noisy.\n *\n * Opt-outs: STANDARD_CODE_NO_AUTO_UPDATE=1 disables the background install\n * (the availability hint still shows); NO_UPDATE_NOTIFIER/CI disable the\n * version check entirely.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst PKG_NAME = \"@standardagents/code\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PKG_NAME)}`;\n\n/** Cache lives under ~/.config/standardagents-cli/update-check.json */\nconst CACHE_REL_DIR = \".config/standardagents-cli\";\nconst CACHE_FILE = \"update-check.json\";\n/** Background auto-update attempt state (same directory). */\nconst STATE_FILE = \"auto-update.json\";\nconst CACHE_TTL_MS = 1000 * 60 * 60 * 6; // 6 hours\n\n/** Network timeout — don't delay startup more than this. */\nconst CHECK_TIMEOUT_MS = 4000;\n\n/** How long an in-flight background install is trusted before it's presumed\n * crashed (never wrote its final state) and eligible to start again. */\nconst IN_FLIGHT_TTL_MS = 15 * 60 * 1000;\n\nexport interface UpdateInfo {\n current: string;\n latest: string;\n}\n\ninterface CacheEntry {\n latest: string;\n timestamp: number;\n}\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/** Persisted record of the most recent background install attempt. */\nexport interface AutoUpdateState {\n version: string; // the version the attempt tried to install\n startedAt: number;\n exitCode: number | null; // null while (presumed) in flight\n finishedAt?: number;\n output?: string; // tail of the package manager's output (for diagnostics)\n}\n\nexport type AutoUpdateDecision =\n | \"start\" // no blocking state — kick off a background install\n | \"in_flight\" // an attempt for this version started recently and hasn't finished\n | \"already_failed\" // this version was attempted and the install failed\n | \"path_shadowed\" // the install \"succeeded\" but this process still runs the old version\n | \"dev_checkout\" // running from source, not an installed copy — never auto-update\n | \"disabled\"; // STANDARD_CODE_NO_AUTO_UPDATE opt-out\n\n// ── cache/state helpers ──────────────────────────────────────────────────────\n\nfunction cacheDir(): string {\n return path.join(homedir(), CACHE_REL_DIR);\n}\n\nfunction cachePath(): string {\n return path.join(cacheDir(), CACHE_FILE);\n}\n\nfunction readCache(): CacheEntry | null {\n try {\n const raw = fs.readFileSync(cachePath(), \"utf-8\");\n return JSON.parse(raw) as CacheEntry;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(latest: string): void {\n try {\n const dir = cacheDir();\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(cachePath(), JSON.stringify({ latest, timestamp: Date.now() }));\n } catch {\n // Fail silently — cache write never crashes the CLI.\n }\n}\n\nexport function readAutoUpdateState(dir = cacheDir()): AutoUpdateState | null {\n try {\n const raw = fs.readFileSync(path.join(dir, STATE_FILE), \"utf-8\");\n const state = JSON.parse(raw) as AutoUpdateState;\n return typeof state?.version === \"string\" ? state : null;\n } catch {\n return null;\n }\n}\n\nexport function writeAutoUpdateState(state: AutoUpdateState, dir = cacheDir()): void {\n try {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, STATE_FILE), JSON.stringify(state));\n } catch {\n // Fail silently.\n }\n}\n\nexport function clearAutoUpdateState(dir = cacheDir()): void {\n try {\n fs.unlinkSync(path.join(dir, STATE_FILE));\n } catch {\n // Already gone — fine.\n }\n}\n\n// ── package manager detection ────────────────────────────────────────────────\n\n/**\n * Which package manager owns the running install, judged by where this module\n * executes from. Global installs land in manager-specific trees (pnpm's\n * content-addressed `.pnpm`/PNPM_HOME, bun's `.bun/install/global`, yarn's\n * `.config/yarn/global` or `.yarn`), while a path outside any\n * `node_modules/@standardagents/code` means a dev checkout (returns null —\n * never auto-update source trees). npm is the fallback for a plain global\n * node_modules.\n */\nexport function detectPackageManager(\n selfPath: string = fileURLToPath(import.meta.url),\n env: Record<string, string | undefined> = process.env\n): PackageManager | null {\n // Normalize by the PATH STRING's separators (either style), not the host's\n // path.sep — a Windows-style path must parse the same everywhere.\n const norm = selfPath.split(/[\\\\/]/).join(\"/\");\n if (!norm.includes(\"node_modules/@standardagents/code\")) return null;\n\n const pnpmHome = (env.PNPM_HOME || \"\").split(/[\\\\/]/).join(\"/\");\n if (pnpmHome && norm.startsWith(pnpmHome)) return \"pnpm\";\n if (norm.includes(\"/.pnpm/\") || /\\/pnpm\\/global\\//.test(norm)) return \"pnpm\";\n if (norm.includes(\"/.bun/\")) return \"bun\";\n if (norm.includes(\"/.config/yarn/\") || norm.includes(\"/.yarn/\")) return \"yarn\";\n return \"npm\";\n}\n\n/** The global-install update invocation for a package manager. */\nexport function updateCommand(pm: PackageManager): { cmd: string; args: string[]; display: string } {\n switch (pm) {\n case \"pnpm\":\n return { cmd: \"pnpm\", args: [\"add\", \"-g\", `${PKG_NAME}@latest`], display: `pnpm add -g ${PKG_NAME}@latest` };\n case \"yarn\":\n return { cmd: \"yarn\", args: [\"global\", \"add\", `${PKG_NAME}@latest`], display: `yarn global add ${PKG_NAME}@latest` };\n case \"bun\":\n return { cmd: \"bun\", args: [\"add\", \"-g\", `${PKG_NAME}@latest`], display: `bun add -g ${PKG_NAME}@latest` };\n default:\n return { cmd: \"npm\", args: [\"i\", \"-g\", `${PKG_NAME}@latest`], display: `npm i -g ${PKG_NAME}@latest` };\n }\n}\n\n// ── auto-update decision + launch ────────────────────────────────────────────\n\n/**\n * Decide what to do about an available update. Pure — all inputs explicit —\n * so the retry/backoff rules are testable: attempt each new version once,\n * treat a recent unfinished attempt as in flight, treat a stale unfinished\n * attempt as crashed (eligible to retry), and never loop on a version that\n * already failed or didn't take effect.\n */\nexport function decideAutoUpdate(\n info: UpdateInfo,\n opts: {\n state: AutoUpdateState | null;\n pm: PackageManager | null;\n env?: Record<string, string | undefined>;\n now?: number;\n }\n): AutoUpdateDecision {\n const env = opts.env ?? process.env;\n if (env.STANDARD_CODE_NO_AUTO_UPDATE) return \"disabled\";\n if (!opts.pm) return \"dev_checkout\";\n\n const state = opts.state;\n if (state && state.version === info.latest) {\n if (state.exitCode === null) {\n const now = opts.now ?? Date.now();\n return now - state.startedAt < IN_FLIGHT_TTL_MS ? \"in_flight\" : \"start\";\n }\n // The attempt finished. exitCode 0 but we're still running the old\n // version means the new install isn't what this launcher resolves to\n // (shadowed PATH, multiple installs) — don't reinstall in a loop.\n return state.exitCode === 0 ? \"path_shadowed\" : \"already_failed\";\n }\n return \"start\";\n}\n\n/**\n * Kick off the background install: record an in-flight state, then spawn a\n * DETACHED node child that runs the package manager and writes the final\n * state (exit code + output tail) when it finishes. The CLI does not wait —\n * the new version simply applies on the next launch.\n */\nexport function startBackgroundUpdate(\n latest: string,\n pm: PackageManager,\n dir = cacheDir()\n): boolean {\n const startedAt = Date.now();\n writeAutoUpdateState({ version: latest, startedAt, exitCode: null }, dir);\n const stateFile = path.join(dir, STATE_FILE);\n const { cmd, args } = updateCommand(pm);\n // The child is plain `node -e` (no shell quoting risk for the state path or\n // version — both JSON-encoded), detached with no stdio so it survives this\n // process exiting and can never write to our terminal.\n const script =\n \"const cp=require('child_process');const fs=require('fs');\" +\n `const r=cp.spawnSync(${JSON.stringify(cmd)},${JSON.stringify(args)},{shell:process.platform==='win32',encoding:'utf8'});` +\n \"const out=((r.stdout||'')+(r.stderr||'')).slice(-2000);\" +\n `fs.writeFileSync(${JSON.stringify(stateFile)},JSON.stringify({version:${JSON.stringify(latest)},startedAt:${startedAt},exitCode:r.status==null?-1:r.status,finishedAt:Date.now(),output:out}));`;\n try {\n const child = spawn(process.execPath, [\"-e\", script], { detached: true, stdio: \"ignore\" });\n child.unref();\n return true;\n } catch {\n // Couldn't even spawn — mark failed so the next launch shows the hint.\n writeAutoUpdateState({ version: latest, startedAt, exitCode: -1, finishedAt: Date.now() }, dir);\n return false;\n }\n}\n\n/**\n * If a background update for OUR current version completed successfully, the\n * update has been applied — consume (clear) the state and return it so the\n * caller can mention it once. Any state for the current version is cleared\n * either way (it's spent).\n */\nexport function consumeAppliedUpdate(currentVersion: string, dir = cacheDir()): AutoUpdateState | null {\n const state = readAutoUpdateState(dir);\n if (!state || state.version !== currentVersion) return null;\n clearAutoUpdateState(dir);\n return state.exitCode === 0 ? state : null;\n}\n\n// ── version check ────────────────────────────────────────────────────────────\n\nasync function fetchLatest(currentVersion: string): Promise<string | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: controller.signal,\n headers: {\n Accept: \"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*\",\n \"User-Agent\": `${PKG_NAME}/${currentVersion}`,\n },\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { \"dist-tags\"?: { latest?: string } };\n return data[\"dist-tags\"]?.latest ?? null;\n } catch {\n // Offline, timeout, DNS failure, etc. — remain silent.\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Check whether a newer version of this package is available on npm.\n *\n * Results are cached for 6 hours to avoid hammering the registry. On failure\n * (offline, timeout, malformed response) returns `null` — the CLI should never\n * be blocked or noisy about a version check.\n *\n * @param currentVersion — the locally installed version (from package.json).\n * @returns `UpdateInfo` if a newer version exists, or `null` if up-to-date or\n * the check could not be completed.\n */\n/**\n * True when `candidate` is a strictly newer RELEASE than `current` (semver\n * major.minor.patch; a stable release outranks a same-base prerelease). We\n * compare by precedence rather than mere inequality so the notice NEVER\n * suggests a downgrade or a pointless reinstall when the running build is\n * already at or ahead of the registry's `latest` — e.g. a freshly published\n * build read against a stale cache.\n */\nexport function isNewerVersion(candidate: string, current: string): boolean {\n const parse = (v: string) => {\n const m = v.trim().replace(/^v/, \"\").match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-(.+))?$/);\n return m ? { nums: [Number(m[1]), Number(m[2]), Number(m[3])], pre: m[4] ?? null } : null;\n };\n const a = parse(candidate);\n const b = parse(current);\n if (!a || !b) return false; // unparseable → never prompt\n for (let i = 0; i < 3; i++) {\n if (a.nums[i] !== b.nums[i]) return a.nums[i] > b.nums[i];\n }\n // Same major.minor.patch: a release is newer than a same-base prerelease.\n return a.pre === null && b.pre !== null;\n}\n\nexport async function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\n if (!currentVersion) return null;\n\n // Honour an explicit opt-out.\n if (process.env.NO_UPDATE_NOTIFIER || process.env.CI) return null;\n\n // Check cache first — skip the network call if we checked recently.\n const cached = readCache();\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return isNewerVersion(cached.latest, currentVersion)\n ? { current: currentVersion, latest: cached.latest }\n : null;\n }\n\n const latest = await fetchLatest(currentVersion);\n if (!latest) return null;\n writeCache(latest);\n return isNewerVersion(latest, currentVersion) ? { current: currentVersion, latest } : null;\n}\n\n/**\n * Force a fresh check, bypassing the local cache.\n * Used by the `/update` slash command so the user always gets a live answer.\n */\nexport async function forceCheckForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\n if (!currentVersion) return null;\n if (process.env.NO_UPDATE_NOTIFIER || process.env.CI) return null;\n\n const latest = await fetchLatest(currentVersion);\n if (!latest) return null;\n writeCache(latest);\n return isNewerVersion(latest, currentVersion) ? { current: currentVersion, latest } : null;\n}\n\n/**\n * Run the package manager's global update in the FOREGROUND (the `/update`\n * command), capturing output rather than inheriting stdio — a child writing\n * to the terminal would desync the TUI's bottom-region redraw.\n */\nexport function runUpdate(pm: PackageManager): Promise<{ ok: boolean; output: string }> {\n return new Promise((resolve) => {\n const { cmd, args } = updateCommand(pm);\n const child = spawn(cmd, args, {\n shell: process.platform === \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let out = \"\";\n child.stdout?.on(\"data\", (d) => (out += d));\n child.stderr?.on(\"data\", (d) => (out += d));\n child.on(\"close\", (code) => resolve({ ok: code === 0, output: out }));\n child.on(\"error\", (err) => resolve({ ok: false, output: String(err) }));\n });\n}\n","/**\n * The Standard Code daemon — a headless execution client for this machine.\n *\n * Installed on a VPS (or any always-on box), it holds bridges to every thread\n * assigned to this machine (threads tagged `runner:<machine_id>`), executes\n * the agent's forwarded tool calls against the thread's project directory,\n * and heartbeats into the account-wide machine registry so other clients can\n * offer \"run this session on <machine>\".\n *\n * Design points:\n * - Execution ownership: the daemon connects with the stable client id\n * `daemon:<machine_id>` and claim `if_unowned`, so a restart/reboot\n * reclaims its threads but it never steals a live interactive takeover.\n * A periodic probe re-cycles non-owner bridges with `if_stale` so a thread\n * whose interactive owner vanished (laptop closed) falls back to the daemon.\n * - Approvals: permission-gated calls it can't auto-accept are relayed to\n * watching clients through the thread KV (see relay.ts); no TTY needed.\n * - Self-update: the standard background auto-update runs on a timer; when a\n * newer version lands, the daemon exits cleanly at the next idle moment and\n * the service supervisor (launchd/systemd) restarts it on the new code.\n * - Self-heal: any crash exits the process; the supervisor restarts it.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { ApiClient } from \"./api.ts\";\nimport { permissionKey, type Bridge } from \"./bridge.ts\";\nimport { ExecutionSession } from \"./execution-session.ts\";\nimport { SystemEvents } from \"./events-stream.ts\";\nimport { decide, type PermissionState } from \"./permissions.ts\";\nimport { saveApprovals } from \"./approvals.ts\";\nimport { getCredential, defaultEndpoint, normalizeEndpoint } from \"./credentials.ts\";\nimport { loadMachineIdentity, daemonClientId, type MachineIdentity } from \"./machine.ts\";\nimport {\n touchDaemon,\n registerProject,\n readMachineCommands,\n clearMachineCommands,\n applyMachineCommand,\n loadMachine,\n getMachineName,\n machineDisplayName,\n} from \"./registry.ts\";\nimport { awaitApprovalViaRelay } from \"./relay.ts\";\nimport { runUpdate } from \"./check-update.ts\";\nimport {\n AGENT_ID_VARIANTS,\n PRODUCTION_ENDPOINT,\n readVersion,\n relaxTlsForLocalEndpoint,\n} from \"./product.ts\";\nimport {\n checkForUpdate,\n consumeAppliedUpdate,\n decideAutoUpdate,\n detectPackageManager,\n readAutoUpdateState,\n startBackgroundUpdate,\n} from \"./check-update.ts\";\n\nconst HEARTBEAT_MS = 30_000;\nconst COMMAND_POLL_MS = 8_000;\nconst RECLAIM_PROBE_MS = 2 * 60_000;\nconst UPDATE_CHECK_MS = 6 * 60 * 60_000;\nconst SWEEP_MS = 10 * 60_000;\nconst MAX_WORKERS = 30;\nconst LOG_MAX_BYTES = 1_000_000;\n\nconst LOG_FILE = path.join(os.homedir(), \".standardagents\", \"daemon.log\");\n\n/** Append a timestamped line to the daemon log, rotating at ~1MB. */\nexport function daemonLog(line: string): void {\n try {\n fs.mkdirSync(path.dirname(LOG_FILE), { recursive: true });\n try {\n if (fs.statSync(LOG_FILE).size > LOG_MAX_BYTES) {\n fs.renameSync(LOG_FILE, `${LOG_FILE}.old`);\n }\n } catch {\n // no log yet\n }\n fs.appendFileSync(LOG_FILE, `${new Date().toISOString()} ${line}\\n`);\n } catch {\n // logging must never take the daemon down\n }\n}\n\n/** The `path:` tag value on a thread (with `~` expanded), or null. */\nfunction pathFromTags(tags: string[]): string | null {\n const tag = tags.find((t) => t.startsWith(\"path:\"));\n if (!tag) return null;\n const raw = tag.slice(\"path:\".length);\n return raw.replace(/^~(?=\\/|$)/, os.homedir());\n}\n\n/**\n * One attached thread. The execution stack itself (registry/MCP/HostTools/\n * permission engine/bridge) is the SHARED ExecutionSession — identical to the\n * interactive CLI's — with the daemon supplying only its I/O adapter: log\n * lines instead of TUI prints, and the thread-KV approval relay instead of a\n * dialog.\n */\nclass ThreadWorker {\n readonly session: ExecutionSession;\n private readonly perm: PermissionState;\n private inFlight = 0;\n isOwner = false;\n /** Set by the daemon so a superseded worker can remove itself. */\n onEvicted?: (threadId: string) => void;\n\n constructor(\n api: ApiClient,\n identity: MachineIdentity,\n machineName: string,\n readonly threadId: string,\n readonly projectDir: string,\n readonly createdAt: number\n ) {\n this.perm = { level: 1, alwaysAllow: new Set(), allowRisk: new Set() };\n\n this.session = new ExecutionSession({\n api,\n threadId,\n projectDir,\n machineName,\n perm: this.perm,\n identity: {\n clientId: daemonClientId(identity),\n clientName: machineName,\n clientKind: \"daemon\",\n claim: \"if_unowned\",\n },\n hooks: {\n onActivity: (line) => daemonLog(`[${threadId.slice(0, 8)}] ${line}`),\n onStatus: (_id, summary) => {\n this.inFlight += summary ? 1 : -1;\n if (this.inFlight < 0) this.inFlight = 0;\n },\n onConnection: (state, attempt) => {\n if (state !== \"reconnecting\" || attempt === 1 || attempt % 10 === 0) {\n daemonLog(`[${threadId.slice(0, 8)}] bridge ${state}${attempt ? ` (attempt ${attempt})` : \"\"}`);\n }\n },\n onOwnership: (isOwner, owner) => {\n this.isOwner = isOwner;\n daemonLog(\n `[${threadId.slice(0, 8)}] ownership: ${isOwner ? \"OWNER\" : \"watcher\"}` +\n (owner ? ` (owner: ${owner.client_name || owner.client_id})` : \"\")\n );\n },\n onSuperseded: () => {\n // Another process presented OUR daemon identity (a duplicate daemon,\n // a manual `daemon run` beside the service). The newer process owns\n // this thread now; this worker stands down and the sweep won't\n // re-attach while the duplicate holds the socket.\n daemonLog(`[${threadId.slice(0, 8)}] superseded by another process with this identity — standing down`);\n this.onEvicted?.(threadId);\n },\n // The daemon's approvals are edited by OTHER clients (the watching\n // CLI's level menu writes the thread KV) — re-sync before every\n // permission decision so a level change applies to the next call.\n refreshPermissions: async () => {\n await this.session.loadApprovals().catch(() => {});\n },\n requestApproval: async (req, summary, effectiveRisk) => {\n const permKey = permissionKey(req);\n const fresh = decide(this.perm, permKey, effectiveRisk, !!req.requestPermission);\n if (fresh === \"allow\") return { choice: \"allow\" };\n if (!req.toolCallId) {\n // Non-durable ask with no human present — refuse safely.\n return { choice: \"deny\", reason: \"No one is available to approve this right now.\" };\n }\n daemonLog(`[${threadId.slice(0, 8)}] relaying approval: ${summary} (risk ${effectiveRisk})`);\n const response = await awaitApprovalViaRelay(api, threadId, {\n tool_call_id: req.toolCallId,\n tool: req.tool,\n summary,\n permission: req.requestPermission,\n risk: effectiveRisk,\n machine: machineName,\n requested_at: Date.now(),\n });\n if (!response) {\n return { choice: \"deny\", reason: \"The approval request timed out with no one to approve it.\" };\n }\n if (response.choice === \"always\") this.perm.alwaysAllow.add(permKey);\n if (response.choice === \"always_risk\") this.perm.allowRisk.add(effectiveRisk);\n if (response.choice === \"always\" || response.choice === \"always_risk\") {\n saveApprovals(api, threadId, this.perm);\n }\n return { choice: response.choice, reason: response.reason };\n },\n },\n });\n\n // Enabled MCP servers connect per-thread, mirroring the interactive CLI.\n void this.session.connectEnabledMcpServers().then((results) => {\n for (const r of results.filter((r) => !r.ok)) {\n daemonLog(`[${threadId.slice(0, 8)}] MCP \"${r.name}\" failed: ${r.error}`);\n }\n });\n }\n\n get bridge(): Bridge {\n return this.session.bridge;\n }\n\n get busy(): boolean {\n return this.inFlight > 0;\n }\n\n async start(): Promise<void> {\n await this.session.loadApprovals().catch(() => {});\n // Ground truth for the agent's [SESSION] context: where its shell lives.\n this.session.writeSessionInfo();\n await this.session.bridge.connect();\n }\n\n stop(): void {\n this.session.stop();\n }\n}\n\nexport interface DaemonOptions {\n endpoint?: string;\n}\n\nexport async function runDaemon(options: DaemonOptions = {}): Promise<void> {\n const endpoint = normalizeEndpoint(options.endpoint || defaultEndpoint() || PRODUCTION_ENDPOINT);\n relaxTlsForLocalEndpoint(endpoint);\n const version = readVersion();\n const identity = loadMachineIdentity();\n const runnerTag = `runner:${identity.machine_id}`;\n\n const cred = getCredential(endpoint);\n if (!cred) {\n process.stderr.write(\n `No saved sign-in for ${endpoint}.\\n` +\n `Run \\`standardcode daemon install\\` (or plain \\`standardcode\\`) once to sign in.\\n`\n );\n process.exit(1);\n }\n const api = new ApiClient(endpoint, cred.access_token);\n const check = await api.verifyDetailed();\n if (!check.ok) {\n daemonLog(`startup: credential check failed: ${check.reason}`);\n process.stderr.write(`Sign-in check failed: ${check.reason}\\n`);\n process.exit(1);\n }\n\n // The display name is account data (the user's `.name` key), overlaid on the\n // registry record. Resolve it now and refresh on each heartbeat so a rename\n // from another client propagates to new workers' session_info / client_name.\n let displayName =\n machineDisplayName((await loadMachine(api, identity.machine_id).catch(() => null)) ?? {\n hostname: os.hostname(),\n id: identity.machine_id,\n });\n\n const applied = consumeAppliedUpdate(version);\n daemonLog(\n `daemon starting — v${version}${applied ? \" (freshly auto-updated)\" : \"\"}, machine ${identity.machine_id} (${displayName}), endpoint ${endpoint}`\n );\n\n // Crashes must exit (loudly) so the service supervisor restarts us clean.\n process.on(\"uncaughtException\", (err) => {\n daemonLog(`FATAL uncaughtException: ${err?.stack || err}`);\n process.exit(1);\n });\n process.on(\"unhandledRejection\", (err) => {\n daemonLog(`unhandledRejection: ${err instanceof Error ? err.stack : String(err)}`);\n });\n\n const workers = new Map<string, ThreadWorker>();\n\n const attach = async (threadId: string, tags: string[], createdAt = 0): Promise<void> => {\n if (workers.has(threadId)) return;\n const projectDir = pathFromTags(tags);\n if (!projectDir) return;\n if (workers.size >= MAX_WORKERS) {\n // Evict the oldest idle worker to make room for the new thread.\n const oldest = [...workers.values()]\n .filter((w) => !w.busy)\n .sort((a, b) => a.createdAt - b.createdAt)[0];\n if (!oldest) return;\n oldest.stop();\n workers.delete(oldest.threadId);\n daemonLog(`detached ${oldest.threadId.slice(0, 8)} (worker cap)`);\n }\n // Make sure the project directory exists so forwarded tools have a home;\n // a remote \"new project\" flow may name a directory that isn't there yet.\n try {\n fs.mkdirSync(projectDir, { recursive: true });\n } catch (e) {\n daemonLog(`cannot prepare project dir ${projectDir}: ${e instanceof Error ? e.message : String(e)}`);\n return;\n }\n const worker = new ThreadWorker(api, identity, displayName, threadId, projectDir, createdAt || Date.now());\n worker.onEvicted = (id) => detach(id);\n workers.set(threadId, worker);\n daemonLog(`attached ${threadId.slice(0, 8)} → ${projectDir}`);\n await worker.start();\n // Keep the machine's project list fresh for the session-location picker.\n void registerProject(api, identity, projectDir).catch(() => {});\n };\n\n const detach = (threadId: string): void => {\n const worker = workers.get(threadId);\n if (!worker) return;\n worker.stop();\n workers.delete(threadId);\n daemonLog(`detached ${threadId.slice(0, 8)}`);\n };\n\n /** Attach every (recent) thread assigned to this machine. */\n const sweep = async (): Promise<void> => {\n try {\n const threads = await api.listThreads(AGENT_ID_VARIANTS, [runnerTag]);\n const recent = threads\n .sort((a, b) => (b.created_at ?? 0) - (a.created_at ?? 0))\n .slice(0, MAX_WORKERS);\n for (const t of recent) {\n await attach(t.id, t.tags, (t.created_at ?? 0) * 1000);\n }\n } catch (e) {\n daemonLog(`sweep failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n };\n\n // Live discovery: a laptop starting a remote session creates the thread with\n // our runner tag; the events channel tells us to attach immediately.\n const events = new SystemEvents(api, {\n onOpen: () => void sweep(),\n onThreadCreated: (t) => {\n if (t.tags?.includes(runnerTag)) void attach(t.id, t.tags ?? [], (t.created_at ?? 0) * 1000);\n },\n onThreadUpdated: (t) => {\n if (t.terminated) detach(t.id);\n else if (t.tags?.includes(runnerTag)) void attach(t.id, t.tags ?? [], (t.created_at ?? 0) * 1000);\n },\n onThreadDeleted: (id) => detach(id),\n });\n events.connect();\n await sweep();\n\n // Registry heartbeat: this is what makes the machine show up as an\n // available \"run it there\" target on other clients.\n await touchDaemon(api, identity, version).catch((e) =>\n daemonLog(`heartbeat failed: ${e instanceof Error ? e.message : String(e)}`)\n );\n const heartbeat = setInterval(() => {\n void touchDaemon(api, identity, version).catch(() => {});\n // Keep the cached display name current so a rename elsewhere reaches new\n // workers (existing workers keep their name — it's cosmetic).\n void getMachineName(api, identity.machine_id)\n .then((n) => {\n if (n) displayName = n;\n })\n .catch(() => {});\n }, HEARTBEAT_MS);\n\n // Ownership reclaim probe: claims are evaluated at bridge connect, so a\n // worker that ISN'T owner periodically re-connects with `if_stale` — if the\n // interactive owner is truly gone (no live socket), the daemon takes back\n // execution; if the owner is alive, nothing changes.\n const reclaim = setInterval(() => {\n for (const worker of workers.values()) {\n if (!worker.isOwner) {\n worker.bridge.setClaim(\"if_stale\");\n worker.bridge.refresh();\n } else {\n worker.bridge.setClaim(\"if_unowned\");\n }\n }\n }, RECLAIM_PROBE_MS);\n\n // Self-update: kick the standard background auto-update; once a newer\n // version has installed, exit cleanly at the next idle moment so the\n // service supervisor restarts us on the new code.\n let updateReady = false;\n const checkUpdates = async (): Promise<void> => {\n try {\n const info = await checkForUpdate(version);\n if (!info) return;\n const pm = detectPackageManager();\n const decision = decideAutoUpdate(info, { state: readAutoUpdateState(), pm });\n if (decision === \"start\" && pm) {\n daemonLog(`auto-update: installing v${info.latest} in the background`);\n startBackgroundUpdate(info.latest, pm);\n }\n const state = readAutoUpdateState();\n if (state && state.version === info.latest && state.exitCode === 0) {\n daemonLog(`auto-update: v${info.latest} installed — restarting when idle`);\n updateReady = true;\n }\n } catch {\n // update checks are best-effort\n }\n };\n void checkUpdates();\n const updateTimer = setInterval(() => void checkUpdates(), UPDATE_CHECK_MS);\n\n // Management command channel: apply rename / add-remove project / forced\n // update commands queued for THIS machine by other clients (the /machines\n // menu). Drained every few seconds so remote management feels responsive.\n let draining = false;\n const drainCommands = async (): Promise<void> => {\n if (draining) return;\n draining = true;\n try {\n const cmds = await readMachineCommands(api, identity.machine_id);\n if (cmds.length === 0) return;\n const applied: string[] = [];\n let forcedUpdate = false;\n for (const cmd of cmds) {\n try {\n if (cmd.kind === \"update\") {\n forcedUpdate = true;\n applied.push(cmd.id);\n continue;\n }\n const result = await applyMachineCommand(api, identity, cmd);\n daemonLog(`command ${cmd.kind}: ${result}`);\n applied.push(cmd.id);\n } catch (e) {\n daemonLog(`command ${cmd.kind} failed: ${e instanceof Error ? e.message : String(e)}`);\n applied.push(cmd.id); // drop it — don't retry-loop on a bad command\n }\n }\n await clearMachineCommands(api, identity.machine_id, applied).catch(() => {});\n\n // A forced update runs the package manager now, then exits so the\n // supervisor restarts us on the new version (mirrors the auto-update\n // idle-restart path, but immediate).\n if (forcedUpdate) {\n const pm = detectPackageManager();\n if (!pm) {\n daemonLog(\"forced update requested but this is not an installed build — ignoring\");\n } else if (![...workers.values()].some((w) => w.busy)) {\n daemonLog(`forced update: running ${pm} install now`);\n const { ok, output } = await runUpdate(pm);\n daemonLog(`forced update ${ok ? \"succeeded\" : \"failed\"}: ${output.trim().split(\"\\n\").slice(-2).join(\" | \")}`);\n if (ok) {\n daemonLog(\"restarting to apply the forced update\");\n shutdown(0);\n }\n } else {\n daemonLog(\"forced update deferred — a session is busy; will retry\");\n // Re-queue by leaving updateReady semantics to the sweeper: set the\n // flag so the idle-restart path also applies a background install.\n void checkUpdates();\n }\n }\n } finally {\n draining = false;\n }\n };\n void drainCommands();\n const commandTimer = setInterval(() => void drainCommands(), COMMAND_POLL_MS);\n\n // Periodic re-sweep as a safety net for missed events, and the idle-restart\n // gate for a ready update.\n const sweeper = setInterval(() => {\n if (updateReady && ![...workers.values()].some((w) => w.busy)) {\n daemonLog(\"restarting to apply the installed update\");\n shutdown(0);\n return;\n }\n void sweep();\n }, SWEEP_MS);\n\n const shutdown = (code: number): void => {\n clearInterval(heartbeat);\n clearInterval(reclaim);\n clearInterval(updateTimer);\n clearInterval(commandTimer);\n clearInterval(sweeper);\n for (const worker of workers.values()) worker.stop();\n events.close();\n daemonLog(`daemon exiting (code ${code})`);\n process.exit(code);\n };\n process.on(\"SIGTERM\", () => shutdown(0));\n process.on(\"SIGINT\", () => shutdown(0));\n\n daemonLog(`daemon ready — watching for threads tagged ${runnerTag}`);\n // Keep the process alive forever; all work is event/timer driven.\n await new Promise(() => {});\n}\n","/**\n * Daemon service management: install/uninstall/status of the OS supervisor\n * that keeps `standardcode daemon run` alive across crashes and reboots.\n *\n * - macOS: a LaunchAgent (~/Library/LaunchAgents/ai.standardcode.daemon.plist)\n * with KeepAlive — launchd restarts the daemon on crash and starts it at\n * login.\n * - Linux: a systemd user unit (~/.config/systemd/user/standardcode-daemon\n * .service) with Restart=always, plus `loginctl enable-linger` so the unit\n * runs without an active login session (the VPS case).\n *\n * The supervisor is also the second half of self-update: the daemon exits\n * cleanly once a newer version has installed, and the supervisor restarts it\n * on the new code.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\n\nconst SERVICE_LABEL = \"ai.standardcode.daemon\";\nconst SYSTEMD_UNIT = \"standardcode-daemon.service\";\n\nexport interface ServiceCommand {\n /** argv to launch `standardcode daemon run` (absolute paths only). */\n argv: string[];\n}\n\n/**\n * Resolve how the supervisor should launch the daemon, based on how THIS\n * process was launched. An installed CLI runs its bundled entry under node; a\n * dev checkout (a .ts entry) runs through the repo's tsx.\n */\nexport function resolveDaemonCommand(extraArgs: string[] = []): ServiceCommand {\n const entry = path.resolve(process.argv[1] ?? \"\");\n if (!entry) throw new Error(\"Cannot determine how this CLI was launched.\");\n const argv: string[] = [process.execPath];\n if (entry.endsWith(\".ts\")) {\n // Dev checkout: find the repo's tsx runner so the service can execute TS.\n let dir = path.dirname(entry);\n let tsx: string | null = null;\n for (let i = 0; i < 6 && dir !== path.dirname(dir); i++) {\n const candidate = path.join(dir, \"node_modules\", \"tsx\", \"dist\", \"cli.mjs\");\n if (fs.existsSync(candidate)) {\n tsx = candidate;\n break;\n }\n dir = path.dirname(dir);\n }\n if (!tsx) {\n throw new Error(\n \"This is a source checkout and tsx wasn't found — run `pnpm install` in the repo, or install the CLI globally and re-run daemon install.\"\n );\n }\n argv.push(tsx);\n }\n argv.push(entry, \"daemon\", \"run\", ...extraArgs);\n return { argv };\n}\n\n/** A PATH for the service environment: supervisors start with a minimal PATH,\n * but forwarded bash/tools need the user's usual toolchain locations. */\nfunction servicePath(): string {\n const parts = [\n path.dirname(process.execPath),\n \"/opt/homebrew/bin\",\n \"/usr/local/bin\",\n \"/usr/bin\",\n \"/bin\",\n \"/usr/sbin\",\n \"/sbin\",\n ];\n const current = (process.env.PATH || \"\").split(\":\").filter(Boolean);\n return [...new Set([...current, ...parts])].join(\":\");\n}\n\nfunction run(cmd: string, args: string[]): { ok: boolean; output: string } {\n const res = spawnSync(cmd, args, { encoding: \"utf8\" });\n const output = `${res.stdout ?? \"\"}${res.stderr ?? \"\"}`.trim();\n return { ok: res.status === 0, output };\n}\n\nconst plistPath = () => path.join(os.homedir(), \"Library\", \"LaunchAgents\", `${SERVICE_LABEL}.plist`);\nconst unitPath = () => path.join(os.homedir(), \".config\", \"systemd\", \"user\", SYSTEMD_UNIT);\nconst xmlEscape = (s: string) => s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\nexport interface InstallResult {\n ok: boolean;\n detail: string;\n manualHint?: string;\n}\n\nexport function installService(command: ServiceCommand, endpoint?: string): InstallResult {\n if (process.platform === \"darwin\") return installLaunchd(command, endpoint);\n if (process.platform === \"linux\") return installSystemd(command, endpoint);\n return {\n ok: false,\n detail: `Unsupported platform for the daemon service: ${process.platform}`,\n manualHint: \"Run `standardcode daemon run` under your own supervisor.\",\n };\n}\n\nfunction installLaunchd(command: ServiceCommand, endpoint?: string): InstallResult {\n const logDir = path.join(os.homedir(), \".standardagents\");\n fs.mkdirSync(logDir, { recursive: true });\n fs.mkdirSync(path.dirname(plistPath()), { recursive: true });\n const envEntries = [\n ` <key>PATH</key><string>${xmlEscape(servicePath())}</string>`,\n ...(endpoint ? [` <key>STANDARD_CODE_DAEMON_ENDPOINT</key><string>${xmlEscape(endpoint)}</string>`] : []),\n ].join(\"\\n\");\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n <dict>\n <key>Label</key><string>${SERVICE_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n${command.argv.map((a) => ` <string>${xmlEscape(a)}</string>`).join(\"\\n\")}\n </array>\n <key>RunAtLoad</key><true/>\n <key>KeepAlive</key><true/>\n <key>ThrottleInterval</key><integer>5</integer>\n <key>StandardOutPath</key><string>${xmlEscape(path.join(logDir, \"daemon.out.log\"))}</string>\n <key>StandardErrorPath</key><string>${xmlEscape(path.join(logDir, \"daemon.err.log\"))}</string>\n <key>EnvironmentVariables</key>\n <dict>\n${envEntries}\n </dict>\n </dict>\n</plist>\n`;\n fs.writeFileSync(plistPath(), plist);\n const uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n run(\"launchctl\", [\"bootout\", `gui/${uid}`, plistPath()]); // clear any old copy\n const boot = run(\"launchctl\", [\"bootstrap\", `gui/${uid}`, plistPath()]);\n if (!boot.ok) {\n // Older macOS fallback.\n const load = run(\"launchctl\", [\"load\", \"-w\", plistPath()]);\n if (!load.ok) {\n return {\n ok: false,\n detail: `launchctl failed: ${boot.output || load.output}`,\n manualHint: `Load it manually: launchctl bootstrap gui/${uid} ${plistPath()}`,\n };\n }\n }\n return { ok: true, detail: `LaunchAgent installed (${plistPath()})` };\n}\n\nfunction installSystemd(command: ServiceCommand, endpoint?: string): InstallResult {\n fs.mkdirSync(path.dirname(unitPath()), { recursive: true });\n const unit = `[Unit]\nDescription=Standard Code daemon (headless coding-agent execution client)\nAfter=network-online.target\n\n[Service]\nExecStart=${command.argv.map((a) => (a.includes(\" \") ? `\"${a}\"` : a)).join(\" \")}\nRestart=always\nRestartSec=5\nEnvironment=PATH=${servicePath()}\n${endpoint ? `Environment=STANDARD_CODE_DAEMON_ENDPOINT=${endpoint}\\n` : \"\"}\n[Install]\nWantedBy=default.target\n`;\n fs.writeFileSync(unitPath(), unit);\n const reload = run(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n if (!reload.ok) {\n return {\n ok: false,\n detail: `systemd user manager unavailable: ${reload.output}`,\n manualHint:\n `Unit written to ${unitPath()}. On a server without a user manager, copy it to /etc/systemd/system/ ` +\n `(sudo), change ExecStart's user if needed, then: sudo systemctl enable --now ${SYSTEMD_UNIT}`,\n };\n }\n const enable = run(\"systemctl\", [\"--user\", \"enable\", \"--now\", SYSTEMD_UNIT]);\n if (!enable.ok) {\n return { ok: false, detail: `systemctl enable failed: ${enable.output}` };\n }\n // Without linger the unit dies when the SSH session ends — the whole point\n // of a VPS daemon is surviving that.\n const linger = run(\"loginctl\", [\"enable-linger\", os.userInfo().username]);\n return {\n ok: true,\n detail:\n `systemd user unit installed (${unitPath()})` +\n (linger.ok ? \", lingering enabled\" : ` — enable lingering manually: sudo loginctl enable-linger ${os.userInfo().username}`),\n };\n}\n\nexport function uninstallService(): InstallResult {\n if (process.platform === \"darwin\") {\n const uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n run(\"launchctl\", [\"bootout\", `gui/${uid}`, plistPath()]);\n try {\n fs.unlinkSync(plistPath());\n } catch {\n // already gone\n }\n return { ok: true, detail: \"LaunchAgent removed\" };\n }\n if (process.platform === \"linux\") {\n run(\"systemctl\", [\"--user\", \"disable\", \"--now\", SYSTEMD_UNIT]);\n try {\n fs.unlinkSync(unitPath());\n } catch {\n // already gone\n }\n run(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n return { ok: true, detail: \"systemd user unit removed\" };\n }\n return { ok: false, detail: `Unsupported platform: ${process.platform}` };\n}\n\nexport function serviceStatus(): { installed: boolean; running: boolean; detail: string } {\n if (process.platform === \"darwin\") {\n const installed = fs.existsSync(plistPath());\n const list = run(\"launchctl\", [\"list\", SERVICE_LABEL]);\n const pidMatch = list.output.match(/\"PID\"\\s*=\\s*(\\d+)/);\n return {\n installed,\n running: list.ok && !!pidMatch,\n detail: installed\n ? list.ok\n ? pidMatch\n ? `running (pid ${pidMatch[1]})`\n : \"loaded, not running\"\n : \"installed, not loaded\"\n : \"not installed\",\n };\n }\n if (process.platform === \"linux\") {\n const installed = fs.existsSync(unitPath());\n const active = run(\"systemctl\", [\"--user\", \"is-active\", SYSTEMD_UNIT]);\n return {\n installed,\n running: active.output.trim() === \"active\",\n detail: installed ? active.output.trim() || \"unknown\" : \"not installed\",\n };\n }\n return { installed: false, running: false, detail: `unsupported platform ${process.platform}` };\n}\n","/**\n * `standardcode daemon <command>` — manage this machine's headless execution\n * daemon. Plain stdout/readline (no TUI): install runs over SSH on fresh VPS\n * boxes, so everything must work on a dumb terminal.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport readline from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { ApiClient } from \"./api.ts\";\nimport { getCredential, saveCredential, defaultEndpoint, normalizeEndpoint } from \"./credentials.ts\";\nimport { deviceLogin } from \"./device-login.ts\";\nimport { loadMachineIdentity } from \"./machine.ts\";\nimport {\n clearDaemon,\n daemonOnline,\n loadMachine,\n machineDisplayName,\n setMachineName,\n registerProject,\n unregisterProject,\n updateOwnMachineRecord,\n} from \"./registry.ts\";\nimport { runDaemon } from \"./daemon.ts\";\nimport {\n installService,\n resolveDaemonCommand,\n serviceStatus,\n uninstallService,\n} from \"./daemon-service.ts\";\nimport { PRODUCTION_ENDPOINT, readVersion, relaxTlsForLocalEndpoint } from \"./product.ts\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n teal: \"\\x1b[38;5;37m\",\n};\n\nfunction usage(): void {\n output.write(\n [\n \"\",\n `${c.bold}standardcode daemon${c.reset} — headless execution client for this machine`,\n \"\",\n `${c.bold}Commands${c.reset}`,\n \" install [--endpoint url] Sign in (if needed), name this machine, and install\",\n \" the always-on service (launchd / systemd).\",\n \" uninstall Stop and remove the service.\",\n \" status Service + registry status for this machine.\",\n \" run [--endpoint url] Run the daemon in the foreground (what the service runs).\",\n \" add-project <path> Register a project directory for remote sessions.\",\n \" remove-project <path> Remove a registered project directory.\",\n \"\",\n ].join(\"\\n\")\n );\n}\n\nfunction parseEndpointFlag(args: string[]): { endpoint?: string; rest: string[] } {\n const rest: string[] = [];\n let endpoint: string | undefined;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--endpoint\" || arg === \"-e\") {\n endpoint = args[++i];\n } else if (arg.startsWith(\"--endpoint=\")) {\n endpoint = arg.slice(\"--endpoint=\".length);\n } else {\n rest.push(arg);\n }\n }\n return { endpoint, rest };\n}\n\nfunction resolveEndpoint(flag?: string): string {\n return normalizeEndpoint(\n flag || process.env.STANDARD_CODE_DAEMON_ENDPOINT || defaultEndpoint() || PRODUCTION_ENDPOINT\n );\n}\n\n/** Ensure a working credential for the endpoint, running device login if needed. */\nasync function ensureSignedIn(endpoint: string): Promise<ApiClient> {\n relaxTlsForLocalEndpoint(endpoint);\n const host = endpoint.replace(/^https?:\\/\\//, \"\");\n const stored = getCredential(endpoint);\n if (stored) {\n const api = new ApiClient(endpoint, stored.access_token);\n const check = await api.verifyDetailed();\n if (check.ok) return api;\n output.write(`${c.yellow}Saved sign-in for ${host} failed:${c.reset} ${check.reason}\\n\\n`);\n }\n output.write(`${c.bold}Sign in to Standard Code${c.reset} ${c.dim}(${host})${c.reset}\\n\\n`);\n const token = await deviceLogin(endpoint);\n const api = new ApiClient(endpoint, token);\n const check = await api.verifyDetailed();\n if (!check.ok) throw new Error(`Sign-in didn't verify: ${check.reason}`);\n saveCredential(\n { endpoint, access_token: token, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: false }\n );\n output.write(`${c.green}✓${c.reset} Signed in to ${c.teal}${host}${c.reset}\\n\\n`);\n return api;\n}\n\nasync function installCommand(endpointFlag?: string): Promise<void> {\n const endpoint = resolveEndpoint(endpointFlag);\n const api = await ensureSignedIn(endpoint);\n\n // Name this machine — a label stored on your ACCOUNT (not on this box), so\n // it's what other clients see in the \"where should this session run?\" picker\n // and can be changed from anywhere via /machines.\n const identity = loadMachineIdentity();\n const existing = await loadMachine(api, identity.machine_id).catch(() => null);\n const suggested = machineDisplayName(existing ?? { hostname: os.hostname(), id: identity.machine_id });\n const rl = readline.createInterface({ input, output });\n const answer = (await rl.question(\n `${c.bold}Machine name${c.reset} ${c.dim}(shown in the session picker)${c.reset} [${suggested}]: `\n )).trim();\n rl.close();\n if (answer) await setMachineName(api, identity.machine_id, answer);\n\n // Register the machine record before starting the service so the account\n // knows this machine exists even if the first heartbeat is slow.\n await updateOwnMachineRecord(api, identity);\n const displayName = answer || suggested;\n\n output.write(`${c.dim}Installing the always-on service…${c.reset}\\n`);\n const extra = endpointFlag ? [\"--endpoint\", endpoint] : [];\n const result = installService(resolveDaemonCommand(extra), endpointFlag ? endpoint : undefined);\n if (!result.ok) {\n output.write(`${c.red}✗${c.reset} ${result.detail}\\n`);\n if (result.manualHint) output.write(`${c.dim}${result.manualHint}${c.reset}\\n`);\n process.exit(1);\n }\n output.write(`${c.green}✓${c.reset} ${result.detail}\\n`);\n\n // Wait for the daemon's first registry heartbeat as proof of life.\n output.write(`${c.dim}Waiting for the daemon's first heartbeat…${c.reset}\\n`);\n const deadline = Date.now() + 30_000;\n let alive = false;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 2000));\n const record = await loadMachine(api, identity.machine_id);\n if (record && daemonOnline(record)) {\n alive = true;\n break;\n }\n }\n if (alive) {\n output.write(\n `${c.green}✓${c.reset} ${c.bold}${displayName}${c.reset} is online.\\n\\n` +\n `Sessions started elsewhere can now run on this machine.\\n` +\n `${c.dim}Projects register automatically when you run standardcode in a directory here,\\n` +\n `or add one now: standardcode daemon add-project <path>${c.reset}\\n`\n );\n } else {\n output.write(\n `${c.yellow}⚠${c.reset} The service installed but no heartbeat arrived yet.\\n` +\n `${c.dim}Check ~/.standardagents/daemon.log and \\`standardcode daemon status\\`.${c.reset}\\n`\n );\n }\n}\n\nasync function statusCommand(): Promise<void> {\n const status = serviceStatus();\n const identity = loadMachineIdentity();\n output.write(`${c.bold}Service:${c.reset} ${status.detail}\\n`);\n const endpoint = resolveEndpoint();\n const cred = getCredential(endpoint);\n if (!cred) {\n output.write(\n `${c.bold}Machine:${c.reset} ${os.hostname()} ${c.dim}(${identity.machine_id})${c.reset}\\n`\n );\n output.write(`${c.bold}Account:${c.reset} ${c.yellow}not signed in to ${endpoint}${c.reset}\\n`);\n return;\n }\n relaxTlsForLocalEndpoint(endpoint);\n const api = new ApiClient(endpoint, cred.access_token);\n const record = await loadMachine(api, identity.machine_id).catch(() => null);\n // The machine's display NAME is account data — sourced from the record.\n output.write(\n `${c.bold}Machine:${c.reset} ${machineDisplayName(record ?? { hostname: os.hostname(), id: identity.machine_id })} ${c.dim}(${identity.machine_id})${c.reset}\\n`\n );\n if (!record) {\n output.write(`${c.bold}Registry:${c.reset} not registered yet\\n`);\n return;\n }\n const online = daemonOnline(record);\n const seen = record.daemon\n ? `${Math.round((Date.now() - record.daemon.last_seen_at) / 1000)}s ago (v${record.daemon.version})`\n : \"never\";\n output.write(`${c.bold}Registry:${c.reset} ${online ? `${c.green}online${c.reset}` : `${c.yellow}offline${c.reset}`} · last heartbeat ${seen}\\n`);\n const projects = Object.keys(record.projects);\n output.write(`${c.bold}Projects:${c.reset} ${projects.length ? \"\" : c.dim + \"none registered\" + c.reset}\\n`);\n for (const p of projects.sort()) output.write(` ${c.dim}${p}${c.reset}\\n`);\n}\n\nasync function projectCommand(action: \"add\" | \"remove\", target?: string): Promise<void> {\n if (!target) {\n output.write(`${c.red}✗${c.reset} Expected a project path.\\n`);\n process.exit(1);\n }\n const dir = path.resolve(target);\n if (action === \"add\" && !fs.existsSync(dir)) {\n output.write(`${c.red}✗${c.reset} ${dir} does not exist on this machine.\\n`);\n process.exit(1);\n }\n const endpoint = resolveEndpoint();\n const api = await ensureSignedIn(endpoint);\n const identity = loadMachineIdentity();\n const record = await loadMachine(api, identity.machine_id).catch(() => null);\n const displayName = machineDisplayName(record ?? { hostname: os.hostname(), id: identity.machine_id });\n if (action === \"add\") {\n await registerProject(api, identity, dir);\n output.write(`${c.green}✓${c.reset} Registered ${dir} for remote sessions on ${displayName}.\\n`);\n } else {\n await unregisterProject(api, identity, dir);\n output.write(`${c.green}✓${c.reset} Removed ${dir} from this machine's projects.\\n`);\n }\n}\n\n/** Entry point for `standardcode daemon …` (called from index.ts). */\nexport async function runDaemonCommand(argv: string[]): Promise<void> {\n const [command, ...restArgs] = argv;\n const { endpoint, rest } = parseEndpointFlag(restArgs);\n switch (command) {\n case \"run\":\n await runDaemon({ endpoint: endpoint || process.env.STANDARD_CODE_DAEMON_ENDPOINT });\n return;\n case \"install\":\n await installCommand(endpoint);\n return;\n case \"uninstall\": {\n const result = uninstallService();\n output.write(`${result.ok ? c.green + \"✓\" : c.red + \"✗\"}${c.reset} ${result.detail}\\n`);\n // Clear the registry heartbeat so other clients stop offering this box.\n const ep = resolveEndpoint(endpoint);\n const cred = getCredential(ep);\n if (cred) {\n relaxTlsForLocalEndpoint(ep);\n await clearDaemon(new ApiClient(ep, cred.access_token), loadMachineIdentity()).catch(() => {});\n }\n return;\n }\n case \"status\":\n await statusCommand();\n return;\n case \"add-project\":\n await projectCommand(\"add\", rest[0]);\n return;\n case \"remove-project\":\n await projectCommand(\"remove\", rest[0]);\n return;\n case \"version\":\n output.write(`standardcode daemon v${readVersion()}\\n`);\n return;\n default:\n usage();\n if (command && command !== \"help\" && command !== \"--help\" && command !== \"-h\") {\n process.exit(1);\n }\n }\n}\n","/**\n * Standard Code CLI entry point.\n *\n * Pre-flight (plain readline): resolve the instance endpoint, OAuth-login if\n * needed, then offer to resume a thread tagged for this project+machine or start\n * a new one. Then hand off to the interactive TUI which streams the agent and\n * forwards its tools to this host.\n */\nimport os from \"node:os\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport readline from \"node:readline/promises\";\nimport { spawn } from \"node:child_process\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { ApiClient, type MessageAttachment, type SessionQuote, type SkillInfo, type SubagentInfo } from \"./api.ts\";\nimport type { Bridge } from \"./bridge.ts\";\nimport type { HostTools } from \"./host-tools.ts\";\nimport { ExecutionSession } from \"./execution-session.ts\";\nimport { MessageStream } from \"./stream.ts\";\nimport { SystemEvents } from \"./events-stream.ts\";\nimport { SubagentActivity } from \"./subagent-streams.ts\";\nimport { Tui, INPUT_BOX_MARGIN, type PastedImage } from \"./tui.ts\";\nimport { loadHistory, appendHistory } from \"./history.ts\";\nimport { renderMarkdown } from \"./markdown.ts\";\nimport { ProcessRegistry } from \"./process-registry.ts\";\nimport type { McpManager } from \"./mcp.ts\";\nimport {\n listMcpServers,\n saveMcpServer,\n removeMcpServer,\n setMcpServerEnabled,\n parseServerSpec,\n type McpServerConfig,\n} from \"./mcp-config.ts\";\nimport {\n getCredential,\n saveCredential,\n deleteCredential,\n defaultEndpoint,\n normalizeEndpoint,\n saveDefaultEndpoint,\n} from \"./credentials.ts\";\nimport { LEVELS, levelLabel, type ExecutionOwnerInfo, type Level, type ThreadSummary } from \"./types.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport { loadApprovals, saveApprovals } from \"./approvals.ts\";\nimport { gradientText, brandCycleColor } from \"./render.ts\";\nimport { deviceLogin, openUrl } from \"./device-login.ts\";\nimport {\n AGENT_ID,\n AGENT_ID_VARIANTS,\n PRODUCTION_ENDPOINT,\n readVersion,\n relaxTlsForLocalEndpoint,\n} from \"./product.ts\";\nimport {\n interactiveClientId,\n loadMachineIdentity,\n machineIdFromDaemonClientId,\n type MachineIdentity,\n} from \"./machine.ts\";\nimport {\n daemonOnline,\n loadMachine,\n loadMachines,\n machineDisplayName,\n setMachineName,\n registerProject,\n enqueueMachineCommand,\n applyMachineCommand,\n type MachineRecord,\n type MachineCommand,\n} from \"./registry.ts\";\nimport {\n APPROVAL_REQUEST_KEY,\n parseApprovalRequest,\n writeApprovalResponse,\n} from \"./relay.ts\";\nimport { runDaemonCommand } from \"./daemon-cli.ts\";\nimport { serviceStatus } from \"./daemon-service.ts\";\nimport {\n checkForUpdate,\n consumeAppliedUpdate,\n decideAutoUpdate,\n detectPackageManager,\n forceCheckForUpdate,\n readAutoUpdateState,\n runUpdate,\n startBackgroundUpdate,\n updateCommand,\n type UpdateInfo,\n} from \"./check-update.ts\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n white: \"\\x1b[97m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n gray: \"\\x1b[90m\",\n magenta: \"\\x1b[35m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n teal: \"\\x1b[38;5;37m\", // brand teal (matches the marketing site's teal accent)\n};\n\n/**\n * The Standard Agents logomark — two interlocking squares crossed by a diagonal\n * lens — rendered in full block characters. Printed at the left of the startup\n * banner with the session details aligned to its right.\n */\nconst LOGO_MARK = [\n \" █████████████\",\n \" ███ ██\",\n \" ██ █\",\n \"████ ████████ ██\",\n \"███ ████████ ███\",\n \"██ ████████ ████\",\n \"█ ██\",\n \"██ ███\",\n \"█████████████\",\n];\n\ninterface CliArgs {\n endpoint?: string;\n promptEndpoint: boolean;\n dir?: string;\n help: boolean;\n}\n\nfunction printUsage(): void {\n output.write(\n [\n \"\",\n `${c.bold}Usage${c.reset}`,\n \" standardcode [options] [dir]\",\n \"\",\n `${c.bold}Options${c.reset}`,\n \" -e, --endpoint [url] Use a different Standard Agents instance for this run\",\n \" (default: https://api.standardcode.ai).\",\n \" If url is omitted, prompt for it.\",\n \" Credentials are remembered for that endpoint, but\",\n \" the saved default endpoint is not changed.\",\n \" -h, --help Show this help.\",\n \"\",\n ].join(\"\\n\")\n );\n}\n\nfunction parseArgs(args: string[]): CliArgs {\n const parsed: CliArgs = { help: false, promptEndpoint: false };\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n parsed.help = true;\n continue;\n }\n if (arg === \"--endpoint\" || arg === \"-e\") {\n const value = args[i + 1];\n if (value && !value.startsWith(\"-\")) {\n parsed.endpoint = value;\n i++;\n } else {\n parsed.promptEndpoint = true;\n }\n continue;\n }\n if (arg.startsWith(\"--endpoint=\")) {\n const value = arg.slice(\"--endpoint=\".length);\n if (value) {\n parsed.endpoint = value;\n } else {\n parsed.promptEndpoint = true;\n }\n continue;\n }\n if (arg === \"--\") {\n // Some package-manager script invocations pass their separator through to\n // the script (for example `pnpm code -- --endpoint ...`). Treat a leading\n // separator before another option as a wrapper artifact.\n if (i === 0 && args[i + 1]?.startsWith(\"-\")) continue;\n const rest = args.slice(i + 1);\n if (rest.length > 1) throw new Error(\"Expected at most one project directory.\");\n if (rest[0]) parsed.dir = rest[0];\n break;\n }\n if (arg.startsWith(\"-\")) throw new Error(`Unknown option: ${arg}`);\n if (parsed.dir) throw new Error(\"Expected at most one project directory.\");\n parsed.dir = arg;\n }\n return parsed;\n}\n\n/**\n * Print a user `!command` and its output as a distinct block in the transcript:\n * a magenta `!` gutter line with the command, then the combined stdout/stderr\n * (dim for success, red for failure). `where` notes where it ran (the session's\n * machine) so it reads clearly in a remote session.\n */\nfunction printCommandBlock(tui: Tui, command: string, output: string, ok: boolean, where?: string): void {\n tui.print(\"\");\n const note = where ? ` ${c.dim}(ran on ${where})${c.reset}` : \"\";\n tui.print(`${c.magenta}!${c.reset} ${c.bold}${command}${c.reset}${note}`);\n const body = (output ?? \"\").replace(/\\s+$/, \"\");\n if (body) {\n for (const line of body.split(\"\\n\")) {\n tui.print(` ${ok ? c.dim : c.red}${line}${c.reset}`);\n }\n } else {\n tui.print(` ${c.dim}(no output)${c.reset}`);\n }\n tui.print(\"\");\n}\n\n/**\n * Print an assistant reply: light Markdown formatting, padded with a blank line\n * above and below so successive messages don't run together. A small grey dot\n * marks the first line in the gutter — scanning the left edge shows where each\n * new response begins — with the body indented to align under it.\n */\nfunction printAssistant(tui: Tui, text: string): void {\n const cols = Math.max(20, (process.stdout.columns || 80) - 3); // cushion for the 2-col gutter\n tui.clearStream(); // wipe the live preview; the committed message renders below\n tui.print(\"\");\n let dotted = false;\n for (const line of renderMarkdown(text, cols)) {\n if (!dotted && line.trim()) {\n tui.print(`${c.gray}•${c.reset} ${line}`);\n dotted = true;\n } else {\n tui.print(` ${line}`);\n }\n }\n tui.print(\"\");\n}\n\n/**\n * A single-line animated loading indicator for the pre-TUI phases (verifying\n * credentials, listing sessions, attaching to the thread). Redraws in place on\n * the current line; `stop()` wipes it so the next output starts clean. Safe\n * only while nothing else writes to stdout. Indented to match the boxed HUD's\n * outer margin so the pre-flight stack lines up with the input box.\n */\nfunction startLoader(label: string): { stop: () => void } {\n const frames = [\"⣷\", \"⣯\", \"⣟\", \"⡿\", \"⢿\", \"⣻\", \"⣽\", \"⣾\"];\n const pad = \" \".repeat(INPUT_BOX_MARGIN);\n output.write(\"\\x1b[?25l\"); // hide the cursor while the glyph animates\n const draw = () => {\n const now = Date.now();\n const f = frames[Math.floor(now / 70) % frames.length];\n output.write(`\\r\\x1b[K${pad}${brandCycleColor(now)}${f}${c.reset} ${c.dim}${label}…${c.reset}`);\n };\n draw();\n const timer = setInterval(draw, 70);\n\n return {\n stop: () => {\n clearInterval(timer);\n output.write(\"\\r\\x1b[K\\x1b[?25h\");\n },\n };\n}\n\n/** A calm, branded goodbye printed on a graceful shutdown. */\nfunction farewell(stoppedProcs = 0): void {\n output.write(\"\\x1b[?25h\"); // re-show the cursor in case a loader had it hidden\n if (stoppedProcs > 0) {\n output.write(\n `\\n${c.cyan}⚙${c.reset} Stopped ${stoppedProcs} background process${stoppedProcs === 1 ? \"\" : \"es\"}.\\n`\n );\n }\n output.write(`\\n${c.teal}◇${c.reset} ${c.dim}Standard Code — see you soon.${c.reset}\\n`);\n}\n\n/**\n * Print the startup welcome: the logomark, then the product name, version, the\n * connected instance, and the working directory stacked beneath it — a calm,\n * branded header before the session begins.\n */\nfunction printWelcome(endpoint: string, projectDir: string): void {\n const home = os.homedir();\n const dir = projectDir.startsWith(home) ? \"~\" + projectDir.slice(home.length) : projectDir;\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\");\n const version = readVersion();\n const pad = \" \";\n // Session details, placed to the right of the mark and vertically centered.\n // The hosted instance is the product's home — naming its host on the splash\n // is just noise, so the endpoint line only appears for non-default instances.\n const meta = [\n `${c.bold}${gradientText(\"Standard Code\")}${c.reset}${version ? ` ${c.dim}v${version}${c.reset}` : \"\"}`,\n `${c.dim}terminal coding agent${c.reset}`,\n ...(endpoint === PRODUCTION_ENDPOINT ? [] : [`${c.teal}${host}${c.reset}`]),\n `${c.dim}${dir}${c.reset}`,\n ];\n const markWidth = Math.max(...LOGO_MARK.map((l) => [...l].length));\n const metaTop = Math.floor((LOGO_MARK.length - meta.length) / 2);\n output.write(\"\\n\");\n for (let i = 0; i < LOGO_MARK.length; i++) {\n const glyph = LOGO_MARK[i].padEnd(markWidth); // logo stays white-on-black\n const line = meta[i - metaTop];\n output.write(`${pad}${glyph}${line ? ` ${line}` : \"\"}\\n`);\n }\n output.write(\"\\n\");\n}\n\n/**\n * Colour a tool-activity line for readable contrast: a bright status glyph\n * (green ✓, red ✗, yellow ⛔) with the action text at full contrast and only the\n * trailing parenthetical detail dimmed. Replaces the old wrap-everything-in-gray.\n */\nfunction colorActivity(line: string): string {\n const m = line.match(/^(\\s*)([✓✗⛔])\\s?([\\s\\S]*)$/);\n if (!m) return `${c.dim}${line}${c.reset}`;\n const [, indent, glyph, rest] = m;\n if (glyph === \"✓\") {\n const body = rest.replace(/\\s(\\([^()]*\\))\\s*$/, ` ${c.dim}$1${c.reset}`);\n return `${indent}${c.green}✓${c.reset} ${body}`;\n }\n if (glyph === \"✗\") {\n // Error output (e.g. a failed command's stderr) rides along in `rest` and can\n // run dozens of lines. Show it in red and cap it at a handful of lines so the\n // transcript stays scannable — the model still receives the full untruncated\n // result over the bridge, this only trims what the human sees.\n const ERR_MAX_LINES = 7;\n const lines = rest.split(\"\\n\");\n const shown = lines.slice(0, ERR_MAX_LINES);\n const hidden = lines.length - shown.length;\n const body = shown\n .map((l, i) =>\n i === 0\n ? `${indent}${c.red}✗ ${l}${c.reset}`\n : `${indent}${c.red}${c.dim}${l}${c.reset}`\n )\n .join(\"\\n\");\n if (hidden > 0) {\n return `${body}\\n${indent}${c.dim}… +${hidden} more line${hidden === 1 ? \"\" : \"s\"}${c.reset}`;\n }\n return body;\n }\n return `${indent}${c.yellow}⛔ ${rest}${c.reset}`;\n}\n\n/** Where a session's forwarded tools execute. */\ninterface SessionLocation {\n mode: \"local\" | \"remote\";\n /** This machine's identity (always present). */\n identity: MachineIdentity;\n /** Remote mode: the machine record whose daemon runs the tools. */\n runner?: MachineRecord;\n /** Remote mode: the project directory on the runner. */\n remotePath?: string;\n /** Show the one-line daemon-install tip (no daemon anywhere on the account). */\n suggestDaemonInstall?: boolean;\n}\n\nasync function main(): Promise<void> {\n // `standardcode daemon …` is its own command surface (install/run/status),\n // dispatched before normal arg parsing — its subcommands would otherwise\n // read as project directories.\n if (process.argv[2] === \"daemon\") {\n await runDaemonCommand(process.argv.slice(3));\n return;\n }\n\n let cliArgs: CliArgs;\n try {\n cliArgs = parseArgs(process.argv.slice(2));\n } catch (error) {\n output.write(`${c.red}error:${c.reset} ${error instanceof Error ? error.message : String(error)}\\n`);\n printUsage();\n process.exit(1);\n }\n if (cliArgs.help) {\n printUsage();\n return;\n }\n const endpointArg = cliArgs.endpoint;\n const endpointOverride = cliArgs.promptEndpoint || (typeof endpointArg === \"string\" && endpointArg.trim() !== \"\");\n const dirArg = cliArgs.dir;\n\n const projectDir = path.resolve(dirArg || process.cwd());\n const machine = os.hostname();\n\n // Create the line reader lazily so it never eagerly consumes stdin (which\n // would swallow a message the user pre-types before the interactive prompt).\n // A `SIGINT` listener implements double-press-to-quit during these pre-flight\n // prompts — without it, ctrl-c rejects `question()` with an AbortError and\n // crashes the process with a stack trace.\n const reader: { rl: readline.Interface | null } = { rl: null };\n let handoffClosing = false; // set when we intentionally close the reader for the TUI handoff\n let preflightArmed = false;\n let preflightTimer: ReturnType<typeof setTimeout> | null = null;\n const onPreflightSigint = () => {\n if (preflightArmed) {\n if (preflightTimer) clearTimeout(preflightTimer);\n reader.rl?.close();\n farewell();\n process.exit(0);\n }\n preflightArmed = true;\n output.write(`\\n${c.dim}Press Control-C again to exit${c.reset}\\n`);\n preflightTimer = setTimeout(() => {\n preflightArmed = false;\n preflightTimer = null;\n }, 2000);\n };\n const ask = async (question: string): Promise<string> => {\n if (!reader.rl) {\n reader.rl = readline.createInterface({ input, output });\n reader.rl.on(\"SIGINT\", onPreflightSigint);\n // EOF (ctrl-d / closed stdin) ends the reader — exit gracefully instead of\n // looping into an ERR_USE_AFTER_CLOSE on the next prompt.\n reader.rl.on(\"close\", () => {\n if (handoffClosing) return; // our own handoff close, not the user leaving\n farewell();\n process.exit(0);\n });\n }\n return reader.rl.question(question);\n };\n const askEndpoint = async (): Promise<string> => {\n for (;;) {\n const answer = (await ask(\n `${c.cyan}Standard Agents instance URL${c.reset} (e.g. http://localhost:5178): `\n )).trim();\n if (answer) return answer;\n output.write(`${c.dim}An endpoint URL is required.${c.reset}\\n`);\n }\n };\n // Cover the cooked-mode gaps too (e.g. while resolving threads before the TUI\n // grabs the keyboard) so a stray ctrl-c there also takes two presses and exits\n // gracefully rather than killing the process. Once the TUI enables raw mode,\n // ctrl-c arrives as a keypress and this never fires.\n process.on(\"SIGINT\", onPreflightSigint);\n\n // 1. Resolve endpoint. Normal users never choose one: the hosted Standard\n // Code instance is the default, and the very first thing they ever see is\n // the splash — not a URL prompt. `--endpoint <url>` overrides for a run;\n // bare `--endpoint` explicitly asks; a previously saved default (set by\n // an explicit endpoint flow) is respected for power users.\n let endpointPrompted = false;\n let endpoint = endpointArg || (cliArgs.promptEndpoint ? \"\" : defaultEndpoint() || PRODUCTION_ENDPOINT);\n if (!endpoint) {\n endpoint = await askEndpoint();\n endpointPrompted = true;\n }\n endpoint = normalizeEndpoint(endpoint);\n\n // Local dev instances (OrbStack, etc.) use a CA Node won't trust by default —\n // relax TLS for loopback/.local/private hosts so the CLI can actually connect.\n const tlsRelaxed = relaxTlsForLocalEndpoint(endpoint);\n\n // Welcome banner — printed once the destination instance is known, before any\n // auth prompt, so the session opens with a calm, branded header.\n printWelcome(endpoint, projectDir);\n if (tlsRelaxed) {\n output.write(`${c.dim} TLS verification relaxed for local endpoint.${c.reset}\\n\\n`);\n }\n\n // 3. Check for available updates (fast, cached — silently skipped if\n // offline). When the CLI is an installed copy, a newer version installs\n // itself in a detached background process — via the SAME package manager\n // that owns the install — and applies on the next launch. A dev checkout,\n // an opted-out env, or a previously failed attempt just shows the hint.\n const version = readVersion();\n let updateAvailable: UpdateInfo | null = null;\n {\n const loading = startLoader(\"Checking for updates\");\n updateAvailable = await checkForUpdate(version);\n loading.stop();\n const applied = consumeAppliedUpdate(version);\n if (applied) {\n output.write(` ${c.green}✓${c.reset} ${c.dim}Standard Code updated to v${version}.${c.reset}\\n\\n`);\n }\n if (updateAvailable) {\n const pm = detectPackageManager();\n const decision = decideAutoUpdate(updateAvailable, { state: readAutoUpdateState(), pm });\n if (decision === \"start\" && pm && startBackgroundUpdate(updateAvailable.latest, pm)) {\n output.write(\n ` ${c.teal}⟳${c.reset} ${c.dim}Standard Code ${c.reset}${c.bold}v${updateAvailable.latest}${c.reset}${c.dim} is installing in the background — it applies on your next launch.${c.reset}\\n\\n`\n );\n } else if (decision === \"in_flight\") {\n output.write(\n ` ${c.teal}⟳${c.reset} ${c.dim}Standard Code v${updateAvailable.latest} is still installing in the background.${c.reset}\\n\\n`\n );\n } else {\n const display = updateCommand(pm ?? \"npm\").display;\n output.write(\n ` ${c.teal}◇${c.reset} ${c.dim}Update available:${c.reset} ${c.dim}v${updateAvailable.current}${c.reset} → ${c.bold}v${updateAvailable.latest}${c.reset}\\n` +\n ` ${c.dim}Run ${c.reset}${c.bold}${display}${c.reset}${c.dim} to update${c.reset}\\n\\n`\n );\n }\n }\n }\n\n // 2. Resolve credentials. Use a stored API token if it still works, otherwise\n // ask for one (create it in your Standard Agents instance settings).\n const stored = getCredential(endpoint);\n let api = stored ? new ApiClient(endpoint, stored.access_token) : null;\n let storedCheck: Awaited<ReturnType<ApiClient[\"verifyDetailed\"]>> | null = null;\n if (api) {\n const connecting = startLoader(\"Connecting to Standard Agents\");\n storedCheck = await api.verifyDetailed();\n connecting.stop();\n }\n if (!api || !storedCheck?.ok) {\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\");\n // Say WHY the saved credentials didn't carry over — a stopped server or a\n // dead network is a very different situation from a revoked key, and the\n // user shouldn't be pasting fresh tokens at a connection problem.\n if (storedCheck && !storedCheck.ok) {\n output.write(`${c.red}✗${c.reset} ${c.dim}Saved sign-in for this endpoint failed:${c.reset} ${storedCheck.reason}\\n`);\n if (storedCheck.hint) output.write(` ${c.dim}${storedCheck.hint}${c.reset}\\n`);\n output.write(\"\\n\");\n }\n const explainFailure = (result: { reason: string; hint?: string }, prefix: string) => {\n output.write(`${c.red}✗${c.reset} ${prefix}${result.reason}\\n`);\n if (result.hint) output.write(` ${c.dim}${result.hint}${c.reset}\\n`);\n };\n output.write(`${c.bold}${gradientText(\"Sign in to Standard Code\")}${c.reset}\\n`);\n // The hosted instance is the default home; only surface the raw host when\n // the session points somewhere non-standard, so first-run stays clean.\n if (`https://${host}` !== PRODUCTION_ENDPOINT) {\n output.write(`${c.dim}Connecting to${c.reset} ${c.teal}${host}${c.reset}\\n`);\n }\n output.write(\n `${c.dim}You'll only need to do this once on this machine.${c.reset}\\n\\n`\n );\n output.write(\n `${c.white}Press ${c.bold}Enter${c.reset}${c.white} to open your browser and sign in.${c.reset} ${c.dim}(or paste an API token)${c.reset}\\n\\n`\n );\n for (;;) {\n const token = (await ask(`${c.teal}❯${c.reset} `)).trim();\n if (!token) {\n // Device-code browser login: the instance parks a one-time code, the\n // browser approval (on hosted instances, routed through the Standard\n // Agents platform login) mints a personal API key, and we poll it up.\n const got = await deviceLogin(endpoint).catch((e) => {\n output.write(`${c.red}✗${c.reset} ${c.dim}${e instanceof Error ? e.message : String(e)}${c.reset}\\n`);\n return null;\n });\n if (!got) continue;\n api = new ApiClient(endpoint, got);\n const connecting = startLoader(\"Connecting to Standard Agents\");\n const check = await api.verifyDetailed();\n connecting.stop();\n if (check.ok) {\n saveCredential(\n { endpoint, access_token: got, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: !endpointOverride }\n );\n output.write(`${c.green}✓${c.reset} Connected to ${c.teal}${host}${c.reset}\\n`);\n break;\n }\n explainFailure(check, \"Browser sign-in didn't verify: \");\n continue;\n }\n api = new ApiClient(endpoint, token);\n const connecting = startLoader(\"Connecting to Standard Agents\");\n const check = await api.verifyDetailed();\n connecting.stop();\n if (check.ok) {\n saveCredential(\n { endpoint, access_token: token, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: !endpointOverride }\n );\n output.write(`${c.green}✓${c.reset} Connected to ${c.teal}${host}${c.reset}\\n`);\n break;\n }\n explainFailure(check, \"\");\n }\n } else if (endpointPrompted) {\n saveDefaultEndpoint(endpoint);\n }\n\n if (!api) process.exit(1);\n handoffClosing = true;\n reader.rl?.close();\n\n // 3. Decide WHERE this session runs, then offer to resume or start new.\n // This machine's identity + project go into the account-wide machine\n // registry (best effort — older instances lack the user-KV API), and any\n // machine with a live daemon becomes a \"run it there\" target.\n const identity = loadMachineIdentity();\n void registerProject(api, identity, projectDir).catch(() => {});\n\n const tui = new Tui(1); // auto-accept level 1 by default (asks on anything riskier than a read)\n\n const home = os.homedir();\n const tildeDir = projectDir.startsWith(home) ? \"~\" + projectDir.slice(home.length) : projectDir;\n const shortDir = tildeDir.length > 38 ? \"…\" + tildeDir.slice(-37) : tildeDir;\n\n const session: SessionLocation = { mode: \"local\", identity };\n {\n const loadingMachines = startLoader(\"Checking your machines\");\n const machines = await loadMachines(api).catch(() => [] as MachineRecord[]);\n loadingMachines.stop();\n session.suggestDaemonInstall = machines.every((m) => !m.daemon);\n const remoteTargets = machines.filter((m) => m.id !== identity.machine_id && daemonOnline(m));\n if (remoteTargets.length > 0) {\n const where = await tui.select<MachineRecord | null>(\n `${c.bold}${gradientText(\"Where should this session run?\")}${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n [\n { label: `This machine — ${shortDir}`, hint: \"tools run locally\", value: null },\n ...remoteTargets.map((m) => ({\n label: m.name,\n hint: `${m.hostname} · daemon online${m.daemon ? ` · v${m.daemon.version}` : \"\"}`,\n value: m,\n })),\n ]\n );\n if (where) {\n const remotePath = await pickRemoteProject(tui, where);\n if (remotePath) {\n session.mode = \"remote\";\n session.runner = where;\n session.remotePath = remotePath;\n }\n }\n }\n }\n\n // Tags: `path:` + `machine:` name the project+host a session belongs to\n // (they always have), and `runner:` names the MACHINE ID whose client\n // executes the tools — it's what a daemon watches for. Resume matching for\n // local sessions stays on path+machine so pre-runner threads still appear.\n let tags: string[];\n let resumeTags: string[];\n if (session.mode === \"remote\" && session.runner && session.remotePath) {\n tags = [\n `path:${session.remotePath}`,\n `machine:${session.runner.hostname || session.runner.name}`,\n `runner:${session.runner.id}`,\n ];\n resumeTags = [`path:${session.remotePath}`, `runner:${session.runner.id}`];\n } else {\n tags = [`path:${projectDir}`, `machine:${machine}`, `runner:${identity.machine_id}`];\n resumeTags = [`path:${projectDir}`, `machine:${machine}`];\n }\n\n const loadingSessions = startLoader(\"Loading sessions\");\n let existing: ThreadSummary[] = [];\n try {\n existing = await api.listThreads(AGENT_ID_VARIANTS, resumeTags);\n } catch {\n existing = [];\n }\n const summaries = existing.length > 0 ? await summarizeThreads(api, existing.slice(0, 8)) : [];\n loadingSessions.stop();\n\n // A brand-new remote thread needs its session context seeded from here —\n // the daemon re-asserts it on attach, but the agent's first step shouldn't\n // wait for that.\n const createSessionThread = async (): Promise<string> => {\n const id = await api!.createThread(AGENT_ID, tags);\n if (session.mode === \"remote\" && session.runner && session.remotePath) {\n await api!\n .kvSet(id, \"session_info\", { cwd: session.remotePath, machine: session.runner.name })\n .catch(() => {});\n }\n return id;\n };\n\n let threadId: string;\n let resumed = false;\n // For a brand-new session, ↑/↓ recall seeds from the project's newest prior\n // thread (history lives in the thread KV, not on the local filesystem).\n let historySeed: string | undefined;\n if (existing.length > 0) {\n const items: { label: string; hint?: string; value: string | null }[] = summaries.map((s) => ({\n label: s.label,\n hint: s.hint,\n value: s.id,\n }));\n items.push({ label: \"+ Start a new session\", value: null });\n const whereLabel =\n session.mode === \"remote\" && session.runner\n ? `${session.runner.name}:${shortenPath(session.remotePath ?? \"\")}`\n : shortDir;\n const picked = await tui.select(\n `${c.bold}${gradientText(\"Resume a session\")}${c.reset} ${c.gray}${whereLabel}${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n items\n );\n if (typeof picked === \"string\") {\n threadId = picked;\n resumed = true;\n } else {\n threadId = await createSessionThread();\n historySeed = existing[0]?.id;\n }\n } else {\n threadId = await createSessionThread();\n }\n\n // `/clear` resolves the session with a request for a fresh thread; loop so\n // the new session reuses the same TUI, credentials, and project tags. The\n // old thread seeds ↑/↓ recall so input history survives the clear.\n for (;;) {\n await runInteractive(tui, api, threadId, projectDir, machine, resumed, session, historySeed);\n historySeed = threadId;\n threadId = await createSessionThread();\n // Tell the fresh thread which thread it replaced so the instance releases\n // that thread's simultaneous-thread slot on the new thread's first step\n // (rather than the slot lingering for its ~90s lease TTL after `/clear`).\n await api.kvSet(threadId, \"lease_supersedes\", historySeed);\n resumed = false;\n }\n}\n\n/** Shorten an absolute path for menu labels (keep the tail). */\nfunction shortenPath(p: string, max = 38): string {\n return p.length > max ? \"…\" + p.slice(-(max - 1)) : p;\n}\n\n/**\n * Pick which project on a remote machine the session works in: the machine's\n * registered projects (most recently used first), or a typed-in path. Returns\n * null when the user backs out (the session falls back to local).\n */\nasync function pickRemoteProject(tui: Tui, runner: MachineRecord): Promise<string | null> {\n const ENTER_PATH = \"__enter_path__\";\n const projects = Object.entries(runner.projects).sort(\n (a, b) => (b[1]?.last_used_at ?? 0) - (a[1]?.last_used_at ?? 0)\n );\n const items: { label: string; hint?: string; value: string }[] = projects.map(([dir, p]) => ({\n label: shortenPath(dir, 48),\n hint: p?.last_used_at ? relativeTime(p.last_used_at / 1000) : \"\",\n value: dir,\n }));\n items.push({ label: `+ Another path on ${runner.name}…`, hint: \"type a directory\", value: ENTER_PATH });\n const picked = await tui.select(\n `${c.bold}${gradientText(`Project on ${runner.name}`)}${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n items\n );\n if (!picked) return null;\n if (picked !== ENTER_PATH) return picked;\n const typed = await tui.prompt(\n `Directory on ${runner.name} (absolute, created if missing)`,\n \"~/projects/my-app\"\n );\n if (!typed) return null;\n const trimmed = typed.trim();\n if (!trimmed.startsWith(\"/\") && !trimmed.startsWith(\"~\")) {\n tui.print(`${c.yellow}Use an absolute path (starting with / or ~).${c.reset}`);\n return null;\n }\n return trimmed;\n}\n\n/**\n * A message is \"silent\" when it's a system-injected user turn (subagent result\n * hand-backs, malformed-tool-call replays, queued housekeeping) rather than\n * something the human actually typed — so it must never name a session.\n */\nfunction isSilentMessage(m: any): boolean {\n return m?.silent === true || m?.metadata?.silent === true;\n}\n\n/**\n * Build a one-line preview + timestamp for each thread, naming the session by\n * the LAST thing the human actually said. We read content via `messageText`\n * (user messages can be content-block arrays, not just strings — the old\n * string-only check made every such session render \"(empty session)\"), skip\n * silent/system-injected turns, and take the most recent one.\n */\nasync function summarizeThreads(\n api: ApiClient,\n threads: ThreadSummary[]\n): Promise<{ id: string; label: string; hint: string }[]> {\n return Promise.all(\n threads.map(async (t) => {\n let preview = \"\";\n try {\n // Newest-first so the most recent human message is in-window even for\n // long sessions; we also sort ourselves in case the server ignores it.\n const msgs = await api.getMessages(t.id, 50, \"desc\");\n const latest = msgs\n .filter((m: any) => m.role === \"user\" && m.status !== \"pending\" && !isSilentMessage(m))\n .map((m: any) => ({ at: m.created_at ?? 0, text: messageText(m.content).replace(/\\s+/g, \" \").trim() }))\n .filter((m) => m.text.length > 0)\n .sort((a, b) => b.at - a.at)[0];\n if (latest) preview = latest.text;\n } catch {\n // ignore; show a placeholder\n }\n const label = preview\n ? preview.length > 64\n ? preview.slice(0, 63) + \"…\"\n : preview\n : \"(empty session)\";\n const when = t.created_at ? relativeTime(t.created_at) : \"\";\n const hint = [t.id.slice(0, 8), when].filter(Boolean).join(\" · \");\n return { id: t.id, label, hint };\n })\n );\n}\n\n/**\n * A human-readable label for a subagent: prefer its registry title (e.g.\n * \"Research Assistant\"), else the agent's display title, else a title-cased\n * agent name. A per-instance thread name refines it (\"Research Assistant ·\n * auth-flow\") when present.\n */\nfunction subagentLabel(s: SubagentInfo, titles: Map<string, string>): string {\n const agentName = (s.agent_name || \"\").trim();\n const title =\n (s.title || \"\").trim() ||\n titles.get(agentName) ||\n (agentName ? agentName.replace(/[_-]+/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()) : \"Subagent\");\n const tagged = (s.threadName || \"\").trim();\n return tagged ? `${title} · ${tagged}` : title;\n}\n\n/** Compact relative time from a unix-seconds timestamp. */\nfunction relativeTime(unixSeconds: number): string {\n const diff = Date.now() / 1000 - unixSeconds;\n if (diff < 60) return \"just now\";\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`;\n return `${Math.floor(diff / 86400)}d ago`;\n}\n\n/**\n * Whether a message carries tool calls. The API serializes `tool_calls` as a\n * JSON STRING (not an array), so `Array.isArray` is never true — checking only\n * that would treat a tool-call assistant message (which can also have narration\n * content) as a final answer, completing the turn while a tool/approval is still\n * pending. Handle both shapes.\n */\nfunction hasToolCalls(m: any): boolean {\n const tc = m?.tool_calls;\n if (Array.isArray(tc)) return tc.length > 0;\n if (typeof tc === \"string\") {\n const s = tc.trim();\n return s.length > 0 && s !== \"null\" && s !== \"[]\";\n }\n return false;\n}\n\n/** Extract plain text from a message's content (string or content-block array). */\nfunction messageText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((b: any) => (typeof b === \"string\" ? b : typeof b?.text === \"string\" ? b.text : \"\"))\n .join(\"\");\n }\n return \"\";\n}\n\n/** Whether the thread is currently working (a turn active or queued work pending). */\nfunction threadBusy(msgs: any[]): boolean {\n if (!msgs.length) return false;\n if (msgs.some((m) => m.status === \"pending\")) return true;\n const last = [...msgs].sort((a, b) => (b.created_at ?? 0) - (a.created_at ?? 0))[0];\n if (!last) return false;\n if (last.role === \"user\" || last.role === \"tool\") return true; // turn about to run / mid-turn\n if (last.role === \"assistant\") return hasToolCalls(last); // tool-call message = still going\n return false; // a final assistant text, or a system/stop message → idle\n}\n\n/** Replay a resumed thread's conversation so it feels like picking up mid-session. */\nasync function printHistory(api: ApiClient, threadId: string, tui: Tui): Promise<void> {\n let msgs: any[];\n try {\n msgs = await api.getMessages(threadId, 200);\n } catch {\n return;\n }\n const convo = msgs\n .filter(\n (m) =>\n m.metadata?.user_command ||\n m.role === \"user\" ||\n (m.role === \"assistant\" && messageText(m.content).trim())\n )\n .sort((a, b) => (a.created_at ?? 0) - (b.created_at ?? 0));\n if (!convo.length) return;\n const shown = convo.slice(-24);\n tui.print(`${c.dim}── resuming session · ${convo.length} message${convo.length === 1 ? \"\" : \"s\"} ──${c.reset}`);\n if (shown.length < convo.length) tui.print(`${c.dim} … earlier messages omitted${c.reset}`);\n for (const m of shown) {\n if (m.metadata?.user_command) {\n printCommandBlock(\n tui,\n String(m.metadata.command ?? \"\"),\n String(m.metadata.output ?? messageText(m.content)),\n m.metadata.ok !== false\n );\n continue;\n }\n const text = messageText(m.content).trim();\n if (!text) continue;\n if (m.role === \"user\") tui.printUserMessage(text);\n else printAssistant(tui, text);\n }\n}\n\nasync function runInteractive(\n tui: Tui,\n api: ApiClient,\n threadId: string,\n projectDir: string,\n machine: string,\n resumed: boolean,\n session: SessionLocation,\n historySeedThreadId?: string\n): Promise<void> {\n // Remote sessions are WATCHERS: the thread's tools execute on the runner\n // machine's daemon (the execution owner), while this client streams the\n // conversation, sends messages, and answers relayed approval requests. No\n // bridge, no local host executors, no local MCP host.\n const remote = session.mode === \"remote\";\n const runnerName = session.runner?.name ?? \"the remote machine\";\n // Background-process metadata lives in the thread's KV (server-side), so even\n // a watcher can list what the executing client spawned — this is a thin KV\n // client, not local process state.\n const registry = new ProcessRegistry(api, threadId, machine);\n const refreshBgCount = () => {\n void registry.runningCount().then((n) => tui.setBackgroundCount(n)).catch(() => {});\n };\n const perm: PermissionState = { level: tui.level, alwaysAllow: new Set(), allowRisk: new Set() };\n\n // The SHARED execution stack (registry + MCP host + HostTools + bridge),\n // identical to the daemon's — built only for a client that can execute (a\n // local session). A remote watcher has no execution stack. Constructed just\n // below, once the bridge hooks' dependencies (activeSteps, refreshStatus,\n // offerUpgrade, …) exist; `exec`/`host`/`mcp`/`bridge` are its members.\n let exec: ExecutionSession | null = null;\n let host: HostTools | null = null;\n let mcp: McpManager | null = null;\n let bridge: Bridge | null = null;\n const publishMcpCatalog = () => exec?.publishMcpCatalog();\n\n // Restore this session's saved approvals (auto-accept level + pre-approved\n // tools and risk levels) from the thread KV, so they resume with the session.\n const savedApprovals = await loadApprovals(api, threadId);\n for (const t of savedApprovals.allowTools) perm.alwaysAllow.add(t);\n for (const r of savedApprovals.allowRisk) perm.allowRisk.add(r);\n if (savedApprovals.level) {\n perm.level = savedApprovals.level;\n tui.setLevel(savedApprovals.level);\n }\n tui.onLevelChange((l: Level) => {\n perm.level = l;\n saveApprovals(api, threadId, perm);\n });\n // Persist the effective permission setting now (not just on change) so the\n // backend evaluates the SAME level/approvals when deciding whether a forwarded\n // tool needs approval — otherwise it parks calls the CLI would auto-accept.\n saveApprovals(api, threadId, perm);\n // session_info (the agent's \"where does my shell live\" ground truth) is\n // written AFTER ownership is known, below — a client that turns out to be a\n // non-owner (another terminal or a local daemon holds the thread) must not\n // overwrite the executing client's cwd/machine.\n\n // Everything from here to the banner is session wiring (history load, the\n // bridge/stream/events sockets) — show one loader for the whole stretch.\n // Started after the approvals restore above so its possible level-change\n // print can't collide with the redrawn loader line.\n const attaching = startLoader(\"Attaching to thread\");\n\n // ── state ────────────────────────────────────────────────────────────────\n let busy = false; // is the agent currently working\n // Set when the user hits esc to interrupt: clears the working indicator\n // immediately and suppresses the poller from re-showing it until the backend\n // confirms the turn actually stopped (otherwise \"Working\" lingers a poll or two).\n let interrupting = false;\n // Messages typed while busy, held to send next (with any pasted images).\n const queued: { text: string; images: PastedImage[] }[] = [];\n let editingQueued = false; // input currently holds a pulled queued message\n const shownIds = new Set<string>(); // message ids already printed to the transcript\n // User messages the CLI optimistically displayed on send, keyed by content, so\n // the poller doesn't re-print them — while it DOES render user messages that\n // were submitted from elsewhere (web UI, API, another client).\n const pendingSent = new Map<string, number>();\n // The last message we sent — resent verbatim to continue after an at-limit\n // upgrade (the blocked turn never reached the model).\n let lastSent: { text: string; images: PastedImage[] } | null = null;\n let upgradeInFlight = false;\n\n // ── token feed ──────────────────────────────────────────────────────────\n // Cumulative tokens are authoritative from logs (one row per completed LLM\n // call); a live estimate from streamed content ticks the output count up\n // between log updates so a long generation isn't silent.\n let tokensIn = 0;\n let tokensOut = 0;\n let liveOut = 0; // output tokens for the in-progress response (from `generation` events)\n const countedLogs = new Set<string>();\n\n // ── step indicator (what the agent is doing right now) ────────────────────\n // The label comes from the server stream's tool_call_started/done events — it\n // shows what the agent is doing, which is especially valuable for a long tool.\n // That signal is best-effort though (a reconnect can drop an event), so the\n // bridge — which actually runs the forwarded tools on the host — RECONCILES it:\n // it fills in a `started` the stream missed and clears a `done` it dropped, so\n // the label can't strand on a tool that already finished (see Bridge onStatus).\n // Most recently started active tool wins; cleared when the turn goes idle.\n const activeSteps = new Map<string, string>(); // tool call id -> label\n\n // Push the current totals + step to the prompt. Output total folds in the\n // live in-progress count; the step's own output is the live count.\n const refreshStatus = () => {\n tui.setTokens(tokensIn, tokensOut + liveOut);\n let label: string | null = null;\n for (const v of activeSteps.values()) label = v; // last (most recent) entry\n tui.setStep(label, liveOut);\n };\n\n // Execution ownership: this interactive session claims the thread unless a\n // LIVE other client already owns it. If the recorded owner is a daemon on\n // THIS machine, take over outright — the filesystem is the same and the\n // human at the keyboard should approve and see the tools.\n let claim: \"if_stale\" | \"takeover\" = \"if_stale\";\n if (!remote) {\n const ownerRec = (await api.kvGet(threadId, \"execution_owner\").catch(() => null)) as\n | { client_id?: string }\n | null;\n const ownerDaemonMachine = machineIdFromDaemonClientId(ownerRec?.client_id);\n if (ownerDaemonMachine === session.identity.machine_id) claim = \"takeover\";\n }\n\n if (!remote) {\n // This machine's display NAME is account data (its `.name` key), overlaid\n // on the registry record — resolve it for the bridge client_name shown to\n // other clients. Falls back to the hostname.\n const localDisplayName = machineDisplayName(\n (await loadMachine(api, session.identity.machine_id).catch(() => null)) ?? {\n hostname: machine,\n id: session.identity.machine_id,\n }\n );\n exec = new ExecutionSession({\n api,\n threadId,\n projectDir,\n machineName: machine,\n perm,\n identity: {\n clientId: interactiveClientId(session.identity),\n clientName: `${localDisplayName} (terminal)`,\n clientKind: \"interactive\",\n claim,\n },\n hooks: {\n onActivity: (line, detail) => {\n tui.print(colorActivity(line));\n // Pre-styled extra rows (truncated diffs for edits/writes) print verbatim.\n if (detail) for (const d of detail) tui.print(d);\n refreshBgCount();\n },\n onOwnership: (isOwner: boolean, owner: ExecutionOwnerInfo | null) => {\n if (isOwner) {\n // We execute here now — reassert on any future reconnect so a daemon's\n // stale-claim probe can't quietly take execution during a brief drop.\n bridge?.setClaim(\"takeover\");\n // Owner-only session facts (a watcher must never overwrite them).\n exec?.writeSessionInfo();\n } else {\n tui.print(\n `${c.yellow}⚠ Another client${owner?.client_name ? ` (${owner.client_name})` : \"\"} is executing tools for this session — this terminal is watching.${c.reset}`\n );\n }\n },\n onClaimRefused: (reason: string) => {\n if (reason === \"in_flight\") {\n tui.print(\n `${c.yellow}⚠ The session's current client is mid-operation — execution can't move here until it finishes. Watching for now.${c.reset}`\n );\n }\n },\n onSuperseded: () => {\n tui.print(\n `${c.yellow}⚠ Another Standard Code process on this machine took over this session — this terminal is watching.${c.reset}`\n );\n },\n onStatus: (id, summary) => {\n // Reconcile the stream's best-effort step signal with what the host is\n // really running — the CLI executes the forwarded tools, so it knows:\n // - on start: fill in a `started` the stream may have dropped, but DON'T\n // override a label the stream already set (it can be richer/intentional).\n // - on finish: authoritatively clear it, healing a dropped `done` so the\n // label can't strand on a tool that already completed.\n // Durable calls share the tool-call id with the stream, so this lines up.\n if (summary) {\n if (!activeSteps.has(id)) activeSteps.set(id, summary);\n } else {\n activeSteps.delete(id);\n }\n refreshStatus();\n },\n onConnection: (state, attempt) => {\n // Brief drops are normal (a permission wait, a dev-server reload) and the\n // bridge reconnects on its own — stay quiet unless reconnection is actually\n // struggling (several seconds of failed attempts). The disconnect shows as a\n // TRANSIENT notice line in the bottom region that clears itself the moment we\n // reconnect, so nothing about it lingers in the transcript.\n if (state === \"reconnecting\") {\n if (attempt >= 4) tui.setConnected(false);\n } else {\n tui.setConnected(true);\n }\n },\n requestApproval: async (req, summary, risk) => {\n // Boxed permission dialog (allow / always / deny / deny-with-feedback).\n // Feedback text rides back to the agent on the deny tool result.\n return tui.approval(\n `${summary}${req.requestPermission ? `\\nwhy: ${req.requestPermission}` : \"\"}`,\n risk\n );\n },\n },\n });\n host = exec.host;\n mcp = exec.mcp;\n bridge = exec.bridge;\n }\n\n // The message stream drives two live signals (the transcript itself is\n // rendered from polling for robustness):\n // - `generation` events → the live output-token count (moves during ALL\n // generation, including big tool arguments like file content).\n // - `tool_call_started` / `tool_call_done` → the current step label.\n const stream = new MessageStream(api, threadId, {\n // Live streaming preview: answer text and (opt-in) internal reasoning feed\n // the TUI's ephemeral preview; the committed message still renders from\n // polling, which calls tui.clearStream() first so there's no double-render.\n onChunk: (text, mid) => tui.streamResponseDelta(text, mid),\n onReasoningChunk: (text, mid) => tui.streamThinkingDelta(text, mid),\n onAssistantText: () => {},\n onEvent: (eventType, data) => {\n if (eventType === \"generation\" && typeof data?.outputTokens === \"number\") {\n liveOut = data.outputTokens;\n refreshStatus();\n } else if (eventType === \"tool_call_started\" && data?.id) {\n activeSteps.set(data.id, data.progress || data.name || \"working\");\n refreshStatus();\n } else if (eventType === \"tool_call_done\" && data?.id) {\n activeSteps.delete(data.id);\n refreshStatus();\n } else if (eventType === \"goal_updated\" && data) {\n tui.setGoal(data);\n }\n },\n // A failed turn whose message is the lease service's at-limit denial → offer\n // an in-terminal upgrade right where the friction happened. (offerUpgrade /\n // isSessionLimitError are defined below; this callback only fires mid-session.)\n onError: (err: string) => {\n if (isSessionLimitError(err)) void offerUpgrade({ auto: true });\n },\n });\n\n // ── subagent tracking ──────────────────────────────────────────────────────\n // A subagent runs in its own child thread, but whether it's *actively running*\n // (vs idle or terminated) lives in our thread's child registry — not on the\n // thread-registry events. So we treat the system-events channel purely as a\n // \"something changed\" signal and re-read /api/threads/:id/subagents, showing a\n // line only for subagents whose status is `running`.\n // Running child threadId -> display title, registry status detail, and raw\n // agent name (the TUI colors the compaction agent orange by name).\n const activeSubagents = new Map<string, { title: string; registryDetail: string; agentName?: string }>();\n // Agent name → title, loaded once so subagent lines read \"Research Assistant\"\n // rather than the raw agent name. Best effort; falls back to a prettified name.\n const agentTitles = new Map<string, string>();\n const agentTitlesReady = api\n .listAgents()\n .then((list) => list.forEach((a) => agentTitles.set(a.name, a.title)))\n .catch(() => {});\n // Compose each line as \"Title — activity\". The live stream phrase (what the\n // subagent's own thread is doing RIGHT NOW — reading a page, running a\n // search) wins over the registry status text (setStatus heartbeats, which\n // only some agents publish); with neither, the bare title renders as before.\n const pushSubagents = () =>\n tui.setSubagents(\n [...activeSubagents.entries()].map(([id, s]) => {\n const detail = subActivity.phraseFor(id) ?? s.registryDetail;\n return { id, label: `${s.title}${detail ? ` — ${detail}` : \"\"}`, agentName: s.agentName };\n })\n );\n // Live per-subagent activity: one read-only stream to each running child\n // thread (opened/closed by the reconcile below via sync()); a phrase change\n // just re-pushes the lines.\n const subActivity = new SubagentActivity(api, () => pushSubagents());\n // Rebuild the running-subagent set from the authoritative child registry.\n // Runs on every (re)connect (covering subagents that started before this\n // socket, or during a reconnect gap) and whenever a child thread changes.\n const reconcileSubagents = async () => {\n try {\n await agentTitlesReady;\n const subs = await api.listSubagents(threadId);\n activeSubagents.clear();\n for (const s of subs) {\n // Hide finished/parked children. Anything else is live: \"running\", or a\n // custom working status (agents can publish progress via setStatus /\n // sessionStatus bindings — e.g. the coordinator's code workers heartbeat\n // \"editing src/auth.ts — 2 of 3 call sites done\" into the registry).\n const status = (s.status || \"\").trim();\n if (status === \"idle\" || status === \"terminated\") continue;\n // Keep the registry status text when it's more than the bare lifecycle\n // marker — it's the fallback detail when no live stream phrase exists.\n // Collapsed to one line — agents publish arbitrary status text, and a\n // newline inside a HUD row would desync the TUI's redraw math.\n const oneLineStatus = status.replace(/\\s+/g, \" \");\n activeSubagents.set(s.id, {\n title: subagentLabel(s, agentTitles),\n registryDetail: oneLineStatus && oneLineStatus !== \"running\" ? oneLineStatus.slice(0, 80) : \"\",\n agentName: s.agent_name ?? undefined,\n });\n }\n // Streams follow the registry: open for newcomers, closed for departed.\n subActivity.sync(activeSubagents.keys());\n pushSubagents();\n } catch {\n // Best effort — the next event or reconnect re-reconciles.\n }\n };\n // Coalesce bursts of events into a single registry read; if more events land\n // while a read is in flight, run exactly one more afterwards.\n let reconcileTimer: ReturnType<typeof setTimeout> | null = null;\n let reconcilePending = false;\n const scheduleReconcile = () => {\n if (reconcileTimer) {\n reconcilePending = true;\n return;\n }\n reconcileTimer = setTimeout(async () => {\n reconcileTimer = null;\n await reconcileSubagents();\n if (reconcilePending) {\n reconcilePending = false;\n scheduleReconcile();\n }\n }, 150);\n };\n const events = new SystemEvents(api, {\n onOpen: () => scheduleReconcile(),\n onThreadCreated: (t) => {\n if (t.parent === threadId) scheduleReconcile();\n },\n onThreadUpdated: (t) => {\n if (t.parent === threadId) scheduleReconcile();\n },\n onThreadDeleted: (id) => {\n if (activeSubagents.has(id)) scheduleReconcile();\n },\n });\n // Registry status text (setStatus / sessionStatus heartbeats) changes without\n // firing a thread event, so while any subagent line is visible, refresh it on\n // a slow poll to keep the displayed working state current. Discovery of NEW\n // subagents still comes from the events above; this only keeps text fresh.\n const heartbeatPoll = setInterval(() => {\n if (activeSubagents.size > 0) scheduleReconcile();\n }, 5000);\n heartbeatPoll.unref();\n\n // `/clear` resolves this promise; runInteractive tears the session down and\n // returns, and the caller loops back in with a fresh thread. (Quit never\n // resolves it — quit exits the process directly.)\n let endSession!: () => void;\n const sessionEnded = new Promise<void>((r) => (endSession = r));\n\n const quit = async () => {\n tui.end();\n // Stop the agent's turn on the backend before we exit — the LLM loop runs\n // remotely, so without this it would keep working after the CLI disconnects.\n // ONLY when this client owns execution, though: a watcher (or a demoted\n // non-owner) detaching must not kill the turn the owning client is still\n // executing. Also kill any background processes this machine spawned:\n // they're detached, so without this they'd outlive the session. Fire both,\n // tear down locally, then wait briefly so they land (capped so quitting\n // stays snappy even if the instance is unreachable).\n const stopped = (bridge?.isOwner ?? false)\n ? api.stop(threadId).catch(() => {})\n : Promise.resolve();\n const procsStopped = host ? host.stopAllLocalProcesses().catch(() => 0) : Promise.resolve(0);\n bridge?.close();\n stream.close();\n events.close();\n subActivity.closeAll();\n mcp?.closeAll();\n const [, killed] = await Promise.race([\n Promise.all([stopped, procsStopped]),\n new Promise<[unknown, number]>((r) => setTimeout(() => r([undefined, 0]), 1500)),\n ]);\n farewell(killed);\n process.exit(0);\n };\n tui.setQuitHandler(quit);\n\n // `/logout`: forget the saved token for this instance, then shut down like a\n // normal quit (stop the turn + this machine's background processes). The next\n // launch lands on the sign-in screen.\n const logout = async () => {\n deleteCredential(api.origin);\n const instanceHost = api.origin.replace(/^https?:\\/\\//, \"\");\n tui.print(`${c.gray}Signed out — removed the saved token for ${c.teal}${instanceHost}${c.reset}${c.gray}. Run standardcode to sign in again.${c.reset}`);\n await quit();\n };\n const bgMgr: BgManager = {\n list: () => registry.list(),\n stop: async (id: string) => {\n if (!host) {\n // The processes live on the executing machine (a remote daemon) — this\n // watcher can't signal them. Ask the agent instead (its\n // background_process tool runs there).\n tui.print(\n `${c.gray}That process runs on ${runnerName} — ask the agent to stop it (it manages processes there).${c.reset}`\n );\n return;\n }\n await host.execute(\"background_process\", { action: \"stop\", id });\n refreshBgCount();\n },\n };\n\n // ── MCP control surface (for the /mcp command + slash menu) ────────────────\n // In a remote session the daemon is the MCP host, so this surface is only\n // wired for local sessions (the /mcp command is hidden remotely).\n const mcpCtl: McpController = {\n configured: () => listMcpServers(),\n connectedNames: () => mcp?.connectedNames() ?? [],\n catalog: () => mcp?.catalog() ?? { servers: [] },\n connect: async (cfg) => {\n if (!mcp) return { ok: false, error: \"MCP servers run on the session's machine.\" };\n try {\n const client = await mcp.connect(cfg);\n publishMcpCatalog();\n return { ok: true, tools: client.tools.length };\n } catch (e) {\n publishMcpCatalog();\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n },\n disconnect: (name) => {\n mcp?.disconnect(name);\n publishMcpCatalog();\n },\n add: async (cfg) => {\n saveMcpServer(cfg);\n return mcpCtl.connect(cfg);\n },\n // Seed the request into the main chat — the agent researches + installs it\n // there (using research_agent + the mcp tool's install action), visible in\n // the transcript.\n requestInstall: (query) => {\n void sendNow(\n `Install an MCP server for me: ${query}. Research the best one and its exact launch command, then install it.`\n );\n },\n remove: (name) => {\n mcp?.disconnect(name);\n removeMcpServer(name);\n publishMcpCatalog();\n },\n setEnabled: (name, enabled) => setMcpServerEnabled(name, enabled),\n };\n\n // ── submit / queue / steer ─────────────────────────────────────────────────\n // Pasted images become real message attachments: the instance stores the\n // bytes in the thread filesystem and injects them into the LLM's vision\n // context, exactly like an image sent from the web UI. The `[#Image N]`\n // placeholders stay in the text so the model can reference them by name.\n const extFor = (mime: string): string =>\n ({ \"image/png\": \"png\", \"image/jpeg\": \"jpg\", \"image/gif\": \"gif\", \"image/webp\": \"webp\" })[mime] ?? \"bin\";\n const toAttachments = (images: PastedImage[]): MessageAttachment[] =>\n images.map((img) => ({ name: `image-${img.seq}.${extFor(img.mime)}`, mimeType: img.mime, data: img.data }));\n\n const sendNow = async (text: string, images: PastedImage[] = []) => {\n lastSent = { text, images };\n tui.printUserMessage(text);\n // Mark it shown so the poller (which now also renders user messages) doesn't\n // double-print our own send once the backend persists it.\n const key = text.trim();\n pendingSent.set(key, (pendingSent.get(key) ?? 0) + 1);\n try {\n await api.sendMessage(threadId, text, toAttachments(images));\n } catch (e) {\n const n = (pendingSent.get(key) ?? 1) - 1;\n if (n > 0) pendingSent.set(key, n);\n else pendingSent.delete(key); // send failed — don't suppress a future identical message\n tui.print(`${c.dim}failed to send: ${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n interrupting = false; // a fresh turn — let the working indicator show again\n busy = true;\n tui.setWorking(true);\n };\n // ── `!command` bang ────────────────────────────────────────────────────────\n // A leading `!` runs a shell command NOW on the thread's execution owner\n // (wherever the session runs — a remote VPS daemon, not this watcher), prints\n // the output inline, and records it in thread history (so tuned-in clients see\n // it too). It never goes to the agent. The instance forwards it over the same\n // bridge the agent's tools use, so it always lands where execution lives.\n const whereLabel = remote ? runnerName : \"this machine\";\n let bangRunning = false;\n const runBangCommand = async (command: string) => {\n if (bangRunning) {\n tui.print(`${c.dim}a command is already running — one at a time.${c.reset}`);\n return;\n }\n bangRunning = true;\n tui.print(`${c.magenta}!${c.reset} ${c.dim}running on ${whereLabel}…${c.reset}`);\n try {\n const res = await api.runCommand(threadId, command);\n // The instance persisted it as a `user_command` system message; mark that\n // id shown so the poller doesn't render it a second time on this client.\n if (res.messageId) shownIds.add(res.messageId);\n printCommandBlock(tui, command, res.ok ? res.output ?? \"\" : res.error ?? \"command failed\", res.ok, whereLabel);\n } catch (e) {\n printCommandBlock(tui, command, e instanceof Error ? e.message : String(e), false, whereLabel);\n } finally {\n bangRunning = false;\n }\n };\n\n const flushQueued = async () => {\n if (!queued.length) return;\n const toSend = queued.splice(0);\n tui.setQueuedCount(0);\n for (const q of toSend) await sendNow(q.text, q.images);\n };\n\n // Manually kick off a background compaction. Spawns the non-blocking\n // compaction subagent server-side immediately (even while the thread is idle),\n // which then surfaces through the normal subagent display — no special CLI\n // message needed. Idempotent: a server-side lock prevents overlapping runs.\n const requestCompaction = async () => {\n try {\n await api.compact(threadId);\n } catch (err) {\n tui.print(`${c.red}✗${c.reset} couldn't start compaction: ${(err as Error).message}`);\n }\n };\n\n // /account — open the standardcode.ai dashboard, pre-authed when the\n // instance can mint a magic link for this thread's user (falls back to the\n // plain dashboard where they sign in by inbox link).\n const runAccountCommand = async () => {\n tui.print(`${c.gray}Opening your account…${c.reset}`);\n const link = await api.accountLink(threadId).catch(() => null);\n const target = link?.url ?? \"https://standardcode.ai/account\";\n openUrl(target);\n tui.print(\n link?.preauthed\n ? `${c.gray}→ account dashboard opened in your browser (signed in)${c.reset}`\n : `${c.gray}→ opened ${target} — sign in with your account email${c.reset}`\n );\n };\n\n // ── in-terminal parallel-session upgrade ──────────────────────────────────\n const ordinal = (n: number): string => {\n const s = [\"th\", \"st\", \"nd\", \"rd\"], v = n % 100;\n return `${n}${s[(v - 20) % 10] ?? s[v] ?? s[0]}`;\n };\n const fmtCost = (q: SessionQuote): string | null =>\n typeof q.amount_cents === \"number\" && q.amount_cents !== 0\n ? `$${(Math.abs(q.amount_cents) / 100).toFixed(2)}`\n : null;\n\n // A delightful, on-brand panel: gradient title, a session meter (● in use,\n // gradient + for the one being added, dim · for headroom), and an unambiguous\n // cost line (with the amber trial-conversion warning when applicable).\n const renderUpgradePanel = (q: SessionQuote): string => {\n const dots: string[] = [];\n for (let i = 0; i < q.max; i++) {\n if (i < q.current) dots.push(`${c.teal}●${c.reset}`);\n else if (i === q.current) dots.push(`${c.bold}${gradientText(\"+\")}${c.reset}`);\n else dots.push(`${c.dim}·${c.reset}`);\n }\n const cost = fmtCost(q);\n const lines = [\n \"\",\n `${c.bold}${gradientText(\"✦ Add a parallel session\")}${c.reset}`,\n \"\",\n `${dots.join(\" \")} ${c.dim}${q.current} of ${q.current} session${q.current === 1 ? \"\" : \"s\"} in use${c.reset}`,\n ];\n if (q.ends_trial) {\n lines.push(\n `${c.yellow}Your $5 trial covers 1 session. Adding a ${ordinal(q.sessions)} ends the trial${c.reset}`,\n `${c.yellow}and starts your $49/mo plan now${cost ? ` — ${c.bold}${cost} charged today${c.reset}${c.yellow}` : \"\"}.${c.reset}`,\n );\n } else if (cost) {\n lines.push(`Add a ${ordinal(q.sessions)} session at $49/mo — ${c.bold}${cost} charged now${c.reset}.`);\n } else {\n lines.push(`Add a ${ordinal(q.sessions)} session at $49/mo — prorated on your next invoice.`);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n };\n\n // Offer + apply an upgrade. `auto` = triggered by hitting the limit mid-turn\n // (we then resend the blocked message so the session just continues).\n const offerUpgrade = async (opts: { auto?: boolean } = {}) => {\n if (upgradeInFlight) return;\n upgradeInFlight = true;\n try {\n // Say WHY this appeared before doing anything else. When triggered by a\n // blocked turn (auto), the raw denial was deliberately swallowed — with\n // no explanation the browser opening reads as a glitch, not a limit.\n if (opts.auto) {\n tui.print(\n `${c.yellow}You're out of simultaneous sessions — another Standard Code session is using your slot.${c.reset}`\n );\n }\n const quote = await api.sessionsQuote(threadId);\n if (!quote) {\n // No subscription or billing unreachable → hand off to the dashboard.\n const link = await api.accountLink(threadId).catch(() => null);\n const target = link?.url ?? \"https://standardcode.ai/account\";\n tui.print(\n `${c.gray}Close the other session (its slot frees within ~90s) — or add another` +\n ` simultaneous session to your plan, then resend your message.${c.reset}`\n );\n openUrl(target);\n tui.print(`${c.gray}→ opened ${target} to manage your plan${c.reset}`);\n return;\n }\n if (quote.current >= quote.max) {\n tui.print(\n `${c.yellow}You're at the maximum of ${quote.max} parallel session${quote.max === 1 ? \"\" : \"s\"}.${c.reset}\\n` +\n `${c.gray}Close another session (its slot frees within ~90s), then resend your message.${c.reset}`\n );\n return;\n }\n tui.print(renderUpgradePanel(quote));\n const cost = fmtCost(quote);\n const confirmLabel = quote.ends_trial\n ? `End trial & start now${cost ? ` — pay ${cost} today` : \"\"}`\n : `Confirm${cost ? ` — pay ${cost} now` : \" — add the session\"}`;\n const choice = await tui.select(`Add a ${ordinal(quote.sessions)} parallel session?`, [\n { label: confirmLabel, value: \"go\" as const },\n { label: \"Not now\", value: \"no\" as const },\n ]);\n if (choice !== \"go\") {\n tui.print(`${c.gray}No change made — you can upgrade anytime with /upgrade.${c.reset}`);\n return;\n }\n tui.print(`${c.gray}Applying…${c.reset}`);\n let applied: { ok?: boolean; sessions?: number; error?: string };\n try {\n applied = await api.sessionsUpgrade(threadId, quote.sessions);\n } catch (e) {\n tui.print(`${c.red}✗${c.reset} Upgrade failed: ${e instanceof Error ? e.message : String(e)}`);\n return;\n }\n if (!applied?.ok) {\n tui.print(`${c.red}✗${c.reset} Upgrade failed: ${applied?.error ?? \"unknown error\"}`);\n return;\n }\n const n = applied.sessions ?? quote.sessions;\n tui.print(`${c.green}✓${c.reset} ${c.bold}${gradientText(`You now have ${n} parallel session${n === 1 ? \"\" : \"s\"}.`)}${c.reset}`);\n // Continue the blocked turn: resend the message that hit the limit.\n if (opts.auto && lastSent) {\n tui.print(`${c.gray}Continuing…${c.reset}`);\n await sendNow(lastSent.text, lastSent.images);\n }\n } finally {\n upgradeInFlight = false;\n }\n };\n\n // Recognize the lease service's at-limit / no-subscription denials (surfaced\n // as the hook's blocked-turn error text) so we can offer an upgrade in place.\n const isSessionLimitError = (msg: string): boolean =>\n /thread limit reached|simultaneous (thread|session)s?.*in use|no active standard code subscription/i.test(msg);\n\n // ── skills control surface (for the /skills command) ──────────────────────\n // Skills live in the INSTANCE (global across sessions); the CLI only lists\n // and toggles them over the API — nothing skill-related is stored locally.\n const skillsCtl: SkillsController = {\n list: () => api.listSkills(),\n setEnabled: (name, enabled) => api.setSkillEnabled(name, enabled),\n remove: (name) => api.removeSkill(name),\n // Seed the request into the main chat — the agent researches or authors\n // the skill there (research_agent + the skill tool's install action),\n // visible in the transcript.\n requestInstall: (query) => {\n void sendNow(\n `Install a skill for me: ${query}. Find the skill's published files (or author a proper SKILL.md from your research), install it, then tell me what it can do.`\n );\n },\n };\n\n // Slash-command palette: typing \"/\" filters this list inline above the prompt.\n // Each command is individually addressable (/compact, /mcp, …). Hints are\n // functions so live state (context %, level, counts) stays fresh as it redraws.\n tui.setCommands([\n {\n name: \"clear\",\n label: \"Clear conversation\",\n hint: \"start a fresh session\",\n run: () => endSession(),\n },\n {\n name: \"compact\",\n label: \"Compact conversation now\",\n hint: () => tui.contextPctLabel() || \"free up context\",\n run: requestCompaction,\n },\n { name: \"level\", label: \"Auto-accept level\", hint: () => `level ${tui.level}`, run: () => runLevelMenu(tui, perm) },\n {\n name: \"permissions\",\n label: \"Approved commands\",\n hint: () => {\n const n = perm.alwaysAllow.size + perm.allowRisk.size;\n return n ? `${n} approved` : \"none\";\n },\n run: () => runApprovalsMenu(tui, perm, () => saveApprovals(api, threadId, perm)),\n },\n // MCP servers are hosted by whichever client executes the tools — hide\n // the local MCP manager in a remote session (the daemon hosts them there).\n ...(remote\n ? []\n : [\n {\n name: \"mcp\",\n label: \"MCP servers\",\n hint: () => {\n const n = mcpCtl.connectedNames().length;\n return n ? `${n} connected` : \"none\";\n },\n run: () => runMcpMenu(tui, mcpCtl),\n },\n ]),\n {\n name: \"machines\",\n label: \"Your machines\",\n hint: \"list, rename, update, manage projects\",\n run: () => runMachinesMenu(tui, api, session.identity),\n },\n {\n name: \"daemon\",\n label: \"Machine daemon\",\n hint: () => (serviceStatus().installed ? \"installed on this machine\" : \"not installed here\"),\n run: () => showDaemonInfo(tui, session),\n },\n {\n name: \"skills\",\n label: \"Agent skills\",\n hint: \"list / install / manage\",\n run: () => runSkillsMenu(tui, skillsCtl),\n },\n {\n name: \"account\",\n label: \"Manage your account\",\n hint: \"billing & sessions, opens in browser\",\n run: () => runAccountCommand(),\n },\n {\n name: \"upgrade\",\n label: \"Add a parallel session\",\n hint: \"run more sessions at once\",\n run: () => offerUpgrade(),\n },\n { name: \"background\", label: \"Background processes\", hint: \"list / stop\", run: () => runProcessMenu(tui, bgMgr) },\n { name: \"keybindings\", label: \"Keyboard shortcuts\", run: () => showKeybindings(tui) },\n { name: \"update\", label: \"Check for updates\", hint: \"check for a newer version\", run: () => runUpdateCommand(tui) },\n { name: \"logout\", label: \"Sign out\", hint: \"delete the saved token & quit\", run: () => logout() },\n { name: \"quit\", label: \"Quit\", run: () => quit() },\n ]);\n\n // Seed ↑/↓ recall from the thread KV (inheriting the project's newest prior\n // thread on a fresh session); every submit appends (whether it sends now or\n // queues) so history survives across sessions — all server-side, nothing on\n // the local filesystem.\n const history = await loadHistory(api, threadId, historySeedThreadId);\n tui.setHistory(history);\n\n tui.onSubmit = (text, images) => {\n // `!command` — run a shell command on the execution owner immediately,\n // out of band from the agent. `!!` escapes to a literal message starting\n // with `!`. A bare `!` (no command) is ignored.\n const trimmed = text.trimStart();\n if (trimmed.startsWith(\"!\") && !trimmed.startsWith(\"!!\")) {\n const command = trimmed.slice(1).trim();\n if (command) {\n appendHistory(api, threadId, history, text);\n void runBangCommand(command);\n }\n return;\n }\n const outgoing = trimmed.startsWith(\"!!\") ? text.replace(\"!!\", \"!\") : text;\n appendHistory(api, threadId, history, outgoing);\n text = outgoing;\n if (editingQueued) {\n editingQueued = false;\n queued.push({ text, images });\n tui.setQueuedCount(queued.length);\n tui.print(`${c.gray}⏳ queued:${c.reset} ${text}`);\n return;\n }\n if (busy) {\n queued.push({ text, images });\n tui.setQueuedCount(queued.length);\n tui.print(`${c.gray}⏳ queued:${c.reset} ${text} ${c.dim}(esc to steer now)${c.reset}`);\n } else {\n void sendNow(text, images);\n }\n };\n\n tui.onInterrupt = () => {\n if (queued.length > 0) {\n tui.print(`${c.yellow}↪ steering — stopping current work and sending your message…${c.reset}`);\n void api\n .stop(threadId)\n .catch(() => {})\n .then(() => flushQueued());\n } else if (busy) {\n // Optimistically stop the working indicator so esc feels immediate.\n interrupting = true;\n busy = false;\n activeSteps.clear();\n liveOut = 0;\n tui.setWorking(false);\n refreshStatus();\n tui.print(`${c.yellow}[interrupted by user]${c.reset}`);\n void api.stop(threadId).catch(() => {});\n }\n };\n\n // Enter on the ←-selected [⚙ n bg] prompt badge opens the same panel as\n // the /background slash command.\n tui.onBgBadge = () => {\n void runProcessMenu(tui, bgMgr).catch(() => {});\n };\n\n // Up on an empty top line first pulls the last QUEUED message back for\n // editing (returning true consumes the key); otherwise the TUI falls through\n // to history recall.\n tui.onUpArrow = () => {\n if (tui.getInput().trim() || queued.length === 0) return false;\n const q = queued.pop()!;\n tui.setQueuedCount(queued.length);\n editingQueued = true;\n tui.setInput(q.text, q.images);\n return true;\n };\n\n events.connect();\n await Promise.all([...(bridge ? [bridge.connect()] : []), stream.connect()]);\n // Whether THIS client executes forwarded tools — gates owner-only side\n // effects below (MCP hosting/catalog). Legacy instances never answer, so\n // the timeout falls back to the assumed-owner default.\n const ownsExecution = bridge ? await bridge.whenOwnershipKnown(3000) : false;\n\n // Seed the live goal checklist; it then stays current via goal_updated events.\n void api.getGoal(threadId).then((g) => tui.setGoal(g)).catch(() => {});\n\n attaching.stop();\n tui.banner(\n remote\n ? [\n `${c.bold}${c.magenta}Standard Code${c.reset} ${c.dim}— coding agent${c.reset}`,\n `${c.gray}project:${c.reset} ${session.remotePath ?? \"?\"} ${c.teal}on ${runnerName}${c.reset}`,\n `${c.gray}runs on:${c.reset} ${runnerName} ${c.dim}(daemon executes tools; you're watching from ${machine})${c.reset} ${c.gray}thread:${c.reset} ${threadId.slice(0, 8)}`,\n ]\n : [\n `${c.bold}${c.magenta}Standard Code${c.reset} ${c.dim}— coding agent${c.reset}`,\n `${c.gray}project:${c.reset} ${projectDir}`,\n `${c.gray}machine:${c.reset} ${machine} ${c.gray}thread:${c.reset} ${threadId.slice(0, 8)}`,\n ]\n );\n if (!remote && session.suggestDaemonInstall && process.platform !== \"win32\" && !serviceStatus().installed) {\n tui.print(\n `${c.dim}Tip: install the always-on daemon (${c.reset}standardcode daemon install${c.dim}) to start sessions on this machine from anywhere.${c.reset}`\n );\n }\n\n if (resumed) await printHistory(api, threadId, tui);\n\n // Seed shown-ids so the poller doesn't re-print existing history.\n try {\n (await api.getMessages(threadId, 200)).forEach((m: any) => shownIds.add(m.id));\n } catch {\n // ignore\n }\n\n const runningProcs = (await registry.list()).filter((p) => p.status === \"running\");\n if (runningProcs.length) {\n tui.print(\n `${c.cyan}⚙ ${runningProcs.length} background process${runningProcs.length === 1 ? \"\" : \"es\"} running:${c.reset}`\n );\n for (const p of runningProcs) tui.print(`${c.gray} ${p.id} ${p.description || p.command}${c.reset}`);\n }\n refreshBgCount();\n\n // Connect every enabled MCP server, then publish the catalog so the agent sees\n // the tools on its very first step. (The CLI is the MCP host; this is the real\n // initialize/tools-list handshake with each local server, via the shared\n // ExecutionSession.) A remote session or a non-owner skips this — the\n // executing client owns the MCP catalog.\n if (exec && ownsExecution) {\n for (const res of await exec.connectEnabledMcpServers()) {\n if (res.ok) {\n tui.print(`${c.cyan}⚡ MCP \"${res.name}\" connected${c.reset} ${c.gray}(${res.tools} tool${res.tools === 1 ? \"\" : \"s\"})${c.reset}`);\n } else {\n tui.print(`${c.red}⚠ MCP \"${res.name}\" failed:${c.reset} ${c.gray}${res.error}${c.reset}`);\n }\n }\n }\n\n tui.start(); // begin the persistent input line\n\n // ── approval relay (remote sessions) ───────────────────────────────────────\n // When the runner's daemon needs a human decision, it parks an\n // `approval_request` in the thread KV. This watching client renders the\n // normal approval prompt and writes the decision back; the daemon applies\n // it and clears the keys. First responder wins if several clients watch.\n const answeredApprovals = new Set<string>();\n let approvalPromptOpen = false;\n const relayApprovals = async (): Promise<void> => {\n // Any non-executing client relays: a remote watcher, but also a local\n // session that lost (or never got) ownership — e.g. this machine's daemon\n // or another terminal owns the thread and needs a human to approve.\n const watching = remote || (bridge ? !bridge.isOwner : false);\n if (!watching || approvalPromptOpen) return;\n const request = parseApprovalRequest(await api.kvGet(threadId, APPROVAL_REQUEST_KEY));\n if (!request || answeredApprovals.has(request.tool_call_id)) return;\n approvalPromptOpen = true;\n try {\n // The approval dialog handles deny-with-feedback itself and returns the\n // final { choice, reason } — write it straight through to the relay.\n const { choice, reason } = await tui.approval(\n `${request.summary}${request.permission ? `\\n${c.bold}why: ${request.permission}${c.reset}` : \"\"}\\n${c.dim}runs on ${request.machine || runnerName}${c.reset}`,\n request.risk\n );\n answeredApprovals.add(request.tool_call_id);\n await writeApprovalResponse(api, threadId, {\n tool_call_id: request.tool_call_id,\n choice,\n reason,\n decided_at: Date.now(),\n });\n } finally {\n approvalPromptOpen = false;\n }\n };\n\n // ── poller: display new messages, drive the working indicator, flush queue ──\n const poll = async () => {\n let msgs: any[];\n try {\n msgs = await api.getMessages(threadId, 60);\n } catch {\n return;\n }\n const sorted = [...msgs].sort((a, b) => (a.created_at ?? 0) - (b.created_at ?? 0));\n for (const m of sorted) {\n if (shownIds.has(m.id) || m.status === \"pending\") continue;\n shownIds.add(m.id);\n const text = messageText(m.content).trim();\n // At-limit / no-subscription denial (from the enforce_thread_leases hook)\n // → offer the in-terminal upgrade instead of printing the raw error. The\n // stream's onError catches the same condition; upgradeInFlight dedups.\n const denial = (typeof m.error === \"string\" && m.error) || text;\n if (denial && isSessionLimitError(denial)) {\n void offerUpgrade({ auto: true });\n continue;\n }\n // A user `!command` is persisted as a system message tagged\n // `user_command` — render it as a command block on every client (the one\n // that ran it already marked its id shown; this is for the others).\n if (m.metadata?.user_command) {\n printCommandBlock(\n tui,\n String(m.metadata.command ?? \"\"),\n String(m.metadata.output ?? text),\n m.metadata.ok !== false\n );\n continue;\n }\n if (m.role === \"assistant\" && text) printAssistant(tui, text);\n else if (m.role === \"system\" && text) tui.print(`${c.dim}${text}${c.reset}`);\n else if (m.role === \"user\" && text) {\n const pending = pendingSent.get(text) ?? 0;\n if (pending > 0) {\n // Our own optimistic send, now confirmed — already on screen.\n if (pending === 1) pendingSent.delete(text);\n else pendingSent.set(text, pending - 1);\n } else {\n // Submitted from elsewhere — render it as a normal sent user message.\n tui.printUserMessage(text);\n }\n }\n }\n const polledBusy = threadBusy(msgs);\n // While interrupting, keep the indicator off until the backend has actually\n // gone idle — then clear the latch so future turns show \"Working\" again.\n if (interrupting) {\n if (!polledBusy) interrupting = false;\n busy = false;\n } else {\n busy = polledBusy;\n }\n tui.setWorking(busy);\n if (!busy) {\n // Turn finished — clear any stale step + in-progress live count.\n if (activeSteps.size) activeSteps.clear();\n liveOut = 0;\n refreshStatus();\n if (queued.length > 0 && !editingQueued) await flushQueued();\n }\n refreshBgCount();\n void relayApprovals().catch(() => {});\n\n // Authoritative token totals from completed LLM-call logs.\n try {\n const logs = await api.getLogs(threadId, 100);\n let landed = 0;\n for (const l of logs) {\n // Skip until the call is finalized — an in-progress log has null tokens,\n // and counting it early would mark its id seen before the real counts land.\n if (!l.is_complete) continue;\n const id = l.id ?? `${l.created_at}:${l.total_tokens}`;\n if (countedLogs.has(id)) continue;\n countedLogs.add(id);\n const inT = Number(l.input_tokens) || 0;\n const outT = Number(l.output_tokens) || 0;\n tokensIn += inT;\n tokensOut += outT;\n landed += outT;\n }\n if (landed > 0) liveOut = 0; // a real count arrived; drop the live estimate\n refreshStatus();\n } catch {\n // ignore — token feed is best-effort\n }\n\n // Context gauge: the runtime records the latest request's input tokens\n // (the true serialized context size) and the model's window to thread KV.\n // Scaled to the COMPACTION POINT, not the raw window: the instance triggers\n // background compaction at half the model's context (its\n // TRIGGER_CONTEXT_FRACTION), so 100% here = \"compaction is about to run\",\n // which is the only ceiling the user can actually hit.\n const COMPACTION_TRIGGER_FRACTION = 0.5;\n // Mirrors the instance's TRIGGER_TOKENS_CAP: compaction fires at\n // min(50% of the window, 50k tokens), so the gauge tops out there too.\n const COMPACTION_TRIGGER_CAP = 50_000;\n try {\n const cu = (await api.kvGet(threadId, \"context_usage\")) as\n | { inputTokens?: number; maxContextTokens?: number }\n | null;\n const used = Number(cu?.inputTokens) || 0;\n const max = Math.min(\n (Number(cu?.maxContextTokens) || 0) * COMPACTION_TRIGGER_FRACTION || Infinity,\n COMPACTION_TRIGGER_CAP,\n );\n tui.setContextPct(max > 0 && used > 0 ? (used / max) * 100 : null);\n } catch {\n // ignore — gauge is best-effort\n }\n };\n const pollTimer = setInterval(() => void poll().catch(() => {}), 1200);\n\n // Event-driven from here. The promise resolves only on `/clear` — quit exits\n // the process without ever resolving it.\n await sessionEnded;\n\n // ── /clear teardown: silence this session so the next one owns the TUI ────\n clearInterval(pollTimer);\n clearInterval(heartbeatPoll);\n // Stop the remote turn (the LLM loop runs server-side) and this machine's\n // background processes — the fresh thread's registry won't know about them.\n // Only the execution owner stops the turn: clearing away from a session\n // that runs elsewhere must not kill the work still executing there.\n const stopped = (bridge?.isOwner ?? false)\n ? api.stop(threadId).catch(() => {})\n : Promise.resolve();\n const procsStopped = host ? host.stopAllLocalProcesses().catch(() => 0) : Promise.resolve(0);\n bridge?.close();\n stream.close();\n events.close();\n subActivity.closeAll();\n mcp?.closeAll();\n const [, killed] = await Promise.race([\n Promise.all([stopped, procsStopped]),\n new Promise<[unknown, number]>((r) => setTimeout(() => r([undefined, 0]), 1500)),\n ]);\n // Reset the live bottom-region signals so nothing from the old thread lingers\n // while the new session boots and re-seeds them.\n tui.setWorking(false);\n tui.setSubagents([]);\n tui.setGoal(null);\n tui.setQueuedCount(0);\n tui.setContextPct(null);\n tui.setStep(null, 0);\n tui.setBackgroundCount(0);\n if (killed > 0) {\n tui.print(`${c.cyan}⚙${c.reset} Stopped ${killed} background process${killed === 1 ? \"\" : \"es\"}.`);\n }\n tui.print(`${c.dim}── conversation cleared — starting a fresh session ──${c.reset}`);\n}\n\ninterface BgManager {\n list: () => Promise<{ id: string; command: string; description?: string; status: string; pid: number; exitCode?: number | null }[]>;\n stop: (id: string) => Promise<void>;\n}\n\ninterface SkillsController {\n list: () => Promise<SkillInfo[]>;\n setEnabled: (name: string, enabled: boolean) => Promise<void>;\n remove: (name: string) => Promise<void>;\n /** Seed an install request into the main chat for the agent to research + install. */\n requestInstall: (query: string) => void;\n}\n\n/**\n * Interactive skills control surface (reached via `/skills`). Lists installed\n * skills with enabled state, and lets you install (free-text request handled\n * by the agent in-chat), enable/disable, inspect, and remove — all menu-driven.\n */\nasync function runSkillsMenu(tui: Tui, skills: SkillsController): Promise<void> {\n let list: SkillInfo[];\n try {\n list = await skills.list();\n } catch (e) {\n tui.print(`${c.red}✗ couldn't load skills:${c.reset} ${c.gray}${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n\n const INSTALL = \"__install__\";\n const items = list.map((s) => ({\n label: s.name,\n hint: `${s.enabled ? \"enabled\" : \"disabled\"} · ${s.files.length} file${s.files.length === 1 ? \"\" : \"s\"}`,\n value: s.name,\n }));\n items.push({ label: \"+ Install a skill…\", hint: \"find & install\", value: INSTALL });\n\n const picked = await tui.select(\n `${c.bold}Agent skills${c.reset} ${c.dim}(↑/↓ · enter · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n\n if (picked === INSTALL) {\n const query = await tui.prompt(\n \"What skill do you want to install?\",\n \"the anthropic pdf skill / a skill for writing conventional commits\"\n );\n if (query) skills.requestInstall(query);\n return;\n }\n\n const skill = list.find((s) => s.name === picked)!;\n tui.print(`${c.cyan}${skill.name}${c.reset}${skill.version ? ` ${c.dim}v${skill.version}${c.reset}` : \"\"} ${c.gray}— ${skill.description}${c.reset}`);\n const action = await tui.select(`${c.bold}${picked}${c.reset}`, [\n skill.enabled\n ? { label: \"Disable (hide from the agent)\", value: \"disable\" as const }\n : { label: \"Enable\", value: \"enable\" as const },\n { label: \"View files\", value: \"files\" as const },\n { label: \"Remove this skill\", value: \"remove\" as const },\n { label: \"Back\", value: \"back\" as const },\n ]);\n\n try {\n if (action === \"enable\" || action === \"disable\") {\n await skills.setEnabled(picked, action === \"enable\");\n tui.print(`${c.gray}${action}d ${picked}${c.reset}`);\n } else if (action === \"files\") {\n for (const f of skill.files) tui.print(` ${c.gray}${f}${c.reset}`);\n } else if (action === \"remove\") {\n await skills.remove(picked);\n tui.print(`${c.gray}removed ${picked}${c.reset}`);\n }\n } catch (e) {\n tui.print(`${c.red}✗ ${e instanceof Error ? e.message : String(e)}${c.reset}`);\n }\n}\n\ninterface McpController {\n configured: () => McpServerConfig[];\n connectedNames: () => string[];\n catalog: () => { servers: { name: string; status: string; tools: { name: string; description?: string }[]; resources: { uri: string }[]; error?: string }[] };\n connect: (cfg: McpServerConfig) => Promise<{ ok: boolean; tools?: number; error?: string }>;\n disconnect: (name: string) => void;\n add: (cfg: McpServerConfig) => Promise<{ ok: boolean; tools?: number; error?: string }>;\n remove: (name: string) => void;\n setEnabled: (name: string, enabled: boolean) => void;\n /** Seed an install request into the main chat for the agent to research + install. */\n requestInstall: (query: string) => void;\n}\n\n/** The `/` configuration menu: clear, permission mode, approvals, processes, shortcuts, sign out, quit. */\n/** The auto-accept level submenu (reached via `/level`). */\nasync function runLevelMenu(tui: Tui, perm: PermissionState): Promise<void> {\n const picked = await tui.select(\n `${c.bold}Auto-accept level${c.reset} ${c.dim}(↑/↓ · enter · shift-tab cycles)${c.reset}`,\n LEVELS.map((l) => ({\n label: levelLabel(l),\n hint: l === tui.level ? \"current\" : \"\",\n value: l,\n }))\n );\n if (picked) {\n tui.setLevel(picked);\n perm.level = picked;\n }\n}\n\n/**\n * `/machines` — manage the machines on your account: list them (name,\n * hostname, platform, version, online status, projects), rename, force a\n * standardcode update, and add/remove project directories. The LOCAL machine\n * is managed directly (this client is on its filesystem); a REMOTE machine is\n * managed by queueing a command its daemon drains within ~8s.\n */\nasync function runMachinesMenu(tui: Tui, api: ApiClient, self: MachineIdentity): Promise<void> {\n let machines: MachineRecord[];\n try {\n machines = await loadMachines(api);\n } catch (e) {\n tui.print(`${c.red}✗ couldn't load machines:${c.reset} ${c.gray}${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n if (!machines.length) {\n tui.print(`${c.gray}No machines registered yet. Run standardcode on a machine (or install its daemon) to register it.${c.reset}`);\n return;\n }\n machines.sort((a, b) => (b.updated_at ?? 0) - (a.updated_at ?? 0));\n\n const picked = await tui.select(\n `${c.bold}Your machines${c.reset} ${c.dim}(↑/↓ · enter · esc)${c.reset}`,\n machines.map((m) => {\n const isSelf = m.id === self.machine_id;\n const online = daemonOnline(m);\n const daemonBit = m.daemon ? (online ? \"daemon online\" : \"daemon offline\") : \"no daemon\";\n const nproj = Object.keys(m.projects).length;\n return {\n label: `${m.name}${isSelf ? \" (this machine)\" : \"\"}`,\n hint: `${m.hostname} · ${m.platform}/${m.arch} · v${m.version ?? \"?\"} · ${daemonBit} · ${nproj} project${nproj === 1 ? \"\" : \"s\"}`,\n value: m.id,\n };\n })\n );\n if (!picked) return;\n const machine = machines.find((m) => m.id === picked)!;\n await manageMachine(tui, api, self, machine);\n}\n\n/** Submenu for one machine: rename / update / projects. */\nasync function manageMachine(\n tui: Tui,\n api: ApiClient,\n self: MachineIdentity,\n machine: MachineRecord\n): Promise<void> {\n const isSelf = machine.id === self.machine_id;\n const online = daemonOnline(machine);\n // Rename is an ACCOUNT edit — works for any machine with no daemon needed.\n // Update / project changes act on the machine's filesystem, so they need a\n // daemon there (queued for a remote machine); this machine can always do them.\n const canRunCommands = isSelf || !!machine.daemon;\n\n const options: { label: string; hint?: string; value: string }[] = [\n { label: \"Rename\", value: \"rename\" },\n ];\n if (canRunCommands) {\n options.push(\n { label: \"Update standardcode\", hint: `v${machine.version ?? \"?\"} → latest`, value: \"update\" },\n { label: \"Manage projects\", hint: `${Object.keys(machine.projects).length}`, value: \"projects\" }\n );\n }\n options.push({ label: \"Back\", value: \"back\" });\n\n if (!isSelf && !machine.daemon) {\n tui.print(\n `${c.dim}${machine.name} has no daemon — you can rename it here; update and project changes need its daemon installed.${c.reset}`\n );\n } else if (!isSelf && machine.daemon && !online) {\n tui.print(\n `${c.dim}${machine.name}'s daemon is offline — queued changes apply when it next comes online.${c.reset}`\n );\n }\n\n const action = await tui.select(`${c.bold}${machine.name}${c.reset}`, options);\n if (!action || action === \"back\") return;\n\n // update / project changes: apply directly on the local machine, or queue a\n // command for a remote machine's daemon to drain.\n const dispatch = async (\n kind: MachineCommand[\"kind\"],\n args?: Record<string, unknown>\n ): Promise<void> => {\n if (isSelf) {\n await applyMachineCommand(api, self, { id: \"local\", kind, args, requested_at: Date.now() });\n } else {\n await enqueueMachineCommand(api, machine.id, kind, args);\n }\n };\n const applyNote = isSelf\n ? \"applied\"\n : `queued — ${machine.name}'s daemon will apply it within ~10s`;\n\n if (action === \"rename\") {\n const name = await tui.prompt(`New name for ${machine.name}`, machine.name);\n if (name === null || !name.trim()) return;\n // Names are ACCOUNT data — a direct user-KV write, authoritative for any\n // machine (no daemon round-trip, can't be reverted by a heartbeat).\n await setMachineName(api, machine.id, name.trim());\n tui.print(`${c.green}✓${c.reset} Renamed ${c.bold}${machine.name}${c.reset} → ${c.bold}${name.trim()}${c.reset}.`);\n } else if (action === \"update\") {\n if (isSelf) {\n // Updating THIS machine's CLI = the normal foreground update.\n await runUpdateCommand(tui);\n } else {\n const go = await tui.select(`Force ${machine.name} to update standardcode now?`, [\n { label: \"Yes, update & restart its daemon\", value: \"yes\" as const },\n { label: \"Cancel\", value: \"no\" as const },\n ]);\n if (go !== \"yes\") return;\n await dispatch(\"update\");\n tui.print(`${c.green}✓${c.reset} Update ${c.gray}${applyNote} (its daemon updates and restarts on the new version).${c.reset}`);\n }\n } else if (action === \"projects\") {\n await manageMachineProjects(tui, api, self, machine, dispatch, applyNote);\n }\n}\n\n/** Add/remove project directories on a machine. */\nasync function manageMachineProjects(\n tui: Tui,\n api: ApiClient,\n self: MachineIdentity,\n machine: MachineRecord,\n dispatch: (kind: MachineCommand[\"kind\"], args?: Record<string, unknown>) => Promise<void>,\n applyNote: string\n): Promise<void> {\n const ADD = \"__add__\";\n const paths = Object.keys(machine.projects).sort();\n const picked = await tui.select(\n `${c.bold}Projects on ${machine.name}${c.reset} ${c.dim}(enter to remove · esc)${c.reset}`,\n [\n ...paths.map((p) => ({ label: p, hint: \"enter to remove\", value: p })),\n { label: \"+ Add a project directory…\", hint: \"absolute path\", value: ADD },\n ]\n );\n if (!picked) return;\n if (picked === ADD) {\n const path = await tui.prompt(\n `Absolute project path on ${machine.name}`,\n machine.id === self.machine_id ? process.cwd() : \"/home/you/project\"\n );\n if (!path || !path.trim()) return;\n const trimmed = path.trim();\n if (!trimmed.startsWith(\"/\") && !trimmed.startsWith(\"~\")) {\n tui.print(`${c.yellow}Use an absolute path (starting with / or ~).${c.reset}`);\n return;\n }\n await dispatch(\"add_project\", { path: trimmed });\n tui.print(`${c.green}✓${c.reset} Add ${trimmed} ${c.gray}${applyNote}.${c.reset}`);\n } else {\n await dispatch(\"remove_project\", { path: picked });\n tui.print(`${c.green}✓${c.reset} Remove ${picked} ${c.gray}${applyNote}.${c.reset}`);\n }\n}\n\n/**\n * `/daemon` — where this session executes + how to install the always-on\n * daemon on this machine. Installation itself runs outside the TUI\n * (`standardcode daemon install`) because it needs plain readline + launchd/\n * systemd interaction.\n */\nfunction showDaemonInfo(tui: Tui, session: SessionLocation): void {\n if (session.mode === \"remote\" && session.runner) {\n tui.print(\n `${c.gray}This session runs on${c.reset} ${c.bold}${session.runner.name}${c.reset} ${c.gray}(${session.runner.hostname}) — its daemon executes the tools.${c.reset}`\n );\n } else {\n tui.print(`${c.gray}This session runs on this machine.${c.reset}`);\n }\n const status = serviceStatus();\n tui.print(\n `${c.gray}Daemon on this machine:${c.reset} ${status.installed ? status.detail : \"not installed\"}`\n );\n if (!status.installed) {\n tui.print(\n `${c.gray}Install it to start sessions on this machine from anywhere:${c.reset} ${c.bold}standardcode daemon install${c.reset}`\n );\n tui.print(\n `${c.dim}The daemon keeps running after you close the terminal — it self-restarts, self-updates, and executes sessions you start from other machines.${c.reset}`\n );\n } else {\n tui.print(`${c.dim}Manage it with standardcode daemon status | uninstall | add-project <path>.${c.reset}`);\n }\n}\n\n/** Print the keyboard-shortcut reference (reached via `/keybindings`). */\nfunction showKeybindings(tui: Tui): void {\n tui.print(`${c.gray}shortcuts:${c.reset}`);\n tui.print(`${c.gray} shift-tab${c.reset} cycle auto-accept level (1–5)`);\n tui.print(`${c.gray} /${c.reset} open the command palette (type to filter)`);\n tui.print(`${c.gray} !cmd${c.reset} run a shell command on the session's machine (e.g. !ls); !! to send a literal !`);\n tui.print(`${c.gray} ctrl-v${c.reset} paste an image from the clipboard ([#Image 1])`);\n tui.print(`${c.gray} ↑ / ↓${c.reset} cycle past messages (on the input's top line)`);\n tui.print(`${c.gray} ←${c.reset} from the start of the input: select the [⚙ n bg] badge (enter opens it)`);\n tui.print(`${c.gray} ctrl-c${c.reset} quit`);\n}\n\n/** Check npm for a newer version and prompt to update. */\nasync function runUpdateCommand(tui: Tui): Promise<void> {\n const version = readVersion();\n const result = await forceCheckForUpdate(version);\n if (!result) {\n tui.print(`${c.green}✓${c.reset} ${c.gray}@standardagents/code${c.reset} is up to date (v${version})`);\n return;\n }\n const { latest } = result;\n tui.print(`\\n ${c.yellow}⟳${c.reset} Update available: ${c.gray}v${version}${c.reset} → ${c.green}v${latest}${c.reset}`);\n // Update through the package manager that owns this install — updating a\n // pnpm/bun/yarn-managed global with npm would fork it into competing copies.\n const pm = detectPackageManager();\n if (!pm) {\n tui.print(` ${c.gray}This is a source checkout — pull the repo to update.${c.reset}`);\n return;\n }\n const { display } = updateCommand(pm);\n const choice = await tui.select(`Update now with \\`${display}\\`?`, [\n { label: \"Yes, update now\", value: \"yes\" as const },\n { label: \"No, skip\", value: \"no\" as const },\n ]);\n if (choice === \"yes\") {\n tui.print(` ${c.gray}Running ${display}…${c.reset}`);\n const { ok, output: pmOutput } = await runUpdate(pm);\n if (ok) {\n tui.print(` ${c.green}✓${c.reset} Updated to v${latest}. Restart to use the new version.`);\n } else {\n tui.print(` ${c.red}✗${c.reset} Update failed:`);\n for (const line of pmOutput.trim().split(\"\\n\").slice(-6)) {\n tui.print(` ${c.dim}${line}${c.reset}`);\n }\n }\n } else {\n tui.print(` ${c.gray}Skipped. Run /update later.${c.reset}`);\n }\n}\n\n/** Submenu listing tracked background processes; lets you stop a running one. */\nasync function runProcessMenu(tui: Tui, bg: BgManager): Promise<void> {\n const procs = await bg.list();\n if (!procs.length) {\n tui.print(`${c.gray}No background processes for this session.${c.reset}`);\n return;\n }\n const items = procs.map((p) => {\n const status =\n p.status === \"running\"\n ? `${c.green}running${c.reset}`\n : `${c.gray}${p.status}${typeof p.exitCode === \"number\" ? ` (exit ${p.exitCode})` : \"\"}${c.reset}`;\n return {\n label: `${p.description || p.command}`,\n hint: `${p.id} · ${status}`,\n value: p.id,\n };\n });\n const picked = await tui.select(\n `${c.bold}Background processes${c.reset} ${c.dim}(↑/↓ · enter to manage · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n const proc = procs.find((p) => p.id === picked);\n if (!proc || proc.status !== \"running\") {\n tui.print(`${c.gray}${picked} is not running.${c.reset}`);\n return;\n }\n const action = await tui.select(`${c.bold}${proc.description || proc.command}${c.reset}`, [\n { label: \"Stop this process\", value: \"stop\" as const },\n { label: \"Leave it running\", value: \"leave\" as const },\n ]);\n if (action === \"stop\") {\n await bg.stop(picked);\n tui.print(`${c.gray}stopped ${picked}${c.reset}`);\n }\n}\n\n/** Submenu showing the session's pre-approved tools/risk levels; pick one to revoke. */\nasync function runApprovalsMenu(tui: Tui, perm: PermissionState, save: () => void): Promise<void> {\n const tools = Array.from(perm.alwaysAllow).sort();\n const risks = Array.from(perm.allowRisk).sort((a, b) => a - b);\n if (!tools.length && !risks.length) {\n tui.print(\n `${c.gray}No pre-approved commands. At a permission prompt, choose \"Always allow this tool\" or \"Allow all level N\" to add some.${c.reset}`\n );\n return;\n }\n const items = [\n ...tools.map((t) => ({ label: `Tool: ${t}`, hint: \"always allowed\", value: `tool:${t}` })),\n ...risks.map((r) => ({ label: `Risk level ${r} and below`, hint: \"auto-accepted\", value: `risk:${r}` })),\n { label: \"Clear all approvals\", hint: \"\", value: \"clear\" },\n ];\n const picked = await tui.select(\n `${c.bold}Approved commands${c.reset} ${c.dim}(enter to revoke · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n if (picked === \"clear\") {\n perm.alwaysAllow.clear();\n perm.allowRisk.clear();\n tui.print(`${c.gray}cleared all approvals${c.reset}`);\n } else if (picked.startsWith(\"tool:\")) {\n const t = picked.slice(5);\n perm.alwaysAllow.delete(t);\n tui.print(`${c.gray}revoked tool ${t}${c.reset}`);\n } else if (picked.startsWith(\"risk:\")) {\n const r = Number(picked.slice(5));\n perm.allowRisk.delete(r);\n tui.print(`${c.gray}revoked level ${r}${c.reset}`);\n }\n save();\n}\n\n/**\n * Interactive MCP control surface (reached via `/` → \"MCP servers\"). Lists\n * configured servers with status, and lets you add (free-text command), view\n * tools, connect/disconnect, enable/disable, and remove — all menu-driven.\n */\nasync function runMcpMenu(tui: Tui, mcp: McpController): Promise<void> {\n const configured = mcp.configured();\n const connected = new Set(mcp.connectedNames());\n const cat = mcp.catalog();\n\n const INSTALL = \"__install__\";\n const ADD_MANUAL = \"__manual__\";\n const items = configured.map((s) => {\n const entry = cat.servers.find((e) => e.name === s.name);\n const status = !s.enabled\n ? \"disabled\"\n : connected.has(s.name)\n ? `connected · ${entry?.tools.length ?? 0} tools`\n : entry?.error\n ? \"error\"\n : \"disconnected\";\n return { label: s.name, hint: status, value: s.name };\n });\n items.push({ label: \"+ Install a new MCP server…\", hint: \"find & install\", value: INSTALL });\n items.push({ label: \"Add manually (name: command)…\", hint: \"advanced\", value: ADD_MANUAL });\n\n const picked = await tui.select(\n `${c.bold}MCP servers${c.reset} ${c.dim}(↑/↓ · enter · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n\n if (picked === INSTALL) {\n await installMcpServerFlow(tui, mcp);\n return;\n }\n if (picked === ADD_MANUAL) {\n await addMcpServer(tui, mcp);\n return;\n }\n\n const server = configured.find((s) => s.name === picked)!;\n const isConnected = connected.has(picked);\n\n const action = await tui.select(`${c.bold}${picked}${c.reset}`, [\n { label: \"View tools\", value: \"tools\" as const },\n isConnected\n ? { label: \"Disconnect\", value: \"disconnect\" as const }\n : { label: \"Connect\", value: \"connect\" as const },\n server.enabled\n ? { label: \"Disable (don't auto-connect)\", value: \"disable\" as const }\n : { label: \"Enable (auto-connect on start)\", value: \"enable\" as const },\n { label: \"Remove this server\", value: \"remove\" as const },\n { label: \"Back\", value: \"back\" as const },\n ]);\n\n if (action === \"tools\") {\n const entry = mcp.catalog().servers.find((e) => e.name === picked);\n if (!entry || entry.status !== \"connected\") {\n tui.print(`${c.gray}${picked} is not connected — connect it to list tools.${c.reset}`);\n return;\n }\n if (!entry.tools.length) tui.print(`${c.gray}${picked} exposes no tools.${c.reset}`);\n for (const t of entry.tools) tui.print(` ${c.cyan}${t.name}${c.reset}${t.description ? ` ${c.gray}— ${t.description}${c.reset}` : \"\"}`);\n if (entry.resources.length) tui.print(` ${c.gray}${entry.resources.length} resource(s)${c.reset}`);\n } else if (action === \"connect\") {\n const res = await mcp.connect(server);\n tui.print(res.ok ? `${c.cyan}⚡ connected (${res.tools} tools)${c.reset}` : `${c.red}⚠ ${res.error}${c.reset}`);\n } else if (action === \"disconnect\") {\n mcp.disconnect(picked);\n tui.print(`${c.gray}disconnected ${picked}${c.reset}`);\n } else if (action === \"enable\") {\n mcp.setEnabled(picked, true);\n const res = await mcp.connect(server);\n tui.print(res.ok ? `${c.cyan}⚡ enabled + connected (${res.tools} tools)${c.reset}` : `${c.red}⚠ enabled but failed: ${res.error}${c.reset}`);\n } else if (action === \"disable\") {\n mcp.setEnabled(picked, false);\n mcp.disconnect(picked);\n tui.print(`${c.gray}disabled + disconnected ${picked}${c.reset}`);\n } else if (action === \"remove\") {\n mcp.remove(picked);\n tui.print(`${c.gray}removed ${picked}${c.reset}`);\n }\n}\n\n/** Prompt for a new MCP server (`name: command args`), then save + connect it. */\nasync function addMcpServer(tui: Tui, mcp: McpController): Promise<void> {\n const spec = await tui.prompt(\n \"Add an MCP server — enter name: command [args…]\",\n \"fs: npx -y @modelcontextprotocol/server-filesystem .\"\n );\n if (!spec) return;\n const cfg = parseServerSpec(spec);\n if (!cfg) {\n tui.print(`${c.yellow}couldn't parse that. Use name: command [args]${c.reset}`);\n return;\n }\n tui.print(`${c.gray}connecting MCP \"${cfg.name}\" (${cfg.command} ${cfg.args.join(\" \")})…${c.reset}`);\n const res = await mcp.add(cfg);\n if (res.ok) tui.print(`${c.cyan}⚡ MCP \"${cfg.name}\" connected${c.reset} ${c.gray}(${res.tools} tool${res.tools === 1 ? \"\" : \"s\"})${c.reset}`);\n else tui.print(`${c.red}⚠ MCP \"${cfg.name}\" failed:${c.reset} ${c.gray}${res.error}${c.reset} ${c.dim}(saved; retry from the MCP menu)${c.reset}`);\n}\n\n/**\n * The \"Install a new MCP server\" flow: ask what the user wants, then seed that\n * request into the main chat. The agent researches the right server (via\n * research_agent) and installs it (the mcp tool's install action) right there\n * in the transcript — so the same thing happens whether you use this menu or\n * just ask in chat. We land straight back in the conversation.\n */\nasync function installMcpServerFlow(tui: Tui, mcp: McpController): Promise<void> {\n const query = await tui.prompt(\n \"What MCP server do you want to install?\",\n \"the best computer-use mcp server for mac\"\n );\n if (!query) return;\n mcp.requestInstall(query);\n}\n\nmain().catch((err) => {\n process.stderr.write(`\\n${err instanceof Error ? err.stack || err.message : String(err)}\\n`);\n process.exit(1);\n});\n"]}
1
+ {"version":3,"sources":["../src/api.ts","../src/permissions.ts","../src/approvals.ts","../src/heartbeat.ts","../src/render.ts","../src/bridge.ts","../src/process-registry.ts","../src/mcp-config.ts","../src/host-tools.ts","../src/mcp.ts","../src/execution-session.ts","../src/stream.ts","../src/events-stream.ts","../src/subagent-streams.ts","../src/wordmill.ts","../src/types.ts","../src/clipboard.ts","../src/tui.ts","../src/history.ts","../src/markdown.ts","../src/credentials.ts","../src/device-login.ts","../src/product.ts","../src/machine.ts","../src/registry.ts","../src/relay.ts","../src/fs-browse.ts","../src/check-update.ts","../src/daemon.ts","../src/daemon-service.ts","../src/daemon-cli.ts","../src/index.ts"],"names":["clean","DIM","RESET","cols","path","os","KEY","fs","file","input","isAlive","dir","spawn","crypto","c","hasToolCalls","dots","dotsStyled","top","bottom","clamp","flat","BOLD","output","MAX_ENTRIES","r","applied","run","api","check","readline","parseArgs","connecting","stopped","procsStopped","killed"],"mappings":"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","file":"index.js","sourcesContent":["/** Minimal REST client for the Standard Agents instance. */\nimport type { ThreadSummary } from \"./types.ts\";\n\n/** Outcome of an endpoint+token check, with a human-precise failure story. */\nexport type VerifyResult =\n | { ok: true }\n | { ok: false; reason: string; hint?: string };\n\n/** A parallel-session upgrade quote from the billing service. */\nexport interface SessionQuote {\n current: number; // sessions in use / currently paid for\n max: number; // hard ceiling\n sessions: number; // the target this quote is for\n amount_cents: number | null; // what Confirm charges now (null = figure unavailable)\n currency: string;\n ends_trial: boolean; // true when confirming ends the $5 trial and converts to paid\n status: string; // subscription status (trialing / active / …)\n}\n\n/**\n * Turn a fetch() failure into a precise, human explanation. Node reports the\n * real cause (DNS, refused, timeout, TLS, offline) as error codes buried in\n * the `cause` chain — surface them instead of a generic \"didn't work\".\n */\nfunction classifyConnectError(err: unknown, endpoint: string): VerifyResult {\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/.*$/, \"\");\n // Collect codes + messages across the cause chain (undici nests them).\n const codes = new Set<string>();\n const messages: string[] = [];\n for (let e: any = err; e; e = e.cause) {\n if (typeof e.code === \"string\") codes.add(e.code);\n if (typeof e.message === \"string\") messages.push(e.message);\n if (Array.isArray(e.errors)) {\n for (const sub of e.errors) {\n if (typeof sub?.code === \"string\") codes.add(sub.code);\n if (typeof sub?.message === \"string\") messages.push(sub.message);\n }\n }\n }\n const text = messages.join(\" | \");\n const has = (...wanted: string[]) => wanted.some((w) => codes.has(w));\n\n if (has(\"ENOTFOUND\", \"EAI_AGAIN\")) {\n return {\n ok: false,\n reason: `Can't resolve ${host} — no such hostname from this machine.`,\n hint: \"The endpoint URL is probably wrong (typo, or that server isn't running). Check the URL, your VPN, and local DNS.\",\n };\n }\n if (has(\"ECONNREFUSED\")) {\n return {\n ok: false,\n reason: `${host} refused the connection — nothing is listening there.`,\n hint: \"The instance looks stopped. Start it (or check the port in the endpoint URL).\",\n };\n }\n if (has(\"EHOSTUNREACH\", \"ENETUNREACH\", \"ENETDOWN\")) {\n return {\n ok: false,\n reason: `No route to ${host} — the network looks down or unreachable.`,\n hint: \"Check your internet connection / VPN.\",\n };\n }\n if (has(\"ETIMEDOUT\", \"UND_ERR_CONNECT_TIMEOUT\", \"UND_ERR_HEADERS_TIMEOUT\") || (err as any)?.name === \"TimeoutError\") {\n return {\n ok: false,\n reason: `${host} didn't answer in time.`,\n hint: \"The server may be overloaded or a firewall is eating the traffic. Try again.\",\n };\n }\n if (\n has(\n \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\n \"DEPTH_ZERO_SELF_SIGNED_CERT\",\n \"SELF_SIGNED_CERT_IN_CHAIN\",\n \"CERT_HAS_EXPIRED\",\n \"ERR_TLS_CERT_ALTNAME_INVALID\"\n ) || /certificate|TLS|SSL/i.test(text)\n ) {\n return {\n ok: false,\n reason: `TLS problem talking to ${host}: ${text.slice(0, 120)}`,\n hint: \"For local/self-signed endpoints, use the http:// URL or trust the local CA.\",\n };\n }\n return {\n ok: false,\n reason: `Couldn't reach ${host}${text ? ` (${text.slice(0, 120)})` : \"\"}.`,\n hint: \"This is a connection problem, not a token problem — check the endpoint URL and your network.\",\n };\n}\n\n/** A subagent child thread with its current lifecycle status. */\nexport interface SubagentInfo {\n id: string;\n agent_name: string | null;\n title: string | null;\n threadName: string | null;\n status: string; // \"running\" | \"idle\" | \"terminated\" | custom\n}\n\n/** An installed Agent Skill's registry metadata. */\nexport interface SkillInfo {\n name: string;\n description: string;\n version?: string;\n enabled: boolean;\n files: string[];\n}\n\n/** A file attachment on an outgoing message (the instance's message-POST shape). */\nexport interface MessageAttachment {\n name: string;\n mimeType: string;\n data: string; // base64 encoded\n width?: number;\n height?: number;\n}\n\nexport interface GoalStep {\n step: string;\n status?: string; // \"pending\" | \"in_progress\" | \"done\"\n}\nexport interface GoalData {\n summary: string | null; // short ~5-word label shown while the goal is pursued\n description: string | null;\n steps: GoalStep[];\n}\n\nexport class ApiClient {\n constructor(\n private endpoint: string,\n private token: string\n ) {}\n\n get wsEndpoint(): string {\n return this.endpoint.replace(/^http/, \"ws\");\n }\n\n /** The instance origin (used to build admin-UI links). */\n get origin(): string {\n return this.endpoint;\n }\n\n get bearer(): string {\n return this.token;\n }\n\n private async json<T>(pathname: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${this.endpoint}${pathname}`, {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.token}`,\n ...(init?.headers || {}),\n },\n });\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`${init?.method || \"GET\"} ${pathname} -> ${res.status}: ${text.slice(0, 300)}`);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n }\n\n async verify(): Promise<boolean> {\n return (await this.verifyDetailed()).ok;\n }\n\n /**\n * Check the endpoint + token and say PRECISELY what's wrong when they\n * fail. \"That token didn't work\" is a lie when the real problem is a typo'd\n * hostname, a stopped server, or a dead network — sign-in errors must let\n * the user tell those apart from an actually-rejected key.\n */\n async verifyDetailed(): Promise<VerifyResult> {\n let res: Response;\n try {\n res = await fetch(`${this.endpoint}/api/auth/me`, {\n headers: { Authorization: `Bearer ${this.token}` },\n signal: AbortSignal.timeout(15_000),\n });\n } catch (err) {\n return classifyConnectError(err, this.endpoint);\n }\n if (res.ok) return { ok: true };\n if (res.status === 401) {\n return {\n ok: false,\n reason: \"The instance rejected this token — it's invalid, expired, or was revoked.\",\n hint: \"Create a fresh API key in the instance settings (or press Enter to sign in with your browser). Keys only work on the instance that minted them.\",\n };\n }\n if (res.status === 403) {\n return {\n ok: false,\n reason: \"The token was recognized, but this account isn't allowed to use the API here.\",\n hint: \"Ask an instance admin to grant access, or use a different account's key.\",\n };\n }\n if (res.status === 404 || res.status === 405) {\n return {\n ok: false,\n reason: `${this.endpoint} answered, but it doesn't look like a Standard Agents instance (no /api/auth/me).`,\n hint: \"Double-check the endpoint URL — this may be a different service.\",\n };\n }\n if (res.status >= 500) {\n return {\n ok: false,\n reason: `The instance hit an error while checking the token (HTTP ${res.status}).`,\n hint: \"That's a server-side problem — check the instance's logs and try again.\",\n };\n }\n return { ok: false, reason: `The instance answered HTTP ${res.status} while checking the token.` };\n }\n\n /** Agent name → display title map (best effort; for labeling subagents). */\n async listAgents(): Promise<{ name: string; title: string }[]> {\n const res = await this.json<{ agents?: any[] } | any[]>(\"/api/agents\");\n const arr = Array.isArray(res) ? res : res.agents || [];\n return arr\n .filter((a) => a && typeof a.name === \"string\")\n .map((a) => ({ name: a.name, title: typeof a.title === \"string\" ? a.title : a.name }));\n }\n\n async createThread(agentId: string, tags: string[]): Promise<string> {\n const res = await this.json<{ threadId?: string; id?: string }>(\"/api/threads\", {\n method: \"POST\",\n body: JSON.stringify({ agent_id: agentId, tags }),\n });\n const id = res.threadId || res.id;\n if (!id) throw new Error(\"Thread create returned no id\");\n return id;\n }\n\n /**\n * List threads for an agent (or several variants of it), optionally\n * filtering to those carrying all given tags. Multiple ids exist because\n * the instance's model gearbox hands a session between agent variants — a\n * thread that last ran in another gear must still show up for resume.\n */\n async listThreads(agentId: string | string[], requireTags: string[]): Promise<ThreadSummary[]> {\n const ids = Array.isArray(agentId) ? agentId : [agentId];\n const pages = await Promise.all(\n ids.map((id) =>\n this.json<{ threads?: any[] } | any[]>(\n `/api/threads?agent_id=${encodeURIComponent(id)}&limit=100`\n ).catch(() => [] as any[])\n )\n );\n const arr = pages.flatMap((res) => (Array.isArray(res) ? res : (res as { threads?: any[] }).threads || []));\n return arr\n .map((t) => ({\n id: t.id,\n tags: Array.isArray(t.tags) ? t.tags : [],\n created_at: t.created_at,\n title: t.title,\n preview: t.preview || t.last_message,\n }))\n .filter((t: ThreadSummary) => requireTags.every((tag) => t.tags.includes(tag)));\n }\n\n /**\n * Subagent child threads of a thread, each with its current lifecycle status\n * (`running`/`idle`/`terminated`). Sourced from the parent's child registry,\n * which the live `/api/events` stream doesn't carry — so the CLI reads this to\n * learn which subagents are *actually running* (vs idle or finished), both on\n * (re)connect and whenever a subagent thread changes.\n */\n async listSubagents(threadId: string): Promise<SubagentInfo[]> {\n const res = await this.json<{ subagents?: any[] } | any[]>(\n `/api/threads/${threadId}/subagents`\n );\n const arr = Array.isArray(res) ? res : res.subagents || [];\n return arr\n .filter((s) => s && (s.id ?? s.reference))\n .map((s) => ({\n id: s.id ?? s.reference,\n agent_name: s.agent_name ?? s.name ?? null,\n title: s.title ?? null,\n threadName: s.threadName ?? s.thread_name ?? null,\n status: typeof s.status === \"string\" ? s.status : \"running\",\n }));\n }\n\n /**\n * Send a user message, optionally with attachments (e.g. pasted images).\n * Attachments use the instance's message-POST shape — base64 `data` +\n * `mimeType` — which the server stores in the thread filesystem and injects\n * into the LLM's vision context as real image content blocks.\n */\n async sendMessage(threadId: string, content: string, attachments?: MessageAttachment[]): Promise<void> {\n const body: Record<string, unknown> = { role: \"user\", content };\n if (attachments && attachments.length > 0) body.attachments = attachments;\n await this.json(`/api/threads/${threadId}/messages`, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async getMessages(threadId: string, limit = 50, order?: \"asc\" | \"desc\"): Promise<any[]> {\n const orderParam = order ? `&order=${order}` : \"\";\n const res = await this.json<{ messages?: any[] } | any[]>(\n `/api/threads/${threadId}/messages?limit=${limit}${orderParam}`\n );\n return Array.isArray(res) ? res : res.messages || [];\n }\n\n async getLogs(threadId: string, limit = 100): Promise<any[]> {\n const res = await this.json<{ logs?: any[] } | any[]>(\n `/api/threads/${threadId}/logs?limit=${limit}&order=desc`\n );\n return Array.isArray(res) ? res : res.logs || [];\n }\n\n /**\n * Deliver a durable forwarded tool result to the thread, resuming the turn.\n * Retries with backoff — this is the durable delivery path, so it must land\n * even if the connection is briefly flaky after a permission wait.\n */\n async postToolResult(\n threadId: string,\n toolCallId: string,\n ok: boolean,\n result?: string,\n error?: string,\n executor?: { clientId: string; generation?: number }\n ): Promise<boolean> {\n const body = JSON.stringify({\n tool_call_id: toolCallId,\n ok,\n result,\n error,\n // Ownership fence: calls dispatched to a specific execution owner are\n // only accepted back from that owner at that generation.\n ...(executor ? { client_id: executor.clientId, generation: executor.generation ?? 0 } : {}),\n });\n for (let attempt = 0; attempt < 6; attempt++) {\n try {\n await this.json(`/api/threads/${threadId}/tool-result`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n });\n return true;\n } catch {\n await new Promise((r) => setTimeout(r, Math.min(500 * 2 ** attempt, 8000)));\n }\n }\n return false;\n }\n\n /**\n * Download raw file bytes from the thread's filesystem (e.g. an\n * /attachments/* asset a subagent generated). Returns null on any failure.\n */\n async fetchFile(threadId: string, fsPath: string): Promise<Buffer | null> {\n const clean = fsPath.startsWith(\"/\") ? fsPath : `/${fsPath}`;\n try {\n const res = await fetch(`${this.endpoint}/api/threads/${threadId}/fs${clean}`, {\n headers: { Authorization: `Bearer ${this.token}` },\n });\n if (!res.ok) return null;\n return Buffer.from(await res.arrayBuffer());\n } catch {\n return null;\n }\n }\n\n // ── account-wide user KV (per-user, spans every thread) ───────────────────\n // Backed by the instance's /api/users/me/kv store. This is where the machine\n // registry lives: which machines (laptops / VPS daemons) belong to this\n // account, and which projects each machine has.\n\n /** Read one value from the signed-in user's account-wide KV (null if absent). */\n async userKvGet(key: string): Promise<unknown> {\n try {\n const res = await this.json<{ value?: unknown }>(\n `/api/users/me/kv?key=${encodeURIComponent(key)}`\n );\n return res?.value ?? null;\n } catch {\n return null;\n }\n }\n\n /** Write one value to the signed-in user's account-wide KV (null deletes). */\n async userKvSet(key: string, value: unknown): Promise<void> {\n await this.json(`/api/users/me/kv`, {\n method: \"POST\",\n body: JSON.stringify({ key, value }),\n });\n }\n\n /** List the signed-in user's account-wide KV entries under a key prefix. */\n async userKvList(prefix: string): Promise<Array<{ key: string; value: unknown; updated_at: number }>> {\n try {\n const res = await this.json<{ entries?: Array<{ key: string; value: unknown; updated_at: number }> }>(\n `/api/users/me/kv?prefix=${encodeURIComponent(prefix)}&limit=200`\n );\n return Array.isArray(res?.entries) ? res.entries : [];\n } catch {\n return [];\n }\n }\n\n /** Read a value from the thread's durable KV store (null if absent). */\n async kvGet(threadId: string, key: string): Promise<unknown> {\n try {\n const res = await this.json<{ value?: unknown }>(\n `/api/threads/${threadId}/kv?key=${encodeURIComponent(key)}`\n );\n return res?.value ?? null;\n } catch {\n return null; // 404 = key not yet set\n }\n }\n\n /** Write a value to the thread's durable KV store. */\n async kvSet(threadId: string, key: string, value: unknown): Promise<void> {\n try {\n await this.json(`/api/threads/${threadId}/kv`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ key, value }),\n });\n } catch {\n // best effort\n }\n }\n\n /** Mint a pre-authed standardcode.ai account-dashboard URL for this thread's\n * user. Returns null when the chain is unavailable — the caller falls back\n * to the plain dashboard URL (sign-in by inbox link). */\n async accountLink(threadId: string): Promise<{ url: string; preauthed: boolean } | null> {\n try {\n const res = await this.json<{ url?: string; preauthed?: boolean }>(\n `/api/threads/${threadId}/account_link`,\n { method: \"POST\" }\n );\n return res?.url ? { url: res.url, preauthed: res.preauthed === true } : null;\n } catch {\n return null;\n }\n }\n\n /** Preview the cost of changing to `sessions` parallel sessions (default +1).\n * Returns null when billing is unavailable / there's no subscription. */\n async sessionsQuote(threadId: string, sessions?: number): Promise<SessionQuote | null> {\n try {\n return await this.json<SessionQuote>(`/api/threads/${threadId}/sessions_quote`, {\n method: \"POST\",\n body: JSON.stringify(typeof sessions === \"number\" ? { sessions } : {}),\n });\n } catch {\n return null;\n }\n }\n\n /** Apply a parallel-session change (charges via Stripe). Throws on failure. */\n async sessionsUpgrade(threadId: string, sessions: number): Promise<{ ok?: boolean; sessions?: number; error?: string }> {\n return this.json(`/api/threads/${threadId}/sessions_upgrade`, {\n method: \"POST\",\n body: JSON.stringify({ sessions }),\n });\n }\n\n // ── skills (instance-global Agent Skills library) ─────────────────────────\n\n /** Installed skills — metadata only. Includes disabled skills. */\n async listSkills(): Promise<SkillInfo[]> {\n const res = await this.json<{ skills?: SkillInfo[] }>(`/api/skills?all=1`);\n return Array.isArray(res?.skills) ? res.skills : [];\n }\n\n /** Enable/disable an installed skill. */\n async setSkillEnabled(name: string, enabled: boolean): Promise<void> {\n await this.json(`/api/skills/${encodeURIComponent(name)}`, {\n method: \"PATCH\",\n body: JSON.stringify({ enabled }),\n });\n }\n\n /** Uninstall a skill. */\n async removeSkill(name: string): Promise<void> {\n await this.json(`/api/skills/${encodeURIComponent(name)}`, { method: \"DELETE\" });\n }\n\n /**\n * Kick off background conversation compaction now. Spawns the compaction\n * subagent directly server-side (so it fires even while the thread is idle).\n */\n async compact(threadId: string): Promise<void> {\n await this.json(`/api/threads/${threadId}/compact`, { method: \"POST\" });\n }\n\n async stop(threadId: string): Promise<void> {\n try {\n await this.json(`/api/threads/${threadId}/stop`, { method: \"POST\" });\n } catch {\n // best effort\n }\n }\n\n /**\n * Run a user-typed `!command` on the thread's execution owner (wherever the\n * session runs — e.g. a remote VPS daemon). The instance forwards it over\n * the bridge, records it in history, and returns the combined output.\n */\n async runCommand(\n threadId: string,\n command: string\n ): Promise<{ ok: boolean; output?: string; error?: string; messageId?: string }> {\n try {\n return await this.json<{ ok: boolean; output?: string; error?: string; messageId?: string }>(\n `/api/threads/${threadId}/run_command`,\n { method: \"POST\", body: JSON.stringify({ command }) }\n );\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n }\n\n /** The thread's current goal (set via set_goal / update_goal_step). */\n async getGoal(threadId: string): Promise<GoalData> {\n try {\n const r = await this.json<Partial<GoalData>>(`/api/threads/${threadId}/goal`);\n return {\n summary: r?.summary ?? null,\n description: r?.description ?? null,\n steps: Array.isArray(r?.steps) ? r.steps : [],\n };\n } catch {\n return { summary: null, description: null, steps: [] };\n }\n }\n}\n","/**\n * Permission engine. Combines the current mode with the model-supplied risk\n * (1–5) to decide whether a forwarded tool runs automatically, needs the user's\n * approval, or is blocked outright.\n */\nimport type { Level } from \"./types.ts\";\n\nexport type Decision = \"allow\" | \"ask\" | \"deny\";\n\nexport interface PermissionState {\n /** Auto-accept level 1–5: calls at risk ≤ level run automatically; riskier ones ask. */\n level: Level;\n /** Tool names the user chose to always allow this session. */\n alwaysAllow: Set<string>;\n /**\n * Risk levels the user granted this session (\"allow level N\"). Risk is a\n * GRADIENT, not distinct buckets: a grant at level N auto-accepts everything\n * at risk ≤ N — approving installs (3) obviously covers safe writes (2).\n * Kept as a Set (not a single ceiling) only for persisted-approval\n * compatibility; decide() always reads it as max().\n */\n allowRisk: Set<number>;\n}\n\n/** The effective auto-accept ceiling: base level raised by any risk grants. */\nexport function riskCeiling(state: PermissionState): number {\n let ceiling: number = state.level;\n for (const granted of state.allowRisk) {\n if (granted > ceiling) ceiling = granted;\n }\n return ceiling;\n}\n\nexport function decide(\n state: PermissionState,\n tool: string,\n risk: number | null,\n hasPermissionRequest: boolean\n): Decision {\n const effectiveRisk = typeof risk === \"number\" ? Math.min(5, Math.max(1, risk)) : hasPermissionRequest ? 3 : 1;\n\n // Standing tool approvals the user granted this session.\n if (state.alwaysAllow.has(tool)) return \"allow\";\n\n // One gradient: anything at or below the effective ceiling (base level,\n // raised by session risk grants) runs without asking.\n return effectiveRisk <= riskCeiling(state) ? \"allow\" : \"ask\";\n}\n\n/**\n * Catastrophic-command guard that applies regardless of mode. These are blocked\n * even in bypass mode — a coding agent should never be able to wipe the machine.\n */\nconst CATASTROPHIC_PATTERNS: RegExp[] = [\n /\\brm\\s+(-[a-z]*\\s+)*-[a-z]*f[a-z]*\\s+(-[a-z]*\\s+)*(\\/|~|\\$HOME|\\/\\*|\\.\\s*$|\\/\\s*$)/i, // rm -rf / , rm -rf ~\n /\\brm\\s+-rf\\s+--no-preserve-root/i,\n /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\}\\s*;:/, // fork bomb\n /\\bmkfs(\\.\\w+)?\\b/i, // format filesystem\n /\\bdd\\b[^\\n]*\\bof=\\/dev\\/(sd|disk|nvme|hd)/i, // overwrite raw disk\n /\\b(shutdown|reboot|halt|poweroff)\\b/i,\n />\\s*\\/dev\\/(sd|disk|nvme|hd)/i,\n /\\bchmod\\s+-R\\s+(000|777)\\s+\\/(?:\\s|$)/i,\n];\n\nexport function isCatastrophic(command: string): boolean {\n return CATASTROPHIC_PATTERNS.some((re) => re.test(command));\n}\n","/**\n * Session approvals — the permission mode plus the tools and risk levels the\n * user has pre-approved — persisted in the THREAD's KV store (server-side), so\n * they resume with the session and a server hook can show the agent what's\n * already approved. Nothing is stored on the client.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport type { Level } from \"./types.ts\";\n\nconst KEY = \"approvals\";\n\nexport interface ApprovalsKV {\n level?: Level;\n allowTools: string[];\n allowRisk: number[];\n}\n\nexport async function loadApprovals(api: ApiClient, threadId: string): Promise<ApprovalsKV> {\n const v = await api.kvGet(threadId, KEY);\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const n = Number(o.level);\n const level = n >= 1 && n <= 5 ? (n as Level) : undefined;\n return {\n level,\n allowTools: Array.isArray(o.allowTools) ? (o.allowTools as string[]) : [],\n allowRisk: Array.isArray(o.allowRisk) ? (o.allowRisk as number[]) : [],\n };\n }\n return { allowTools: [], allowRisk: [] };\n}\n\n/** Persist the current approvals to the thread KV (fire-and-forget). */\nexport function saveApprovals(api: ApiClient, threadId: string, perm: PermissionState): void {\n const payload: ApprovalsKV = {\n level: perm.level,\n allowTools: Array.from(perm.alwaysAllow).sort(),\n allowRisk: Array.from(perm.allowRisk).sort((a, b) => a - b),\n };\n void api.kvSet(threadId, KEY, payload);\n}\n","/**\n * App-level keepalive + half-open detection for a WebSocket.\n *\n * Node's WebSocket (and the server) won't promptly report a connection that died\n * silently — an idle NAT/proxy timeout drops the TCP without a close frame, so\n * the socket sits in `OPEN` forever and `send()` never throws. We defend against\n * that by pinging the server on an interval (it answers \"pong\") and treating the\n * connection as dead if no frame arrives within {@link CONNECTION_SILENCE_TIMEOUT_MS}.\n *\n * The owner calls `start()` once the socket opens, `markAlive()` on every frame\n * it receives, and `stop()` when the socket closes. `onDead` fires at most once\n * per heartbeat and should drop + reconnect the socket.\n */\n\n/** How often to ping the server (which replies \"pong\"). */\nexport const HEARTBEAT_INTERVAL_MS = 5000;\n\n/**\n * If the server sends nothing — no pong, no data — for this long, the socket is\n * dead even if `readyState` still says OPEN. Kept comfortably under the server's\n * own liveness timeout so the client detects the drop and reconnects first.\n */\nexport const CONNECTION_SILENCE_TIMEOUT_MS = 15000;\n\nexport interface HeartbeatOptions {\n /** Ping cadence in ms. Defaults to {@link HEARTBEAT_INTERVAL_MS}. */\n intervalMs?: number;\n /** Silence-before-dead window in ms. Defaults to {@link CONNECTION_SILENCE_TIMEOUT_MS}. */\n silenceMs?: number;\n}\n\nexport class Heartbeat {\n private timer: ReturnType<typeof setInterval> | null = null;\n private lastRecvAt = 0;\n private readonly intervalMs: number;\n private readonly silenceMs: number;\n\n constructor(\n private ws: Pick<WebSocket, \"readyState\" | \"send\" | \"close\">,\n private onDead: () => void,\n options: HeartbeatOptions = {}\n ) {\n this.intervalMs = options.intervalMs ?? HEARTBEAT_INTERVAL_MS;\n this.silenceMs = options.silenceMs ?? CONNECTION_SILENCE_TIMEOUT_MS;\n }\n\n start(): void {\n this.stop();\n this.lastRecvAt = Date.now();\n this.timer = setInterval(() => this.tick(), this.intervalMs);\n }\n\n /** Record that a frame was received — proof the connection is alive. */\n markAlive(): void {\n this.lastRecvAt = Date.now();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n private tick(): void {\n if (Date.now() - this.lastRecvAt > this.silenceMs) {\n this.fail();\n return;\n }\n try {\n if (this.ws.readyState === WebSocket.OPEN) this.ws.send(\"ping\");\n else this.fail();\n } catch {\n this.fail();\n }\n }\n\n private fail(): void {\n this.stop();\n try {\n this.ws.close();\n } catch {\n // already closing/closed\n }\n this.onDead();\n }\n}\n","/**\n * Transcript renderers for tool activity: git-style truncated diffs for\n * edits/writes and light syntax highlighting for bash commands.\n *\n * These produce PERMANENT transcript lines (printed above the run area), so\n * they may wrap in the scrollback without breaking any redraw math — but each\n * line is still clamped to the terminal width so a big hunk doesn't flood the\n * screen. Colors follow git/Claude/Codex conventions: dark green background\n * for added lines, dark red for removed.\n */\n\nconst RESET = \"\\x1b[0m\";\nconst DIM = \"\\x1b[2m\";\nconst ADD_BG = \"\\x1b[48;5;22m\\x1b[38;5;254m\"; // dark green bg, pale text\nconst DEL_BG = \"\\x1b[48;5;52m\\x1b[38;5;254m\"; // dark red bg, pale text\n\n// Shared budget: a diff shows at most this many content rows per side before\n// truncating to a \"… +n more\" line — enough to see the shape of a change\n// without drowning the transcript.\nconst MAX_SIDE_LINES = 4;\n\nfunction clamp(s: string, max: number): string {\n return s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n}\n\nfunction cols(): number {\n return Math.max(20, process.stdout.columns || 80);\n}\n\n/** Expand tabs (a tab under a colored bg renders unpredictably wide). */\nfunction flat(line: string): string {\n return line.replace(/\\t/g, \" \");\n}\n\n/**\n * A truncated git-style hunk for an exact-string edit: the lines removed\n * (red background, `-`) then the lines added (green background, `+`).\n * Common leading/trailing lines between old and new are trimmed away so the\n * hunk shows just the changed core. Returns [] when nothing visibly changed.\n */\nexport function diffLines(oldStr: string, newStr: string): string[] {\n let oldLines = oldStr.split(\"\\n\");\n let newLines = newStr.split(\"\\n\");\n // Trim shared prefix/suffix lines so only the real change shows.\n while (oldLines.length && newLines.length && oldLines[0] === newLines[0]) {\n oldLines.shift();\n newLines.shift();\n }\n while (\n oldLines.length &&\n newLines.length &&\n oldLines[oldLines.length - 1] === newLines[newLines.length - 1]\n ) {\n oldLines.pop();\n newLines.pop();\n }\n const width = cols() - 2;\n const out: string[] = [];\n const side = (lines: string[], bg: string, sign: string) => {\n const shown = lines.slice(0, MAX_SIDE_LINES);\n for (const l of shown) out.push(`${bg}${sign} ${clamp(flat(l), width)}${RESET}`);\n const hidden = lines.length - shown.length;\n if (hidden > 0) out.push(`${DIM} … +${hidden} more line${hidden === 1 ? \"\" : \"s\"}${RESET}`);\n };\n side(oldLines, DEL_BG, \"-\");\n side(newLines, ADD_BG, \"+\");\n return out;\n}\n\n/** A truncated all-added hunk for a newly written file. */\nexport function newFileLines(content: string): string[] {\n const lines = content.split(\"\\n\");\n const width = cols() - 2;\n const shown = lines.slice(0, MAX_SIDE_LINES);\n const out = shown.map((l) => `${ADD_BG}+ ${clamp(flat(l), width)}${RESET}`);\n const hidden = lines.length - shown.length;\n if (hidden > 0) out.push(`${DIM} … +${hidden} more line${hidden === 1 ? \"\" : \"s\"}${RESET}`);\n return out;\n}\n\n/**\n * Muted shell rendering for a command shown in the transcript: program words\n * (start / after a control operator) at normal intensity, EVERYTHING else —\n * arguments, strings, flags, operators, comments — dim. The transcript should\n * read as a quiet activity log, not a syntax rainbow; the program names are\n * enough to scan what ran. Quote-aware single-pass tokenizer; falls back to\n * dim text on anything it doesn't understand.\n */\nexport function highlightBash(cmd: string): string {\n let out = \"\";\n let i = 0;\n let expectProgram = true; // next bare word is a program name (start / after an operator)\n while (i < cmd.length) {\n const ch = cmd[i];\n if (ch === \"'\" || ch === '\"') {\n // Whole quoted string (including quotes), dim; honor backslash escapes in \"\".\n let j = i + 1;\n while (j < cmd.length && cmd[j] !== ch) {\n if (ch === '\"' && cmd[j] === \"\\\\\") j++;\n j++;\n }\n out += `${DIM}${cmd.slice(i, Math.min(j + 1, cmd.length))}${RESET}`;\n i = j + 1;\n continue;\n }\n if (ch === \"#\") {\n out += `${DIM}${cmd.slice(i)}${RESET}`;\n break;\n }\n const op = cmd.slice(i).match(/^(\\|\\||&&|\\||;|>>|>|<)/);\n if (op) {\n out += `${DIM}${op[1]}${RESET}`;\n i += op[1].length;\n expectProgram = true;\n continue;\n }\n const word = cmd.slice(i).match(/^[^\\s'\"#|;&<>]+/);\n if (word) {\n const w = word[0];\n if (expectProgram && !w.startsWith(\"-\")) {\n out += w; // program name at normal intensity — the only non-dim ink\n expectProgram = false;\n } else {\n out += `${DIM}${w}${RESET}`;\n }\n i += w.length;\n continue;\n }\n out += `${DIM}${ch}${RESET}`;\n i++;\n }\n return out;\n}\n\n/**\n * Collapse a (possibly multi-line, heredoc-y) command into one calm\n * transcript line: newlines become ⏎, runs of whitespace collapse, and the\n * result is clamped so it can't flood the transcript. Multi-line command\n * bodies belong in the child process, not the activity log.\n */\nexport function oneLineCommand(cmd: string, max: number): string {\n const collapsed = cmd.replace(/\\s*\\n+\\s*/g, \" ⏎ \").replace(/[ \\t]{2,}/g, \" \").trim();\n return clamp(collapsed, max);\n}\n\n// ── brand gradient ───────────────────────────────────────────────────────────\n\n/**\n * The Standard Code brand gradient (amber → coral → violet), applied per\n * character with 24-bit ANSI color. `phase` shifts the gradient's starting\n * point (0..1) so multi-line art can sweep diagonally. Terminals without\n * truecolor get a 256-color approximation — never plain text, the brand\n * moments should always land.\n */\nconst GRAD_STOPS: Array<[number, number, number]> = [\n [0xff, 0xb3, 0x5c], // amber\n [0xff, 0x5c, 0x87], // coral\n [0x8b, 0x6c, 0xff], // violet\n];\nconst GRAD_256 = [215, 210, 204, 176, 141]; // amber→pink→violet approximation\n\nfunction truecolor(): boolean {\n const ct = process.env.COLORTERM ?? \"\";\n if (/truecolor|24bit/i.test(ct)) return true;\n // Common truecolor terminals that don't always set COLORTERM.\n return /iterm|kitty|wezterm|ghostty|alacritty/i.test(process.env.TERM_PROGRAM ?? \"\");\n}\n\nfunction gradAt(t: number): [number, number, number] {\n const clamped = Math.max(0, Math.min(1, t));\n const seg = clamped * (GRAD_STOPS.length - 1);\n const i = Math.min(GRAD_STOPS.length - 2, Math.floor(seg));\n const k = seg - i;\n const [a, b] = [GRAD_STOPS[i], GRAD_STOPS[i + 1]];\n return [\n Math.round(a[0] + (b[0] - a[0]) * k),\n Math.round(a[1] + (b[1] - a[1]) * k),\n Math.round(a[2] + (b[2] - a[2]) * k),\n ];\n}\n\n/** Ping-pong a time/position value through [0,1] so a looping animation sweeps\n * amber→coral→violet→coral→amber with no seam at the wrap point. */\nfunction cyclePos(t: number): number {\n const p = t - Math.floor(t);\n return p < 0.5 ? p * 2 : 2 - p * 2;\n}\n\nfunction colorAtCycle(tri: number, tc: boolean): string {\n if (tc) {\n const [r, g, b] = gradAt(tri);\n return `\\x1b[38;2;${r};${g};${b}m`;\n }\n return `\\x1b[38;5;${GRAD_256[Math.min(GRAD_256.length - 1, Math.floor(tri * GRAD_256.length))]}m`;\n}\n\n/** ANSI fg escape that cycles through the brand gradient over time — for\n * animated glyphs like the working spinner. `ms` is a clock (Date.now()). */\nexport function brandCycleColor(ms: number, periodMs = 1200): string {\n return colorAtCycle(cyclePos(ms / periodMs), truecolor());\n}\n\n/**\n * Seamless looping brand gradient sample (amber → coral → violet → amber).\n * `t` is any real; only the fractional part matters. Used for rotating border\n * highlights so the sweep has no hard seam.\n */\nexport function brandLoopFg(t: number): string {\n const p = t - Math.floor(t);\n // 4 stops with wrap-back to amber so the loop is continuous.\n const stops: Array<[number, number, number]> = [\n GRAD_STOPS[0],\n GRAD_STOPS[1],\n GRAD_STOPS[2],\n GRAD_STOPS[0],\n ];\n const seg = p * (stops.length - 1);\n const i = Math.min(stops.length - 2, Math.floor(seg));\n const k = seg - i;\n const a = stops[i];\n const b = stops[i + 1];\n const r = Math.round(a[0] + (b[0] - a[0]) * k);\n const g = Math.round(a[1] + (b[1] - a[1]) * k);\n const bl = Math.round(a[2] + (b[2] - a[2]) * k);\n if (truecolor()) return `\\x1b[38;2;${r};${g};${bl}m`;\n // 256-color: pick the nearest stop by segment.\n const approx = [215, 210, 204, 141, 215];\n return `\\x1b[38;5;${approx[Math.min(approx.length - 1, Math.round(p * (approx.length - 1)))]}m`;\n}\n\n/** Apply the brand gradient across a single line of text. */\nexport function gradientText(text: string, phase = 0): string {\n const chars = [...text];\n const visible = chars.filter((ch) => ch.trim().length > 0).length;\n if (!visible) return text;\n const tc = truecolor();\n let seen = 0;\n let out = \"\";\n for (const ch of chars) {\n if (ch.trim().length === 0) { out += ch; continue; }\n const t = Math.min(1, phase + (seen / Math.max(1, visible - 1)) * (1 - phase * 0.4));\n seen++;\n if (tc) {\n const [r, g, b] = gradAt(t);\n out += `\\x1b[38;2;${r};${g};${b}m${ch}`;\n } else {\n out += `\\x1b[38;5;${GRAD_256[Math.min(GRAD_256.length - 1, Math.floor(t * GRAD_256.length))]}m${ch}`;\n }\n }\n return out + \"\\x1b[0m\";\n}\n\n/**\n * Muted brand-tinted chrome for HUD box borders — warm amber-ink that sits\n * with the amber→coral→violet palette without competing with content.\n * Matches the dim line colors on standardcode.ai.\n */\nexport function brandChromeColor(): string {\n if (truecolor()) return \"\\x1b[38;2;120;100;88m\"; // muted amber\n return \"\\x1b[38;5;180m\";\n}\n\n/** Solid brand stop (amber / coral / violet) for small chrome labels. */\nexport function brandStopColor(stop: \"amber\" | \"coral\" | \"violet\"): string {\n if (truecolor()) {\n const [r, g, b] =\n stop === \"amber\" ? GRAD_STOPS[0] : stop === \"coral\" ? GRAD_STOPS[1] : GRAD_STOPS[2];\n return `\\x1b[38;2;${r};${g};${b}m`;\n }\n return stop === \"amber\"\n ? \"\\x1b[38;5;215m\"\n : stop === \"coral\"\n ? \"\\x1b[38;5;204m\"\n : \"\\x1b[38;5;141m\";\n}\n\n","/**\n * The client-tool bridge: holds a WebSocket open to the instance, receives\n * forwarded tool requests, runs them through the permission engine + safety\n * guard, executes the approved ones on the host, and returns results.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport type { HostTools } from \"./host-tools.ts\";\nimport { decide, isCatastrophic, type PermissionState } from \"./permissions.ts\";\nimport { saveApprovals } from \"./approvals.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\nimport type {\n BridgeClientIdentity,\n ExecutionOwnerInfo,\n HostResult,\n ToolRequest,\n} from \"./types.ts\";\nimport { diffLines, newFileLines, highlightBash, oneLineCommand } from \"./render.ts\";\n\nexport type ApprovalChoice = \"allow\" | \"deny\" | \"always\" | \"always_risk\";\n/** Approval outcome plus, for a denial, an optional reason the user typed for the agent. */\nexport type ApprovalResult = { choice: ApprovalChoice; reason?: string };\n\nexport type ConnectionState = \"connected\" | \"reconnecting\" | \"reconnected\";\n\nexport interface BridgeHooks {\n /** Print a permanent line (a finished/denied/blocked tool). `detail` lines are\n * pre-styled extra rows (e.g. a truncated diff) printed verbatim beneath it. */\n onActivity(line: string, detail?: string[]): void;\n /** Update the live working status (the currently-running tool, or null = idle). */\n /** A host tool started (`summary`) or finished (`null`) executing, keyed by its\n * tool-call id. The CLI is the source of truth for what is running on the host —\n * the server's stream events can be missed (reconnects), leaving a stale label. */\n onStatus?(id: string, summary: string | null): void;\n /** Report connection lifecycle so the UI can show disconnect/reconnect state. */\n onConnection?(state: ConnectionState, attempt: number): void;\n /** Execution ownership changed: whether THIS client now executes forwarded\n * tools, plus who the current owner is (from bridge_ready / owner_changed). */\n onOwnership?(isOwner: boolean, owner: ExecutionOwnerInfo | null): void;\n /** The instance refused this client's ownership claim (e.g. \"in_flight\" —\n * the current owner is mid-tool-call; execution can't move safely yet). */\n onClaimRefused?(reason: string): void;\n /** The instance closed this socket because a NEWER connection presented the\n * same client identity (close code 4001). The bridge will NOT reconnect —\n * reconnecting would ping-pong the socket between the two processes. */\n onSuperseded?(): void;\n /** Re-sync the permission state before each decision. A headless daemon's\n * approvals are edited by OTHER clients (through the thread KV), so its\n * in-memory copy must be refreshed per request; the interactive CLI owns\n * its own state and omits this. */\n refreshPermissions?(): Promise<void>;\n /** Ask the user to approve a tool; resolve with their choice. */\n requestApproval(req: ToolRequest, summary: string, effectiveRisk: number): Promise<ApprovalResult>;\n}\n\n/** Tools that mutate or execute (used to deny in plan mode cleanly). */\nconst PATH_ARG_TOOLS = new Set([\"read_file\", \"grep\", \"glob\", \"write_file\", \"edit_file\"]);\n\nexport class Bridge {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private resolveConnected: (() => void) | null = null;\n // Durable forwarded calls we've started handling, so a server re-send (after a\n // reconnect) doesn't prompt or run them twice.\n private handledDurable = new Set<string>();\n // Whether this client currently holds execution ownership. Starts true so an\n // instance that predates the owner concept (no owner field in bridge_ready)\n // behaves exactly as before; an owner-aware instance sets it on every connect.\n private owner = true;\n // Ownership generation from the last bridge_ready/owner_changed (echoed in\n // durable deliveries so the server's fence can match).\n private ownerGeneration = 0;\n // Resolved once the first owner-aware bridge_ready arrives (or never, on a\n // legacy instance — callers pair this with a timeout).\n private ownershipKnownResolve: (() => void) | null = null;\n private ownershipKnownPromise = new Promise<void>((resolve) => {\n this.ownershipKnownResolve = resolve;\n });\n\n constructor(\n private api: ApiClient,\n private threadId: string,\n private host: HostTools,\n private perm: PermissionState,\n private hooks: BridgeHooks,\n /** Identity for execution-owner election. Omitted = legacy anonymous bridge. */\n private identity?: BridgeClientIdentity\n ) {}\n\n /** Whether this client currently executes forwarded tool calls. */\n get isOwner(): boolean {\n return this.owner;\n }\n\n /** Adjust the ownership claim used on the NEXT (re)connect — e.g. an\n * interactive session that became owner reasserts with `takeover` after a\n * brief drop, instead of silently losing execution to a daemon's\n * stale-claim probe. */\n setClaim(claim: BridgeClientIdentity[\"claim\"]): void {\n if (this.identity) this.identity.claim = claim;\n }\n\n /**\n * Resolve once the instance has said whether this client owns execution\n * (the first owner-aware bridge_ready). Legacy instances never say — the\n * timeout resolves to the current (assumed-owner) state so callers can gate\n * owner-only side effects like session_info/mcp_catalog writes.\n */\n async whenOwnershipKnown(timeoutMs = 3000): Promise<boolean> {\n await Promise.race([\n this.ownershipKnownPromise,\n new Promise<void>((resolve) => setTimeout(resolve, timeoutMs)),\n ]);\n return this.owner;\n }\n\n /**\n * Connect and keep the bridge connected. Resolves on the first successful\n * open; thereafter any drop is reconnected automatically with exponential\n * backoff (disconnections are expected — e.g. a dev-server reload — so this\n * must be rock solid). A short safety timeout resolves startup even if the\n * very first attempt is slow, since reconnection continues in the background.\n */\n connect(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n this.resolveConnected = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n // Don't hang startup forever if the first attempt is slow.\n setTimeout(() => this.resolveConnected?.(), 8000);\n this.openSocket();\n });\n }\n\n private openSocket(): void {\n if (this.closed) return;\n let url = `${this.api.wsEndpoint}/api/threads/${this.threadId}/bridge?token=${encodeURIComponent(this.api.bearer)}`;\n if (this.identity) {\n url +=\n `&client_id=${encodeURIComponent(this.identity.clientId)}` +\n `&client_kind=${encodeURIComponent(this.identity.clientKind)}` +\n `&claim=${encodeURIComponent(this.identity.claim)}`;\n if (this.identity.clientName) {\n url += `&client_name=${encodeURIComponent(this.identity.clientName)}`;\n }\n }\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n\n ws.addEventListener(\"open\", () => {\n const wasReconnecting = this.reconnectAttempt > 0;\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.hooks.onConnection?.(wasReconnecting ? \"reconnected\" : \"connected\", 0);\n this.resolveConnected?.();\n });\n\n ws.addEventListener(\"message\", (ev) => {\n // Any frame (pong, bridge_ready, tool_request) proves the link is alive.\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n\n // A socket that fails to open fires 'error' but may never fire 'close', so\n // both must drive reconnection. handleDrop dedupes via the current-socket check.\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", (ev) => {\n // 4001 = a newer connection presented OUR client identity. Do not\n // reconnect (the two processes would ping-pong the socket) — hand the\n // session to the newer process and tell the app.\n if ((ev as { code?: number }).code === 4001 && this.ws === ws) {\n this.closed = true;\n this.owner = false;\n this.ws = null;\n this.stopHeartbeat();\n this.hooks.onSuperseded?.();\n return;\n }\n this.handleDrop(ws);\n });\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return; // stale event from a superseded socket\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n this.hooks.onConnection?.(\"reconnecting\", this.reconnectAttempt);\n // Exponential backoff with jitter, capped — keep trying indefinitely.\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n // Heartbeat so the server can tell a live client (mid-build or awaiting an\n // approval) from a dead one and never freeze a thread on us — and so WE\n // notice when the server goes silent (a half-open TCP that never fires\n // 'close'/'error') and reconnect instead of looking connected forever.\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n\n /**\n * Force a reconnect now. Ownership claims are evaluated at bridge connect,\n * so a non-owner that wants to re-check (e.g. the daemon probing whether a\n * disconnected interactive owner has gone stale) cycles its socket.\n */\n refresh(): void {\n if (this.closed) return;\n const ws = this.ws;\n if (ws) {\n try {\n ws.close();\n } catch {\n // handleDrop still runs via the close event\n }\n this.handleDrop(ws);\n } else {\n this.scheduleReconnect();\n }\n }\n\n private send(payload: object): void {\n try {\n this.ws?.send(JSON.stringify(payload));\n } catch {\n // socket gone; the server will time the call out\n }\n }\n\n private async onMessage(raw: string): Promise<void> {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n // Execution ownership: bridge_ready tells us whether WE execute forwarded\n // tools for this thread; owner_changed announces a takeover by another\n // client. Instances that predate the owner concept send neither field and\n // this client keeps its historical sole-executor behavior.\n if (msg.type === \"bridge_ready\") {\n if (typeof msg.owner === \"boolean\") {\n this.owner = msg.owner;\n const owner = parseOwnerInfo(msg.current_owner);\n this.ownerGeneration = owner?.generation ?? 0;\n if (typeof msg.claim_refused === \"string\") {\n this.hooks.onClaimRefused?.(msg.claim_refused);\n }\n this.hooks.onOwnership?.(msg.owner, owner);\n this.ownershipKnownResolve?.();\n }\n return;\n }\n if (msg.type === \"owner_changed\") {\n const owner = parseOwnerInfo(msg.owner);\n this.owner = !!owner && !!this.identity && owner.client_id === this.identity.clientId;\n this.ownerGeneration = owner?.generation ?? 0;\n this.hooks.onOwnership?.(this.owner, owner);\n return;\n }\n if (msg.type === \"superseded\") {\n // A newer connection presented OUR client identity (see the 4001 close\n // path below — this frame covers runtimes that drop close codes).\n this.closed = true;\n this.owner = false;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n try {\n this.ws?.close();\n } catch {\n // server closes it anyway\n }\n this.ws = null;\n this.hooks.onSuperseded?.();\n return;\n }\n if (msg.type !== \"tool_request\") return;\n // Belt & braces: a non-owner must never execute — the server doesn't\n // dispatch to non-owners, but a frame racing an ownership change could.\n if (!this.owner) return;\n const req = msg as ToolRequest;\n await this.handleToolRequest(req);\n }\n\n /**\n * Reply to a tool request. Durable calls (the agent parked them) deliver the\n * result over HTTP so it lands even if this socket later drops; legacy calls\n * reply over the WebSocket.\n */\n private respond(req: ToolRequest, ok: boolean, result?: string, error?: string): void {\n if (req.durable && req.toolCallId) {\n // Echo the ownership stamp so the server's generation fence can verify\n // this delivery comes from the client the call was dispatched to.\n const executor = this.identity\n ? {\n clientId: this.identity.clientId,\n generation: typeof req.generation === \"number\" ? req.generation : this.ownerGeneration,\n }\n : undefined;\n void this.api.postToolResult(this.threadId, req.toolCallId, ok, result, error, executor);\n } else {\n this.send({ type: \"tool_response\", id: req.id, ok, result, error });\n }\n }\n\n private async handleToolRequest(req: ToolRequest): Promise<void> {\n // Durable calls may be re-sent by the server after a reconnect — only handle\n // each once (prompt + run), so the user isn't asked twice.\n if (req.durable && req.toolCallId) {\n if (this.handledDurable.has(req.toolCallId)) return;\n this.handledDurable.add(req.toolCallId);\n }\n\n const summary = describe(req);\n\n // Compute an effective risk, escalating anything that touches paths outside\n // the project directory (the agent is told to stay inside it).\n let effectiveRisk = typeof req.risk === \"number\" ? req.risk : req.requestPermission ? 3 : 1;\n if (PATH_ARG_TOOLS.has(req.tool) && this.host.isOutsideProject(req.args.path as string | undefined)) {\n effectiveRisk = Math.max(effectiveRisk, 4);\n }\n\n // Hard safety: never run catastrophic shell commands, even in bypass mode.\n if (req.tool === \"bash\" && isCatastrophic(String(req.args.command || \"\"))) {\n this.hooks.onActivity(`⛔ blocked dangerous command: ${summary}`);\n this.respond(req, false, undefined, \"Blocked: this command is considered catastrophic and was refused by the client safety guard.\");\n return;\n }\n\n // Permission key: normally the tool name, but MCP calls are gated at the\n // finer `mcp:<server>/<tool>` granularity so \"always allow this tool\" approves\n // one server's tool rather than every MCP call.\n await this.hooks.refreshPermissions?.().catch(() => {});\n const permKey = permissionKey(req);\n const decision = decide(this.perm, permKey, effectiveRisk, !!req.requestPermission);\n\n if (decision === \"deny\") {\n this.hooks.onActivity(`⛔ ${summary} — blocked (risk ${effectiveRisk})`);\n this.respond(req, false, undefined, `Denied by policy (risk ${effectiveRisk}).`);\n return;\n }\n\n if (decision === \"ask\") {\n const { choice, reason } = await this.hooks.requestApproval(req, summary, effectiveRisk);\n if (choice === \"deny\") {\n const why = reason?.trim();\n this.hooks.onActivity(`⛔ ${summary} — you declined${why ? `: ${why}` : \"\"}`);\n this.respond(\n req,\n false,\n undefined,\n why\n ? `The user declined to run this operation. Their reason: ${why}`\n : \"The user declined to run this operation.\"\n );\n return;\n }\n if (choice === \"always\") this.perm.alwaysAllow.add(permKey);\n if (choice === \"always_risk\") this.perm.allowRisk.add(effectiveRisk);\n if (choice === \"always\" || choice === \"always_risk\") {\n saveApprovals(this.api, this.threadId, this.perm);\n }\n }\n\n // Show the running tool in the live status, then leave a permanent line. The\n // status is keyed by the tool-call id and cleared in a `finally`, so the\n // \"Working …\" label can never get stuck on a tool that already finished even\n // if execution throws or the server's done event is dropped.\n const callKey = req.toolCallId ?? req.id ?? `${req.tool}:${summary}`;\n this.hooks.onStatus?.(callKey, summary);\n let result: HostResult;\n try {\n result = await this.host.execute(req.tool, req.args);\n } finally {\n this.hooks.onStatus?.(callKey, null);\n }\n if (result.ok) {\n const { display, detail } = activityPresentation(req, summary);\n this.hooks.onActivity(`✓ ${display}${detailSuffix(req.tool, result.result)}`, detail);\n this.respond(req, true, result.result ?? \"\");\n } else {\n this.hooks.onActivity(`✗ ${summary} — ${result.error}`);\n this.respond(req, false, undefined, result.error);\n }\n }\n}\n\n/** Parse an owner payload from a bridge frame (best effort). */\nfunction parseOwnerInfo(value: unknown): ExecutionOwnerInfo | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const r = value as Record<string, unknown>;\n if (typeof r.client_id !== \"string\" || r.client_id.length === 0) return null;\n return {\n client_id: r.client_id,\n client_name: typeof r.client_name === \"string\" ? r.client_name : null,\n client_kind: typeof r.client_kind === \"string\" ? r.client_kind : null,\n generation: typeof r.generation === \"number\" ? r.generation : undefined,\n };\n}\n\n/**\n * Stable permission key for a request. For MCP, gate on the specific server +\n * tool/resource so approvals are fine-grained; for everything else, the tool name.\n */\nexport function permissionKey(req: ToolRequest): string {\n if (req.tool !== \"mcp\") return req.tool;\n const a = req.args;\n const server = String(a.server || \"?\");\n const action = String(a.action || \"call\");\n if (action === \"read_resource\") return `mcp:${server}/resource`;\n if (action === \"list_tools\") return `mcp:${server}/list`;\n return `mcp:${server}/${String(a.tool || \"?\")}`;\n}\n\nconst DIM = \"\\x1b[2m\";\nconst RESET = \"\\x1b[0m\";\n\n/**\n * Activity-feed presentation for a finished tool call: the ✓-line text plus\n * optional indented sub-lines. Bash gets its command syntax-highlighted;\n * edits/writes get a truncated git-style hunk beneath the summary so the\n * change is visible at a glance; background_process reads as its action with\n * the command/description as a dim sub-line — never raw JSON args.\n */\nexport function activityPresentation(\n req: ToolRequest,\n summary: string\n): { display: string; detail?: string[] } {\n const a = req.args;\n const cols = Math.max(40, process.stdout.columns || 80);\n if (req.tool === \"bash\") {\n return { display: `bash: ${highlightBash(oneLineCommand(String(a.command ?? \"\"), cols - 20))}` };\n }\n if (req.tool === \"edit_file\") {\n return { display: summary, detail: diffLines(String(a.old_string ?? \"\"), String(a.new_string ?? \"\")) };\n }\n if (req.tool === \"write_file\") {\n return { display: summary, detail: newFileLines(String(a.content ?? \"\")) };\n }\n if (req.tool === \"background_process\") {\n const action = String(a.action || \"list\");\n const id = a.id ? ` ${String(a.id)}` : \"\";\n const display = action === \"start\" ? \"bg start\" : `bg ${action}${id}`;\n const detail: string[] = [];\n if (action === \"start\" && a.command) {\n detail.push(` ${DIM}${oneLineCommand(String(a.command), cols - 8)}${RESET}`);\n }\n if (typeof a.description === \"string\" && a.description.trim()) {\n detail.push(` ${DIM}${oneLineCommand(a.description, cols - 8)}${RESET}`);\n }\n return { display, detail: detail.length ? detail : undefined };\n }\n return { display: summary };\n}\n\n/** One-line human summary of a tool request for the activity feed. */\nexport function describe(req: ToolRequest): string {\n const a = req.args;\n switch (req.tool) {\n case \"mcp\": {\n const server = String(a.server || \"?\");\n const action = String(a.action || \"call\");\n if (action === \"list_tools\") return `mcp ${server}: list tools`;\n if (action === \"read_resource\") return `mcp ${server}: read ${a.uri}`;\n return `mcp ${server}: ${a.tool}`;\n }\n case \"read_file\":\n return `read ${a.path}`;\n case \"grep\":\n return `grep \"${a.pattern}\"${a.glob ? ` in ${a.glob}` : \"\"}`;\n case \"glob\":\n return `find ${a.pattern}`;\n case \"write_file\":\n return `write ${a.path}`;\n case \"edit_file\":\n return `edit ${a.path}`;\n case \"save_to_disk\":\n return `save ${a.source_path} → ${a.dest_path}`;\n case \"run_skill_script\":\n return `skill ${a.skill}: run ${a.entry}`;\n case \"bash\":\n return `bash: ${oneLineCommand(String(a.command ?? \"\"), 80)}`;\n case \"background_process\": {\n // The approval prompt sees only this summary, so `start` must carry the\n // command; the activity feed re-presents it as an indented sub-line.\n const action = String(a.action || \"list\");\n if (action === \"start\") return `bg start: ${oneLineCommand(String(a.command ?? \"\"), 80)}`;\n if (action === \"list\") return \"bg list\";\n return `bg ${action}${a.id ? ` ${String(a.id)}` : \"\"}`;\n }\n default:\n return `${req.tool} ${JSON.stringify(a).slice(0, 80)}`;\n }\n}\n\n/** A short parenthetical hint appended to a finished read-style tool line. */\nfunction detailSuffix(tool: string, result?: string): string {\n if (!result) return \"\";\n // Mutations already read clearly from their summary; don't pile on.\n if (tool === \"write_file\" || tool === \"edit_file\") return \"\";\n if (tool === \"bash\") {\n const m = result.match(/\\[exit code (\\d+)\\]\\s*$/);\n return m ? ` (exit ${m[1]})` : \"\";\n }\n const lines = result.split(\"\\n\").length;\n return ` (${lines} line${lines === 1 ? \"\" : \"s\"})`;\n}\n","/**\n * Registry of long-running background processes the agent spawns.\n *\n * The metadata lives in the THREAD's durable key-value store (server-side), not\n * on this client — so the process list resumes from any machine, at any time,\n * and nothing about it is kept on the client. (The process *output* logs are the\n * one host-local thing: a detached process writes its stdout to a file on the\n * machine it runs on; that file can only live there.)\n *\n * Liveness is re-derived from the OS for this machine's processes — a recorded\n * \"running\" entry is verified with a signal-0 probe — so the registry self-heals\n * if a process died while we weren't watching. Processes on other machines show\n * their last-known status (we can't probe a PID we don't own).\n */\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { ApiClient } from \"./api.ts\";\n\n/** Process *output* logs are host-local (the process writes its stdout here). */\nexport const LOG_DIR = path.join(os.homedir(), \".standardagents\", \"process-logs\");\n\n/** The thread KV key under which the process list is stored. */\nconst KEY = \"bg_processes\";\n\nexport type ProcessStatus = \"running\" | \"exited\" | \"stopped\";\n\nexport interface ProcessEntry {\n id: string;\n pid: number;\n command: string;\n description?: string;\n cwd: string;\n machine: string;\n logPath: string;\n startedAt: number;\n status: ProcessStatus;\n exitCode?: number | null;\n endedAt?: number;\n}\n\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n // EPERM means the process exists but isn't ours; ESRCH means it's gone.\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nexport class ProcessRegistry {\n constructor(\n private api: ApiClient,\n private threadId: string,\n private machine: string\n ) {}\n\n private async read(): Promise<ProcessEntry[]> {\n const value = await this.api.kvGet(this.threadId, KEY);\n return Array.isArray(value) ? (value as ProcessEntry[]) : [];\n }\n\n private async write(entries: ProcessEntry[]): Promise<void> {\n await this.api.kvSet(this.threadId, KEY, entries);\n }\n\n /** Mark this machine's dead \"running\" entries as exited. Returns true if any changed. */\n private reconcileLiveness(entries: ProcessEntry[]): boolean {\n let changed = false;\n for (const e of entries) {\n if (e.machine === this.machine && e.status === \"running\" && !isAlive(e.pid)) {\n e.status = \"exited\";\n e.endedAt = Date.now();\n changed = true;\n }\n }\n return changed;\n }\n\n /** All tracked processes, newest first, with liveness re-checked + persisted. */\n async list(): Promise<ProcessEntry[]> {\n const entries = await this.read();\n if (this.reconcileLiveness(entries)) await this.write(entries);\n return entries.sort((a, b) => b.startedAt - a.startedAt);\n }\n\n async runningCount(): Promise<number> {\n const entries = await this.list();\n return entries.filter((e) => e.status === \"running\").length;\n }\n\n async get(id: string): Promise<ProcessEntry | null> {\n return (await this.read()).find((e) => e.id === id) ?? null;\n }\n\n async add(entry: ProcessEntry): Promise<void> {\n const entries = await this.read();\n entries.push(entry);\n await this.write(entries);\n }\n\n async markExited(id: string, exitCode: number | null): Promise<void> {\n const entries = await this.read();\n const e = entries.find((x) => x.id === id);\n if (e && e.status === \"running\") {\n e.status = \"exited\";\n e.exitCode = exitCode;\n e.endedAt = Date.now();\n await this.write(entries);\n }\n }\n\n async markStopped(id: string): Promise<void> {\n const entries = await this.read();\n const e = entries.find((x) => x.id === id);\n if (e) {\n e.status = \"stopped\";\n e.endedAt = Date.now();\n await this.write(entries);\n }\n }\n}\n","/**\n * MCP server configuration — the list of Model Context Protocol servers this\n * CLI can launch locally and negotiate with. Stored in `~/.standardagents/mcp.json`\n * so it persists across sessions and machines (per-user, not per-thread).\n *\n * Each server is a local process the CLI spawns and speaks JSON-RPC 2.0 to over\n * stdio (see `mcp.ts`). The CLI is the MCP *host*: it owns the connection, does\n * the capability handshake, and forwards the agent's tool calls to the server.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\n/**\n * Resolve the config file path at call time (not module load) so it honors an\n * override. `STANDARDAGENTS_MCP_CONFIG` points at an explicit mcp.json — tests\n * set it to a throwaway temp file so they never read or clobber the user's real\n * `~/.standardagents/mcp.json`.\n */\nfunction configFile(): string {\n return process.env.STANDARDAGENTS_MCP_CONFIG || path.join(os.homedir(), \".standardagents\", \"mcp.json\");\n}\n\n/** A locally-launchable MCP server (stdio transport). */\nexport interface McpServerConfig {\n /** Stable, human-readable id (used to namespace tools, e.g. `mcp:<name>/<tool>`). */\n name: string;\n /** Executable to spawn (e.g. `node`, `npx`, `uvx`, an absolute path). */\n command: string;\n /** Arguments passed to the command. */\n args: string[];\n /** Extra environment variables for the server process (merged over the CLI's env). */\n env?: Record<string, string>;\n /** Working directory for the server process (defaults to the project dir). */\n cwd?: string;\n /** When false, the server is remembered but not connected on startup. */\n enabled: boolean;\n}\n\nexport interface McpConfigFile {\n servers: Record<string, McpServerConfig>;\n}\n\nexport function loadMcpConfig(): McpConfigFile {\n try {\n const raw = fs.readFileSync(configFile(), \"utf8\");\n const parsed = JSON.parse(raw) as McpConfigFile;\n if (!parsed.servers || typeof parsed.servers !== \"object\") parsed.servers = {};\n return parsed;\n } catch {\n return { servers: {} };\n }\n}\n\nexport function listMcpServers(): McpServerConfig[] {\n const cfg = loadMcpConfig();\n return Object.values(cfg.servers).sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function saveMcpServer(server: McpServerConfig): void {\n const cfg = loadMcpConfig();\n cfg.servers[server.name] = server;\n write(cfg);\n}\n\nexport function removeMcpServer(name: string): void {\n const cfg = loadMcpConfig();\n delete cfg.servers[name];\n write(cfg);\n}\n\nexport function setMcpServerEnabled(name: string, enabled: boolean): void {\n const cfg = loadMcpConfig();\n const s = cfg.servers[name];\n if (!s) return;\n s.enabled = enabled;\n write(cfg);\n}\n\nfunction write(cfg: McpConfigFile): void {\n const file = configFile();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify(cfg, null, 2), { mode: 0o600 });\n}\n\n/**\n * Parse a server definition from a CLI-style command string, e.g.\n * `weather: npx -y @modelcontextprotocol/server-weather`\n * The part before the first `:` is the server name; the rest is the command +\n * args. Returns null if the shape is unusable.\n */\nexport function parseServerSpec(spec: string): McpServerConfig | null {\n const trimmed = spec.trim();\n const colon = trimmed.indexOf(\":\");\n if (colon <= 0) return null;\n const name = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n if (!name || !rest) return null;\n const parts = tokenize(rest);\n if (!parts.length) return null;\n const [command, ...args] = parts;\n return { name, command, args, enabled: true };\n}\n\n/**\n * Build a server config from a short name + a full command line, e.g.\n * serverFromCommand(\"playwright\", \"npx -y @playwright/mcp@latest\")\n * Returns null if the name or command is unusable.\n */\nexport function serverFromCommand(\n name: string,\n commandLine: string,\n env?: Record<string, string>\n): McpServerConfig | null {\n const cleanName = name.trim();\n const parts = tokenize(commandLine.trim());\n if (!cleanName || !parts.length) return null;\n const [command, ...args] = parts;\n return { name: cleanName, command, args, env, enabled: true };\n}\n\n/** Minimal shell-ish tokenizer that honours single/double quotes (no expansion). */\nfunction tokenize(input: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let quote: '\"' | \"'\" | null = null;\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n if (quote) {\n if (ch === quote) quote = null;\n else cur += ch;\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n } else if (/\\s/.test(ch)) {\n if (cur) {\n out.push(cur);\n cur = \"\";\n }\n } else {\n cur += ch;\n }\n }\n if (cur) out.push(cur);\n return out;\n}\n","/**\n * Host-side executors for forwarded coding tools. These run on the user's\n * machine. Paths are resolved relative to the project directory; everything is\n * best-effort and returns a structured {@link HostResult} rather than throwing.\n */\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport type { HostResult } from \"./types.ts\";\nimport { ProcessRegistry, LOG_DIR, type ProcessEntry } from \"./process-registry.ts\";\nimport type { McpManager } from \"./mcp.ts\";\nimport type { ApiClient } from \"./api.ts\";\nimport { saveMcpServer, removeMcpServer, serverFromCommand } from \"./mcp-config.ts\";\n\n/**\n * How long to watch a freshly-started background process before declaring it\n * \"running\". Fast failures (port already in use, missing binary, bad flag) exit\n * within milliseconds; this window catches them so we never report or track a\n * process that never actually came up.\n */\nconst STARTUP_GRACE_MS = 600;\n\n/** True if a pid is still alive (signal-0 probe; EPERM = alive but not ours). */\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\n/** Read the last `n` non-empty lines of a log file (empty string if unreadable). */\nasync function readLogTail(logPath: string, n: number): Promise<string> {\n try {\n const content = await fsp.readFile(logPath, \"utf8\");\n return content.split(\"\\n\").filter(Boolean).slice(-n).join(\"\\n\");\n } catch {\n return \"\";\n }\n}\n\nexport class HostTools {\n constructor(\n private projectDir: string,\n private registry?: ProcessRegistry,\n private threadId?: string,\n private machine?: string,\n private mcp?: McpManager,\n /** Called after the MCP server set changes so the catalog can be re-published. */\n private onMcpCatalogChange?: () => void,\n /** Instance API access — used by save_to_disk to download thread-fs bytes. */\n private api?: ApiClient\n ) {}\n\n /** Resolve a user/model-supplied path against the project directory. */\n resolve(p: string | undefined): string {\n if (!p || p === \".\") return this.projectDir;\n return path.resolve(this.projectDir, p);\n }\n\n /** True when the resolved path escapes the project directory. */\n isOutsideProject(p: string | undefined): boolean {\n const abs = this.resolve(p);\n const rel = path.relative(this.projectDir, abs);\n return rel.startsWith(\"..\") || path.isAbsolute(rel);\n }\n\n async execute(tool: string, args: Record<string, unknown>): Promise<HostResult> {\n try {\n switch (tool) {\n case \"read_file\":\n return await this.readFile(args);\n case \"grep\":\n return await this.grep(args);\n case \"glob\":\n return await this.glob(args);\n case \"write_file\":\n return await this.writeFile(args);\n case \"edit_file\":\n return await this.editFile(args);\n case \"bash\":\n return await this.bash(args);\n case \"save_to_disk\":\n return await this.saveToDisk(args);\n case \"run_skill_script\":\n return await this.runSkillScript(args);\n case \"background_process\": {\n // One tool, dispatched by action: start launches + verifies a process;\n // list/logs/stop inspect or terminate tracked ones.\n const action = String(args.action || \"list\");\n if (action === \"start\") return await this.runBackground(args);\n return await this.backgroundProcesses(args);\n }\n case \"mcp\": {\n // Forwarded MCP tool: the CLI is the MCP host, so the negotiation and\n // execution happen here against the locally-connected server.\n if (!this.mcp) {\n return { ok: false, error: \"MCP is not available in this session.\" };\n }\n // Removing a server also drops it from the stored config and republishes\n // the catalog, so it doesn't linger or reconnect.\n if (String(args.action) === \"remove\") {\n const name = String(args.server || \"\");\n if (!name) return { ok: false, error: \"remove requires a 'server' name.\" };\n this.mcp.disconnect(name);\n removeMcpServer(name);\n this.onMcpCatalogChange?.();\n return { ok: true, result: JSON.stringify({ removed: name }) };\n }\n return await this.mcp.dispatch(args);\n }\n case \"install_mcp\":\n return await this.installMcp(args);\n default:\n return { ok: false, error: `Unknown tool: ${tool}` };\n }\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n }\n\n private async readFile(args: Record<string, unknown>): Promise<HostResult> {\n const file = this.resolve(String(args.path || \"\"));\n const stat = await fsp.stat(file).catch(() => null);\n if (!stat) return { ok: false, error: `File not found: ${args.path}` };\n if (stat.isDirectory()) return { ok: false, error: `${args.path} is a directory` };\n if (stat.size > 2_000_000) return { ok: false, error: `File too large (${stat.size} bytes)` };\n\n const content = await fsp.readFile(file, \"utf8\");\n const lines = content.split(\"\\n\");\n const offset = typeof args.offset === \"number\" ? Math.max(1, args.offset) : 1;\n const limit = typeof args.limit === \"number\" ? args.limit : lines.length;\n const slice = lines.slice(offset - 1, offset - 1 + limit);\n const numbered = slice.map((l, i) => `${offset + i}\\t${l}`).join(\"\\n\");\n return { ok: true, result: numbered || \"(empty file)\" };\n }\n\n private async grep(args: Record<string, unknown>): Promise<HostResult> {\n const pattern = String(args.pattern || \"\");\n if (!pattern) return { ok: false, error: \"pattern is required\" };\n const searchPath = this.resolve(args.path ? String(args.path) : undefined);\n const rgArgs = [\"--line-number\", \"--no-heading\", \"--color\", \"never\", \"--max-count\", \"200\"];\n if (args.ignore_case) rgArgs.push(\"-i\");\n if (args.glob) rgArgs.push(\"--glob\", String(args.glob));\n rgArgs.push(\"--\", pattern, searchPath);\n const rg = await this.run(\"rg\", rgArgs, this.projectDir, 30000);\n if (rg.code === 127) {\n return { ok: false, error: \"ripgrep (rg) not found on host; install it for grep.\" };\n }\n // rg exits 1 with no matches — treat as a successful empty result.\n const out = rg.stdout.trim();\n return { ok: true, result: out || \"(no matches)\" };\n }\n\n private async glob(args: Record<string, unknown>): Promise<HostResult> {\n const pattern = String(args.pattern || \"\");\n if (!pattern) return { ok: false, error: \"pattern is required\" };\n const base = this.resolve(args.path ? String(args.path) : undefined);\n const rg = await this.run(\"rg\", [\"--files\", \"--glob\", pattern, base], this.projectDir, 30000);\n if (rg.code === 127) {\n // Fallback: native recursive walk with a simple glob match.\n const matches = await this.walkGlob(base, pattern);\n return { ok: true, result: matches.slice(0, 300).join(\"\\n\") || \"(no files)\" };\n }\n const rel = rg.stdout\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((p) => path.relative(this.projectDir, p))\n .slice(0, 300);\n return { ok: true, result: rel.join(\"\\n\") || \"(no files)\" };\n }\n\n private async writeFile(args: Record<string, unknown>): Promise<HostResult> {\n const file = this.resolve(String(args.path || \"\"));\n const content = String(args.content ?? \"\");\n await fsp.mkdir(path.dirname(file), { recursive: true });\n const existed = fs.existsSync(file);\n await fsp.writeFile(file, content, \"utf8\");\n return {\n ok: true,\n result: `${existed ? \"Overwrote\" : \"Created\"} ${path.relative(this.projectDir, file)} (${Buffer.byteLength(content)} bytes)`,\n };\n }\n\n private async editFile(args: Record<string, unknown>): Promise<HostResult> {\n const file = this.resolve(String(args.path || \"\"));\n const oldStr = String(args.old_string ?? \"\");\n const newStr = String(args.new_string ?? \"\");\n const replaceAll = args.replace_all === true;\n const stat = await fsp.stat(file).catch(() => null);\n if (!stat) return { ok: false, error: `File not found: ${args.path}` };\n\n const content = await fsp.readFile(file, \"utf8\");\n if (oldStr === \"\") return { ok: false, error: \"old_string cannot be empty\" };\n const count = content.split(oldStr).length - 1;\n if (count === 0) return { ok: false, error: \"old_string not found in file (it must match exactly).\" };\n if (count > 1 && !replaceAll) {\n return { ok: false, error: `old_string is not unique (${count} matches). Add more context or set replace_all.` };\n }\n const updated = replaceAll ? content.split(oldStr).join(newStr) : content.replace(oldStr, newStr);\n await fsp.writeFile(file, updated, \"utf8\");\n return { ok: true, result: `Edited ${path.relative(this.projectDir, file)} (${count} replacement${count === 1 ? \"\" : \"s\"})` };\n }\n\n /**\n * Copy a file from the THREAD filesystem (e.g. a generated /attachments/*\n * asset) onto the project disk: download the bytes from the instance API and\n * write them at the destination. The bytes never pass through the model.\n */\n private async saveToDisk(args: Record<string, unknown>): Promise<HostResult> {\n const source = String(args.source_path || \"\");\n const destArg = String(args.dest_path || \"\");\n if (!source || !destArg) return { ok: false, error: \"source_path and dest_path are required\" };\n if (!this.api || !this.threadId) {\n return { ok: false, error: \"No instance API available for thread file downloads.\" };\n }\n const bytes = await this.api.fetchFile(this.threadId, source);\n if (!bytes) return { ok: false, error: `Could not download ${source} from the thread filesystem.` };\n const dest = this.resolve(destArg);\n await fsp.mkdir(path.dirname(dest), { recursive: true });\n const existed = fs.existsSync(dest);\n await fsp.writeFile(dest, bytes);\n return {\n ok: true,\n result: `${existed ? \"Overwrote\" : \"Saved\"} ${path.relative(this.projectDir, dest)} (${bytes.length} bytes) from ${source}`,\n };\n }\n\n /**\n * Execute a SKILL script on the host. Skills live in the instance (cloud is\n * the source of truth); the server forwards the skill's files with the call\n * and we materialize them into a content-addressed temp dir — nothing about\n * a skill is stored on this machine beyond an ephemeral cache. The script\n * runs with cwd = the PROJECT (so it can operate on the user's files) and\n * SKILL_DIR pointing at the materialized folder (so it can read its own\n * references/assets).\n */\n private async runSkillScript(args: Record<string, unknown>): Promise<HostResult> {\n const skill = String(args.skill || \"skill\");\n const entry = String(args.entry || \"\");\n if (!entry) return { ok: false, error: \"entry (the script path within the skill) is required\" };\n let files: { path: string; content: string }[];\n try {\n const parsed = JSON.parse(String(args.files_json || \"[]\"));\n if (!Array.isArray(parsed)) throw new Error(\"not an array\");\n files = parsed.map((f) => ({ path: String(f.path), content: String(f.content ?? \"\") }));\n } catch {\n return { ok: false, error: \"files_json must be a JSON array of {path, content}\" };\n }\n if (!files.some((f) => f.path === entry)) {\n return { ok: false, error: `entry \"${entry}\" is not among the provided skill files` };\n }\n let scriptArgs: string[] = [];\n if (args.args_json) {\n try {\n const parsed = JSON.parse(String(args.args_json));\n if (!Array.isArray(parsed)) throw new Error(\"not an array\");\n scriptArgs = parsed.map(String);\n } catch {\n return { ok: false, error: \"args_json must be a JSON array of strings\" };\n }\n }\n\n // Content-addressed materialization: same skill content → same dir, no rewrite.\n const hash = crypto.createHash(\"sha256\").update(JSON.stringify(files)).digest(\"hex\").slice(0, 12);\n const skillDir = path.join(os.tmpdir(), \"standardcode-skills\", `${skill}-${hash}`);\n for (const f of files) {\n const dest = path.resolve(skillDir, f.path);\n if (path.relative(skillDir, dest).startsWith(\"..\")) {\n return { ok: false, error: `Skill file escapes its directory: ${f.path}` };\n }\n await fsp.mkdir(path.dirname(dest), { recursive: true });\n await fsp.writeFile(dest, f.content, \"utf8\");\n }\n const entryPath = path.resolve(skillDir, entry);\n\n // Interpreter: shebang wins; otherwise by extension.\n const entryContent = files.find((f) => f.path === entry)!.content;\n let cmd: string;\n let argv: string[];\n if (entryContent.startsWith(\"#!\")) {\n await fsp.chmod(entryPath, 0o755);\n cmd = entryPath;\n argv = scriptArgs;\n } else {\n const ext = path.extname(entry).toLowerCase();\n const interp: Record<string, string[]> = {\n \".py\": [\"python3\"],\n \".sh\": [\"bash\"],\n \".js\": [\"node\"],\n \".mjs\": [\"node\"],\n \".ts\": [\"npx\", \"tsx\"],\n };\n const found = interp[ext];\n if (!found) return { ok: false, error: `No interpreter for \"${ext}\" — add a shebang line to the script.` };\n cmd = found[0];\n argv = [...found.slice(1), entryPath, ...scriptArgs];\n }\n\n const timeoutMs = typeof args.timeout_ms === \"number\" ? Math.min(args.timeout_ms, 300_000) : 120_000;\n return await new Promise<HostResult>((resolvePromise) => {\n const child = spawn(cmd, argv, {\n cwd: this.projectDir,\n env: { ...process.env, SKILL_DIR: skillDir },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let out = \"\";\n const cap = (chunk: Buffer) => {\n if (out.length < 200_000) out += chunk.toString(\"utf8\");\n };\n child.stdout.on(\"data\", cap);\n child.stderr.on(\"data\", cap);\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n resolvePromise({ ok: false, error: `Skill script timed out after ${timeoutMs}ms.\\n${out.slice(-4000)}` });\n }, timeoutMs);\n child.on(\"error\", (err) => {\n clearTimeout(timer);\n resolvePromise({ ok: false, error: `Could not launch ${cmd}: ${err.message}` });\n });\n child.on(\"exit\", (code) => {\n clearTimeout(timer);\n const body = out.trim() || \"(no output)\";\n if (code === 0) resolvePromise({ ok: true, result: body });\n else resolvePromise({ ok: false, error: `Script exited with code ${code}:\\n${body.slice(-6000)}` });\n });\n });\n }\n\n private async bash(args: Record<string, unknown>): Promise<HostResult> {\n const command = String(args.command || \"\");\n if (!command.trim()) return { ok: false, error: \"command is required\" };\n const cwd = args.cwd ? this.resolve(String(args.cwd)) : this.projectDir;\n const timeout = typeof args.timeout_ms === \"number\" ? args.timeout_ms : 120000;\n const res = await this.run(\"bash\", [\"-lc\", command], cwd, timeout);\n const combined = [res.stdout, res.stderr].filter(Boolean).join(\"\\n\").trim();\n const truncated = combined.length > 30000 ? combined.slice(0, 30000) + \"\\n…(truncated)\" : combined;\n if (res.timedOut) {\n return { ok: false, error: `Command timed out after ${timeout}ms.\\n${truncated}` };\n }\n const status = `exit code ${res.code}`;\n return {\n ok: res.code === 0,\n result: `${truncated || \"(no output)\"}\\n[${status}]`,\n error: res.code === 0 ? undefined : `Command failed (${status}).\\n${truncated}`,\n };\n }\n\n /** Start a tracked long-running process, detached, with output to a log file. */\n private async runBackground(args: Record<string, unknown>): Promise<HostResult> {\n const command = String(args.command || \"\");\n if (!command.trim()) return { ok: false, error: \"command is required\" };\n const cwd = args.cwd ? this.resolve(String(args.cwd)) : this.projectDir;\n // spawn() reports a missing cwd as an ASYNC 'error' event (\"spawn bash\n // ENOENT\"), not a throw — check up front so the agent gets a clear error.\n if (!fs.existsSync(cwd)) {\n return { ok: false, error: `cwd does not exist: ${cwd}` };\n }\n const id = crypto.randomUUID().slice(0, 8);\n const logPath = path.join(LOG_DIR, `${id}.log`);\n\n let out: number;\n try {\n await fsp.mkdir(LOG_DIR, { recursive: true });\n out = fs.openSync(logPath, \"a\");\n } catch (err) {\n return { ok: false, error: `Could not open log file: ${err instanceof Error ? err.message : String(err)}` };\n }\n\n let child;\n try {\n child = spawn(\"bash\", [\"-lc\", command], { cwd, detached: true, stdio: [\"ignore\", out, out] });\n } catch (err) {\n fs.closeSync(out);\n return { ok: false, error: `Failed to start: ${err instanceof Error ? err.message : String(err)}` };\n }\n // spawn failures (bad cwd, missing binary) arrive as an async 'error'\n // event; without a listener Node throws it as an uncaught exception and\n // takes the whole CLI down. Capture it and fold it into the early-exit\n // check below.\n let spawnError: Error | null = null;\n child.on(\"error\", (err) => {\n spawnError = err;\n });\n fs.closeSync(out); // the child holds its own copy of the fd\n const pid = child.pid;\n\n // Verify the process actually STAYED UP before we record it. A command that\n // fails fast (a port already in use, a missing binary, a bad flag) exits\n // within milliseconds — we don't want to report a phantom \"running\" process\n // or persist it to the registry. Watch for an early exit during a short\n // grace window, then surface the captured output so the agent can see why.\n let earlyExit: number | null | undefined;\n const onEarlyExit = (code: number | null) => {\n earlyExit = code;\n };\n child.on(\"exit\", onEarlyExit);\n await new Promise((r) => setTimeout(r, STARTUP_GRACE_MS));\n\n if (spawnError) {\n return { ok: false, error: `Failed to start: ${(spawnError as Error).message}` };\n }\n if (!pid) return { ok: false, error: \"Process failed to start (no pid).\" };\n\n if (earlyExit !== undefined || !isAlive(pid)) {\n const tail = await readLogTail(logPath, 15);\n const code = earlyExit ?? \"unknown\";\n return {\n ok: false,\n error:\n `The process exited immediately (exit code ${code}) — it did not stay running, ` +\n `so nothing was started or tracked.` +\n (tail ? `\\n\\nOutput:\\n${tail}` : \" No output was captured.\"),\n };\n }\n\n // It survived the grace window — now it's safe to detach and record it.\n child.removeListener(\"exit\", onEarlyExit);\n child.unref();\n\n if (this.registry) {\n const entry: ProcessEntry = {\n id,\n pid,\n command,\n description: typeof args.description === \"string\" ? args.description : undefined,\n cwd,\n machine: this.machine ?? \"\",\n logPath,\n startedAt: Date.now(),\n status: \"running\",\n };\n // Persist to the thread's KV (server-side) so the process is visible on\n // resume from any machine.\n await this.registry.add(entry);\n child.on(\"exit\", (code) => void this.registry?.markExited(id, code));\n }\n\n return {\n ok: true,\n result: JSON.stringify(\n {\n id,\n pid,\n status: \"running\",\n logPath,\n note: `Started in the background as process ${id} (pid ${pid}) and confirmed running. Output is logged to ${logPath}. Use background_process (list/logs/stop) to check on it or stop it.`,\n },\n null,\n 2\n ),\n };\n }\n\n /**\n * Install + connect an MCP server from a name + launch command (e.g.\n * \"npx -y @playwright/mcp@latest\"). Saves it to the user's MCP config,\n * launches it, runs the handshake, and republishes the catalog on success so\n * the agent immediately sees its tools. The connect IS the install — for `npx`\n * commands the package is fetched on first run.\n */\n private async installMcp(args: Record<string, unknown>): Promise<HostResult> {\n if (!this.mcp) return { ok: false, error: \"MCP is not available in this session.\" };\n const name = String(args.name || \"\");\n const command = String(args.command || \"\");\n if (!name || !command) {\n return { ok: false, error: \"install_mcp needs a `name` and a `command` (e.g. \\\"npx -y @playwright/mcp@latest\\\").\" };\n }\n\n let env: Record<string, string> | undefined;\n if (typeof args.env_json === \"string\" && args.env_json.trim()) {\n try {\n const parsed = JSON.parse(args.env_json);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) env = parsed as Record<string, string>;\n else return { ok: false, error: \"env_json must encode a JSON object of environment variables.\" };\n } catch (e) {\n return { ok: false, error: `env_json is not valid JSON: ${e instanceof Error ? e.message : String(e)}` };\n }\n }\n\n const cfg = serverFromCommand(name, command, env);\n if (!cfg) return { ok: false, error: `Could not parse the command: \"${command}\".` };\n\n saveMcpServer(cfg);\n try {\n const client = await this.mcp.connect(cfg);\n this.onMcpCatalogChange?.();\n const tools = client.tools.map((t) => t.name);\n return {\n ok: true,\n result: JSON.stringify(\n {\n server: cfg.name,\n command: `${cfg.command} ${cfg.args.join(\" \")}`.trim(),\n connected: true,\n toolCount: tools.length,\n tools,\n note:\n `Installed and connected MCP server \"${cfg.name}\" with ${tools.length} tool${tools.length === 1 ? \"\" : \"s\"}` +\n `${tools.length ? `: ${tools.join(\", \")}` : \"\"}. They are available now and will auto-connect next session.`,\n },\n null,\n 2\n ),\n };\n } catch (err) {\n this.onMcpCatalogChange?.();\n return {\n ok: false,\n error: `Saved MCP server \"${cfg.name}\" but it failed to start: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n /** List / inspect logs of / stop tracked background processes. */\n private async backgroundProcesses(args: Record<string, unknown>): Promise<HostResult> {\n const action = String(args.action || \"list\");\n if (!this.registry) {\n return { ok: true, result: \"Background-process tracking is not available in this session.\" };\n }\n\n if (action === \"list\") {\n const procs = await this.registry.list();\n if (!procs.length) return { ok: true, result: \"No background processes for this session.\" };\n const lines = procs.map((p) => {\n const age = relativeAge(p.startedAt);\n const status =\n p.status === \"running\"\n ? \"running\"\n : `${p.status}${typeof p.exitCode === \"number\" ? ` (exit ${p.exitCode})` : \"\"}`;\n return `${p.id} [${status}] pid ${p.pid} started ${age}\\n ${p.command}`;\n });\n return { ok: true, result: lines.join(\"\\n\") };\n }\n\n const id = String(args.id || \"\");\n const proc = await this.registry.get(id);\n if (!proc) return { ok: false, error: `No background process with id ${id}` };\n\n if (action === \"logs\") {\n const maxLines = typeof args.lines === \"number\" ? args.lines : 60;\n let content = \"\";\n try {\n content = await fsp.readFile(proc.logPath, \"utf8\");\n } catch {\n return { ok: true, result: `(no output captured yet for ${id})` };\n }\n const tail = content.split(\"\\n\").slice(-maxLines).join(\"\\n\");\n return { ok: true, result: tail || `(no output yet for ${id})` };\n }\n\n if (action === \"stop\") {\n if (proc.status !== \"running\") {\n return { ok: true, result: `Process ${id} is already ${proc.status}.` };\n }\n try {\n process.kill(-proc.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n process.kill(-proc.pid, \"SIGKILL\");\n } catch {\n // already gone\n }\n }, 3000);\n } catch {\n try {\n process.kill(proc.pid, \"SIGKILL\");\n } catch {\n // already gone\n }\n }\n await this.registry.markStopped(id);\n return { ok: true, result: `Stopped background process ${id} (pid ${proc.pid}).` };\n }\n\n return { ok: false, error: `Unknown action: ${action}` };\n }\n\n /**\n * Terminate every still-running background process this machine started, so\n * detached children don't outlive the CLI when the session quits. Sends\n * SIGTERM to each process group, waits a brief grace, then SIGKILL any\n * straggler, and records them stopped. Best effort and bounded so quitting\n * stays snappy. Returns the number of running processes it signaled.\n */\n async stopAllLocalProcesses(): Promise<number> {\n if (!this.registry) return 0;\n let running: ProcessEntry[] = [];\n try {\n const procs = await this.registry.list();\n running = procs.filter((p) => p.status === \"running\" && p.machine === (this.machine ?? \"\"));\n } catch {\n return 0;\n }\n if (!running.length) return 0;\n\n // Negative pid targets the whole process group — detached children are\n // their own group leader, so this kills the process tree, not just bash.\n const signal = (pid: number, sig: NodeJS.Signals) => {\n try {\n process.kill(-pid, sig);\n } catch {\n try {\n process.kill(pid, sig);\n } catch {\n // already gone\n }\n }\n };\n\n for (const proc of running) signal(proc.pid, \"SIGTERM\");\n await new Promise((r) => setTimeout(r, 300));\n for (const proc of running) signal(proc.pid, \"SIGKILL\");\n await Promise.allSettled(running.map((proc) => this.registry!.markStopped(proc.id)));\n return running.length;\n }\n\n private run(\n cmd: string,\n args: string[],\n cwd: string,\n timeoutMs: number\n ): Promise<{ stdout: string; stderr: string; code: number; timedOut: boolean }> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let exitCode = 0;\n let settled = false;\n // Cap captured output so a chatty/looping command can't grow memory\n // without bound (which previously could take the whole CLI down).\n const MAX_OUTPUT = 256 * 1024;\n\n let child;\n try {\n // Own process group so a timeout can kill the whole tree, and so a\n // backgrounded server keeps running after the CLI exits.\n child = spawn(cmd, args, { cwd, detached: true });\n } catch {\n resolve({ stdout: \"\", stderr: \"\", code: 127, timedOut: false });\n return;\n }\n child.unref();\n\n let graceTimer: ReturnType<typeof setTimeout> | null = null;\n const settle = (code: number) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (graceTimer) clearTimeout(graceTimer);\n resolve({ stdout, stderr, code, timedOut });\n };\n\n const timer = setTimeout(() => {\n timedOut = true;\n try {\n if (child.pid) process.kill(-child.pid, \"SIGKILL\");\n } catch {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // already gone\n }\n }\n // Settle even if `close` never arrives (a detached child may hold stdio).\n setTimeout(() => settle(exitCode), 250);\n }, timeoutMs);\n\n child.stdout?.on(\"data\", (d) => {\n if (stdout.length < MAX_OUTPUT) stdout += d.toString();\n });\n child.stderr?.on(\"data\", (d) => {\n if (stderr.length < MAX_OUTPUT) stderr += d.toString();\n });\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (!stderr) stderr = String(err);\n settle(err.code === \"ENOENT\" ? 127 : 1);\n });\n // Normal completion: stdio drained.\n child.on(\"close\", (code) => settle(code ?? exitCode));\n // The process exited but stdio may stay open if it backgrounded a child\n // that inherited the pipes (e.g. `server &`). Resolve shortly after exit\n // so background commands return promptly instead of hanging on `close`.\n child.on(\"exit\", (code) => {\n exitCode = code ?? 0;\n graceTimer = setTimeout(() => settle(exitCode), 250);\n });\n });\n }\n\n private async walkGlob(base: string, pattern: string): Promise<string[]> {\n const re = globToRegExp(pattern);\n const out: string[] = [];\n const walk = async (dir: string) => {\n const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const e of entries) {\n if (e.name === \".git\" || e.name === \"node_modules\") continue;\n const full = path.join(dir, e.name);\n if (e.isDirectory()) await walk(full);\n else {\n const rel = path.relative(this.projectDir, full);\n if (re.test(rel) || re.test(e.name)) out.push(rel);\n }\n }\n };\n await walk(base);\n return out;\n }\n}\n\nfunction relativeAge(startedAt: number): string {\n const diff = (Date.now() - startedAt) / 1000;\n if (diff < 60) return `${Math.floor(diff)}s ago`;\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`;\n return `${Math.floor(diff / 86400)}d ago`;\n}\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \" \")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/ /g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(`^${escaped}$`);\n}\n","/**\n * Model Context Protocol (MCP) client + manager.\n *\n * The CLI is the MCP **host**: for each configured server it spawns the process\n * locally and speaks JSON-RPC 2.0 over stdio (newline-delimited UTF-8 frames, as\n * the MCP stdio transport specifies). It performs the real capability handshake\n * (`initialize` → `notifications/initialized`), discovers tools and resources\n * (`tools/list`, `resources/list`), and executes the agent's forwarded calls\n * (`tools/call`, `resources/read`).\n *\n * Nothing here talks to the Standard Agents instance — the instance only ever\n * forwards an `mcp` tool request down the bridge; this module is what turns that\n * into a genuine MCP exchange on the user's machine and returns the result.\n *\n * Zero-dependency: Node globals only.\n */\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport type { McpServerConfig } from \"./mcp-config.ts\";\n\n/** MCP protocol revision this client implements/negotiates. */\nexport const MCP_PROTOCOL_VERSION = \"2025-06-18\";\n/** Protocol versions we know how to speak, newest first (for negotiation fallback). */\nconst SUPPORTED_PROTOCOL_VERSIONS = [\"2025-06-18\", \"2025-03-26\", \"2024-11-05\"];\n\nconst CLIENT_INFO = { name: \"standard-code\", version: \"0.1.0\" };\n\ninterface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: unknown;\n}\ninterface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\ninterface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: number;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport interface McpToolDef {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nexport interface McpResourceDef {\n uri: string;\n name?: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface McpServerInfo {\n name: string;\n version?: string;\n}\n\n/** A signed-ish provenance record proving which server produced a result. */\nexport interface McpAttestation {\n /** Configured server id. */\n server: string;\n /** Server's self-reported identity from `initialize`. */\n serverInfo: McpServerInfo;\n /** Negotiated protocol version. */\n protocolVersion: string;\n /** Tool or resource invoked. */\n target: string;\n /** sha256 of the canonicalized arguments. */\n argsSha256: string;\n /** sha256 of the returned content. */\n resultSha256: string;\n /** Random per-call nonce. */\n nonce: string;\n /** Whether the server flagged the result as an error. */\n isError: boolean;\n /** Unix ms when the result was received. */\n at: number;\n}\n\nexport interface McpCallResult {\n ok: boolean;\n /** Flattened text content from the server's response. */\n text: string;\n attestation: McpAttestation;\n}\n\n/** Public, JSON-serializable view of a connected server (for the KV catalog). */\nexport interface McpServerCatalogEntry {\n name: string;\n status: \"connected\" | \"error\" | \"disabled\";\n serverInfo?: McpServerInfo;\n protocolVersion?: string;\n instructions?: string;\n capabilities?: Record<string, unknown>;\n tools: McpToolDef[];\n resources: McpResourceDef[];\n error?: string;\n}\n\nconst RPC_TIMEOUT_MS = 30_000;\n// Generous: a first `npx -y <server>` cold-start downloads the package before the\n// server even speaks, which can take a while on a slow network.\nconst INIT_TIMEOUT_MS = 90_000;\n\n/**\n * One live connection to a single MCP server process. Owns the child process,\n * the JSON-RPC framing, the pending-request map, and the handshake.\n */\nexport class McpClient {\n private child: ChildProcessWithoutNullStreams | null = null;\n private nextId = 1;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }>();\n private buffer = \"\";\n private closed = false;\n\n serverInfo: McpServerInfo;\n protocolVersion = MCP_PROTOCOL_VERSION;\n capabilities: Record<string, unknown> = {};\n instructions = \"\";\n tools: McpToolDef[] = [];\n resources: McpResourceDef[] = [];\n lastError: string | null = null;\n\n constructor(private config: McpServerConfig) {\n this.serverInfo = { name: config.name };\n }\n\n /** Spawn the server, run the initialize handshake, and discover capabilities. */\n async connect(defaultCwd: string): Promise<void> {\n const child = spawn(this.config.command, this.config.args, {\n cwd: this.config.cwd || defaultCwd,\n env: { ...process.env, ...(this.config.env || {}) },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n this.child = child;\n\n child.on(\"error\", (err) => this.failAll(new Error(`MCP server '${this.config.name}' failed to start: ${err.message}`)));\n child.on(\"exit\", (code) => {\n if (!this.closed) this.failAll(new Error(`MCP server '${this.config.name}' exited (code ${code ?? \"unknown\"}).`));\n });\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => this.onData(chunk));\n // Surface server stderr only on failure; many servers log freely to stderr.\n child.stderr.setEncoding(\"utf8\");\n let stderrTail = \"\";\n child.stderr.on(\"data\", (d: string) => {\n stderrTail = (stderrTail + d).slice(-2000);\n });\n\n try {\n const initResult = (await this.request(\n \"initialize\",\n {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: { tools: {}, resources: {} },\n clientInfo: CLIENT_INFO,\n },\n INIT_TIMEOUT_MS\n )) as {\n protocolVersion?: string;\n capabilities?: Record<string, unknown>;\n serverInfo?: McpServerInfo;\n instructions?: string;\n };\n\n const negotiated = initResult.protocolVersion || MCP_PROTOCOL_VERSION;\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(negotiated)) {\n // The server insists on a revision we don't implement. Per the spec the\n // host should disconnect rather than guess at an incompatible wire format.\n throw new Error(\n `Server requires unsupported MCP protocol version '${negotiated}' (this client speaks ${SUPPORTED_PROTOCOL_VERSIONS.join(\", \")}).`\n );\n }\n this.protocolVersion = negotiated;\n this.capabilities = initResult.capabilities || {};\n this.serverInfo = initResult.serverInfo || { name: this.config.name };\n this.instructions = initResult.instructions || \"\";\n\n // Tell the server the handshake is complete before issuing other calls.\n this.notify(\"notifications/initialized\");\n\n // Discover what the server offers (guarded by advertised capabilities).\n if (this.capabilities.tools) await this.refreshTools();\n if (this.capabilities.resources) await this.refreshResources();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.lastError = stderrTail ? `${msg}\\n${stderrTail.trim()}` : msg;\n this.close();\n throw new Error(this.lastError);\n }\n }\n\n async refreshTools(): Promise<void> {\n const res = (await this.request(\"tools/list\", {})) as { tools?: McpToolDef[] };\n this.tools = Array.isArray(res?.tools) ? res.tools : [];\n }\n\n async refreshResources(): Promise<void> {\n try {\n const res = (await this.request(\"resources/list\", {})) as { resources?: McpResourceDef[] };\n this.resources = Array.isArray(res?.resources) ? res.resources : [];\n } catch {\n this.resources = []; // resources are optional; tolerate servers that decline\n }\n }\n\n /** Call a tool and return its flattened text + a provenance attestation. */\n async callTool(name: string, args: Record<string, unknown>): Promise<McpCallResult> {\n const res = (await this.request(\"tools/call\", { name, arguments: args })) as {\n content?: Array<Record<string, unknown>>;\n isError?: boolean;\n structuredContent?: unknown;\n };\n const text = flattenContent(res?.content, res?.structuredContent);\n return this.attest(name, args, text, !!res?.isError);\n }\n\n /** Read a resource and return its flattened text + attestation. */\n async readResource(uri: string): Promise<McpCallResult> {\n const res = (await this.request(\"resources/read\", { uri })) as {\n contents?: Array<Record<string, unknown>>;\n };\n const text = flattenResourceContents(res?.contents);\n return this.attest(uri, { uri }, text, false);\n }\n\n private attest(target: string, args: Record<string, unknown>, text: string, isError: boolean): McpCallResult {\n const attestation: McpAttestation = {\n server: this.config.name,\n serverInfo: this.serverInfo,\n protocolVersion: this.protocolVersion,\n target,\n argsSha256: sha256(canonicalJson(args)),\n resultSha256: sha256(text),\n nonce: crypto.randomBytes(8).toString(\"hex\"),\n isError,\n at: Date.now(),\n };\n return { ok: !isError, text, attestation };\n }\n\n catalogEntry(): McpServerCatalogEntry {\n return {\n name: this.config.name,\n status: this.lastError ? \"error\" : \"connected\",\n serverInfo: this.serverInfo,\n protocolVersion: this.protocolVersion,\n instructions: this.instructions || undefined,\n capabilities: this.capabilities,\n tools: this.tools,\n resources: this.resources,\n error: this.lastError || undefined,\n };\n }\n\n close(): void {\n this.closed = true;\n this.failAll(new Error(\"connection closed\"));\n try {\n this.child?.stdin.end();\n } catch {\n /* ignore */\n }\n try {\n this.child?.kill(\"SIGTERM\");\n } catch {\n /* ignore */\n }\n this.child = null;\n }\n\n // ── JSON-RPC plumbing ─────────────────────────────────────────────────────\n\n private request(method: string, params: unknown, timeoutMs = RPC_TIMEOUT_MS): Promise<unknown> {\n return new Promise((resolve, reject) => {\n if (!this.child || this.closed) {\n reject(new Error(`MCP server '${this.config.name}' is not connected.`));\n return;\n }\n const id = this.nextId++;\n const payload: JsonRpcRequest = { jsonrpc: \"2.0\", id, method, params };\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`MCP request '${method}' to '${this.config.name}' timed out after ${timeoutMs}ms.`));\n }, timeoutMs);\n this.pending.set(id, { resolve, reject, timer });\n this.write(payload);\n });\n }\n\n private notify(method: string, params?: unknown): void {\n const payload: JsonRpcNotification = { jsonrpc: \"2.0\", method, params };\n this.write(payload);\n }\n\n private write(payload: JsonRpcRequest | JsonRpcNotification | JsonRpcResponse): void {\n if (!this.child) return;\n try {\n // Newline-delimited JSON: one message per line, no embedded newlines.\n this.child.stdin.write(JSON.stringify(payload) + \"\\n\");\n } catch (err) {\n this.failAll(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n let nl: number;\n while ((nl = this.buffer.indexOf(\"\\n\")) >= 0) {\n const line = this.buffer.slice(0, nl).trim();\n this.buffer = this.buffer.slice(nl + 1);\n if (!line) continue;\n let msg: JsonRpcResponse & JsonRpcRequest & JsonRpcNotification;\n try {\n msg = JSON.parse(line);\n } catch {\n continue; // ignore non-JSON noise (some servers print banners)\n }\n this.dispatch(msg);\n }\n }\n\n private dispatch(msg: JsonRpcResponse & Partial<JsonRpcRequest>): void {\n // A response to one of our requests.\n if (typeof msg.id === \"number\" && ((\"result\" in msg) || (\"error\" in msg)) && msg.method === undefined) {\n const entry = this.pending.get(msg.id);\n if (!entry) return;\n this.pending.delete(msg.id);\n clearTimeout(entry.timer);\n if (msg.error) entry.reject(new Error(`${msg.error.message} (code ${msg.error.code})`));\n else entry.resolve(msg.result);\n return;\n }\n // A request FROM the server to us. We don't offer sampling/roots, so reply\n // politely: answer pings, decline everything else with method-not-found so\n // the server never hangs waiting on us.\n if (msg.method && typeof msg.id === \"number\") {\n if (msg.method === \"ping\") {\n this.write({ jsonrpc: \"2.0\", id: msg.id, result: {} });\n } else {\n this.write({\n jsonrpc: \"2.0\",\n id: msg.id,\n error: { code: -32601, message: `Method not supported by host: ${msg.method}` },\n });\n }\n return;\n }\n // A notification from the server (e.g. tools/list_changed) — refresh lazily.\n if (msg.method && msg.id === undefined) {\n if (msg.method === \"notifications/tools/list_changed\") void this.refreshTools().catch(() => {});\n if (msg.method === \"notifications/resources/list_changed\") void this.refreshResources().catch(() => {});\n }\n }\n\n private failAll(err: Error): void {\n for (const [, entry] of this.pending) {\n clearTimeout(entry.timer);\n entry.reject(err);\n }\n this.pending.clear();\n }\n}\n\n/**\n * Manages every configured MCP server connection for a session: connects the\n * enabled ones, exposes a catalog for context injection, and dispatches the\n * agent's forwarded `mcp` tool calls to the right client.\n */\nexport class McpManager {\n private clients = new Map<string, McpClient>();\n /** Last attestations produced this session (most recent last). */\n private attestations: McpAttestation[] = [];\n\n constructor(private defaultCwd: string) {}\n\n /** Connect one server (replacing any existing client of the same name). */\n async connect(config: McpServerConfig): Promise<McpClient> {\n this.disconnect(config.name);\n const client = new McpClient(config);\n this.clients.set(config.name, client);\n await client.connect(this.defaultCwd);\n return client;\n }\n\n disconnect(name: string): void {\n const existing = this.clients.get(name);\n if (existing) {\n existing.close();\n this.clients.delete(name);\n }\n }\n\n closeAll(): void {\n for (const [, c] of this.clients) c.close();\n this.clients.clear();\n }\n\n get(name: string): McpClient | undefined {\n return this.clients.get(name);\n }\n\n connectedNames(): string[] {\n return Array.from(this.clients.keys()).sort();\n }\n\n toolCount(): number {\n let n = 0;\n for (const [, c] of this.clients) n += c.tools.length;\n return n;\n }\n\n /** A JSON-serializable catalog of every connected server for the KV/context. */\n catalog(): { servers: McpServerCatalogEntry[]; generatedAt: number } {\n return {\n servers: Array.from(this.clients.values()).map((c) => c.catalogEntry()),\n generatedAt: Date.now(),\n };\n }\n\n recentAttestations(n = 10): McpAttestation[] {\n return this.attestations.slice(-n);\n }\n\n /** Execute a forwarded `mcp` tool request and return host-shaped text. */\n async dispatch(args: Record<string, unknown>): Promise<{ ok: boolean; result?: string; error?: string }> {\n const action = String(args.action || \"call\");\n const serverName = typeof args.server === \"string\" ? args.server : \"\";\n\n if (action === \"list\") {\n // A concise inventory of connected MCP servers (name + tool count) — what\n // the agent should consult to answer \"which MCP servers are installed?\".\n const servers = this.catalog().servers.map((s) => ({\n name: s.name,\n tools: s.tools.length,\n resources: s.resources?.length ?? 0,\n }));\n return {\n ok: true,\n result: servers.length\n ? JSON.stringify({ servers }, null, 2)\n : \"No MCP servers are connected. The user can add one with the /mcp command, or you can install one with the mcp tool (action \\\"install\\\").\",\n };\n }\n\n if (action === \"list_tools\") {\n // No server → list everything; a server → just that one.\n const cat = this.catalog().servers.filter((s) => !serverName || s.name === serverName);\n if (!cat.length) return { ok: false, error: serverName ? `No connected MCP server named '${serverName}'.` : \"No MCP servers are connected. The user can add one with the /mcp command.\" };\n return { ok: true, result: JSON.stringify(cat, null, 2) };\n }\n\n const client = this.clients.get(serverName);\n if (!client) {\n const avail = this.connectedNames();\n return {\n ok: false,\n error: avail.length\n ? `No connected MCP server named '${serverName}'. Connected servers: ${avail.join(\", \")}.`\n : `No MCP servers are connected. The user can add one with the /mcp command.`,\n };\n }\n\n try {\n let res: McpCallResult;\n if (action === \"read_resource\") {\n const uri = String(args.uri || \"\");\n if (!uri) return { ok: false, error: \"read_resource requires a 'uri'.\" };\n res = await client.readResource(uri);\n } else {\n const toolName = String(args.tool || \"\");\n if (!toolName) return { ok: false, error: \"call requires a 'tool' name.\" };\n const callArgs = parseArgs(args.arguments_json);\n if (callArgs instanceof Error) return { ok: false, error: callArgs.message };\n res = await client.callTool(toolName, callArgs);\n }\n\n this.attestations.push(res.attestation);\n const footer = formatAttestation(res.attestation);\n if (!res.ok) {\n return { ok: false, error: `${res.text || \"The MCP tool reported an error.\"}\\n${footer}` };\n }\n return { ok: true, result: `${res.text}\\n${footer}` };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction parseArgs(raw: unknown): Record<string, unknown> | Error {\n if (raw == null || raw === \"\") return {};\n if (typeof raw === \"object\") return raw as Record<string, unknown>;\n if (typeof raw !== \"string\") return new Error(\"arguments_json must be a JSON object string.\");\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) return parsed as Record<string, unknown>;\n return new Error(\"arguments_json must encode a JSON object.\");\n } catch (e) {\n return new Error(`arguments_json is not valid JSON: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n/** Flatten MCP tool-call `content` blocks into a single text string. */\nfunction flattenContent(content: Array<Record<string, unknown>> | undefined, structured: unknown): string {\n const parts: string[] = [];\n for (const block of content || []) {\n if (block.type === \"text\" && typeof block.text === \"string\") parts.push(block.text);\n else if (block.type === \"resource\" && block.resource && typeof block.resource === \"object\") {\n const r = block.resource as Record<string, unknown>;\n if (typeof r.text === \"string\") parts.push(r.text);\n else parts.push(`[resource ${String(r.uri ?? \"\")}]`);\n } else if (block.type === \"image\") parts.push(`[image ${String(block.mimeType ?? \"\")}]`);\n else if (block.type === \"audio\") parts.push(`[audio ${String(block.mimeType ?? \"\")}]`);\n else parts.push(JSON.stringify(block));\n }\n if (!parts.length && structured !== undefined) parts.push(JSON.stringify(structured, null, 2));\n return parts.join(\"\\n\").trim();\n}\n\nfunction flattenResourceContents(contents: Array<Record<string, unknown>> | undefined): string {\n const parts: string[] = [];\n for (const c of contents || []) {\n if (typeof c.text === \"string\") parts.push(c.text);\n else if (typeof c.blob === \"string\") parts.push(`[binary resource ${String(c.uri ?? \"\")} (${c.blob.length} b64 chars)]`);\n }\n return parts.join(\"\\n\").trim();\n}\n\nfunction formatAttestation(a: McpAttestation): string {\n const id = `${a.serverInfo.name}${a.serverInfo.version ? `@${a.serverInfo.version}` : \"\"}`;\n return (\n `[attestation] server=${a.server} (${id}) protocol=${a.protocolVersion} ` +\n `target=${a.target} args_sha256=${a.argsSha256.slice(0, 16)} ` +\n `result_sha256=${a.resultSha256.slice(0, 16)} nonce=${a.nonce}`\n );\n}\n\n/** Stable JSON for hashing (sorted keys) so identical args hash identically. */\nfunction canonicalJson(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(value as Record<string, unknown>).sort()) {\n out[k] = sortKeys((value as Record<string, unknown>)[k]);\n }\n return out;\n }\n return value;\n}\nfunction sha256(input: string): string {\n return crypto.createHash(\"sha256\").update(input).digest(\"hex\");\n}\n","/**\n * The execution session — the ONE wiring of the tool-execution stack, shared\n * by the interactive CLI and the daemon.\n *\n * Both are the same client: registry + MCP host + HostTools executors +\n * permission engine + bridge. The only intended difference between them is\n * the I/O adapter (the BridgeHooks: TUI dialogs vs. daemon log + approval\n * relay). Keeping the wiring here means a new tool, safety rule, or setup\n * step lands in both by construction — they cannot drift.\n *\n * PRIME DIRECTIVE — state lives on the thread, not in the client. Any\n * interface (another terminal, a watcher on a different machine, a future\n * web UI) can attach to a thread and even take over execution, so every\n * piece of session state an interface could need MUST live centrally on\n * api.standardcode.ai: thread KV for session-scoped state (approvals,\n * bg_processes, mcp_catalog, session_info, input_history, execution_owner,\n * the approval relay keys), user KV for account-scoped state (the machine\n * registry). In-memory copies (like PermissionState) are CACHES of that\n * central state with a defined refresh rule — never the source of truth.\n * The only sanctioned client-local files are machine-inherent: credentials,\n * machine identity, and MCP launch commands.\n */\nimport { ApiClient } from \"./api.ts\";\nimport { Bridge, type BridgeHooks } from \"./bridge.ts\";\nimport { HostTools } from \"./host-tools.ts\";\nimport { McpManager } from \"./mcp.ts\";\nimport { listMcpServers } from \"./mcp-config.ts\";\nimport { ProcessRegistry } from \"./process-registry.ts\";\nimport { loadApprovals, type ApprovalsKV } from \"./approvals.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport type { BridgeClientIdentity } from \"./types.ts\";\n\nexport interface ExecutionSessionOptions {\n api: ApiClient;\n threadId: string;\n /** Absolute project directory tools execute in. */\n projectDir: string;\n /** Display name for this machine (session_info, process-registry entries). */\n machineName: string;\n /** The permission engine state; the caller owns its default level. */\n perm: PermissionState;\n /** The I/O adapter — the ONLY part meant to differ between clients. */\n hooks: BridgeHooks;\n /** Bridge identity for execution-owner election. */\n identity: BridgeClientIdentity;\n}\n\n/** One MCP server's connect outcome (for the caller's own presentation). */\nexport interface McpConnectResult {\n name: string;\n ok: boolean;\n tools?: number;\n error?: string;\n}\n\nexport class ExecutionSession {\n readonly registry: ProcessRegistry;\n readonly mcp: McpManager;\n readonly host: HostTools;\n readonly bridge: Bridge;\n\n private readonly api: ApiClient;\n private readonly threadId: string;\n private readonly projectDir: string;\n private readonly machineName: string;\n private readonly perm: PermissionState;\n\n constructor(options: ExecutionSessionOptions) {\n this.api = options.api;\n this.threadId = options.threadId;\n this.projectDir = options.projectDir;\n this.machineName = options.machineName;\n this.perm = options.perm;\n\n // Background-process metadata lives in the thread's KV (server-side), so\n // the list resumes from any machine; nothing about it is stored locally.\n this.registry = new ProcessRegistry(options.api, options.threadId, options.machineName);\n // MCP host: this client negotiates with locally-launched MCP servers and\n // forwards the agent's `mcp` tool calls to them. The discovered catalog is\n // mirrored into the thread KV so a context hook shows the agent what's\n // available — and so watchers can see it too.\n this.mcp = new McpManager(options.projectDir);\n this.host = new HostTools(\n options.projectDir,\n this.registry,\n options.threadId,\n options.machineName,\n this.mcp,\n () => this.publishMcpCatalog(),\n options.api\n );\n this.bridge = new Bridge(\n options.api,\n options.threadId,\n this.host,\n options.perm,\n options.hooks,\n options.identity\n );\n }\n\n /** Mirror the MCP catalog into the thread KV (fire-and-forget). */\n publishMcpCatalog(): void {\n void this.api.kvSet(this.threadId, \"mcp_catalog\", this.mcp.catalog()).catch(() => {});\n }\n\n /**\n * Load the thread's saved approvals (level + pre-approved tools/risk) from\n * the thread KV into the permission engine. Returns the saved record so an\n * interactive caller can also reflect the level in its UI.\n */\n async loadApprovals(): Promise<ApprovalsKV> {\n const saved = await loadApprovals(this.api, this.threadId);\n this.perm.alwaysAllow = new Set(saved.allowTools);\n this.perm.allowRisk = new Set(saved.allowRisk);\n if (saved.level) this.perm.level = saved.level;\n return saved;\n }\n\n /**\n * Tell the agent where its shell lives (`session_info` in thread KV): the\n * instance's context hook renders it as a synthetic opening pwd exchange.\n * OWNER-ONLY — a watcher must never overwrite the executing client's truth.\n */\n writeSessionInfo(): void {\n void this.api\n .kvSet(this.threadId, \"session_info\", { cwd: this.projectDir, machine: this.machineName })\n .catch(() => {});\n }\n\n /**\n * Connect every enabled MCP server and publish the catalog so the agent\n * sees the tools on its very first step. Returns per-server outcomes for\n * the caller to present (TUI lines / daemon log).\n */\n async connectEnabledMcpServers(): Promise<McpConnectResult[]> {\n const results: McpConnectResult[] = [];\n for (const server of listMcpServers().filter((s) => s.enabled)) {\n try {\n const client = await this.mcp.connect(server);\n results.push({ name: server.name, ok: true, tools: client.tools.length });\n } catch (e) {\n results.push({\n name: server.name,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n this.publishMcpCatalog();\n return results;\n }\n\n /** Tear down the connection + local MCP servers (processes are the caller's\n * call — an owner kills its own spawned processes, a watcher has none). */\n stop(): void {\n this.bridge.close();\n this.mcp.closeAll();\n }\n}\n","/**\n * Subscribes to a thread's message WebSocket to render streamed assistant text\n * and detect end-of-turn (an assistant message with non-empty text content,\n * which under stopOnResponse means the agent has finished its turn).\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\n\nexport interface StreamHooks {\n /** A streamed fragment of the assistant's visible answer. `messageId` lets the\n * consumer reset its live buffer when a new message starts. */\n onChunk(text: string, messageId?: string): void;\n /**\n * A streamed fragment of the model's internal reasoning. This is the opt-in\n * `reasoning_chunk` channel (we subscribe with `?reasoning=1`); the backend\n * only sends it to sockets that ask. See the spec `ThreadReasoningChunkEvent`.\n */\n onReasoningChunk?(text: string, messageId?: string): void;\n /**\n * A complete assistant message. `hasToolCalls` is true for narration that\n * precedes tool calls (the turn continues) and false for the final answer\n * (the turn is over).\n */\n onAssistantText(content: string, hasToolCalls: boolean): void;\n /**\n * A custom thread event (the `{ type: \"event\", eventType, data }` channel) —\n * e.g. `tool_call_started`, `tool_call_done`, `generation`.\n */\n onEvent?(eventType: string, data: any): void;\n onError(err: string): void;\n}\n\nexport class MessageStream {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private resolveConnected: (() => void) | null = null;\n\n constructor(\n private api: ApiClient,\n private threadId: string,\n private hooks: StreamHooks\n ) {}\n\n /**\n * Connect and stay connected. Resolves on first open; reconnects on any drop\n * with exponential backoff. Silent — the bridge surfaces the user-facing\n * connection status; completion is detected via HTTP polling regardless, so a\n * dropped stream only affects live display, not correctness.\n */\n connect(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n this.resolveConnected = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n setTimeout(() => this.resolveConnected?.(), 8000);\n this.openSocket();\n });\n }\n\n private openSocket(): void {\n if (this.closed) return;\n // `reasoning=1` opts into the internal-reasoning channel (off by default).\n const url = `${this.api.wsEndpoint}/api/threads/${this.threadId}/stream?token=${encodeURIComponent(this.api.bearer)}&reasoning=1`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n ws.addEventListener(\"open\", () => {\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.resolveConnected?.();\n });\n ws.addEventListener(\"message\", (ev) => {\n // Any frame proves the link is alive; a silent stream would otherwise\n // freeze the live indicators without ever reconnecting.\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n // Both 'error' (failed open) and 'close' must drive reconnection.\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return;\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n\n private onMessage(raw: string): void {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg.type === \"event\" && typeof msg.eventType === \"string\") {\n this.hooks.onEvent?.(msg.eventType, msg.data);\n return;\n }\n if (msg.type === \"message_chunk\" && (msg.depth ?? 0) === 0) {\n if (typeof msg.chunk === \"string\") this.hooks.onChunk(msg.chunk, msg.message_id);\n return;\n }\n if (msg.type === \"reasoning_chunk\" && (msg.depth ?? 0) === 0) {\n if (typeof msg.chunk === \"string\") this.hooks.onReasoningChunk?.(msg.chunk, msg.message_id);\n return;\n }\n if (msg.type === \"message_data\" && (msg.depth ?? 0) === 0) {\n const data = msg.data || {};\n if (data.role === \"assistant\" && typeof data.content === \"string\" && data.content.trim()) {\n // tool_calls is serialized as a JSON string, not an array.\n const tc = data.tool_calls;\n const hasToolCalls = Array.isArray(tc)\n ? tc.length > 0\n : typeof tc === \"string\" && tc.trim() !== \"\" && tc.trim() !== \"null\" && tc.trim() !== \"[]\";\n this.hooks.onAssistantText(data.content, hasToolCalls);\n }\n if (data.role === \"assistant\" && data.status === \"failed\" && data.error) {\n this.hooks.onError(String(data.error));\n }\n }\n }\n}\n","/**\n * Subscribes to the instance-wide system events channel (`GET /api/events`) to\n * learn when threads are created, updated, or terminated. We use it to track\n * *subagents*: a subagent runs in its own child thread, so the only live signal\n * of \"a subagent is working\" is its child thread appearing here with our thread\n * as its `parent` (and disappearing/terminating when it finishes).\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\n\n/** The subset of a thread registry entry we care about. */\nexport interface ThreadEntry {\n id: string;\n agent_name?: string | null;\n tags?: string[] | null;\n parent?: string | null;\n terminated?: number | null;\n created_at?: number;\n}\n\nexport interface SystemEventHooks {\n onThreadCreated(thread: ThreadEntry): void;\n onThreadUpdated(thread: ThreadEntry): void;\n onThreadDeleted(threadId: string): void;\n /** Fired whenever the socket (re)connects, so the consumer can re-snapshot\n * state that live deltas alone can't reconstruct after a gap. */\n onOpen?(): void;\n}\n\nexport class SystemEvents {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private api: ApiClient,\n private hooks: SystemEventHooks\n ) {}\n\n connect(): void {\n this.openSocket();\n }\n\n private openSocket(): void {\n if (this.closed) return;\n const url = `${this.api.wsEndpoint}/api/events?token=${encodeURIComponent(this.api.bearer)}`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n ws.addEventListener(\"open\", () => {\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.hooks.onOpen?.();\n });\n ws.addEventListener(\"message\", (ev) => {\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n private onMessage(raw: string): void {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg?.type === \"thread_created\" && msg.thread) this.hooks.onThreadCreated(msg.thread);\n else if (msg?.type === \"thread_updated\" && msg.thread) this.hooks.onThreadUpdated(msg.thread);\n else if (msg?.type === \"thread_deleted\" && typeof msg.threadId === \"string\") {\n this.hooks.onThreadDeleted(msg.threadId);\n }\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return;\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n}\n","/**\n * Live activity labels for the per-subagent HUD lines.\n *\n * The parent thread's child registry only says a subagent EXISTS and is\n * `running` — the work itself is a black box. But every subagent runs in its\n * own thread, and that thread's `/stream` WebSocket carries the same live\n * signals the main thread's does: `tool_call_started` events (with the tool's\n * one-line `progress` text, e.g. \"reading the Hermes MCP README\"), completion\n * events, and streamed reasoning/answer chunks. This module holds ONE\n * MessageStream per active subagent and folds those signals into a short\n * \"what it's doing right now\" phrase for the subagent's line:\n *\n * ⣯ Research Assistant — reading the Cloudflare email docs\n *\n * Lifecycle: `sync(ids)` is called after every subagent reconcile with the\n * authoritative set of running child thread ids — newcomers get a stream,\n * departed ids are closed and forgotten, so sockets never outlive their\n * subagent line. `closeAll()` tears everything down at session end.\n *\n * Fault tolerance is inherited from MessageStream: heartbeat + half-open\n * detection + exponential-backoff reconnect. A dropped socket therefore\n * degrades to a stale (or absent) phrase — never a crash, and never a stuck\n * line, because the line itself lives or dies by the registry reconcile, not\n * by this stream.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { MessageStream, type StreamHooks } from \"./stream.ts\";\n\n/** What we need from a stream — MessageStream in production; tests inject a\n * fake to drive the hooks directly. */\nexport interface ActivityStream {\n connect(): Promise<void>;\n close(): void;\n}\nexport type ActivityStreamFactory = (threadId: string, hooks: StreamHooks) => ActivityStream;\n\n/** Longest phrase we keep — the TUI clamps to the terminal width anyway; this\n * just bounds what we store and hand over. */\nconst MAX_PHRASE = 120;\n\ninterface Entry {\n stream: ActivityStream;\n /** tool call id → progress phrase, insertion-ordered (last = most recent). */\n steps: Map<string, string>;\n /** Last phrase shown. Sticky: between tools we keep the previous phrase\n * until a chunk/tool replaces it, so the line never flickers empty. */\n phrase: string | null;\n}\n\n/** One-line, bounded, human phrase from an event's progress text. The TUI\n * sanitizes again at render time; this keeps stored state sane. */\nfunction cleanPhrase(raw: string): string {\n const s = raw.replace(/\\s+/g, \" \").trim();\n return s.length > MAX_PHRASE ? `${s.slice(0, MAX_PHRASE - 1)}…` : s;\n}\n\n/** \"web_search\" → \"web search\" — a readable fallback when a tool has no\n * progress text. */\nfunction prettyToolName(name: string): string {\n return name.replace(/^provider:/, \"\").replace(/[_:-]+/g, \" \").trim();\n}\n\nexport class SubagentActivity {\n private entries = new Map<string, Entry>();\n\n constructor(\n api: ApiClient,\n /** Fired when a subagent's phrase changes; the consumer re-pushes the\n * subagent lines to the TUI. */\n private onChange: (threadId: string) => void,\n /** Test seam — production always uses a real MessageStream. */\n private makeStream: ActivityStreamFactory = (threadId, hooks) => new MessageStream(api, threadId, hooks)\n ) {}\n\n /** The current activity phrase for a subagent's child thread, if any. */\n phraseFor(threadId: string): string | null {\n return this.entries.get(threadId)?.phrase ?? null;\n }\n\n /**\n * Reconcile the open streams against the authoritative set of RUNNING\n * subagent child-thread ids (from the parent's registry): open newcomers,\n * close and forget departed ones.\n */\n sync(activeIds: Iterable<string>): void {\n const want = new Set(activeIds);\n for (const [id, entry] of [...this.entries]) {\n if (!want.has(id)) {\n entry.stream.close();\n this.entries.delete(id);\n }\n }\n for (const id of want) {\n if (!this.entries.has(id)) this.open(id);\n }\n }\n\n private open(threadId: string): void {\n const entry: Entry = { stream: null as unknown as ActivityStream, steps: new Map(), phrase: null };\n\n const setPhrase = (phrase: string | null) => {\n if (phrase === entry.phrase) return;\n entry.phrase = phrase;\n this.onChange(threadId);\n };\n /** The most recently started still-active tool wins; with no active tool\n * the previous phrase stays (sticky) rather than blinking empty. */\n const phraseFromSteps = (): string | null => {\n let last: string | null = null;\n for (const v of entry.steps.values()) last = v;\n return last ?? entry.phrase;\n };\n\n entry.stream = this.makeStream(threadId, {\n // Streamed output with no tool in flight means the model is composing —\n // reasoning reads as \"thinking\", visible answer text as \"writing\". These\n // only fire on TRANSITIONS (phrase comparison), not per chunk.\n onChunk: () => {\n if (entry.steps.size === 0) setPhrase(\"writing\");\n },\n onReasoningChunk: () => {\n if (entry.steps.size === 0) setPhrase(\"thinking\");\n },\n onAssistantText: () => {},\n onEvent: (eventType, data) => {\n if (eventType === \"tool_call_started\" && data?.id) {\n entry.steps.set(String(data.id), cleanPhrase(String(data.progress || prettyToolName(String(data.name || \"\")) || \"working\")));\n setPhrase(phraseFromSteps());\n } else if (eventType === \"tool_call_done\" && data?.id) {\n entry.steps.delete(String(data.id));\n setPhrase(phraseFromSteps());\n }\n },\n onError: () => {},\n });\n this.entries.set(threadId, entry);\n // Fire-and-forget: the stream resolves its own connection lifecycle\n // (reconnects with backoff); a subagent that finishes first is cleaned up\n // by the next sync().\n void entry.stream.connect();\n }\n\n /** Close every stream (session teardown). */\n closeAll(): void {\n for (const entry of this.entries.values()) entry.stream.close();\n this.entries.clear();\n }\n}\n","/**\n * WordMill — the working indicator's slot-machine word morph.\n *\n * The status line's \"Working\" label holds steady for a few seconds, then\n * decomposes and re-forms into another working word (some earnest, some\n * fun): each character is a slot that starts flipping through random\n * letters/symbols — lazily at first, then every frame — before landing on\n * the target word's character and sticking. Longer targets grow new slots\n * mid-morph; shorter ones let trailing slots flip out and vanish. The new\n * word then holds, and the cycle repeats for as long as the turn runs.\n *\n * Pure logic, driven entirely by the caller's clock (`text(now)` once per\n * frame): no timers of its own, deterministic per (slot, time-bucket) while\n * flipping so a re-render within the same bucket shows the same glyph.\n */\n\nexport const MILL_WORDS = [\n \"Working\",\n \"Thinking\",\n \"Building\",\n \"Brewing\",\n \"Crafting\",\n \"Scheming\",\n \"Tinkering\",\n \"Noodling\",\n \"Pondering\",\n \"Wrangling\",\n \"Conjuring\",\n \"Percolating\",\n \"Assembling\",\n \"Cogitating\",\n \"Hatching\",\n \"Forging\",\n // The silly shelf — irreverent, never profane.\n \"Pickling\",\n \"Spooning\",\n \"Marinating\",\n \"Squishing\",\n \"Wiggling\",\n \"Frolicking\",\n \"Moisturizing\",\n \"Bamboozling\",\n \"Skedaddling\",\n \"Discombobulating\",\n \"Waffling\",\n \"Yodeling\",\n \"Shimmying\",\n \"Galumphing\",\n \"Snorkeling\",\n \"Bedazzling\",\n] as const;\n\n// What the slots flip through — letters plus the punctuation \"debris\" that\n// sells the decomposing look.\nconst FLIP_POOL = \"abcdefghjkmnopqrstuvwxyz#$%&@!*+=.:~\";\n\nconst HOLD_MS = 2600; // how long a landed word stays intact\n// Per-slot flip cadence: a slot flips lazily right after it starts\n// (LAZY_PERIOD per glyph), then per-frame once it has been flipping a while.\nconst LAZY_MS = 320;\nconst LAZY_PERIOD = 200;\nconst FAST_PERIOD = 70;\n\nconst BOLD = \"\\x1b[1m\";\nconst DIM = \"\\x1b[2m\";\nconst OFF = \"\\x1b[22m\"; // clears bold + dim\n\n/** Deterministic small hash → pool glyph, stable within one flip bucket. */\nfunction glyphAt(slot: number, bucket: number): string {\n let h = (slot + 1) * 2654435761 ^ (bucket + 1) * 40503;\n h = Math.imul(h ^ (h >>> 13), 1274126177);\n h ^= h >>> 16;\n return FLIP_POOL[(h >>> 0) % FLIP_POOL.length];\n}\n\ninterface Slot {\n start: number; // ms into the morph when this slot begins flipping\n land: number; // ms into the morph when it locks onto the target char\n}\n\nexport class WordMill {\n private word: string = MILL_WORDS[0];\n private target: string | null = null; // non-null while morphing\n private phaseAt = 0; // clock time the current phase began\n private slots: Slot[] = [];\n private morphLen = 0;\n private rng: () => number;\n\n constructor(rng: () => number = Math.random) {\n this.rng = rng;\n }\n\n /** Restart at \"Working\" (called when a turn begins). */\n reset(now: number): void {\n this.word = MILL_WORDS[0];\n this.target = null;\n this.phaseAt = now;\n }\n\n /** The plain word currently displayed or being formed (for tests). */\n get current(): string {\n return this.target ?? this.word;\n }\n\n /** The styled label for this frame (contains only bold/dim ANSI). */\n text(now: number): string {\n if (this.phaseAt === 0) this.phaseAt = now;\n if (!this.target) {\n if (now - this.phaseAt >= HOLD_MS) this.beginMorph(now);\n else return `${BOLD}${this.word}${OFF}`;\n }\n return this.morphFrame(now);\n }\n\n private beginMorph(now: number): void {\n const options = MILL_WORDS.filter((w) => w !== this.word);\n this.target = options[Math.floor(this.rng() * options.length)];\n this.phaseAt = now;\n const n = Math.max(this.word.length, this.target.length);\n this.slots = [];\n let maxLand = 0;\n for (let i = 0; i < n; i++) {\n // Staggered starts sell the \"one by one it comes apart\" ramp; lands\n // sweep loosely left→right with jitter so letters lock in one at a\n // time rather than all at once.\n const start = this.rng() * 500;\n const land = 750 + i * 90 + this.rng() * 350;\n this.slots.push({ start, land });\n if (land > maxLand) maxLand = land;\n }\n this.morphLen = maxLand + 60;\n }\n\n private morphFrame(now: number): string {\n const target = this.target!;\n const t = now - this.phaseAt;\n if (t >= this.morphLen) {\n // Morph complete — the target becomes the held word.\n this.word = target;\n this.target = null;\n this.phaseAt = now;\n return `${BOLD}${this.word}${OFF}`;\n }\n let out = \"\";\n for (let i = 0; i < this.slots.length; i++) {\n const s = this.slots[i];\n if (t < s.start) {\n // Still intact: shows the OLD word's char (a slot the old word\n // doesn't have simply hasn't appeared yet).\n const ch = this.word[i];\n if (ch) out += `${BOLD}${ch}${OFF}`;\n } else if (t < s.land) {\n // Flipping: lazy cadence right after start, per-frame once warm.\n const age = t - s.start;\n const period = age < LAZY_MS ? LAZY_PERIOD : FAST_PERIOD;\n out += `${DIM}${glyphAt(i, Math.floor(t / period))}${OFF}`;\n } else {\n // Landed: shows the NEW word's char (or vanishes for shrunk slots).\n const ch = target[i];\n if (ch) out += `${BOLD}${ch}${OFF}`;\n }\n }\n return out;\n }\n}\n","/** Bridge protocol + shared CLI types. */\n\n/** A forwarded tool request the instance sends down the bridge. */\nexport interface ToolRequest {\n type: \"tool_request\";\n /** In-memory await id (non-durable calls reply over the WebSocket with this). */\n id?: string;\n /**\n * Durable calls: the agent parked this call and is awaiting the result over\n * HTTP. Reply by POSTing to /tool-result with `toolCallId` instead of the WS.\n */\n durable?: boolean;\n toolCallId?: string;\n tool: string;\n args: Record<string, unknown>;\n requestPermission: string | null;\n risk: number | null;\n /** Ownership generation this call was dispatched under; echoed back in the\n * durable HTTP delivery so a superseded owner's late result is refused. */\n generation?: number;\n}\n\n/** The CLI's reply to a tool request. */\nexport interface ToolResponse {\n type: \"tool_response\";\n id: string;\n ok: boolean;\n result?: string;\n error?: string;\n}\n\n/** Result of executing a tool on the host. */\nexport interface HostResult {\n ok: boolean;\n result?: string;\n error?: string;\n}\n\n/**\n * Permission is a single auto-accept LEVEL 1–5: every tool call at risk ≤ level\n * runs automatically; anything riskier asks. (The catastrophic-command guard\n * still blocks dangerous commands at every level.) shift-tab cycles the level.\n */\nexport type Level = 1 | 2 | 3 | 4 | 5;\n\nexport const LEVELS: Level[] = [1, 2, 3, 4, 5];\n\n/** What each level lets run without asking (risk meanings: 1 read · 2 safe writes/builds · 3 installs/project edits · 4 outside-project/git-history · 5 destructive). */\nconst LEVEL_DETAIL: Record<Level, string> = {\n 1: \"only safe reads run automatically\",\n 2: \"+ safe writes & builds\",\n 3: \"+ installs & project edits\",\n 4: \"+ outside-project & git-history\",\n 5: \"everything — never ask\",\n};\n\nexport function levelLabel(level: Level): string {\n return `auto-accept level ${level} (${LEVEL_DETAIL[level]})`;\n}\n\n/** Stored credential for one instance. */\nexport interface InstanceCredential {\n endpoint: string;\n access_token: string;\n token_type: string;\n user?: { id: string; username: string; role: string };\n saved_at: number;\n}\n\nexport interface CredentialsFile {\n default_endpoint?: string;\n instances: Record<string, InstanceCredential>;\n}\n\nexport interface ThreadSummary {\n id: string;\n tags: string[];\n created_at?: number;\n title?: string;\n preview?: string;\n}\n\n/**\n * The thread's execution owner — the ONE client that runs forwarded tool\n * calls, even when several clients are connected to the thread. Recorded by\n * the instance in the thread KV under `execution_owner` and echoed in the\n * bridge's `bridge_ready` / `owner_changed` frames.\n */\nexport interface ExecutionOwnerInfo {\n client_id: string;\n client_name?: string | null;\n client_kind?: string | null;\n /** Monotonic ownership generation (bumped when ownership moves between clients). */\n generation?: number;\n}\n\n/** How a connecting bridge claims execution ownership (see the instance's\n * bridge-owner semantics): never / only-if-free / also-if-stale / always. */\nexport type BridgeClaim = \"none\" | \"if_unowned\" | \"if_stale\" | \"takeover\";\n\n/** The identity a bridge connection presents for execution-owner election. */\nexport interface BridgeClientIdentity {\n clientId: string;\n clientName?: string;\n clientKind: \"interactive\" | \"daemon\";\n claim: BridgeClaim;\n}\n","/**\n * Best-effort system-clipboard image reader (zero-dependency).\n *\n * Used by the TUI's Ctrl+V handler: terminals only deliver *text* through\n * bracketed paste, so an image on the clipboard never reaches the input by\n * itself. When the user explicitly asks (Ctrl+V), we shell out to the\n * platform's clipboard utility and pull the image as PNG bytes.\n *\n * Per platform:\n * - macOS: `osascript` — first the raw PNG flavour («class PNGf», what\n * screenshots put on the clipboard), then a copied-file fallback\n * («class furl», what Finder ⌘C puts there) read from disk.\n * - Linux: `wl-paste` (Wayland) then `xclip` (X11), asking for image/png.\n * - Windows: PowerShell's Windows.Forms clipboard, saved as PNG.\n *\n * All paths are best-effort: any missing utility or non-image clipboard\n * resolves to null, never throws.\n */\nimport { execFile } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface ClipboardImage {\n data: string; // base64-encoded image bytes\n mime: string; // e.g. \"image/png\"\n}\n\nconst FILE_MIMES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n};\n\n/** Cap pasted images at 8 MB — larger than any reasonable screenshot, small\n * enough that a base64 body stays well within request limits. */\nconst MAX_IMAGE_BYTES = 8 * 1024 * 1024;\n\nfunction run(cmd: string, args: string[], maxBuffer = MAX_IMAGE_BYTES * 2): Promise<{ ok: boolean; stdout: Buffer }> {\n return new Promise((resolve) => {\n execFile(cmd, args, { encoding: \"buffer\", maxBuffer }, (err, stdout) => {\n resolve({ ok: !err, stdout: stdout ?? Buffer.alloc(0) });\n });\n });\n}\n\nfunction fromFile(filePath: string): ClipboardImage | null {\n const mime = FILE_MIMES[path.extname(filePath).toLowerCase()];\n if (!mime) return null;\n try {\n const stat = fs.statSync(filePath);\n if (!stat.isFile() || stat.size === 0 || stat.size > MAX_IMAGE_BYTES) return null;\n return { data: fs.readFileSync(filePath).toString(\"base64\"), mime };\n } catch {\n return null;\n }\n}\n\nasync function readDarwin(): Promise<ClipboardImage | null> {\n // Raw image data (screenshots, \"Copy Image\" from a browser) → PNG flavour.\n const tmp = path.join(os.tmpdir(), `sc-clip-${process.pid}-${Date.now()}.png`);\n const script = [\n `set d to the clipboard as «class PNGf»`,\n `set f to open for access POSIX file \"${tmp}\" with write permission`,\n `set eof f to 0`,\n `write d to f`,\n `close access f`,\n ].join(\"\\n\");\n const png = await run(\"osascript\", [\"-e\", script]);\n if (png.ok) {\n const img = fromFile(tmp);\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n if (img) return img;\n }\n // A file copied in Finder → resolve the file URL and read the image from disk.\n const furl = await run(\"osascript\", [\"-e\", \"POSIX path of (the clipboard as «class furl»)\"]);\n if (furl.ok) {\n const p = furl.stdout.toString(\"utf8\").trim();\n if (p) return fromFile(p);\n }\n return null;\n}\n\nasync function readLinux(): Promise<ClipboardImage | null> {\n for (const [cmd, args] of [\n [\"wl-paste\", [\"--type\", \"image/png\"]],\n [\"xclip\", [\"-selection\", \"clipboard\", \"-t\", \"image/png\", \"-o\"]],\n ] as [string, string[]][]) {\n const res = await run(cmd, args);\n // PNG magic bytes guard against utilities that print an error to stdout.\n if (res.ok && res.stdout.length > 8 && res.stdout.length <= MAX_IMAGE_BYTES && res.stdout[0] === 0x89 && res.stdout[1] === 0x50) {\n return { data: res.stdout.toString(\"base64\"), mime: \"image/png\" };\n }\n }\n return null;\n}\n\nasync function readWindows(): Promise<ClipboardImage | null> {\n const tmp = path.join(os.tmpdir(), `sc-clip-${process.pid}-${Date.now()}.png`);\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms;\",\n \"$img = [System.Windows.Forms.Clipboard]::GetImage();\",\n `if ($img -ne $null) { $img.Save('${tmp.replace(/'/g, \"''\")}', [System.Drawing.Imaging.ImageFormat]::Png) }`,\n ].join(\" \");\n await run(\"powershell\", [\"-NoProfile\", \"-STA\", \"-Command\", ps]);\n const img = fromFile(tmp);\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n return img;\n}\n\n/** Read an image from the system clipboard, or null when there isn't one. */\nexport async function readClipboardImage(): Promise<ClipboardImage | null> {\n try {\n if (process.platform === \"darwin\") return await readDarwin();\n if (process.platform === \"win32\") return await readWindows();\n return await readLinux();\n } catch {\n return null;\n }\n}\n","/**\n * Terminal UI with a persistent bottom input region.\n *\n * A side-margined expanding input box stays anchored at the bottom and is always\n * editable — you can type while the agent works. Working status and subagent\n * lines render directly above the box; the permission level sits in the box's\n * top border (far right). All transcript output is printed ABOVE the work area\n * via print(). Approvals and menus temporarily take over the bottom.\n */\nimport readline from \"node:readline\";\nimport { gradientText, brandCycleColor } from \"./render.ts\";\nimport { WordMill } from \"./wordmill.ts\";\nimport { LEVELS, levelLabel, type Level } from \"./types.ts\";\nimport type { GoalData } from \"./api.ts\";\nimport { readClipboardImage } from \"./clipboard.ts\";\n\n/**\n * An image pasted into the input (Ctrl+V). `seq` ties it to its `[#Image N]`\n * placeholder in the text: only images whose placeholder survives editing are\n * sent with the message.\n */\nexport interface PastedImage {\n seq: number;\n data: string; // base64\n mime: string;\n}\n\n/** The `[#Image N]` placeholder text for a pasted image. */\nexport function imagePlaceholder(seq: number): string {\n return `[#Image ${seq}]`;\n}\n\n// ── boxed input chrome (pure, testable layout builders) ───────────────────────\n//\n// Mirrors the Grok Build bottom HUD: side-margined expanding box with the\n// permission/level label in the top border far right. No model chrome.\n\n/** Outer side margin for the boxed input (cells on left and right). */\nexport const INPUT_BOX_MARGIN = 1;\n\n/**\n * Neutral grey border chrome (Grok-style) — not brand amber. Soft enough to\n * sit behind content; bright enough to read the box edge.\n */\nexport function inputBoxBorderColor(): string {\n return \"\\x1b[38;5;240m\";\n}\n\n/**\n * Permission level as five dots for the box border (filled = active ceiling).\n * Plain string for width math; pair with `borderLevelDotsStyled` for colour.\n * e.g. level 3 → `●●●○○`\n */\nexport function borderLevelDots(level: Level): string {\n const n = Math.max(1, Math.min(5, level));\n return \"●\".repeat(n) + \"○\".repeat(5 - n);\n}\n\n/** Styled dots: filled in `levelColor`, empty in muted grey. */\nexport function borderLevelDotsStyled(\n level: Level,\n levelColor: string,\n emptyColor = \"\\x1b[38;5;240m\",\n reset = \"\\x1b[0m\"\n): string {\n const n = Math.max(1, Math.min(5, level));\n let out = \"\";\n for (let i = 1; i <= 5; i++) {\n out += i <= n ? `${levelColor}●${reset}` : `${emptyColor}○${reset}`;\n }\n return out;\n}\n\n/** @deprecated use borderLevelDots — kept name for call-site greps during transition */\nexport function borderLevelLabel(level: Level): string {\n return borderLevelDots(level);\n}\n\n/**\n * Geometry of the boxed input at a given terminal width.\n * `boxW` is border-to-border width; `contentW` is the wrap width inside.\n * `leftPad` is the screen column where content begins (margin + │ + space).\n */\nexport function inputBoxGeometry(cols: number): {\n margin: number;\n boxW: number;\n contentW: number;\n leftPad: number;\n} {\n const margin = INPUT_BOX_MARGIN;\n // Fit inside the HUD row cap (cols - 1): margin + boxW <= cols - 1.\n const boxW = Math.max(12, cols - 1 - margin);\n // │ + space + content + space + │\n const contentW = Math.max(4, boxW - 4);\n const leftPad = margin + 2;\n return { margin, boxW, contentW, leftPad };\n}\n\n/** Visible width helper used by pure box builders (ANSI-aware, wide glyphs). */\nfunction boxVisibleWidth(s: string): number {\n // eslint-disable-next-line no-control-regex\n let w = 0;\n for (const ch of s.replace(/\\x1b\\[[0-9;]*m/g, \"\")) {\n const cp = ch.codePointAt(0)!;\n w += isWideCodePoint(cp) ? 2 : 1;\n }\n return w;\n}\n\n/**\n * Top border with the level dots right-aligned in the border:\n * `╭──────────── ●●●○○ ─╮`\n *\n * `levelText` is the plain-width form (e.g. `●●●○○`); `levelStyled` is the\n * coloured form drawn in its place. When omitted, `levelText` is painted with\n * `levelColor` as a single run.\n */\nexport function buildBoxTop(\n boxW: number,\n levelText: string,\n borderColor: string,\n levelColor: string,\n reset = \"\\x1b[0m\",\n levelStyled?: string\n): string {\n const labelPlain = ` ${levelText} `;\n const rightFill = 1;\n const budget = Math.max(1, boxW - 2 - rightFill); // corners + right dashes\n const plain =\n labelPlain.length > budget ? labelPlain.slice(0, Math.max(1, budget)) : labelPlain;\n const leftFill = Math.max(1, boxW - 2 - plain.length - rightFill);\n // Styled dots keep the surrounding spaces unstyled so visible width matches.\n const mid =\n levelStyled !== undefined\n ? ` ${levelStyled} `\n : `${levelColor}${plain}${reset}`;\n return (\n `${borderColor}╭${\"─\".repeat(leftFill)}${reset}` +\n mid +\n `${borderColor}${\"─\".repeat(rightFill)}╮${reset}`\n );\n}\n\n/** Bottom border: `╰────────────────╯` */\nexport function buildBoxBottom(boxW: number, borderColor: string, reset = \"\\x1b[0m\"): string {\n return `${borderColor}╰${\"─\".repeat(Math.max(1, boxW - 2))}╯${reset}`;\n}\n\n/** Plain top border with no level chrome: `╭────────────────╮` (menus, pickers). */\nexport function buildBoxTopPlain(boxW: number, borderColor: string, reset = \"\\x1b[0m\"): string {\n return `${borderColor}╭${\"─\".repeat(Math.max(1, boxW - 2))}╮${reset}`;\n}\n\n/**\n * Top border with a LEFT-aligned label in the rim — building block for the\n * {@link Tui.boxedPrompt} component:\n * `╭ Denial feedback ────────────────╮`\n */\nexport function buildBoxTopLeftLabel(\n boxW: number,\n label: string,\n borderColor: string,\n labelColor = \"\\x1b[90m\",\n reset = \"\\x1b[0m\"\n): string {\n const plain = ` ${label} `;\n const budget = Math.max(1, boxW - 3); // ╭ + ≥1 dash + ╮\n const lab = plain.length > budget ? plain.slice(0, Math.max(1, budget)) : plain;\n const fill = Math.max(1, boxW - 2 - lab.length);\n return (\n `${borderColor}╭${reset}` +\n `${labelColor}${lab}${reset}` +\n `${borderColor}${\"─\".repeat(fill)}╮${reset}`\n );\n}\n\n// ── Boxed prompt component ──────────────────────────────────────────────────\n//\n// Reusable single-line free-text capture that reuses the main input box chrome\n// (side margin, grey rounded rim, `❯` carrot, real caret). The only chrome\n// difference is a left-aligned label in the top border instead of level dots.\n//\n// Used today for denial feedback; also the right shape for any other short\n// free-text “tell the agent / tell the system” moment (e.g. reject-with-note,\n// handoff reason, rename). Prefer this over ad-hoc `prompt()` bars when the\n// capture should feel continuous with the HUD.\n//\n// Layout:\n// ╭ <borderLabel> ─────────────────────────╮\n// │ ❯ typed text… │\n// ╰─────────────────────────────────────────╯\n//\n// Keys: Enter submits (may be empty), Esc clears a non-empty draft then\n// cancels on a second Esc (empty buffer). Gradient text is intentionally\n// unused here — brand gradient is reserved for success moments.\n\n/** Options for {@link Tui.boxedPrompt}. */\nexport interface BoxedPromptOptions {\n /**\n * Left-aligned label painted into the top border rim\n * (e.g. `\"Denial feedback\"`, `\"Handoff note\"`).\n */\n borderLabel: string;\n /** ANSI colour for the border label. Default: dim grey (`\\x1b[90m`). */\n labelColor?: string;\n /** Seed the buffer (e.g. to re-edit a previous note). */\n initial?: string;\n /**\n * When true (default), the first Esc on a non-empty buffer clears it; Esc on\n * an empty buffer cancels (resolves `null`). When false, Esc always cancels.\n */\n escClearsFirst?: boolean;\n /**\n * When true, the caller already owns the keyboard via a takeover (e.g. the\n * approval dialog chaining into feedback). Skips begin/end takeover so the\n * parent can finish its own cleanup. Default false.\n */\n nested?: boolean;\n}\n\n/**\n * One body row of the input box: `│ content… │` padded to contentW.\n * `content` may include ANSI (prompt colour); padding uses visible width.\n */\nexport function buildBoxBody(\n content: string,\n contentW: number,\n borderColor: string,\n reset = \"\\x1b[0m\"\n): string {\n const vw = boxVisibleWidth(content);\n const pad = Math.max(0, contentW - vw);\n return `${borderColor}│${reset} ${content}${\" \".repeat(pad)} ${borderColor}│${reset}`;\n}\n\n/**\n * Wrap prompt + multi-line input into physical body content lines at contentW.\n *\n * Grok-style indent: only the first physical row carries the real prompt; every\n * subsequent row (soft wrap OR hard newline) is indented by `prefixWidth`\n * spaces so text lines up under the first line's content (after `❯ `).\n *\n * Pure: no terminal I/O. Returns at least one line (the bare prefix when empty).\n */\nexport function wrapInputBodyLines(\n inputBuffer: string,\n prefix: string,\n prefixWidth: number,\n contentW: number\n): string[] {\n const indent = \" \".repeat(Math.max(0, prefixWidth));\n const lines = inputBuffer.split(\"\\n\");\n const out: string[] = [];\n let isFirstPhysical = true;\n for (let i = 0; i < lines.length; i++) {\n const text = lines[i];\n let remaining = text;\n // Always emit at least one physical row per logical line.\n do {\n const lead = isFirstPhysical ? prefix : indent;\n const avail = Math.max(0, contentW - prefixWidth);\n let take = Math.min(remaining.length, avail);\n if (take === 0 && avail === 0 && remaining.length > 0) take = 1;\n const chunk = remaining.slice(0, take);\n remaining = remaining.slice(take);\n out.push(lead + chunk);\n isFirstPhysical = false;\n if (remaining.length === 0) break;\n } while (remaining.length > 0);\n }\n if (out.length === 0) out.push(prefix);\n return out;\n}\n\n/**\n * Greyscale highlight for the working border sweep.\n * intensity 0 = rest grey, 1 = near-white head. No brand hues — just contrast.\n */\nexport function borderHighlightGrey(intensity: number): string {\n const t = Math.max(0, Math.min(1, intensity));\n // Ease so the head reads as a bright “bead” and the trail softens quickly.\n const e = t * t;\n const lo = 88; // rest-adjacent\n const hi = 236; // soft white\n const v = Math.round(lo + (hi - lo) * e);\n // Prefer truecolor greys when available; 256 greyscale ramp otherwise.\n const ct = process.env.COLORTERM ?? \"\";\n const tc =\n /truecolor|24bit/i.test(ct) ||\n /iterm|kitty|wezterm|ghostty|alacritty/i.test(process.env.TERM_PROGRAM ?? \"\");\n if (tc) return `\\x1b[38;2;${v};${v};${v}m`;\n // xterm 256 greyscale: 232 (dark) … 255 (white)\n return `\\x1b[38;5;${232 + Math.round(23 * e)}m`;\n}\n\n/**\n * Color a perimeter cell for the rotating working highlight.\n * `phase` 0..1 is the head position (clockwise from top-left corner).\n * A short bright grey/white trail rides the rim; the rest stays dull grey.\n */\nexport function rotatingBorderCellColor(\n index: number,\n perimeter: number,\n phase: number,\n trailFrac = 0.2\n): string {\n const P = Math.max(1, perimeter);\n const pos = index / P;\n // Distance behind the head along the travel direction (0 at head → 1 full lap).\n const dBehind = ((phase - pos) % 1 + 1) % 1;\n if (dBehind <= trailFrac) {\n // 1 at head, 0 at tail end\n return borderHighlightGrey(1 - dBehind / trailFrac);\n }\n return inputBoxBorderColor();\n}\n\n/**\n * Clockwise perimeter index for a border cell.\n * Path: top L→R, right T→B (body only), bottom R→L, left B→T (body only).\n * Corners live on the top/bottom edges only (not duplicated on the sides).\n */\nexport function perimeterIndex(\n edge: \"top\" | \"right\" | \"bottom\" | \"left\",\n offset: number,\n boxW: number,\n bodyH: number\n): number {\n const W = boxW;\n const H = Math.max(1, bodyH);\n // top: 0..W-1, right: W..W+H-1, bottom: W+H..2W+H-1, left: 2W+H..2W+2H-1\n if (edge === \"top\") return Math.max(0, Math.min(W - 1, offset));\n if (edge === \"right\") return W + Math.max(0, Math.min(H - 1, offset));\n if (edge === \"bottom\") return W + H + Math.max(0, Math.min(W - 1, offset));\n return 2 * W + H + Math.max(0, Math.min(H - 1, offset));\n}\n\n/**\n * Full boxed-input row set (top + body + bottom), each pre-prefixed with the\n * side margin. Pure builder for tests and `renderBottom`.\n *\n * When `borderPhase` is a finite number, a grey/white highlight sweeps the\n * border clockwise (working state). Otherwise the border is static grey.\n */\nexport function buildInputBoxRows(opts: {\n cols: number;\n inputBuffer: string;\n prefix: string;\n prefixWidth: number;\n level: Level;\n levelColor: string;\n borderColor?: string;\n /** 0..1 head position for the rotating border highlight; omit/null when idle. */\n borderPhase?: number | null;\n}): string[] {\n const { cols, inputBuffer, prefix, prefixWidth, level, levelColor } = opts;\n const borderColor = opts.borderColor ?? inputBoxBorderColor();\n const geo = inputBoxGeometry(cols);\n const body = wrapInputBodyLines(inputBuffer, prefix, prefixWidth, geo.contentW);\n const pad = \" \".repeat(geo.margin);\n const phase = opts.borderPhase;\n\n if (phase == null || !Number.isFinite(phase)) {\n const dots = borderLevelDots(level);\n const dotsStyled = borderLevelDotsStyled(level, levelColor);\n const top = buildBoxTop(geo.boxW, dots, borderColor, levelColor, \"\\x1b[0m\", dotsStyled);\n const bottom = buildBoxBottom(geo.boxW, borderColor);\n return [pad + top, ...body.map((b) => pad + buildBoxBody(b, geo.contentW, borderColor)), pad + bottom];\n }\n\n // ── animated perimeter (one continuous clockwise loop) ────────────────────\n //\n // 0 ── top L→R ──▶ W-1\n // ▲ │\n // left B→T right T→B\n // │ ▼\n // 2W+2H-1 ◀─ bottom R→L ─ W+H\n //\n const W = geo.boxW;\n const bodyH = Math.max(1, body.length);\n const P = 2 * W + 2 * bodyH;\n const reset = \"\\x1b[0m\";\n const colorAt = (i: number) => rotatingBorderCellColor(i, P, phase);\n\n // Top: every column 0..W-1 is a perimeter step. Level dots keep their own\n // colours but still occupy indices so the head travels through that span.\n const dots = borderLevelDots(level);\n const dotsStyled = borderLevelDotsStyled(level, levelColor);\n const labelPlain = ` ${dots} `;\n const rightFillN = 1;\n const budget = Math.max(1, W - 2 - rightFillN);\n const plain = labelPlain.length > budget ? labelPlain.slice(0, Math.max(1, budget)) : labelPlain;\n const leftFill = Math.max(1, W - 2 - plain.length - rightFillN);\n // Layout: [╭][─×leftFill][plain][─×rightFill][╮] length = W\n let top = \"\";\n let xi = 0;\n top += colorAt(perimeterIndex(\"top\", xi++, W, bodyH)) + \"╭\" + reset;\n for (let k = 0; k < leftFill; k++) {\n top += colorAt(perimeterIndex(\"top\", xi++, W, bodyH)) + \"─\" + reset;\n }\n // Dots block: advance indices for each visible column, paint spaces with the\n // sweep colour and leave the glyph colours from dotsStyled.\n // plain is \" ●●●○○ \" — rebuild so each cell gets the right perimeter colour\n // under the fixed glyphs.\n {\n const plainChars = [...plain];\n const styledInner = dotsStyled; // just the 5 dots, no surrounding spaces\n let di = 0; // index into filled/empty dots\n for (const ch of plainChars) {\n const c = colorAt(perimeterIndex(\"top\", xi++, W, bodyH));\n if (ch === \"●\" || ch === \"○\") {\n // Keep level colour on the glyph; still count the step for travel.\n // Prefer level-styled sequence if available.\n const levelN = Math.max(1, Math.min(5, level));\n const filled = di < levelN;\n di++;\n top +=\n (filled ? levelColor || c : \"\\x1b[38;5;240m\") +\n (filled ? \"●\" : \"○\") +\n reset;\n void styledInner;\n } else {\n top += c + ch + reset;\n }\n }\n }\n for (let k = 0; k < rightFillN; k++) {\n top += colorAt(perimeterIndex(\"top\", xi++, W, bodyH)) + \"─\" + reset;\n }\n top += colorAt(perimeterIndex(\"top\", Math.min(xi, W - 1), W, bodyH)) + \"╮\" + reset;\n\n // Body: right edge T→B (offset y), left edge B→T (offset bodyH-1-y).\n const bodyRows: string[] = [];\n for (let y = 0; y < bodyH; y++) {\n const leftC = colorAt(perimeterIndex(\"left\", bodyH - 1 - y, W, bodyH));\n const rightC = colorAt(perimeterIndex(\"right\", y, W, bodyH));\n const vw = boxVisibleWidth(body[y]);\n const sp = Math.max(0, geo.contentW - vw);\n bodyRows.push(\n `${pad}${leftC}│${reset} ${body[y]}${\" \".repeat(sp)} ${rightC}│${reset}`\n );\n }\n\n // Bottom: clockwise means RIGHT → LEFT after finishing the right edge.\n // offset 0 = bottom-right ╯, offset W-1 = bottom-left ╰.\n let bottom = \"\";\n for (let x = 0; x < W; x++) {\n // visual column from right to left for index, but we emit left-to-right:\n // visual x maps to clockwise offset (W-1-x)\n const idx = perimeterIndex(\"bottom\", W - 1 - x, W, bodyH);\n const c = colorAt(idx);\n if (x === 0) bottom += c + \"╰\" + reset;\n else if (x === W - 1) bottom += c + \"╯\" + reset;\n else bottom += c + \"─\" + reset;\n }\n\n return [pad + top, ...bodyRows, pad + bottom];\n}\n\nconst C = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n teal: \"\\x1b[38;5;37m\",\n};\n\n// Dense braille frames — they fill more of the cell, so the spinner reads\n// clearly instead of looking like faint dots.\nconst FRAMES = [\"⣷\", \"⣯\", \"⣟\", \"⡿\", \"⢿\", \"⣻\", \"⣽\", \"⣾\"];\n// Animation tick for the spinners (frame advance + redraw interval). Snappier\n// than the old 100ms without burning noticeable CPU on redraws.\nconst SPINNER_MS = 70;\n\n// Distinct hues cycled across concurrent subagents so each one reads as its own\n// stream (loader + label share the colour). Cyan is reserved for the main\n// working loader and orange for the compaction agent, so both are intentionally\n// absent here.\nconst SUBAGENT_COLORS = [\n \"\\x1b[35m\", // magenta\n \"\\x1b[38;5;39m\", // azure\n \"\\x1b[38;5;75m\", // blue\n \"\\x1b[32m\", // green\n \"\\x1b[38;5;141m\", // violet\n \"\\x1b[38;5;177m\", // orchid\n];\n\n// The compaction subagent is ALWAYS orange — a fixed signature colour so the\n// user instantly recognizes background context compaction, session after\n// session, regardless of what else is running.\nconst COMPACTION_COLOR = \"\\x1b[38;5;208m\";\nconst COMPACTION_AGENT = \"compaction_agent\";\n\ntype KeyHandler = (str: string | undefined, key: readline.Key) => void;\n\n/**\n * Approximate wcwidth: code points that render TWO terminal columns — CJK,\n * Hangul, fullwidth forms, and the emoji blocks. Everything else (including\n * ambiguous-width glyphs like box drawing, arrows, and the ⚙/⏳ badges, which\n * the terminals we target render narrow by default) counts one. Used by the\n * HUD width math so a wide character can't silently push a row past the\n * terminal edge and desync the redraw.\n */\nfunction isWideCodePoint(cp: number): boolean {\n return (\n (cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo\n (cp >= 0x2e80 && cp <= 0xa4cf) || // CJK radicals … Yi\n (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul syllables\n (cp >= 0xf900 && cp <= 0xfaff) || // CJK compatibility ideographs\n (cp >= 0xfe30 && cp <= 0xfe4f) || // CJK compatibility forms\n (cp >= 0xff00 && cp <= 0xff60) || // fullwidth forms\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x1f300 && cp <= 0x1faff) || // emoji\n cp >= 0x20000 // CJK extension planes\n );\n}\n\n/**\n * Neutralize control characters in a HUD row. An embedded newline (e.g. a\n * garbled multi-line step label when an upstream tool-call parse fails) makes\n * one \"row\" occupy several physical rows; the region-height math counts one,\n * so every subsequent redraw stamps the region's top rows into the scrollback\n * — the \"same two lines repeated for pages\" failure mode. Tabs are just as\n * bad (the terminal expands them to an uncounted width). Every control char\n * except the SGR escapes becomes a single space, and a stray ESC that isn't\n * starting a CSI sequence is dropped entirely.\n */\nfunction sanitizeHudRow(s: string): string {\n // eslint-disable-next-line no-control-regex\n return s.replace(/\\x1b(?!\\[)/g, \"\").replace(/[\\x00-\\x1a\\x1c-\\x1f\\x7f]/g, \" \");\n}\n\n/**\n * A slash command shown in the inline command palette. `name` is the word typed\n * after `/` (e.g. \"compact\"); typing filters the list by it. `hint` may be a\n * function so dynamic state (counts, level) stays fresh as the palette redraws.\n */\nexport interface SlashCommand {\n name: string;\n label: string;\n hint?: string | (() => string);\n run: () => void | Promise<void>;\n}\n\nexport class Tui {\n // input + indicators\n private inputBuffer = \"\";\n private cursorPos = 0; // caret index within inputBuffer (0..length)\n private lastCursorRow = 0; // caret's row offset from the input region top, last render\n private working = false;\n private workingStart = 0;\n // Slot-machine morph for the working label (Working → Brewing → …).\n private wordMill = new WordMill();\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n private bgCount = 0;\n // The `[⚙ n bg]` prompt badge can be selected with ← from the start of the\n // input (rendered inverted); Enter then opens the background-process panel.\n private bgBadgeSelected = false;\n private queuedCount = 0;\n private subagents: { id: string; label: string; agentName?: string }[] = []; // active subagents (one line each)\n private subagentColorByID = new Map<string, number>(); // subagent id → SUBAGENT_COLORS index\n private tokensIn = 0; // cumulative input tokens\n private tokensOut = 0; // cumulative output tokens (includes the in-progress live count)\n private contextPct: number | null = null; // % of the model context window currently used\n\n // Live streaming preview, shown just above the status line while a turn runs:\n // the model's internal reasoning (dim italic) until the answer starts, then the\n // answer text (plain). Bounded to a tail; cleared when the message commits.\n private streamThinking = \"\";\n private streamResponse = \"\";\n private streamMessageId: string | null = null; // the message currently previewing\n private streamRedrawTimer: ReturnType<typeof setTimeout> | null = null;\n private streamIdleTimer: ReturnType<typeof setTimeout> | null = null; // wipes a stale preview\n\n // Live goal checklist, fixed below the status bar. Driven by the goal_updated\n // thread event (+ an initial fetch). null = nothing to show.\n private goal: GoalData | null = null;\n // Set true the moment every step of a goal is done: the goal area is cleared\n // and the status line shows \"Goal complete.\" until the next turn starts.\n private goalComplete = false;\n\n // Inline slash-command palette: when the input starts with \"/\", the filtered\n // command list renders above the prompt and arrows/enter/tab drive it.\n private commands: SlashCommand[] = [];\n private slashIdx = 0; // highlighted index within the FILTERED command list\n private step: string | null = null; // current step label (e.g. \"writing index.html\")\n private stepStart = 0; // when the current step began (for the step's own elapsed)\n private stepOut = 0; // output tokens produced during the current step\n private connected = true;\n private bottomDrawn = false;\n private started = false;\n // Resize bookkeeping. When the terminal width changes, previously drawn HUD\n // rows re-wrap (a full-width ruler becomes 2+ physical rows when narrowed),\n // so the caret-relative move-up from the last paint is stale. We store the\n // visible width of EVERY region row (not just above the body) plus the caret\n // row index so moveToRegionTop can recompute physical height under the new\n // wrap. Resize events are debounced — drag-resizing fires dozens of events\n // and redrawing each one desyncs and leaves ghost chrome.\n private lastDrawnCols = 0;\n /** Visible width of every HUD row from the last paint, top → bottom. */\n private drawnRegionWidths: number[] = [];\n /** Index into drawnRegionWidths of the row the caret sat on last paint. */\n private lastCaretRegionIndex = 0;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n /** True between a resize event and the debounced repaint — spinner ticks no-op. */\n private resizePending = false;\n /** @deprecated kept as alias during paint — prefer drawnRegionWidths */\n private drawnHudWidths: number[] = [];\n\n // takeover (approval / menu) state\n private takeoverHandler: KeyHandler | null = null;\n private bufferedPrints: string[] = [];\n\n // double-press-to-quit state: the first ctrl-c arms a brief window and shows a\n // transient hint; a second ctrl-c within the window actually quits.\n private quitArmed = false;\n private quitTimer: ReturnType<typeof setTimeout> | null = null;\n\n // bracketed-paste state\n private pasting = false;\n private pasteTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Images pasted into the CURRENT input (Ctrl+V). Each got a `[#Image N]`\n // placeholder at the caret; on submit only images whose placeholder is still\n // present in the text are handed to onSubmit. Cleared with the input.\n private pendingImages: PastedImage[] = [];\n private imagePasteBusy = false; // one clipboard read at a time\n\n // Sent-message history for ↑/↓ recall (oldest → newest). `historyIdx` is the\n // entry currently shown (null = not browsing); the in-progress draft is\n // stashed so cycling past the newest entry restores it. Any edit exits\n // browsing and keeps the recalled text as the new draft.\n private history: string[] = [];\n private historyIdx: number | null = null;\n private historyDraft = \"\";\n private historyDraftImages: PastedImage[] = [];\n\n // event hooks (wired by index.ts)\n onSubmit: (text: string, images: PastedImage[]) => void = () => {};\n onInterrupt: () => void = () => {};\n /** Up on the top row: return true to consume it (e.g. pull a queued message)\n * before history recall gets a chance. */\n onUpArrow: () => boolean = () => false;\n /** Enter while the `[⚙ n bg]` badge is selected — opens the bg process panel. */\n onBgBadge: () => void = () => {};\n private onQuit: () => void = () => process.exit(0);\n private levelListeners: ((l: Level) => void)[] = [];\n\n constructor(public level: Level = 1) {\n readline.emitKeypressEvents(process.stdin);\n if (process.stdin.isTTY) process.stdin.setRawMode(true);\n process.stdin.on(\"keypress\", (str, key) => this.dispatch(str, key));\n process.stdin.resume();\n // Enable bracketed paste so a paste arrives atomically (newlines inside a\n // paste don't fire a premature submit) and restore it on exit.\n process.stdout.write(\"\\x1b[?2004h\");\n // Restore bracketed paste + the cursor on exit (e.g. ctrl-c mid-menu).\n process.on(\"exit\", () => process.stdout.write(\"\\x1b[?2004l\\x1b[?25h\"));\n // Debounced resize redraw — see scheduleResizeRedraw().\n process.stdout.on(\"resize\", () => this.scheduleResizeRedraw());\n }\n\n /**\n * Terminal resize fires continuously while the user drags. Redrawing on every\n * event desyncs the region-height math (each paint uses a half-rewrapped\n * intermediate width) and stamps ghost boxes into the scrollback. Wait for\n * the size to settle (~1–2 frames), then do one clean clear+repaint. While\n * pending, spinner ticks skip paint so they don't thrash mid-drag.\n */\n private scheduleResizeRedraw(): void {\n this.resizePending = true;\n if (this.resizeTimer) clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.resizeTimer = null;\n this.resizePending = false;\n if (!this.started || this.takeoverHandler) return;\n this.renderBottom();\n }, 40);\n }\n\n get colors() {\n return C;\n }\n\n setQuitHandler(fn: () => void): void {\n this.onQuit = fn;\n }\n\n /**\n * Handle a ctrl-c. The first press arms a 2-second window and surfaces a\n * transient \"Press Control-C again to exit\" hint in the bottom region; a\n * second press within the window quits. After the window lapses the hint\n * clears and the next ctrl-c starts over — so it always takes two.\n */\n requestQuit(): void {\n if (this.quitArmed) {\n if (this.quitTimer) clearTimeout(this.quitTimer);\n this.quitTimer = null;\n this.quitArmed = false;\n this.onQuit();\n return;\n }\n this.quitArmed = true;\n this.renderBottom();\n this.quitTimer = setTimeout(() => {\n this.quitArmed = false;\n this.quitTimer = null;\n this.renderBottom();\n }, 2000);\n }\n\n /** Tear down the bottom region and restore the terminal (called on quit). */\n end(): void {\n // Freeze first so any in-flight spinner / stream / quit timers cannot\n // re-paint the boxed HUD after we clear it (quit is async and awaits\n // backend stop for up to ~1.5s — a 70ms spinner tick would otherwise\n // redraw the input box and garble the farewell message into it).\n this.started = false;\n this.working = false;\n this.subagents = [];\n if (this.quitTimer) clearTimeout(this.quitTimer);\n this.quitTimer = null;\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\n if (this.streamRedrawTimer) {\n clearTimeout(this.streamRedrawTimer);\n this.streamRedrawTimer = null;\n }\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n }\n this.clearBottom();\n process.stdout.write(\"\\x1b[?2004l\\x1b[?25h\");\n }\n onLevelChange(fn: (l: Level) => void): void {\n this.levelListeners.push(fn);\n }\n\n /** Carrot colour by level — cooler/safer (low) to warmer/permissive (high). */\n levelColor(): string {\n return { 1: C.cyan, 2: C.green, 3: C.yellow, 4: C.magenta, 5: C.red }[this.level];\n }\n\n // ─── key dispatch ──────────────────────────────────────────────────────────\n\n private dispatch(str: string | undefined, key: readline.Key): void {\n const seq = (key && key.sequence) || str || \"\";\n\n // Shift+Enter inserts a newline instead of submitting. The robust signal is a\n // bare LF (\"\\n\"): Ghostty/iTerm2/WezTerm and many others send \"\\n\" for\n // Shift+Enter (often by default, otherwise configurable) while plain Enter\n // sends CR (\"\\r\"). We also accept the Kitty (\"\\x1b[13;2u\") and\n // modifyOtherKeys (\"\\x1b[27;2;13~\") forms for terminals that emit those.\n // Checked before any other key logic (including paste detection) — and a raw\n // \"\\n\" never reaches the Enter/submit handler below.\n if (seq === \"\\n\" || seq === \"\\x1b[13;2u\" || seq === \"\\x1b[27;2;13~\") {\n this.insertAtCursor(\"\\n\");\n return;\n }\n\n if (key && key.ctrl && key.name === \"c\") {\n this.requestQuit();\n return;\n }\n if (key && key.name === \"tab\" && key.shift) {\n this.cycleLevel();\n return;\n }\n\n // Bracketed paste: everything between the start/end markers is literal text,\n // even newlines. Handle it before any other key logic so a pasted Return\n // doesn't submit and a pasted \"/\" doesn't open the menu.\n if (!this.pasting && seq.includes(\"\\x1b[200~\")) {\n this.pasting = true;\n this.armPasteSafety();\n this.handlePasteChunk(seq.slice(seq.indexOf(\"\\x1b[200~\") + 6));\n return;\n }\n if (this.pasting) {\n this.armPasteSafety();\n this.handlePasteChunk(seq);\n return;\n }\n\n // A takeover (approval/menu) owns the keyboard while active.\n if (this.takeoverHandler) {\n this.takeoverHandler(str, key);\n return;\n }\n if (!key) return;\n\n // While the `[⚙ n bg]` badge is selected, Enter opens the background-process\n // panel, → / Escape step back into the input, ← stays put (nothing further\n // left), and any other key deselects and is handled as normal input.\n if (this.bgBadgeSelected) {\n if (key.name === \"return\" || key.name === \"enter\") {\n this.bgBadgeSelected = false;\n this.renderBottom();\n this.onBgBadge();\n return;\n }\n if (key.name === \"left\") return;\n this.bgBadgeSelected = false;\n if (key.name === \"right\" || key.name === \"escape\") {\n this.renderBottom();\n return;\n }\n this.renderBottom();\n // fall through: the key edits/moves as usual\n }\n\n // Inline slash-command palette owns navigation while the input starts with\n // \"/\". Editing keys (printable/backspace/left/right) fall through to the\n // normal input logic below, which re-filters the palette on the next render.\n if (this.paletteOpen()) {\n const matches = this.filteredCommands();\n const cur = matches.length ? Math.min(this.slashIdx, matches.length - 1) : 0;\n if (key.name === \"up\") {\n if (matches.length) {\n this.slashIdx = (cur - 1 + matches.length) % matches.length;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"down\") {\n if (matches.length) {\n this.slashIdx = (cur + 1) % matches.length;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"tab\") {\n if (matches.length) {\n this.inputBuffer = \"/\" + matches[cur].name;\n this.cursorPos = this.inputBuffer.length;\n this.slashIdx = 0;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"return\" || key.name === \"enter\") {\n // Shift+Enter inserts a newline instead of running the command\n if (key.shift) {\n this.insertAtCursor(\"\\n\");\n return;\n }\n if (matches.length) this.runCommand(matches[cur]);\n return; // never submit a \"/…\" line as a chat message\n }\n if (key.name === \"escape\") {\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.slashIdx = 0;\n this.renderBottom();\n return;\n }\n // any other key falls through to normal editing (palette re-filters live)\n }\n\n if (key.name === \"escape\") {\n this.onInterrupt();\n return;\n }\n // Caret movement within the (possibly wrapped) input.\n if (key.name === \"left\") {\n if (this.cursorPos > 0) {\n this.cursorPos--;\n this.renderBottom();\n } else if (this.bgCount > 0) {\n // Caret already at the start — ← \"selects\" the [⚙ n bg] badge.\n this.bgBadgeSelected = true;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"right\") {\n if (this.cursorPos < this.inputBuffer.length) {\n this.cursorPos++;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"home\" || (key.ctrl && key.name === \"a\")) {\n this.cursorPos = 0;\n this.renderBottom();\n return;\n }\n if (key.name === \"end\" || (key.ctrl && key.name === \"e\")) {\n this.cursorPos = this.inputBuffer.length;\n this.renderBottom();\n return;\n }\n // Up: move the caret up a visual row when it isn't on the top one —\n // history recall must never hijack cursor movement inside multi-line text.\n // On the TOP row: first offer the key to onUpArrow (pulling a queued\n // message back), then recall the previous history entry.\n if (key.name === \"up\") {\n const { caretRow } = this.inputLayout();\n if (caretRow > 0) {\n this.moveCaretVertical(-1);\n return;\n }\n if (this.onUpArrow()) return;\n this.historyPrev();\n return;\n }\n // Down mirrors up: move the caret down a row unless it's on the bottom\n // one; from the bottom row, step forward through history (past the newest\n // entry restores whatever was being typed).\n if (key.name === \"down\") {\n const { caretRow, rowCount } = this.inputLayout();\n if (caretRow < rowCount - 1) {\n this.moveCaretVertical(1);\n return;\n }\n this.historyNext();\n return;\n }\n if (key.name === \"return\" || key.name === \"enter\") {\n // Shift+Enter inserts a newline instead of submitting.\n // Detection: some terminals set key.shift, others send a distinct escape sequence.\n // Protocol-based Shift+Enter is already handled at the top of dispatch();\n // this catches terminals that natively set the shift modifier on Return.\n if (key.shift) {\n this.insertAtCursor(\"\\n\");\n return;\n }\n const text = this.inputBuffer;\n // Only images whose placeholder survived editing ride along.\n const images = this.pendingImages.filter((img) => text.includes(imagePlaceholder(img.seq)));\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.pendingImages = [];\n this.historyIdx = null;\n this.historyDraft = \"\";\n this.historyDraftImages = [];\n this.renderBottom();\n if (text.trim()) {\n this.addHistoryEntry(text.trim());\n this.onSubmit(text.trim(), images);\n }\n return;\n }\n // Ctrl+V: paste an image from the system clipboard. Terminals only deliver\n // TEXT through bracketed paste, so an image needs this explicit ask — we\n // read the clipboard and drop an `[#Image N]` placeholder at the caret.\n if (key.ctrl && key.name === \"v\") {\n void this.pasteClipboardImage();\n return;\n }\n if (key.name === \"backspace\") {\n if (this.cursorPos > 0) {\n this.inputBuffer =\n this.inputBuffer.slice(0, this.cursorPos - 1) + this.inputBuffer.slice(this.cursorPos);\n this.cursorPos--;\n this.slashIdx = 0;\n this.historyIdx = null;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"delete\") {\n if (this.cursorPos < this.inputBuffer.length) {\n this.inputBuffer =\n this.inputBuffer.slice(0, this.cursorPos) + this.inputBuffer.slice(this.cursorPos + 1);\n this.slashIdx = 0;\n this.historyIdx = null;\n this.renderBottom();\n }\n return;\n }\n if (key.ctrl || key.meta || key.name === \"tab\") return;\n if (str && str >= \" \") {\n this.insertAtCursor(str);\n }\n }\n\n private insertAtCursor(text: string): void {\n this.inputBuffer = this.inputBuffer.slice(0, this.cursorPos) + text + this.inputBuffer.slice(this.cursorPos);\n this.cursorPos += text.length;\n this.slashIdx = 0; // re-anchor the palette highlight to the top match as the filter changes\n this.historyIdx = null; // an edit exits history browsing; the text is the new draft\n this.renderBottom();\n }\n\n /** Insert a paste fragment at the caret; collapse newlines (single-line input). */\n private handlePasteChunk(chunk: string): void {\n const end = chunk.indexOf(\"\\x1b[201~\");\n const content = (end >= 0 ? chunk.slice(0, end) : chunk).replace(/[\\r\\n]+/g, \" \");\n if (content) {\n this.inputBuffer =\n this.inputBuffer.slice(0, this.cursorPos) + content + this.inputBuffer.slice(this.cursorPos);\n this.cursorPos += content.length;\n this.historyIdx = null;\n }\n if (end >= 0) {\n this.pasting = false;\n if (this.pasteTimer) {\n clearTimeout(this.pasteTimer);\n this.pasteTimer = null;\n }\n }\n this.renderBottom();\n }\n\n /** Never let a missed end-marker wedge the input: clear paste mode shortly. */\n private armPasteSafety(): void {\n if (this.pasteTimer) clearTimeout(this.pasteTimer);\n this.pasteTimer = setTimeout(() => {\n this.pasting = false;\n this.pasteTimer = null;\n this.renderBottom();\n }, 2000);\n }\n\n // ─── input layout + vertical caret movement ────────────────────────────────\n\n /**\n * The input's physical rows (same wrapping math as the boxed input body:\n * logical lines split on \"\\n\", line 0 led by the prompt prefix, each wrapping\n * at the box content width) plus where the caret sits among them. Each row\n * records the buffer index of its first character, its character count, and\n * the visual column its first character renders at (only the first physical\n * row of line 0 is offset, by the prompt). Drives ↑/↓: row 0 is \"the top\n * line\" (history recall territory), anything below moves the caret instead.\n */\n private inputLayout(): {\n rows: { start: number; len: number; colOffset: number }[];\n caretRow: number;\n caretCol: number;\n rowCount: number;\n } {\n const cols = process.stdout.columns || 80;\n const { contentW } = inputBoxGeometry(cols);\n const pw = this.visibleWidth(this.promptPrefix());\n const lines = this.inputBuffer.split(\"\\n\");\n const rows: { start: number; len: number; colOffset: number }[] = [];\n let offset = 0;\n for (let i = 0; i < lines.length; i++) {\n const len = lines[i].length;\n // Match wrapInputBodyLines: every physical row reserves prefixWidth at the\n // left (real prompt on the first row, spaces on later rows) so hard\n // newlines and soft wraps line up under the first line's text.\n let remaining = len;\n let charStart = 0;\n do {\n const avail = Math.max(0, contentW - pw);\n let take = Math.min(remaining, avail);\n if (take === 0 && avail === 0 && remaining > 0) take = 1;\n rows.push({ start: offset + charStart, len: take, colOffset: pw });\n charStart += take;\n remaining -= take;\n } while (remaining > 0);\n offset += len + 1; // +1 consumes the \"\\n\"\n }\n // Locate the caret among the physical rows.\n let caretRow = 0;\n let caretCol = 0;\n let found = false;\n for (let r = 0; r < rows.length; r++) {\n const row = rows[r];\n const rowEnd = row.start + row.len;\n const isLast = r === rows.length - 1;\n // Caret lands on this row when it falls inside [start, end), or at `end`\n // when this is the last row OR the next row starts after end (hard newline\n // gap — next row.start === end+1 after the \"\\n\").\n const nextStart = isLast ? rowEnd : rows[r + 1].start;\n if (this.cursorPos < rowEnd || (this.cursorPos === rowEnd && (isLast || nextStart > rowEnd))) {\n caretRow = r;\n caretCol = row.colOffset + (this.cursorPos - row.start);\n found = true;\n break;\n }\n }\n if (!found && rows.length) {\n caretRow = rows.length - 1;\n const row = rows[caretRow];\n caretCol = row.colOffset + row.len;\n }\n // Caret exactly on a wrap boundary past the last row — synthesize an empty\n // trailing row so vertical movement stays in bounds.\n while (caretRow >= rows.length) {\n rows.push({ start: this.inputBuffer.length, len: 0, colOffset: 0 });\n }\n return { rows, caretRow, caretCol, rowCount: rows.length };\n }\n\n /** Move the caret one visual row up/down, keeping the column when possible. */\n private moveCaretVertical(delta: -1 | 1): void {\n const { rows, caretRow, caretCol } = this.inputLayout();\n const target = caretRow + delta;\n if (target < 0 || target >= rows.length) return;\n const row = rows[target];\n const within = Math.max(0, Math.min(caretCol - row.colOffset, row.len));\n this.cursorPos = Math.min(row.start + within, this.inputBuffer.length);\n this.renderBottom();\n }\n\n // ─── sent-message history (↑/↓ recall) ─────────────────────────────────────\n\n /** Seed the recall history (oldest → newest), e.g. from the on-disk file. */\n setHistory(entries: string[]): void {\n this.history = entries.filter((e) => e.trim() !== \"\");\n }\n\n /** Record a sent message (skipping a consecutive duplicate). */\n private addHistoryEntry(text: string): void {\n if (this.history[this.history.length - 1] === text) return;\n this.history.push(text);\n }\n\n /** Recall the previous (older) history entry; stashes the draft first. */\n private historyPrev(): void {\n if (!this.history.length) return;\n if (this.historyIdx === null) {\n this.historyDraft = this.inputBuffer;\n this.historyDraftImages = this.pendingImages;\n this.historyIdx = this.history.length - 1;\n } else if (this.historyIdx > 0) {\n this.historyIdx--;\n } else {\n return; // already at the oldest entry\n }\n this.pendingImages = [];\n this.inputBuffer = this.history[this.historyIdx];\n this.cursorPos = this.inputBuffer.length;\n this.slashIdx = 0;\n this.renderBottom();\n }\n\n /** Step toward the newest entry; past it, restore the stashed draft. */\n private historyNext(): void {\n if (this.historyIdx === null) return; // not browsing — down does nothing\n if (this.historyIdx < this.history.length - 1) {\n this.historyIdx++;\n this.pendingImages = [];\n this.inputBuffer = this.history[this.historyIdx];\n } else {\n this.historyIdx = null;\n this.inputBuffer = this.historyDraft;\n this.pendingImages = this.historyDraftImages;\n this.historyDraft = \"\";\n this.historyDraftImages = [];\n }\n this.cursorPos = this.inputBuffer.length;\n this.slashIdx = 0;\n this.renderBottom();\n }\n\n // ─── clipboard image paste (Ctrl+V) ────────────────────────────────────────\n\n /**\n * Read an image off the system clipboard and drop an `[#Image N]`\n * placeholder at the caret. The bytes ride along with the message on submit\n * (as a real attachment) as long as the placeholder is still in the text —\n * delete the placeholder and the image is dropped too.\n */\n private async pasteClipboardImage(): Promise<void> {\n if (this.imagePasteBusy) return;\n this.imagePasteBusy = true;\n try {\n const img = await readClipboardImage();\n if (!img) {\n this.print(`${C.dim}No image on the clipboard.${C.reset}`);\n return;\n }\n const seq = this.pendingImages.reduce((m, i) => Math.max(m, i.seq), 0) + 1;\n this.pendingImages.push({ seq, data: img.data, mime: img.mime });\n this.insertAtCursor(imagePlaceholder(seq));\n } finally {\n this.imagePasteBusy = false;\n }\n }\n\n private cycleLevel(): void {\n const idx = LEVELS.indexOf(this.level);\n this.setLevel(LEVELS[(idx + 1) % LEVELS.length]);\n }\n\n setLevel(level: Level): void {\n if (level === this.level) return;\n this.level = level;\n this.levelListeners.forEach((fn) => fn(this.level));\n this.print(`${this.levelColor()}${levelLabel(this.level)}${C.reset}`);\n }\n\n // ─── bottom input line ───────────────────────────────────────────────────\n\n /** Begin showing the persistent input line. */\n start(): void {\n this.started = true;\n this.renderBottom();\n }\n\n /** Format an elapsed millisecond span as 45s / 2m 05s / 1h 05m. */\n private formatElapsed(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${String(s % 60).padStart(2, \"0\")}s`;\n const h = Math.floor(m / 60);\n return `${h}h ${String(m % 60).padStart(2, \"0\")}m`;\n }\n\n /** Compact token count: 945 → \"945\", 12345 → \"12.35k\", 1_250_000 → \"1.25M\". */\n private fmtTokens(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(2)}k`;\n return `${(n / 1_000_000).toFixed(2)}M`;\n }\n\n private spinnerFrame(): string {\n // The main loader is a brand moment: the glyph spins fast and its colour\n // drifts through the brand gradient in step with the shimmering label.\n const now = Date.now();\n return `${C.bold}${brandCycleColor(now)}${FRAMES[Math.floor(now / SPINNER_MS) % FRAMES.length]}${C.reset}`;\n }\n\n /** \"↑X ↓Y\" cumulative token totals (greyed — low-priority). */\n private tokensText(): string {\n const parts: string[] = [];\n if (this.tokensIn > 0) parts.push(`↑${this.fmtTokens(this.tokensIn)}`);\n if (this.tokensOut > 0) parts.push(`↓${this.fmtTokens(this.tokensOut)}`);\n return parts.length ? `${C.gray}${parts.join(\" \")}${C.reset}` : \"\";\n }\n\n /**\n * Context-to-compaction gauge, right-aligned on the status line: just \"N%\"\n * in dull grey. Shown whenever we know a value (any fill — 5%, 10%, 20%…).\n * The percentage is scaled so 100% = where background compaction triggers,\n * not the raw model window.\n */\n private contextGaugeText(): string {\n if (this.contextPct == null) return \"\";\n // Soft 256-grey — readable but never competing with spinner / tokens.\n return `\\x1b[38;5;240m${this.contextPct}%${C.reset}`;\n }\n\n /**\n * Set the context-window fill percentage (0–100), or null to hide it.\n * Driven by the runtime's `context_usage` KV, scaled to the compaction\n * trigger (see index.ts poll). Always painted on the status line far right.\n */\n setContextPct(pct: number | null): void {\n const next = pct == null ? null : Math.max(0, Math.min(100, Math.round(pct)));\n if (next === this.contextPct) return;\n this.contextPct = next;\n this.renderBottom();\n }\n\n /** Plain context label (no ANSI) for menu hints, or \"\" when unknown. */\n contextPctLabel(): string {\n return this.contextPct == null ? \"\" : `context ${this.contextPct}%`;\n }\n\n /** Register the slash commands shown in the inline `/` palette. */\n setCommands(commands: SlashCommand[]): void {\n this.commands = commands;\n }\n\n /** Is the `/` command palette currently showing? (input starts with \"/\".) */\n private paletteOpen(): boolean {\n return this.started && !this.takeoverHandler && this.commands.length > 0 && this.inputBuffer.startsWith(\"/\");\n }\n\n /** Commands matching the text typed after \"/\", in declared order. */\n private filteredCommands(): SlashCommand[] {\n if (!this.inputBuffer.startsWith(\"/\")) return [];\n const q = this.inputBuffer.slice(1).trim().toLowerCase();\n if (q === \"\") return this.commands;\n return this.commands.filter(\n (c) => c.name.startsWith(q) || c.name.includes(q) || c.label.toLowerCase().includes(q)\n );\n }\n\n private runCommand(cmd: SlashCommand): void {\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.slashIdx = 0;\n this.renderBottom();\n void Promise.resolve(cmd.run()).catch(() => {});\n }\n\n /**\n * The summary line ABOVE the prompt. While working it reads\n * `⣷ Working <step> <elapsed> ↑in ↓out`; when idle it keeps the cumulative\n * token totals visible (`↑in ↓out`) so they live in the summary rather than\n * crowding the prompt. Null when idle with nothing counted yet.\n */\n private statusLineText(cols: number): string | null {\n const tk = this.tokensText();\n const gauge = this.contextGaugeText();\n // Reserve room on the right for the context gauge so it can sit flush\n // against the terminal edge without ever wrapping the row.\n const gaugeReserve = gauge ? this.visibleWidth(gauge) + 1 : 0;\n let line: string | null;\n if (this.working) {\n const el = this.formatElapsed(Date.now() - this.workingStart);\n const right = `${C.dim}${el}${C.reset}${tk ? \" \" + tk : \"\"}`;\n const head = `${this.spinnerFrame()} ${this.wordMill.text(Date.now())}`;\n const avail = Math.max(\n 0,\n cols - this.visibleWidth(head) - this.visibleWidth(right) - 2 - gaugeReserve\n );\n let stepPart = \"\";\n if (this.step && avail > 1) {\n let s = this.step;\n if (s.length > avail) s = s.slice(0, avail - 1) + \"…\";\n stepPart = ` ${C.dim}${s}${C.reset}`;\n }\n line = `${head}${stepPart} ${right}`;\n } else if (this.goalComplete) {\n // Idle. Once a goal's every step is done we surface \"Goal complete.\" here\n // (the goal area itself is cleared) until the next turn begins.\n const done = `${C.bold}${gradientText(\"✓ Goal complete.\")}${C.reset}`;\n line = tk ? `${done} ${tk}` : done;\n } else {\n line = tk ? tk : null;\n }\n if (!gauge) return line;\n const base = line ?? \"\";\n const pad = Math.max(1, cols - 1 - this.visibleWidth(base) - this.visibleWidth(gauge));\n return `${base}${\" \".repeat(pad)}${gauge}`;\n }\n\n /** The prompt line prefix (with ANSI colour) that precedes the typed text. */\n private promptPrefix(): string {\n // Queue/bg badges + level-tinted carrot. Permission level also appears in\n // the box top-border (far right); metrics live on the status line above.\n const q = this.queuedCount > 0 ? `${C.yellow}[⏳ ${this.queuedCount} queued]${C.reset} ` : \"\";\n // The bg badge renders inverted (reverse video) while selected via ←.\n const bgText = `[⚙ ${this.bgCount} bg]`;\n const bg =\n this.bgCount > 0\n ? this.bgBadgeSelected\n ? `${C.cyan}\\x1b[7m${bgText}\\x1b[27m${C.reset} `\n : `${C.cyan}${bgText}${C.reset} `\n : \"\";\n return `${q}${bg}${this.levelColor()}❯${C.reset} `;\n }\n\n private visibleWidth(s: string): number {\n // eslint-disable-next-line no-control-regex\n let w = 0;\n for (const ch of s.replace(/\\x1b\\[[0-9;]*m/g, \"\")) {\n w += isWideCodePoint(ch.codePointAt(0)!) ? 2 : 1;\n }\n return w;\n }\n\n /**\n * Truncate a styled string to at most `max` VISIBLE columns, copying ANSI\n * escape sequences through without counting them and appending a reset if it\n * cut mid-style. The redraw's whole height math assumes every HUD row is\n * exactly ONE physical terminal row — true only while each row's visible\n * width is strictly less than `cols`. A row of width == cols hits the\n * terminal's auto-wrap boundary: many terminals push the cursor to the next\n * line, so the following CR/LF yields an EXTRA physical row we didn't count,\n * and the region marches down the screen leaving a trail on every tick. Every\n * HUD row is clamped through here to keep that invariant no matter what any\n * individual line builder produces.\n */\n private clampVisible(s: string, max: number): string {\n let out = \"\";\n let width = 0;\n let i = 0;\n let truncated = false;\n while (i < s.length) {\n if (s[i] === \"\\x1b\" && s[i + 1] === \"[\") {\n let j = i + 2;\n while (j < s.length && !/[a-zA-Z]/.test(s[j])) j++;\n out += s.slice(i, j + 1); // copy the full escape sequence verbatim\n i = j + 1;\n continue;\n }\n // Advance by code point, counting terminal COLUMNS (a CJK/emoji glyph\n // occupies two) so a wide character can't sneak the row past `max`.\n const cp = s.codePointAt(i)!;\n const chLen = cp > 0xffff ? 2 : 1;\n const chWidth = isWideCodePoint(cp) ? 2 : 1;\n if (width + chWidth > max) {\n truncated = true;\n break;\n }\n out += s.slice(i, i + chLen);\n width += chWidth;\n i += chLen;\n }\n if (truncated) out += C.reset;\n return out;\n }\n\n /**\n * The slash-palette block rendered BELOW the input. While the palette is open\n * we reserve a fixed number of rows — one per available command — padding with\n * blank rows so the region height never changes as the filter narrows. That\n * pins the input: the region scrolls into place once when the palette opens,\n * then nothing below the input resizes, so the text you're typing never jumps.\n * Returns `[]` when the palette is closed (no reservation, input sits at the\n * bottom as usual).\n */\n private paletteBlockLines(cols: number): string[] {\n if (!this.paletteOpen()) return [];\n const rows = this.paletteLines(cols).map((r) => this.clampVisible(r, Math.max(1, cols - 1)));\n const reserved = Math.max(this.commands.length, rows.length);\n while (rows.length < reserved) rows.push(\"\"); // blank padding holds the height\n return rows;\n }\n\n /**\n * Build the slash-palette rows for the current filter. Each row is clamped to\n * ONE physical line (a wrapped row would desync the move-up redraw), with the\n * `/name` highlighted, the label dimmed, and the hint right-aligned.\n */\n private paletteLines(cols: number): string[] {\n if (!this.paletteOpen()) return [];\n const matches = this.filteredCommands();\n if (matches.length === 0) return [` ${C.gray}no matching command${C.reset}`];\n const cur = Math.min(this.slashIdx, matches.length - 1);\n const pointerW = 2;\n return matches.map((cmd, i) => {\n const sel = i === cur;\n const hint = (typeof cmd.hint === \"function\" ? cmd.hint() : cmd.hint) ?? \"\";\n const hintW = hint.length;\n const name = `/${cmd.name}`;\n let visible = `${name} ${cmd.label}`;\n const labelMax = Math.max(6, cols - pointerW - (hintW ? hintW + 2 : 0));\n if (visible.length > labelMax) visible = visible.slice(0, labelMax - 1) + \"…\";\n const desc = visible.slice(name.length); // \" <label…>\" (or \"…\" if name was clipped)\n const pointer = sel ? `${C.magenta}❯${C.reset} ` : \" \";\n const nameStyled = sel ? `${C.bold}${C.cyan}${name}${C.reset}` : `${C.cyan}${name}${C.reset}`;\n let line = `${pointer}${nameStyled}${C.gray}${desc}${C.reset}`;\n if (hintW) {\n const gap = Math.max(2, cols - pointerW - visible.length - hintW);\n line += `${\" \".repeat(gap)}${C.gray}${hint}${C.reset}`;\n }\n return line;\n });\n }\n\n /**\n * Physical rows a previously painted line of visible width `w` occupies after\n * the terminal rewraps it to `cols`. Hard-written HUD lines reflow this way.\n */\n private rewrapRows(w: number, cols: number): number {\n return Math.max(1, Math.ceil(Math.max(w, 1) / Math.max(1, cols)));\n }\n\n /**\n * Move the cursor to the top-left of the current bottom region.\n *\n * Same width as the last draw → the caret's recorded row offset is exact.\n * Width CHANGED (terminal resized) → previously drawn rows re-wrapped, so\n * that offset is stale. Recompute using every stored region row width under\n * the NEW wrap: rows above the caret row + (caret row's rewrap − 1) so we\n * prefer a slight over-move (clean wipe) over under-move (ghost chrome).\n */\n private moveToRegionTop(): void {\n process.stdout.write(\"\\r\");\n if (!this.bottomDrawn) return;\n const cols = process.stdout.columns || 80;\n let up: number;\n if (cols !== this.lastDrawnCols && this.lastDrawnCols > 0 && this.drawnRegionWidths.length) {\n // Prefer the full-region width list; fall back to the legacy above-body list.\n const widths =\n this.drawnRegionWidths.length > 0 ? this.drawnRegionWidths : this.drawnHudWidths;\n const caretIdx = Math.max(\n 0,\n Math.min(this.lastCaretRegionIndex, Math.max(0, widths.length - 1))\n );\n let above = 0;\n for (let i = 0; i < caretIdx; i++) above += this.rewrapRows(widths[i], cols);\n // Caret row may itself soft-wrap under the new width. Terminals usually\n // keep the cursor on the last physical segment when the line grew longer\n // than the new width at the caret column — use (rewrap − 1) so we never\n // under-move and leave a ghost top border above the clear.\n const caretPhysical = this.rewrapRows(widths[caretIdx] ?? 1, cols);\n up = above + Math.max(0, caretPhysical - 1);\n // Safety pad on resize only: one extra row absorbs off-by-one rewrap\n // disagreements across terminals (some count the wrap boundary differently).\n up += 1;\n } else {\n up = this.lastCursorRow;\n }\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n }\n\n /**\n * Render the bottom region: status + subagents above a side-margined expanding\n * input box (level in the top border far right), with the caret on the input\n * body. Uses only relative cursor moves so it survives terminal scrolling when\n * the region grows near the bottom of the screen.\n *\n * Layout (top → bottom):\n * preview · ruler · notice · quit · status · subagents · goal ·\n * box top (level) · box body · box bottom · palette\n */\n private renderBottom(): void {\n if (!this.started || this.takeoverHandler) return; // not yet active, or a takeover owns the bottom\n // Mid-drag: terminal width is in flux — don't paint until the debounced\n // resize handler fires one authoritative clear+repaint.\n if (this.resizePending) return;\n const cols = process.stdout.columns || 80;\n\n this.moveToRegionTop(); // position cursor at the old region's top\n\n // Visible width of every HUD row this draw (full region). Resize path uses\n // the full list so body / bottom border / palette rewraps are counted too.\n const hudWidths: number[] = [];\n // Buffer every row into one string and flush in a single write() —\n // flushing each row separately makes the redraw flicker on every tick.\n const hudRows: string[] = [];\n // Clamp EVERY row to one column short of the terminal width so it can never\n // hit the auto-wrap boundary and silently consume a second physical row\n // (see clampVisible). This is what keeps the region-height math exact.\n const rowCap = Math.max(1, cols - 1);\n const writeHudRow = (line: string) => {\n // Sanitize BEFORE clamping: an embedded newline or tab (a garbled step\n // label, a multi-line subagent status) would add physical rows/columns\n // the region math doesn't count, and the redraw would then stamp the\n // region's top rows into the scrollback on every tick.\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n hudWidths.push(this.visibleWidth(row));\n hudRows.push(row);\n };\n\n // ── output zone (above the work-area ruler) ──────────────────────────────\n // Live streaming preview (reasoning dim-italic, then the answer plain),\n // bounded to a tail. This is model OUTPUT, so it belongs with the transcript\n // ABOVE the ruler — never interleaved between the status and subagent lines.\n // Cleared on commit.\n const previewLines = this.streamPreviewLines(cols);\n for (const line of previewLines) writeHudRow(line);\n\n // ── work area (the pinned HUD, below a full-width ruler) ──────────────────\n // The ruler is the TOP line of the work area: a full-width divider ALWAYS\n // drawn between the plain output above and the constantly-redrawn run area\n // below. It's part of the redrawn region (not printed into the scrollback).\n writeHudRow(`${C.dim}${\"─\".repeat(cols)}${C.reset}`);\n\n // Work-area left pad matches the input box outer edge (not the inner\n // content). Status, subagents, and goal share this inset with the box.\n const geo = inputBoxGeometry(cols);\n const workPad = \" \".repeat(geo.margin);\n // Width available for status/subagent content after the shared left inset.\n const workCols = Math.max(8, cols - geo.margin);\n\n // Transient disconnect notice (one row).\n const noticeLine = this.connected\n ? null\n : `${C.yellow}⚠ lost connection to the workspace — reconnecting…${C.reset}`;\n if (noticeLine) writeHudRow(workPad + noticeLine);\n\n // Transient \"press again to exit\" hint (one row).\n const quitLine = this.quitArmed ? `${C.dim}Press Control-C again to exit${C.reset}` : null;\n if (quitLine) writeHudRow(workPad + quitLine);\n\n // Status line FIRST (working spinner / tokens / goal-complete) — sits with\n // the subagents directly above the input box, same left pad as the box.\n const statusLine = this.statusLineText(workCols);\n if (statusLine) writeHudRow(workPad + statusLine);\n\n // Subagent lines (one per active subagent), just under the status line.\n // Each subagent gets its own hue (loader + label).\n const frame = FRAMES[Math.floor(Date.now() / SPINNER_MS) % FRAMES.length];\n for (const sub of this.subagents) {\n const color =\n sub.agentName === COMPACTION_AGENT\n ? COMPACTION_COLOR\n : SUBAGENT_COLORS[this.subagentColorByID.get(sub.id) ?? 0];\n // Clamp the label so the whole line stays within ONE physical row.\n const budget = workCols - 10;\n let label = sub.label;\n if (budget < 1) label = \"\";\n else if (label.length > budget) label = label.slice(0, Math.max(0, budget - 1)) + \"…\";\n const line = `${color}${frame}${C.reset} ${color}${label}${C.reset} ${C.dim}working${C.reset}`;\n writeHudRow(workPad + line);\n }\n\n // Live goal checklist, just below status/subagents: header + indented todos.\n const goalLines = this.goalLines(workCols);\n for (const line of goalLines) writeHudRow(workPad + line);\n\n // ── boxed input (side margins, expanding body, level in top-right border) ─\n const prefix = this.promptPrefix();\n const pw = this.visibleWidth(prefix);\n // Rotating greyscale border only while the MAIN agent is working (status\n // spinner showing). Subagent-only activity keeps a static grey rim so the\n // highlight always means \"the primary turn is in flight\".\n const borderAnimating = this.working;\n // Full lap ~1.4s; phase is head position 0..1 along the perimeter.\n const borderPhase = borderAnimating ? (Date.now() % 1400) / 1400 : null;\n const boxRows = buildInputBoxRows({\n cols,\n inputBuffer: this.inputBuffer,\n prefix,\n prefixWidth: pw,\n level: this.level,\n levelColor: this.levelColor(),\n borderColor: inputBoxBorderColor(),\n borderPhase,\n });\n // boxRows = [top, ...body, bottom]\n const boxTop = boxRows[0];\n const boxBottom = boxRows[boxRows.length - 1];\n const boxBody = boxRows.slice(1, -1);\n writeHudRow(boxTop);\n\n const bodyStartIdx = hudWidths.length; // first body row index in the region\n for (const row of boxBody) writeHudRow(row);\n writeHudRow(boxBottom);\n\n // Inline slash-command palette BELOW the box (input never shifts as it\n // filters). Fixed reserved height while open so the box stays pinned.\n const paletteBlock = this.paletteBlockLines(cols);\n for (const line of paletteBlock) writeHudRow(line);\n\n // Caret: place on the matching body row at content column + left pad.\n const layout = this.inputLayout();\n const bodyRowCount = Math.max(1, boxBody.length);\n const caretBodyRow = Math.max(0, Math.min(layout.caretRow, bodyRowCount - 1));\n const caretRegionRow = bodyStartIdx + caretBodyRow;\n const caretScreenCol = Math.min(rowCap - 1, geo.leftPad + layout.caretCol);\n\n this.lastCursorRow = caretRegionRow;\n this.lastCaretRegionIndex = caretRegionRow;\n // Full region widths — resize rewrap must count body, bottom, and palette.\n this.drawnRegionWidths = hudWidths.slice();\n this.drawnHudWidths = hudWidths.slice(0, bodyStartIdx); // legacy above-body slice\n this.lastDrawnCols = cols;\n this.bottomDrawn = true;\n\n // ── single flush ────────────────────────────────────────────────────────\n // One write() for the entire region + caret reposition. Always clear from\n // the region top first (`\\x1b[J`) so a resize never leaves ghost chrome\n // below/around the new paint. On resize we already over-moved slightly in\n // moveToRegionTop so the clear reaches any rewrapped leftover rows.\n const totalRows = hudRows.length;\n const up = Math.max(0, totalRows - 1 - caretRegionRow);\n let out = \"\\x1b[J\" + hudRows.join(\"\\r\\n\");\n if (totalRows > 0) {\n out += \"\\r\";\n if (up > 0) out += `\\x1b[${up}A`;\n if (caretScreenCol > 0) out += `\\x1b[${caretScreenCol}C`;\n }\n process.stdout.write(out);\n }\n\n private clearBottom(): void {\n if (!this.bottomDrawn) return;\n this.moveToRegionTop();\n process.stdout.write(\"\\x1b[J\");\n this.bottomDrawn = false;\n }\n\n // ── live streaming preview ────────────────────────────────────────────────\n // An ephemeral tail of the model's output above the status line: reasoning in\n // dim italic until the answer begins, then the answer plain. clearStream()\n // wipes it right before the finished message is committed to the transcript\n // (which renders full markdown), so there's no double-render.\n\n private static readonly STREAM_TAIL = 20;\n // How long a preview may sit untouched before it's wiped. The model often\n // reasons and then calls a tool without ever emitting an answer, so without\n // this the reasoning tail would linger on screen until the *next* thought (or\n // message) arrives. Re-armed on every delta → fires this long after the last.\n private static readonly STREAM_IDLE_MS = 10_000;\n\n /** Append a fragment of streamed answer text (rendered plain). */\n streamResponseDelta(delta: string, messageId?: string): void {\n this.beginStreamMessage(messageId);\n this.streamResponse += delta;\n this.scheduleStreamRedraw();\n this.armStreamIdleExpiry();\n }\n\n /**\n * Append a fragment of streamed internal reasoning (rendered dim italic).\n * Ignored once the answer has started, since reasoning precedes the answer.\n */\n streamThinkingDelta(delta: string, messageId?: string): void {\n this.beginStreamMessage(messageId);\n if (this.streamResponse) return;\n this.streamThinking += delta;\n this.scheduleStreamRedraw();\n this.armStreamIdleExpiry();\n }\n\n /** Reset the preview when a new message starts, so two messages' output (e.g.\n * one that only reasons then calls a tool, then the next) never blend. */\n private beginStreamMessage(messageId?: string): void {\n if (messageId !== undefined && messageId !== this.streamMessageId) {\n this.streamMessageId = messageId;\n this.streamThinking = \"\";\n this.streamResponse = \"\";\n }\n }\n\n /** Wipe the live preview — call right before committing the final message. */\n clearStream(): void {\n if (this.streamRedrawTimer) {\n clearTimeout(this.streamRedrawTimer);\n this.streamRedrawTimer = null;\n }\n if (this.streamIdleTimer) {\n clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\n }\n this.streamMessageId = null;\n if (!this.streamThinking && !this.streamResponse) return;\n this.streamThinking = \"\";\n this.streamResponse = \"\";\n this.renderBottom();\n }\n\n private scheduleStreamRedraw(): void {\n if (this.streamRedrawTimer || this.takeoverHandler || !this.started) return;\n // Batch rapid deltas into ~25fps redraws so streaming stays smooth.\n this.streamRedrawTimer = setTimeout(() => {\n this.streamRedrawTimer = null;\n this.renderBottom();\n }, 40);\n }\n\n /** Re-armed on every streamed delta: once the model goes quiet for a beat, the\n * preview is stale, so wipe it instead of letting it sit until the next\n * message. The committed message (if any) still renders in full via\n * clearStream(), so nothing is lost. */\n private armStreamIdleExpiry(): void {\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = setTimeout(() => {\n this.streamIdleTimer = null;\n if (!this.streamThinking && !this.streamResponse) return;\n this.streamThinking = \"\";\n this.streamResponse = \"\";\n this.renderBottom();\n }, Tui.STREAM_IDLE_MS);\n }\n\n /**\n * The preview's physical rows: a tail of reasoning (dim italic) before the\n * answer starts, otherwise a tail of the answer (plain). Each row is clamped to\n * one terminal line so the bottom-region redraw math stays correct.\n *\n * Rows match the committed transcript formatting so a finished message doesn't\n * visibly \"snap\" into shape: the answer's first line carries the grey gutter\n * dot (as long as it hasn't scrolled out of the tail) and the body indents two\n * spaces beneath it; reasoning aligns at the same indent, dotless.\n */\n private streamPreviewLines(cols: number): string[] {\n // Reasoning gets a distinct, low-contrast voice: italic + a dark grey that\n // recedes well behind the plain (default-color) answer text.\n const thinkStyle = \"\\x1b[3m\\x1b[38;5;240m\";\n // 2-col gutter lead + clamp to one physical row.\n const clamp = (s: string, wrap: string, lead: string): string => {\n const max = cols - 2;\n const t = s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n return wrap ? `${lead}${wrap}${t}${C.reset}` : `${lead}${t}`;\n };\n // Drop blank lines — streamed leading/internal newlines (e.g. a leading\n // \"\\n\\n\") must not render as a pile of empty rows. Also drop lines of\n // leaked tool-call serialization (DSML tags / stray session markers a\n // model emits as text when its tool call fails to parse upstream): the\n // backend discards them from the committed message, so the live preview\n // must not flash them either.\n const leakedMarkup = /<\\/?[||]DSML[||]|^\\s*\\[\\/?SESSION\\]\\s*<?\\s*$/;\n const realLines = (text: string): string[] =>\n text\n .replace(/\\r/g, \"\")\n .split(\"\\n\")\n .filter((l) => l.trim() !== \"\" && !leakedMarkup.test(l));\n if (this.streamResponse) {\n const all = realLines(this.streamResponse);\n const shown = all.slice(-Tui.STREAM_TAIL);\n const firstVisible = all.length <= Tui.STREAM_TAIL; // response's first line still in the tail\n return shown.map((l, i) =>\n clamp(l, \"\", i === 0 && firstVisible ? `${C.gray}•${C.reset} ` : \" \")\n );\n }\n if (this.streamThinking) {\n return realLines(this.streamThinking)\n .slice(-Tui.STREAM_TAIL)\n .map((l) => clamp(l, thinkStyle, \" \"));\n }\n return [];\n }\n\n // ── live goal checklist ───────────────────────────────────────────────────\n\n /**\n * Update the goal from the goal_updated event (or the initial fetch). When\n * every step is done, the goal is fully achieved: we clear the goal area and\n * flip on the \"Goal complete.\" status badge instead of leaving a finished\n * checklist sitting there.\n */\n setGoal(goal: GoalData | null): void {\n const steps = goal?.steps;\n if (steps && Array.isArray(steps) && steps.length) {\n const allDone = steps.every((s) => s.status === \"done\");\n if (allDone) {\n this.goal = null;\n this.goalComplete = true;\n } else {\n this.goal = goal;\n this.goalComplete = false;\n }\n } else {\n this.goal = null;\n }\n this.renderBottom();\n }\n\n /**\n * The goal's physical rows: a header (the short summary + progress) then one\n * row per step, indented two spaces beneath it so the todos clearly belong to\n * the goal — ○ pending / ▸ in-progress / ✓ done — each clamped to a line.\n */\n private goalLines(cols: number): string[] {\n const steps = this.goal?.steps;\n if (!steps?.length) return [];\n const oneLine = (s: string) => s.replace(/\\s+/g, \" \").trim();\n const clamp = (s: string, max: number) =>\n s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n const calmGreen = \"\\x1b[38;5;65m\"; // muted, low-contrast done check\n const out: string[] = [];\n const done = steps.filter((s) => s.status === \"done\").length;\n const summary = oneLine(this.goal?.summary || this.goal?.description || \"Goal\");\n // Clamp the visible summary (not the ANSI-laden head) so we never cut an\n // escape sequence. Prefix is \"Goal N/M \" in visible characters.\n const prefix = `Goal ${done}/${steps.length} `;\n const sum = clamp(summary, Math.max(1, cols - prefix.length));\n out.push(`${C.bold}Goal${C.reset} ${C.gray}${done}/${steps.length}${C.reset} ${sum}`);\n for (const s of steps) {\n // Two-space indent under the goal, then the marker + step text.\n const text = clamp(oneLine(s.step || \"\"), Math.max(1, cols - 4));\n if (s.status === \"done\") out.push(` ${calmGreen}✓${C.reset} ${C.dim}${text}${C.reset}`);\n else if (s.status === \"in_progress\") out.push(` ${C.cyan}▸${C.reset} ${text}`);\n else out.push(` ${C.gray}○ ${text}${C.reset}`);\n }\n return out;\n }\n\n /**\n * Transcript gutter: content starts at column 1, so the far-left column is a\n * clean strip where only status glyphs (✓ ✗ ⛔ …) land — scanning down the\n * left edge reads as a ledger of what happened. Lines already led by a\n * gutter glyph or whitespace (indented blocks, the user-message bar) pass\n * through untouched.\n */\n private gutterize(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) => {\n const plain = line.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n if (plain === \"\" || /^[\\s✓✗⛔⚠⚙⚡⏳↪›❯◇─•]/.test(plain)) return line;\n return \" \" + line;\n })\n .join(\"\\n\");\n }\n\n /** Print a line of transcript above the persistent input. */\n print(text: string): void {\n const line = this.gutterize(text);\n if (this.takeoverHandler) {\n this.bufferedPrints.push(line);\n return;\n }\n this.clearBottom();\n process.stdout.write(line + \"\\n\");\n this.renderBottom();\n }\n\n /** Multi-line convenience. */\n printLines(lines: string[]): void {\n for (const l of lines) this.print(l);\n }\n\n /**\n * Print a user message as a highlighted block so it stands out in the\n * transcript (à la Codex). The bar is sized to the text (not full width, which\n * would wrap awkwardly), padded with a space on each side and a blank line\n * above and below, and a teal `›` marks the first row.\n */\n printUserMessage(text: string): void {\n const cols = Math.max(20, process.stdout.columns || 80);\n const bg = \"\\x1b[48;5;238m\"; // dark-gray background bar (visible against the terminal)\n const limit = Math.max(8, cols - 6); // wrap width, leaving room for padding\n // Word-wrap ONE logical line to `limit`; returns [\"\"] for a blank line so a\n // paragraph separator survives as a blank row in the bar.\n const wrapLine = (logical: string): string[] => {\n const words = logical.replace(/[^\\S\\n]+/g, \" \").trim().split(\" \").filter(Boolean);\n if (!words.length) return [\"\"];\n const out: string[] = [];\n let cur = \"\";\n for (let w of words) {\n while (w.length > limit) {\n if (cur) {\n out.push(cur);\n cur = \"\";\n }\n out.push(w.slice(0, limit));\n w = w.slice(limit);\n }\n if (!cur) cur = w;\n else if (cur.length + 1 + w.length <= limit) cur += \" \" + w;\n else {\n out.push(cur);\n cur = w;\n }\n }\n if (cur || !out.length) out.push(cur);\n return out;\n };\n // Preserve the user's own line breaks (multi-line prompts, blank-line\n // paragraph separators) instead of collapsing everything into one block;\n // wrap each line independently to the bar width.\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\").flatMap(wrapLine);\n // Width the bar to the longest line + the 2-col marker/indent.\n const innerW = 2 + Math.max(1, ...lines.map((l) => l.length));\n this.print(\"\"); // padding above\n lines.forEach((line, i) => {\n const rowText = (i === 0 ? \"❯ \" : \" \") + line;\n const padded = rowText.padEnd(innerW);\n // recolor the leading marker; one space of padding inside the bar each side\n const inner = i === 0 ? `${C.teal}❯${C.reset}${bg}${padded.slice(1)}` : padded;\n this.print(`${bg} ${inner} ${C.reset}`);\n });\n this.print(\"\"); // padding below\n }\n\n // ─── working indicator (turn state) ───────────────────────────────────────\n\n setWorking(on: boolean): void {\n if (on && !this.working) {\n this.working = true;\n this.workingStart = Date.now();\n // Every turn's label starts back at \"Working\" before the word morphs.\n this.wordMill.reset(this.workingStart);\n // A new turn supersedes the previous \"Goal complete.\" badge.\n this.goalComplete = false;\n } else if (!on) {\n this.working = false;\n }\n this.syncSpinner();\n this.renderBottom();\n }\n\n /** The subagents currently working, one persistent line each. Each keeps a\n * stable, distinct colour for as long as it's active; the compaction agent\n * is always orange (its colour never comes from the shared pool). */\n setSubagents(subagents: { id: string; label: string; agentName?: string }[]): void {\n this.subagents = subagents;\n // Release colours held by subagents that have finished.\n const active = new Set(subagents.map((s) => s.id));\n for (const id of [...this.subagentColorByID.keys()]) {\n if (!active.has(id)) this.subagentColorByID.delete(id);\n }\n // Give each newcomer the lowest colour index not currently in use, so\n // concurrent subagents never share a hue (until the palette is exhausted).\n for (const s of subagents) {\n if (s.agentName === COMPACTION_AGENT) continue; // fixed orange, not pooled\n if (this.subagentColorByID.has(s.id)) continue;\n const used = new Set(this.subagentColorByID.values());\n let idx = 0;\n while (used.has(idx) && idx < SUBAGENT_COLORS.length - 1) idx++;\n this.subagentColorByID.set(s.id, idx);\n }\n this.syncSpinner();\n this.renderBottom();\n }\n\n /** Run the spinner animation while anything (the agent or a subagent) is active. */\n private syncSpinner(): void {\n const spinning = this.working || this.subagents.length > 0;\n if (spinning && !this.spinnerTimer) {\n this.spinnerTimer = setInterval(() => this.renderBottom(), SPINNER_MS);\n } else if (!spinning && this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n }\n }\n\n get isWorking(): boolean {\n return this.working;\n }\n\n setBackgroundCount(n: number): void {\n this.bgCount = n;\n if (n === 0) this.bgBadgeSelected = false; // badge gone → nothing to select\n this.renderBottom();\n }\n setQueuedCount(n: number): void {\n this.queuedCount = n;\n this.renderBottom();\n }\n setConnected(connected: boolean): void {\n this.connected = connected;\n this.renderBottom();\n }\n\n // ─── input buffer access (for up-arrow editing of queued messages) ─────────\n\n getInput(): string {\n return this.inputBuffer;\n }\n /** Replace the input (and any pasted images tied to placeholders in it). */\n setInput(text: string, images: PastedImage[] = []): void {\n this.inputBuffer = text;\n this.cursorPos = text.length;\n this.pendingImages = images;\n this.historyIdx = null;\n this.renderBottom();\n }\n\n /** Cumulative token totals shown on the prompt line (`outTokens` includes live). */\n setTokens(inTokens: number, outTokens: number): void {\n this.tokensIn = inTokens;\n this.tokensOut = outTokens;\n this.renderBottom();\n }\n\n /**\n * Current step the agent is working on, shown on the line above the prompt.\n * `outTokens` is the output produced during this step. The step's own timer\n * resets whenever the label changes.\n */\n setStep(label: string | null, outTokens: number): void {\n // Collapse to one line: the label comes from server-sent tool progress\n // text, which can be multi-line garbage when an upstream parse goes wrong.\n const next = label && label.trim() ? label.replace(/\\s+/g, \" \").trim() : null;\n if (next !== this.step) {\n this.step = next;\n this.stepStart = Date.now();\n }\n this.stepOut = outTokens;\n this.renderBottom();\n }\n\n // ─── takeover helpers (approval / menus) ───────────────────────────────────\n\n private beginTakeover(): void {\n this.bgBadgeSelected = false; // a menu/prompt owns the bottom now\n this.clearBottom();\n process.stdout.write(\"\\r\\x1b[K\");\n process.stdout.write(\"\\x1b[?25l\"); // hide the text cursor while a menu/prompt owns the screen\n this.bottomDrawn = false;\n }\n\n private endTakeover(): void {\n this.takeoverHandler = null;\n process.stdout.write(\"\\x1b[?25h\"); // restore the cursor\n const buffered = this.bufferedPrints;\n this.bufferedPrints = [];\n for (const t of buffered) {\n process.stdout.write(t + \"\\n\");\n }\n this.renderBottom();\n }\n\n /**\n * ## Boxed prompt — reusable HUD free-text component\n *\n * Single-line free-text capture using the **same chrome as the main input\n * box** (side margin, grey rounded rim, level-tinted `❯`, real caret). A\n * left-aligned label sits in the top border rim instead of the permission\n * level dots.\n *\n * Prefer this over {@link Tui.prompt} whenever the capture should feel like\n * part of the HUD rather than a legacy bar — denial feedback, handoff notes,\n * reject-with-reason, rename, or any other short free-text moment.\n *\n * ```\n * ╭ Denial feedback ────────────────────────╮\n * │ ❯ the user-typed note │\n * ╰──────────────────────────────────────────╯\n * ```\n *\n * **Keys**\n * - Enter — submit (resolves the trimmed string; may be `\"\"`)\n * - Esc — clear a non-empty draft; Esc again (empty) cancels → `null`\n * (override with `escClearsFirst: false` to always cancel)\n *\n * **Nested mode** (`nested: true`) — call from inside another takeover\n * (e.g. approval → feedback) so this component only steals the key handler\n * and paints/erases its own three rows; the parent still owns begin/end.\n *\n * Do **not** use brand-gradient text for the label — gradient is reserved\n * for success moments (`✓ Goal complete.`, farewell, etc.).\n *\n * @returns trimmed text on Enter, or `null` if the user cancelled with Esc\n */\n boxedPrompt(opts: BoxedPromptOptions): Promise<string | null> {\n return new Promise((resolve) => {\n const nested = !!opts.nested;\n const escClearsFirst = opts.escClearsFirst !== false;\n const borderLabel = opts.borderLabel || \"Feedback\";\n const labelColor = opts.labelColor ?? \"\\x1b[90m\";\n let buf = opts.initial ?? \"\";\n\n if (!nested) this.beginTakeover();\n process.stdout.write(\"\\x1b[?25h\"); // real caret, same as main input\n\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n const reset = C.reset;\n const prompt = `${this.levelColor()}❯${reset} `;\n const promptW = 2; // \"❯ \"\n\n const writeRow = (line: string) => {\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n process.stdout.write(`\\r\\x1b[K${row}\\n`);\n };\n\n // Frame is 3 rows (top / body / bottom). After three writeRow newlines\n // the cursor sits one row BELOW the bottom, so: 2A → body, 3A → top.\n const draw = () => {\n writeRow(pad + buildBoxTopLeftLabel(geo.boxW, borderLabel, border, labelColor));\n writeRow(pad + buildBoxBody(prompt + buf, geo.contentW, border));\n writeRow(pad + buildBoxBottom(geo.boxW, border));\n // Park the real caret after the typed text on the body row.\n process.stdout.write(\"\\r\\x1b[2A\");\n const col = geo.leftPad + promptW + buf.length;\n if (col > 0) process.stdout.write(`\\x1b[${Math.min(rowCap - 1, col)}C`);\n };\n\n const clearFrame = () => {\n // Caret is on the body row → step to the top, then clear down.\n process.stdout.write(\"\\r\\x1b[1A\\x1b[J\");\n };\n\n const redraw = () => {\n // Caret is on body; step to top, then repaint the whole frame.\n process.stdout.write(\"\\r\\x1b[1A\");\n draw();\n };\n\n const finish = (value: string | null) => {\n clearFrame();\n if (!nested) this.endTakeover();\n else this.takeoverHandler = null;\n resolve(value);\n };\n\n draw();\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"escape\") {\n if (escClearsFirst && buf.length > 0) {\n buf = \"\";\n redraw();\n return;\n }\n finish(null);\n return;\n }\n if (key?.name === \"return\" || key?.name === \"enter\") {\n finish(buf.trim());\n return;\n }\n if (key?.name === \"backspace\") {\n if (!buf.length) return;\n buf = buf.slice(0, -1);\n redraw();\n return;\n }\n if (str && !key?.ctrl && !key?.meta && str >= \" \") {\n if (buf.length < Math.max(8, geo.contentW - promptW - 1)) {\n buf += str;\n redraw();\n }\n }\n };\n });\n }\n\n /**\n * Permission prompt: boxed chrome matching the HUD, arrow-navigable options\n * with shortcuts. Includes \"Deny with feedback\" — choosing it (or Tab)\n * opens {@link Tui.boxedPrompt} so the reason can ride back to the agent.\n */\n approval(\n question: string,\n risk: number\n ): Promise<{ choice: \"allow\" | \"deny\" | \"always\" | \"always_risk\"; reason?: string }> {\n return new Promise((resolve) => {\n type Choice = \"allow\" | \"always\" | \"always_risk\" | \"deny\" | \"deny_feedback\";\n const options: { value: Choice; label: string; shortcut: string; color: string; hint?: string }[] = [\n { value: \"allow\", label: \"Allow once\", shortcut: \"y\", color: C.green },\n { value: \"always\", label: \"Always allow this tool\", shortcut: \"a\", color: C.cyan },\n {\n value: \"always_risk\",\n label: `Allow level ${risk} and below this session`,\n shortcut: \"l\",\n color: C.cyan,\n },\n { value: \"deny\", label: \"Deny\", shortcut: \"n\", color: C.red },\n {\n value: \"deny_feedback\",\n label: \"Deny with feedback\",\n shortcut: \"d\",\n color: C.magenta,\n hint: \"tell the agent why\",\n },\n ];\n let idx = 0;\n const riskLevel = Math.max(1, Math.min(5, Math.round(risk))) as Level;\n // Filled dots in warm risk colour, empty dull.\n const riskBar = borderLevelDotsStyled(riskLevel, C.yellow, \"\\x1b[38;5;240m\");\n\n this.beginTakeover();\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n const reset = C.reset;\n\n // Clamp a line of content to the box interior; hard-wrap long summaries.\n const wrapContent = (text: string): string[] => {\n const flat = text.replace(/\\s+/g, \" \").trim();\n if (!flat) return [\"\"];\n const out: string[] = [];\n let rest = flat;\n while (rest.length > geo.contentW) {\n out.push(rest.slice(0, geo.contentW - 1) + \"…\");\n rest = rest.slice(geo.contentW - 1);\n if (out.length >= 4) {\n // Cap summary height so a huge command doesn't flood the dialog.\n break;\n }\n }\n if (out.length < 4) out.push(rest);\n return out.length ? out : [\"\"];\n };\n\n // Question may include a \"why:\" line from the agent — keep each logical\n // line, wrap each, strip any caller ANSI so the box paints cleanly.\n const summaryLines = question.split(\"\\n\").flatMap((line) => {\n // eslint-disable-next-line no-control-regex\n const plain = line.replace(/\\x1b\\[[0-9;]*m/g, \"\").trim();\n if (!plain) return [];\n const isWhy = /^why:/i.test(plain);\n return wrapContent(plain).map((l) => (isWhy ? `${C.dim}${l}${reset}` : l));\n });\n if (!summaryLines.length) summaryLines.push(`${C.dim}(no details)${reset}`);\n\n const writeRow = (line: string) => {\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n process.stdout.write(`\\r\\x1b[K${row}\\n`);\n };\n\n // Full frame height: blank + title + top + summary… + blank + options… + bottom\n const optionCount = options.length;\n const summaryCount = summaryLines.length;\n const boxRows = 1 /*top*/ + summaryCount + 1 /*blank*/ + optionCount + 1 /*bottom*/;\n const titleRows = 2; // blank + title\n const totalRows = titleRows + boxRows;\n\n const renderOptionContent = (i: number): string => {\n const o = options[i];\n const sel = i === idx;\n const pointer = sel ? `${o.color}❯${reset} ` : \" \";\n const label = sel ? `${C.bold}${o.color}${o.label}${reset}` : `${C.dim}${o.label}${reset}`;\n const shortcut = `${C.gray}(${o.shortcut})${reset}`;\n const hint = o.hint && sel ? `${C.dim} ${o.hint}${reset}` : \"\";\n // pointer(2) + label + \" \" + (x) + hint\n const plainLabel = o.label;\n const used = 2 + plainLabel.length + 1 + 3 + (o.hint && sel ? 2 + o.hint.length : 0);\n const gap = Math.max(1, geo.contentW - used);\n return `${pointer}${label}${\" \".repeat(gap)}${shortcut}${hint}`;\n };\n\n const drawFrame = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${totalRows}A`);\n // Title above the box — plain bold (gradient is reserved for success).\n writeRow(\"\");\n writeRow(\n `${pad}${C.bold}Permission needed${reset} ${C.dim}risk${reset} ${riskBar}`\n );\n writeRow(pad + buildBoxTopPlain(geo.boxW, border));\n for (const line of summaryLines) {\n writeRow(pad + buildBoxBody(line, geo.contentW, border));\n }\n // Spacer row inside the box\n writeRow(pad + buildBoxBody(\"\", geo.contentW, border));\n for (let i = 0; i < optionCount; i++) {\n writeRow(pad + buildBoxBody(renderOptionContent(i), geo.contentW, border));\n }\n writeRow(pad + buildBoxBottom(geo.boxW, border));\n };\n\n drawFrame(false);\n\n const erase = () => {\n process.stdout.write(\"\\r\");\n if (totalRows > 0) process.stdout.write(`\\x1b[${totalRows}A`);\n process.stdout.write(\"\\x1b[J\");\n };\n\n const done = (choice: \"allow\" | \"deny\" | \"always\" | \"always_risk\", reason?: string) => {\n erase();\n this.endTakeover();\n resolve(reason !== undefined ? { choice, reason } : { choice });\n };\n\n // Feedback reuses the boxed-prompt component (same chrome as main input,\n // left rim label). Nested so we keep ownership of begin/end takeover.\n const collectFeedback = () => {\n erase();\n void this.boxedPrompt({ borderLabel: \"Denial feedback\", nested: true }).then((why) => {\n this.endTakeover();\n if (why) resolve({ choice: \"deny\", reason: why });\n else resolve({ choice: \"deny\" });\n });\n };\n\n const pick = (value: Choice) => {\n if (value === \"deny_feedback\") collectFeedback();\n else done(value);\n };\n\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"up\" || str === \"k\") {\n idx = (idx - 1 + optionCount) % optionCount;\n drawFrame(true);\n } else if (key?.name === \"down\" || str === \"j\") {\n idx = (idx + 1) % optionCount;\n drawFrame(true);\n } else if (key?.name === \"tab\") {\n // Tab = deny with feedback (legacy + discoverable).\n pick(\"deny_feedback\");\n } else if (key?.name === \"return\" || key?.name === \"enter\") {\n pick(options[idx].value);\n } else if (key?.name === \"escape\") {\n done(\"deny\");\n } else {\n const k = (str || \"\").toLowerCase();\n if (k === \"y\") pick(\"allow\");\n else if (k === \"a\") pick(\"always\");\n else if (k === \"l\") pick(\"always_risk\");\n else if (k === \"n\") pick(\"deny\");\n else if (k === \"d\" || k === \"f\") pick(\"deny_feedback\");\n }\n };\n });\n }\n\n /**\n * Arrow-key selection menu (slash menu, process menu, resume). Pauses input.\n * Boxed chrome matches the bottom input HUD: side margin + grey rounded\n * border, selected row with a brand-tinted pointer.\n */\n select<T>(title: string, items: { label: string; hint?: string; value: T }[]): Promise<T | undefined> {\n return new Promise((resolve) => {\n let idx = 0;\n this.beginTakeover();\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n // Title sits above the box (same left edge as the border).\n // Layout: blank · title · top · items… · bottom → cursor below bottom.\n if (title) process.stdout.write(`\\n${pad}${title}\\n`);\n else process.stdout.write(\"\\n\");\n\n // Each item is ONE physical row inside the box (preview left, hint right)\n // so a long session preview can't wrap and desync the move-up redraw.\n const renderItemContent = (i: number): string => {\n const it = items[i];\n const sel = i === idx;\n const hint = it.hint ?? \"\";\n const hintW = hint.length;\n const pointerW = 2; // \"❯ \" or \" \"\n const labelMax = Math.max(4, geo.contentW - pointerW - (hintW ? hintW + 2 : 0));\n let label = it.label.replace(/\\s+/g, \" \").trim();\n if (label.length > labelMax) label = label.slice(0, Math.max(0, labelMax - 1)) + \"…\";\n const pointer = sel ? `${C.magenta}❯${C.reset} ` : \" \";\n const styledLabel = sel ? `${C.bold}${C.cyan}${label}${C.reset}` : `${C.dim}${label}${C.reset}`;\n let content = `${pointer}${styledLabel}`;\n if (hintW) {\n // Visible width of pointer+label (pointer is 2, label is plain length).\n const used = pointerW + label.length;\n const gap = Math.max(1, geo.contentW - used - hintW);\n content += `${\" \".repeat(gap)}${sel ? C.gray : C.dim}${hint}${C.reset}`;\n }\n return content;\n };\n\n const writeRow = (line: string) => {\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n process.stdout.write(`\\r\\x1b[K${row}\\n`);\n };\n\n // Box frame rows: top + N items + bottom. Redraw rewrites items + bottom\n // (top stays put) so we move up items.length + 1 from below the bottom.\n const draw = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${items.length + 1}A`);\n else writeRow(pad + buildBoxTopPlain(geo.boxW, border));\n for (let i = 0; i < items.length; i++) {\n writeRow(pad + buildBoxBody(renderItemContent(i), geo.contentW, border));\n }\n writeRow(pad + buildBoxBottom(geo.boxW, border));\n };\n draw(false);\n\n // Erase title + full box when the menu closes.\n // title present: blank + title = 2; absent: just the leading blank = 1.\n const titleRows = title ? 2 : 1;\n const boxRows = 1 + items.length + 1; // top + items + bottom\n const erase = () => {\n process.stdout.write(\"\\r\");\n const up = titleRows + boxRows;\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n process.stdout.write(\"\\x1b[J\");\n };\n const close = (value: T | undefined) => {\n erase();\n this.endTakeover();\n resolve(value);\n };\n this.takeoverHandler = (str, key) => {\n if (!key) return;\n if (key.name === \"up\" || str === \"k\") {\n idx = (idx - 1 + items.length) % items.length;\n draw(true);\n } else if (key.name === \"down\" || str === \"j\") {\n idx = (idx + 1) % items.length;\n draw(true);\n } else if (key.name === \"return\" || key.name === \"enter\") {\n close(items[idx].value);\n } else if (key.name === \"escape\") {\n close(undefined);\n }\n };\n });\n }\n\n /**\n * Free-text prompt (single line). Pauses the main input and reads a line —\n * used where a menu can't, e.g. entering an MCP server command. Enter submits,\n * Escape (or empty submit) cancels with null.\n */\n prompt(question: string, placeholder = \"\"): Promise<string | null> {\n return new Promise((resolve) => {\n let buf = \"\";\n this.beginTakeover();\n process.stdout.write(\"\\x1b[?25h\"); // we want a visible caret while typing\n process.stdout.write(`\\n${C.cyan}┃${C.reset} ${question}\\n`);\n if (placeholder) process.stdout.write(`${C.gray}┃ e.g. ${placeholder}${C.reset}\\n`);\n const draw = () => {\n process.stdout.write(`\\r\\x1b[K${C.cyan}┃${C.reset} ${C.bold}›${C.reset} ${buf}`);\n };\n draw();\n const finish = (value: string | null) => {\n process.stdout.write(\"\\n\");\n this.endTakeover();\n resolve(value);\n };\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"escape\") return finish(null);\n if (key?.name === \"return\" || key?.name === \"enter\") return finish(buf.trim() || null);\n if (key?.name === \"backspace\") {\n buf = buf.slice(0, -1);\n draw();\n return;\n }\n // Ignore control keys; accept printable input (including pasted text).\n if (str && !key?.ctrl && !key?.meta && str >= \" \") {\n buf += str;\n draw();\n }\n };\n });\n }\n\n banner(lines: string[]): void {\n this.clearBottom();\n process.stdout.write(\"\\n\");\n for (const l of lines) process.stdout.write(l + \"\\n\");\n }\n}\n","/**\n * Sent-message history, stored in the THREAD KV (key `input_history`) — not on\n * the local filesystem. Session state lives server-side as a rule (like\n * approvals and the process registry) so it resumes from any machine and\n * leaves nothing behind on the host.\n *\n * KV is per-thread, but recall should feel per-project: when a NEW session\n * starts, the caller passes the project's newest prior thread as a seed and\n * the history carries over (and is copied to the new thread's KV). Oldest →\n * newest; capped so the value can't grow without bound. All IO is best-effort.\n */\n\nexport const HISTORY_KEY = \"input_history\";\nconst MAX_ENTRIES = 100;\n\n/** The KV surface history needs (satisfied by ApiClient). */\nexport interface HistoryStore {\n kvGet(threadId: string, key: string): Promise<unknown>;\n kvSet(threadId: string, key: string, value: unknown): Promise<void>;\n}\n\nfunction clean(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((e): e is string => typeof e === \"string\" && e.trim() !== \"\").slice(-MAX_ENTRIES);\n}\n\n/**\n * Load the thread's sent-message history. When the thread has none yet (a\n * fresh session) and a seed thread is given, inherit the seed's history and\n * persist it onto this thread so the chain continues from here.\n */\nexport async function loadHistory(\n store: HistoryStore,\n threadId: string,\n seedThreadId?: string\n): Promise<string[]> {\n const own = clean(await store.kvGet(threadId, HISTORY_KEY));\n if (own.length) return own;\n if (seedThreadId && seedThreadId !== threadId) {\n const seeded = clean(await store.kvGet(seedThreadId, HISTORY_KEY));\n if (seeded.length) {\n void store.kvSet(threadId, HISTORY_KEY, seeded);\n return seeded;\n }\n }\n return [];\n}\n\n/**\n * Append a sent message to the in-memory history (skipping a consecutive\n * duplicate), cap it, and persist the whole list to the thread KV. Returns\n * the same array, mutated, so the caller's reference stays current.\n */\nexport function appendHistory(\n store: HistoryStore,\n threadId: string,\n history: string[],\n text: string\n): string[] {\n const t = text.trim();\n if (!t || history[history.length - 1] === t) return history;\n history.push(t);\n if (history.length > MAX_ENTRIES) history.splice(0, history.length - MAX_ENTRIES);\n void store.kvSet(threadId, HISTORY_KEY, [...history]);\n return history;\n}\n","/**\n * A light-touch Markdown → ANSI formatter for the transcript. Deliberately not a\n * full Markdown engine: it adds color/emphasis hints (bold, inline code,\n * headings, links), tidy list bullets, basic aligned tables, and fenced code\n * gutters — enough to make agent replies readable without fighting the terminal.\n * Zero dependencies; returns an array of ready-to-print lines.\n */\n\nconst ESC = \"\\x1b[\";\nconst R = ESC + \"0m\";\nconst BOLD = ESC + \"1m\";\nconst DIM = ESC + \"2m\";\nconst ITAL = ESC + \"3m\";\nconst UNDER = ESC + \"4m\";\nconst TEAL = ESC + \"38;5;37m\";\nconst CYAN = ESC + \"36m\";\nconst GRAY = ESC + \"90m\";\n\n/** Visible width of a string, ignoring ANSI SGR sequences. */\n// eslint-disable-next-line no-control-regex\nconst ANSI = /\\x1b\\[[0-9;]*m/g;\nfunction visibleWidth(s: string): number {\n return s.replace(ANSI, \"\").length;\n}\nfunction padEndVisible(s: string, width: number): string {\n const pad = width - visibleWidth(s);\n return pad > 0 ? s + \" \".repeat(pad) : s;\n}\n\n/** Apply inline emphasis: code spans, links, bold, italic, strikethrough. */\nfunction inline(s: string): string {\n // Protect inline code first so its contents aren't re-formatted. NUL sentinels\n // never appear in real text, so they can't collide with digits in the prose.\n const codes: string[] = [];\n s = s.replace(/`([^`]+)`/g, (_, code) => {\n codes.push(code);\n return \"\\x00\" + (codes.length - 1) + \"\\x00\";\n });\n // Links: [text](url) → underlined text + dim url.\n s = s.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g,\n (_, text, url) => `${CYAN}${UNDER}${text}${R} ${DIM}${url}${R}`\n );\n // Bold then italic (asterisk forms only — underscores are common in code/ids).\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, (_, t) => `${BOLD}${t}${R}`);\n s = s.replace(/\\*([^*\\n]+)\\*/g, (_, t) => `${ITAL}${t}${R}`);\n s = s.replace(/~~([^~]+)~~/g, (_, t) => `${DIM}${t}${R}`);\n // Restore code spans in teal. Spaces inside a code span become non-breaking\n // (NBSP) so word-wrapping never splits a command/path like `curl | bash`.\n // eslint-disable-next-line no-control-regex\n s = s.replace(/\\x00(\\d+)\\x00/g, (_, i) => `${TEAL}${codes[+i].replace(/ /g, String.fromCharCode(160))}${R}`);\n return s;\n}\n\n/**\n * Word-wrap styled text to a visible width. ANSI-aware (escape sequences don't\n * count toward width), splits only on regular spaces (so NBSP-protected code\n * spans stay intact). A single word longer than the width is left to overflow\n * rather than split mid-token.\n */\nfunction wrapStyled(text: string, width: number): string[] {\n if (width < 4 || visibleWidth(text) <= width) return [text];\n const words = text.split(\" \");\n const lines: string[] = [];\n let cur = \"\";\n let curLen = 0;\n for (const w of words) {\n const wLen = visibleWidth(w);\n if (cur === \"\") {\n cur = w;\n curLen = wLen;\n } else if (curLen + 1 + wLen <= width) {\n cur += \" \" + w;\n curLen += 1 + wLen;\n } else {\n lines.push(cur);\n cur = w;\n curLen = wLen;\n }\n }\n if (cur !== \"\" || lines.length === 0) lines.push(cur);\n return lines;\n}\n\n/**\n * Emit a block (paragraph/list item/quote) word-wrapped to `cols`, with a lead\n * on the first line and an aligned hanging indent of the same visible width on\n * the rest. `leadWidth` is the visible width of both leads.\n */\nfunction wrapBlock(\n out: string[],\n cols: number,\n leadFirst: string,\n leadRest: string,\n leadWidth: number,\n text: string\n): void {\n const wrapped = wrapStyled(text, Math.max(8, cols - leadWidth));\n wrapped.forEach((ln, idx) => out.push((idx === 0 ? leadFirst : leadRest) + ln));\n}\n\n/** Split a table row \"| a | b |\" into trimmed cells. */\nfunction tableCells(row: string): string[] {\n let r = row.trim();\n if (r.startsWith(\"|\")) r = r.slice(1);\n if (r.endsWith(\"|\")) r = r.slice(0, -1);\n return r.split(\"|\").map((c) => c.trim());\n}\n\nconst SEPARATOR = /^[\\s|:-]+$/;\nfunction isTableSeparator(line: string): boolean {\n return SEPARATOR.test(line) && line.includes(\"-\") && line.includes(\"|\");\n}\n\n/** Render a collected table block (header row + body rows) as aligned columns. */\nfunction renderTable(rows: string[][]): string[] {\n const cols = Math.max(...rows.map((r) => r.length));\n const widths: number[] = [];\n for (let c = 0; c < cols; c++) {\n widths[c] = Math.max(...rows.map((r) => visibleWidth(inline(r[c] ?? \"\"))));\n }\n const sep = `${GRAY} │ ${R}`;\n const out: string[] = [];\n rows.forEach((r, ri) => {\n const cells = [];\n for (let c = 0; c < cols; c++) {\n const raw = r[c] ?? \"\";\n const styled = ri === 0 ? `${BOLD}${inline(raw)}${R}` : inline(raw);\n cells.push(padEndVisible(styled, widths[c]));\n }\n out.push((\" \" + cells.join(sep)).replace(/\\s+$/, \"\"));\n if (ri === 0) {\n // A thin underline beneath the header row.\n const rule = widths.map((w) => `${GRAY}${\"─\".repeat(w)}${R}`).join(`${GRAY}─┼─${R}`);\n out.push(\" \" + rule);\n }\n });\n return out;\n}\n\n/** Format Markdown source into an array of ANSI-styled, word-wrapped terminal lines. */\nexport function renderMarkdown(src: string, cols = 80): string[] {\n const lines = src.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const out: string[] = [];\n let inFence = false;\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Fenced code block: render with a dim gutter, no inline formatting.\n if (/^\\s*```/.test(line)) {\n inFence = !inFence;\n i++;\n continue;\n }\n if (inFence) {\n out.push(`${GRAY}│${R} ${line}`);\n i++;\n continue;\n }\n\n // Table: a row containing \"|\" immediately followed by a separator row.\n if (line.includes(\"|\") && i + 1 < lines.length && isTableSeparator(lines[i + 1])) {\n const block: string[][] = [tableCells(line)];\n i += 2; // skip header + separator\n while (i < lines.length && lines[i].includes(\"|\") && lines[i].trim()) {\n block.push(tableCells(lines[i]));\n i++;\n }\n out.push(...renderTable(block));\n continue;\n }\n\n // Heading.\n const heading = line.match(/^(#{1,6})\\s+(.*)$/);\n if (heading) {\n for (const ln of wrapStyled(heading[2].trim(), cols)) out.push(`${BOLD}${TEAL}${ln}${R}`);\n i++;\n continue;\n }\n\n // Horizontal rule → a short, subtle divider (never full width).\n if (/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(line)) {\n out.push(`${GRAY}──────${R}`);\n i++;\n continue;\n }\n\n // Blockquote.\n const quote = line.match(/^\\s*>\\s?(.*)$/);\n if (quote) {\n for (const ln of wrapStyled(inline(quote[1]), Math.max(8, cols - 2))) {\n out.push(`${GRAY}│${R} ${DIM}${ln}${R}`);\n }\n i++;\n continue;\n }\n\n // Bullet list (-, *, +) with indentation preserved; continuation hangs under the text.\n const bullet = line.match(/^(\\s*)[-*+]\\s+(.*)$/);\n if (bullet) {\n const leadWidth = bullet[1].length + 2;\n wrapBlock(out, cols, `${bullet[1]}${TEAL}•${R} `, \" \".repeat(leadWidth), leadWidth, inline(bullet[2]));\n i++;\n continue;\n }\n\n // Numbered list — keep the number, embolden the marker.\n const numbered = line.match(/^(\\s*)(\\d+)([.)])\\s+(.*)$/);\n if (numbered) {\n const marker = `${numbered[2]}${numbered[3]}`;\n const leadWidth = numbered[1].length + marker.length + 1;\n wrapBlock(out, cols, `${numbered[1]}${BOLD}${marker}${R} `, \" \".repeat(leadWidth), leadWidth, inline(numbered[4]));\n i++;\n continue;\n }\n\n // Plain paragraph line (blank lines pass through as spacing).\n if (line.trim()) wrapBlock(out, cols, \"\", \"\", 0, inline(line));\n else out.push(\"\");\n i++;\n }\n\n return out;\n}\n","/** Read/write ~/.standardagents/credentials. */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { CredentialsFile, InstanceCredential } from \"./types.ts\";\n\nconst DIR = path.join(os.homedir(), \".standardagents\");\nconst FILE = path.join(DIR, \"credentials\");\n\nexport function normalizeEndpoint(endpoint: string): string {\n let e = endpoint.trim();\n if (!/^https?:\\/\\//i.test(e)) e = \"http://\" + e;\n return e.replace(/\\/+$/, \"\");\n}\n\nexport function loadCredentials(): CredentialsFile {\n try {\n const raw = fs.readFileSync(FILE, \"utf8\");\n const parsed = JSON.parse(raw) as CredentialsFile;\n if (!parsed.instances) parsed.instances = {};\n return parsed;\n } catch {\n return { instances: {} };\n }\n}\n\nexport function getCredential(endpoint: string): InstanceCredential | null {\n const creds = loadCredentials();\n return creds.instances[normalizeEndpoint(endpoint)] ?? null;\n}\n\nexport function saveCredential(\n cred: InstanceCredential,\n options: { updateDefault?: boolean } = {}\n): void {\n const creds = loadCredentials();\n const endpoint = normalizeEndpoint(cred.endpoint);\n creds.instances[endpoint] = { ...cred, endpoint };\n if (options.updateDefault ?? true) {\n creds.default_endpoint = endpoint;\n }\n fs.mkdirSync(DIR, { recursive: true });\n // Credentials contain a bearer token — keep them private.\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n\n/** Remove the saved token for an endpoint (the `/logout` command). */\nexport function deleteCredential(endpoint: string): void {\n const creds = loadCredentials();\n delete creds.instances[normalizeEndpoint(endpoint)];\n fs.mkdirSync(DIR, { recursive: true });\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n\nexport function defaultEndpoint(): string | null {\n return loadCredentials().default_endpoint ?? null;\n}\n\nexport function saveDefaultEndpoint(endpoint: string): void {\n const creds = loadCredentials();\n creds.default_endpoint = normalizeEndpoint(endpoint);\n fs.mkdirSync(DIR, { recursive: true });\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n","/**\n * Device-code browser sign-in + browser-open helper, shared by the interactive\n * CLI and `standardcode daemon install` (a VPS install prints the URL for the\n * user to open elsewhere — the flow is Wrangler-style: URL first, then a\n * best-effort local browser open).\n */\nimport { spawn } from \"node:child_process\";\nimport { stdout as output } from \"node:process\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n teal: \"\\x1b[38;5;37m\",\n};\n\n/**\n * Device-code browser sign-in: start a device login on the instance, open the\n * approval URL in the browser (hosted instances route an anonymous visit\n * through the Standard Agents platform login first), and poll until the\n * approval mints our personal API key. Throws with a plain message on\n * timeout or failure.\n */\nexport async function deviceLogin(endpoint: string): Promise<string> {\n const start = await fetch(`${endpoint}/api/auth/device/start`, { method: \"POST\" });\n if (!start.ok) throw new Error(`This instance does not support browser sign-in (HTTP ${start.status}). Paste an API token instead.`);\n const info = (await start.json()) as { code: string; verify_url: string; poll_url: string; interval?: number; expires_in?: number };\n // Wrangler-style: the URL is printed FIRST (copy-pasteable if the browser\n // doesn't open — SSH sessions, containers), then we try to open it.\n output.write(`${c.dim}Opening your browser to sign in. If it doesn't open, visit:${c.reset}\\n`);\n output.write(`\\n ${c.teal}${info.verify_url}${c.reset}\\n\\n`);\n output.write(`${c.dim}Waiting for sign-in to complete… (Ctrl-C to cancel)${c.reset}\\n`);\n openUrl(info.verify_url);\n const deadline = Date.now() + (info.expires_in ?? 600) * 1000;\n const interval = Math.max(2, info.interval ?? 2) * 1000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, interval));\n const res = await fetch(info.poll_url).catch(() => null);\n if (!res) continue;\n if (res.status === 404) throw new Error(\"The sign-in link expired. Try again.\");\n const body = (await res.json().catch(() => ({}))) as { status?: string; token?: string };\n if (body.status === \"approved\" && body.token) return body.token;\n if (body.status === \"denied\") throw new Error(\"Sign-in was denied in the browser.\");\n }\n throw new Error(\"Timed out waiting for browser approval. Try again.\");\n}\n\n/** Open a URL in the system browser (best effort). */\nexport function openUrl(url: string): void {\n const platform = process.platform;\n const cmd = platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n try {\n const child = spawn(cmd, args, { stdio: \"ignore\", detached: true });\n child.unref();\n } catch {\n // ignore — the URL is also printed for manual opening\n }\n}\n","/** Product constants + small environment helpers shared by the interactive\n * CLI (index.ts) and the daemon (daemon.ts). */\nimport fs from \"node:fs\";\n\nexport const AGENT_ID = \"standard_code_agent\";\n// The instance's model gearbox hands sessions between agent variants; a\n// thread parked in another gear must still be resumable (and daemon-servable).\n// Includes historical gear names so old threads keep appearing.\nexport const AGENT_ID_VARIANTS = [\n AGENT_ID,\n \"standard_code_low_agent\",\n \"standard_code_high_agent\",\n];\n// The hosted Standard Code instance — where every normal user's session\n// lives. Only `--endpoint` (rare: local dev, self-hosted) points elsewhere.\nexport const PRODUCTION_ENDPOINT = \"https://api.standardcode.ai\";\n\n/** Read this package's version from package.json (best effort). */\nexport function readVersion(): string {\n try {\n const pkg = JSON.parse(fs.readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\"));\n return typeof pkg.version === \"string\" ? pkg.version : \"\";\n } catch {\n return \"\";\n }\n}\n\n/** Whether a hostname is a local/private dev address (loopback, .local, RFC-1918). */\nexport function isLocalHost(host: string): boolean {\n return (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host.endsWith(\".local\") ||\n host.endsWith(\".localhost\") ||\n /^10\\./.test(host) ||\n /^192\\.168\\./.test(host) ||\n /^172\\.(1[6-9]|2\\d|3[01])\\./.test(host)\n );\n}\n\n/**\n * Relax TLS verification for local/private endpoints only. OrbStack (and other\n * local dev setups) serve HTTPS with a CA installed in the system keychain —\n * which curl and browsers trust, but Node's `fetch`/`WebSocket` do not, so they\n * fail with SELF_SIGNED_CERT_IN_CHAIN and every token \"doesn't work\". For a\n * loopback/`.local`/RFC-1918 host we disable verification (covering fetch and\n * the bridge/stream WebSockets); public endpoints keep full verification.\n * Returns true when verification was relaxed.\n */\nexport function relaxTlsForLocalEndpoint(endpoint: string): boolean {\n let host = \"\";\n try {\n host = new URL(endpoint).hostname;\n } catch {\n return false;\n }\n if (!endpoint.startsWith(\"https:\") || !isLocalHost(host)) return false;\n // Filter out Node's global \"insecure TLS\" warning; we surface our own note.\n const origEmit = process.emitWarning.bind(process);\n process.emitWarning = ((warning: string | Error, ...args: unknown[]) => {\n const msg = typeof warning === \"string\" ? warning : warning?.message ?? \"\";\n if (msg.includes(\"NODE_TLS_REJECT_UNAUTHORIZED\")) return;\n return (origEmit as (...a: unknown[]) => void)(warning, ...args);\n }) as typeof process.emitWarning;\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = \"0\";\n return true;\n}\n","/**\n * Stable machine identity for this host (~/.standardagents/machine.json).\n *\n * Every machine that runs Standard Code — a laptop's interactive CLI or a\n * VPS daemon — gets one durable random id. The id keys this machine's record\n * in the account-wide machine registry (see registry.ts) and forms the\n * client identities the bridge uses for execution ownership:\n *\n * daemon:<machine_id> — the daemon (stable across restarts, so a\n * rebooted VPS reclaims its threads)\n * cli:<machine_id>:<random> — one interactive CLI process (unique per\n * process, so two terminals never both own)\n */\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\n// Resolved lazily (not cached at import) so a changed HOME is always honored —\n// this is what lets tests isolate to a temp home and keeps a long-lived daemon\n// correct if its home ever changes.\nconst dir = () => path.join(os.homedir(), \".standardagents\");\nconst file = () => path.join(dir(), \"machine.json\");\n\n/**\n * machine.json holds ONLY this host's hardware identity — a stable random id.\n * The user-facing NAME is NOT here: a machine's name is a label the user\n * assigns in THEIR account, so it lives on the instance (the machine registry\n * record in user KV), not on the machine's disk. See registry.ts\n * `getMachineName` / `setMachineName`.\n */\nexport interface MachineIdentity {\n machine_id: string;\n created_at: number;\n}\n\n/** Load this host's machine identity, creating one on first use. */\nexport function loadMachineIdentity(): MachineIdentity {\n try {\n const parsed = JSON.parse(fs.readFileSync(file(), \"utf8\")) as MachineIdentity;\n if (typeof parsed.machine_id === \"string\" && parsed.machine_id.length > 0) {\n // machine.json may carry a legacy `name` from before names moved to the\n // account — we keep only the id + created_at (the name migrates via the\n // registry record's fallback; see registry.ts).\n return { machine_id: parsed.machine_id, created_at: parsed.created_at ?? Date.now() };\n }\n } catch {\n // first run (or corrupt file) — mint a fresh identity below\n }\n const identity: MachineIdentity = {\n machine_id: crypto.randomUUID(),\n created_at: Date.now(),\n };\n saveMachineIdentity(identity);\n return identity;\n}\n\nexport function saveMachineIdentity(identity: MachineIdentity): void {\n fs.mkdirSync(dir(), { recursive: true });\n fs.writeFileSync(file(), JSON.stringify(identity, null, 2), { mode: 0o600 });\n}\n\n/** The daemon's stable bridge client id for this machine. */\nexport function daemonClientId(identity: MachineIdentity): string {\n return `daemon:${identity.machine_id}`;\n}\n\n/** A per-process interactive bridge client id for this machine. */\nexport function interactiveClientId(identity: MachineIdentity): string {\n return `cli:${identity.machine_id}:${crypto.randomBytes(4).toString(\"hex\")}`;\n}\n\n/** The machine id inside a daemon client id, or null for any other id. */\nexport function machineIdFromDaemonClientId(clientId: string | null | undefined): string | null {\n if (typeof clientId !== \"string\") return null;\n return clientId.startsWith(\"daemon:\") ? clientId.slice(\"daemon:\".length) : null;\n}\n","/**\n * The account-wide machine registry.\n *\n * Every machine on the account (laptop CLIs and VPS daemons) keeps one record\n * in the user's account-wide KV on the instance, keyed\n * `standardcode.machine.<machine_id>`. The record carries the machine's\n * identity, its known project directories, and — when a daemon is installed —\n * a heartbeat, so the session-start picker can offer \"run this session on\n * <machine>\" with live daemons only.\n *\n * Records are per-machine keys (not one big document) so concurrent daemons\n * heartbeating from different machines never clobber each other.\n */\nimport os from \"node:os\";\nimport crypto from \"node:crypto\";\nimport { execFileSync } from \"node:child_process\";\nimport type { ApiClient } from \"./api.ts\";\nimport type { MachineIdentity } from \"./machine.ts\";\nimport { readVersion } from \"./product.ts\";\n\nconst KEY_PREFIX = \"standardcode.machine.\";\n/** Per-machine command queue lives at `<machine key>.cmd` (a separate user-KV\n * key so a client enqueueing a command never races the daemon's heartbeat\n * read-modify-write of the machine record itself). */\nconst CMD_SUFFIX = \".cmd\";\n/**\n * The user-assigned machine NAME lives at `<machine key>.name` — a dedicated\n * account key that ONLY the user edits (via /machines rename) and the daemon\n * NEVER writes. This is why renaming a machine is a direct account write from\n * any client (no daemon round-trip) and can't be reverted by the daemon's\n * heartbeat. The base record's `name` is a machine-reported default (hostname)\n * and the migration fallback for installs whose name predates this split.\n */\nconst NAME_SUFFIX = \".name\";\n/**\n * The remote file-browser RPC lives at `<machine key>.fsreq` (request, written\n * by a browsing client) and `<machine key>.fsres` (response, written by the\n * machine's daemon). It's a machine-scoped mirror of the thread-KV approval\n * relay: single in-flight request per machine, correlated by `nonce`. A\n * separate key from `.cmd`/the record so browsing never races the heartbeat.\n */\nconst FSREQ_SUFFIX = \".fsreq\";\nconst FSRES_SUFFIX = \".fsres\";\n\n/** How recent a daemon heartbeat must be to count as \"online\". Heartbeats are\n * every 30s, so 3 missed beats = offline. */\nexport const DAEMON_ONLINE_WINDOW_MS = 90 * 1000;\n\nexport interface MachineProjectRecord {\n /** Short display name (the directory's basename). */\n name: string;\n last_used_at: number;\n /** The project's git origin URL, when the directory is a git repo. */\n repository?: string | null;\n}\n\nexport interface DaemonRecord {\n version: string;\n installed_at: number;\n last_seen_at: number;\n pid?: number;\n}\n\nexport interface MachineRecord {\n id: string;\n name: string;\n hostname: string;\n platform: string;\n arch: string;\n /** The @standardagents/code version this machine last ran (any client). */\n version?: string;\n daemon?: DaemonRecord | null;\n /** Absolute project path → record. */\n projects: Record<string, MachineProjectRecord>;\n created_at: number;\n updated_at: number;\n}\n\n/**\n * A management command a client queues for a machine's daemon to apply.\n * (Renaming is NOT here — a name is account data, so a rename is a direct\n * user-KV write via {@link setMachineName}, no daemon needed.)\n */\nexport interface MachineCommand {\n id: string;\n kind: \"update\" | \"add_project\" | \"remove_project\";\n args?: Record<string, unknown>;\n requested_at: number;\n}\n\nexport function machineKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}`;\n}\n\nfunction commandKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${CMD_SUFFIX}`;\n}\n\nfunction nameKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${NAME_SUFFIX}`;\n}\n\nfunction fsRequestKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${FSREQ_SUFFIX}`;\n}\nfunction fsResponseKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${FSRES_SUFFIX}`;\n}\n\n// ── remote file-browser RPC ───────────────────────────────────────────────────\nexport interface FsBrowseRequest {\n nonce: string;\n op: \"list\";\n path: string;\n show_hidden?: boolean;\n requested_at: number;\n}\nexport interface FsBrowseResponse {\n nonce: string;\n ok: boolean;\n result?: unknown; // a BrowseResult (see fs-browse.ts); kept opaque here\n error?: string;\n responded_at: number;\n}\n\nfunction parseFsRequest(value: unknown): FsBrowseRequest | null {\n if (!value || typeof value !== \"object\") return null;\n const r = value as Record<string, unknown>;\n if (typeof r.nonce !== \"string\" || r.op !== \"list\" || typeof r.path !== \"string\") return null;\n return {\n nonce: r.nonce,\n op: \"list\",\n path: r.path,\n show_hidden: r.show_hidden === true,\n requested_at: typeof r.requested_at === \"number\" ? r.requested_at : Date.now(),\n };\n}\n\n/** Client side: enqueue a browse request for a machine's daemon. */\nexport async function writeFsRequest(\n api: ApiClient,\n machineId: string,\n req: Omit<FsBrowseRequest, \"requested_at\">\n): Promise<void> {\n await api.userKvSet(fsRequestKey(machineId), { ...req, requested_at: Date.now() });\n}\n\n/** Client side: read the daemon's response (null until it answers). */\nexport async function readFsResponse(api: ApiClient, machineId: string): Promise<FsBrowseResponse | null> {\n const value = await api.userKvGet(fsResponseKey(machineId));\n if (!value || typeof value !== \"object\") return null;\n const r = value as Record<string, unknown>;\n if (typeof r.nonce !== \"string\" || typeof r.ok !== \"boolean\") return null;\n return {\n nonce: r.nonce,\n ok: r.ok,\n result: r.result,\n error: typeof r.error === \"string\" ? r.error : undefined,\n responded_at: typeof r.responded_at === \"number\" ? r.responded_at : 0,\n };\n}\n\n/** Daemon side: read the pending browse request for THIS machine. */\nexport async function readFsRequest(api: ApiClient, machineId: string): Promise<FsBrowseRequest | null> {\n return parseFsRequest(await api.userKvGet(fsRequestKey(machineId)));\n}\n\n/** Daemon side: publish the browse result for the request's nonce. */\nexport async function writeFsResponse(\n api: ApiClient,\n machineId: string,\n res: Omit<FsBrowseResponse, \"responded_at\">\n): Promise<void> {\n await api.userKvSet(fsResponseKey(machineId), { ...res, responded_at: Date.now() });\n}\n\n/** A machine's display name: the user's account-set name, else the machine's\n * reported hostname, else its id. Takes a record (already name-overlaid by\n * loadMachine/loadMachines) or any object with these fields. */\nexport function machineDisplayName(record: {\n name?: string | null;\n hostname?: string | null;\n id?: string | null;\n}): string {\n return (record.name?.trim() || \"\") || (record.hostname || \"\") || (record.id || \"\") || \"machine\";\n}\n\n/** Read a machine's user-assigned name from the account (null if unset). */\nexport async function getMachineName(api: ApiClient, machineId: string): Promise<string | null> {\n const v = await api.userKvGet(nameKey(machineId));\n return typeof v === \"string\" && v.trim() ? v.trim() : null;\n}\n\n/**\n * Set (or clear) a machine's name in the ACCOUNT — a direct user-KV write that\n * any client can make for any of the user's machines. The daemon never writes\n * this key, so a remote rename is authoritative and can't be reverted by a\n * heartbeat. Passing an empty name clears it (reverts to the hostname default).\n */\nexport async function setMachineName(api: ApiClient, machineId: string, name: string): Promise<void> {\n const trimmed = name.trim();\n await api.userKvSet(nameKey(machineId), trimmed || null);\n}\n\nfunction parseMachineRecord(value: unknown): MachineRecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const r = value as Record<string, unknown>;\n if (typeof r.id !== \"string\" || r.id.length === 0) return null;\n return {\n id: r.id,\n name: typeof r.name === \"string\" && r.name ? r.name : String(r.hostname ?? r.id),\n hostname: typeof r.hostname === \"string\" ? r.hostname : \"\",\n platform: typeof r.platform === \"string\" ? r.platform : \"\",\n arch: typeof r.arch === \"string\" ? r.arch : \"\",\n version: typeof r.version === \"string\" ? r.version : undefined,\n daemon:\n r.daemon && typeof r.daemon === \"object\" && !Array.isArray(r.daemon)\n ? (r.daemon as unknown as DaemonRecord)\n : null,\n projects:\n r.projects && typeof r.projects === \"object\" && !Array.isArray(r.projects)\n ? (r.projects as Record<string, MachineProjectRecord>)\n : {},\n created_at: typeof r.created_at === \"number\" ? r.created_at : 0,\n updated_at: typeof r.updated_at === \"number\" ? r.updated_at : 0,\n };\n}\n\n/** The base record only (no account name overlay) — used by the write path so\n * a heartbeat never folds the user's name into the daemon-written record. */\nasync function loadRawMachine(api: ApiClient, machineId: string): Promise<MachineRecord | null> {\n return parseMachineRecord(await api.userKvGet(machineKey(machineId)));\n}\n\n/**\n * All machine records on the account, each with its account NAME overlaid.\n * The `standardcode.machine.` prefix also covers the `.name` and `.cmd`\n * sibling keys, so we partition: base records, name overrides, command queues.\n */\nexport async function loadMachines(api: ApiClient): Promise<MachineRecord[]> {\n const entries = await api.userKvList(KEY_PREFIX);\n const records: MachineRecord[] = [];\n const names = new Map<string, string>();\n for (const e of entries) {\n const rest = e.key.slice(KEY_PREFIX.length);\n if (rest.endsWith(CMD_SUFFIX)) continue;\n if (rest.endsWith(NAME_SUFFIX)) {\n const id = rest.slice(0, -NAME_SUFFIX.length);\n if (typeof e.value === \"string\" && e.value.trim()) names.set(id, e.value.trim());\n continue;\n }\n const rec = parseMachineRecord(e.value);\n if (rec) records.push(rec);\n }\n for (const rec of records) {\n const override = names.get(rec.id);\n if (override) rec.name = override;\n }\n return records;\n}\n\n/** One machine record with its account NAME overlaid, or null. */\nexport async function loadMachine(api: ApiClient, machineId: string): Promise<MachineRecord | null> {\n const rec = await loadRawMachine(api, machineId);\n if (!rec) return null;\n const override = await getMachineName(api, machineId);\n if (override) rec.name = override;\n return rec;\n}\n\n/** Whether a machine has a daemon that heartbeated recently. */\nexport function daemonOnline(record: MachineRecord, now = Date.now()): boolean {\n return !!record.daemon && now - record.daemon.last_seen_at < DAEMON_ONLINE_WINDOW_MS;\n}\n\n/** A fresh record for this machine (used when none exists yet). The `name`\n * here is the machine-reported default (hostname); the user's chosen name\n * lives in the account `.name` key and is overlaid on read. */\nfunction newRecord(identity: MachineIdentity): MachineRecord {\n const now = Date.now();\n return {\n id: identity.machine_id,\n name: os.hostname(),\n hostname: os.hostname(),\n platform: process.platform,\n arch: process.arch,\n version: readVersion() || undefined,\n daemon: null,\n projects: {},\n created_at: now,\n updated_at: now,\n };\n}\n\n/**\n * Upsert this machine's record with fresh host facts and (optionally) mutate\n * it. Read-modify-write on this machine's OWN key only, so machines never\n * race each other.\n */\nexport async function updateOwnMachineRecord(\n api: ApiClient,\n identity: MachineIdentity,\n mutate?: (record: MachineRecord) => void\n): Promise<MachineRecord> {\n // Operate on the RAW base record (no name overlay): the daemon must never\n // fold the user's account-set name into the record it writes, or its next\n // heartbeat could revert a rename. The user's name lives in the `.name` key.\n const existing = await loadRawMachine(api, identity.machine_id);\n const record = existing ?? newRecord(identity);\n // Preserve the base record's `name` (a hostname default, or a legacy synced\n // name that serves as the migration fallback) — never overwrite it here.\n record.hostname = os.hostname();\n record.platform = process.platform;\n record.arch = process.arch;\n record.version = readVersion() || record.version;\n mutate?.(record);\n record.updated_at = Date.now();\n await api.userKvSet(machineKey(identity.machine_id), record);\n return record;\n}\n\n/** The directory's git origin URL, or null (best effort, never throws). */\nexport function projectRepository(projectDir: string): string | null {\n try {\n const url = execFileSync(\"git\", [\"-C\", projectDir, \"remote\", \"get-url\", \"origin\"], {\n encoding: \"utf8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n return url || null;\n } catch {\n return null;\n }\n}\n\n/** Record that this machine has (just used) a project directory. */\nexport async function registerProject(\n api: ApiClient,\n identity: MachineIdentity,\n projectDir: string\n): Promise<void> {\n const repository = projectRepository(projectDir);\n await updateOwnMachineRecord(api, identity, (record) => {\n record.projects[projectDir] = {\n name: projectDir.split(\"/\").filter(Boolean).pop() || projectDir,\n last_used_at: Date.now(),\n repository,\n };\n });\n}\n\n/** Remove a project directory from this machine's record. */\nexport async function unregisterProject(\n api: ApiClient,\n identity: MachineIdentity,\n projectDir: string\n): Promise<void> {\n await updateOwnMachineRecord(api, identity, (record) => {\n delete record.projects[projectDir];\n });\n}\n\n/** Daemon heartbeat: refresh `daemon.last_seen_at` (creating the block). */\nexport async function touchDaemon(\n api: ApiClient,\n identity: MachineIdentity,\n version: string\n): Promise<void> {\n await updateOwnMachineRecord(api, identity, (record) => {\n const now = Date.now();\n record.daemon = {\n version,\n installed_at: record.daemon?.installed_at ?? now,\n last_seen_at: now,\n pid: process.pid,\n };\n });\n}\n\n/** Mark this machine's daemon uninstalled (clears the heartbeat block). */\nexport async function clearDaemon(api: ApiClient, identity: MachineIdentity): Promise<void> {\n await updateOwnMachineRecord(api, identity, (record) => {\n record.daemon = null;\n });\n}\n\n// ── management command channel ────────────────────────────────────────────────\n// A client manages a REMOTE machine (rename / update / add-remove projects) by\n// queueing a command in that machine's `.cmd` user-KV key; the machine's daemon\n// drains and applies it. (Managing the LOCAL machine is done directly, since\n// the client is on that filesystem — see the /machines command.)\n\nfunction parseCommands(value: unknown): MachineCommand[] {\n if (!Array.isArray(value)) return [];\n return value.filter(\n (c): c is MachineCommand =>\n !!c &&\n typeof c === \"object\" &&\n typeof (c as MachineCommand).id === \"string\" &&\n typeof (c as MachineCommand).kind === \"string\"\n );\n}\n\n/** Queue a management command for a machine's daemon. Returns the command id. */\nexport async function enqueueMachineCommand(\n api: ApiClient,\n machineId: string,\n kind: MachineCommand[\"kind\"],\n args?: Record<string, unknown>\n): Promise<string> {\n const key = commandKey(machineId);\n const queue = parseCommands(await api.userKvGet(key));\n const cmd: MachineCommand = {\n id: crypto.randomBytes(6).toString(\"hex\"),\n kind,\n args,\n requested_at: Date.now(),\n };\n queue.push(cmd);\n await api.userKvSet(key, queue);\n return cmd.id;\n}\n\n/** The daemon's view of its own pending commands. */\nexport async function readMachineCommands(\n api: ApiClient,\n machineId: string\n): Promise<MachineCommand[]> {\n return parseCommands(await api.userKvGet(commandKey(machineId)));\n}\n\n/** Remove applied commands (by id) from a machine's queue. */\nexport async function clearMachineCommands(\n api: ApiClient,\n machineId: string,\n appliedIds: string[]\n): Promise<void> {\n if (appliedIds.length === 0) return;\n const key = commandKey(machineId);\n const remaining = parseCommands(await api.userKvGet(key)).filter(\n (c) => !appliedIds.includes(c.id)\n );\n await api.userKvSet(key, remaining.length ? remaining : null);\n}\n\n/**\n * Apply one management command to THIS machine (daemon side): mutate local\n * identity/registry to match. Returns a short human result for the log.\n * `add_project`/`remove_project` only touch the registry record — the daemon\n * validates the directory exists when it later attaches a session there.\n */\nexport async function applyMachineCommand(\n api: ApiClient,\n identity: MachineIdentity,\n cmd: MachineCommand\n): Promise<string> {\n switch (cmd.kind) {\n case \"add_project\": {\n const path = typeof cmd.args?.path === \"string\" ? cmd.args.path : \"\";\n if (!path) return \"add_project: ignored (no path)\";\n await registerProject(api, identity, path);\n return `added project ${path}`;\n }\n case \"remove_project\": {\n const path = typeof cmd.args?.path === \"string\" ? cmd.args.path : \"\";\n if (!path) return \"remove_project: ignored (no path)\";\n await unregisterProject(api, identity, path);\n return `removed project ${path}`;\n }\n case \"update\":\n // Handled specially by the daemon (it must run the package-manager\n // update and restart); nothing to mutate here.\n return \"update requested\";\n default:\n return `unknown command ${(cmd as MachineCommand).kind}`;\n }\n}\n","/**\n * The approval relay — how a headless daemon asks a human for permission.\n *\n * When the daemon owns execution and a forwarded tool call needs approval,\n * there is no TTY on the VPS to ask at. Instead the daemon parks an\n * `approval_request` record in the thread KV; any watching client (the\n * laptop CLI attached to the same thread) renders its normal approval prompt\n * and writes an `approval_response`; the daemon applies the decision and\n * clears both keys. The turn itself is already durably parked server-side,\n * so a slow human costs nothing.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport type { ApprovalChoice } from \"./bridge.ts\";\n\nexport const APPROVAL_REQUEST_KEY = \"approval_request\";\nexport const APPROVAL_RESPONSE_KEY = \"approval_response\";\n\nexport interface ApprovalRequestKV {\n tool_call_id: string;\n tool: string;\n summary: string;\n permission: string | null;\n risk: number;\n machine: string;\n requested_at: number;\n}\n\nexport interface ApprovalResponseKV {\n tool_call_id: string;\n choice: ApprovalChoice;\n reason?: string;\n decided_at: number;\n}\n\nexport function parseApprovalRequest(value: unknown): ApprovalRequestKV | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const r = value as Record<string, unknown>;\n if (typeof r.tool_call_id !== \"string\" || typeof r.tool !== \"string\") return null;\n return {\n tool_call_id: r.tool_call_id,\n tool: r.tool,\n summary: typeof r.summary === \"string\" ? r.summary : r.tool,\n permission: typeof r.permission === \"string\" ? r.permission : null,\n risk: typeof r.risk === \"number\" ? r.risk : 3,\n machine: typeof r.machine === \"string\" ? r.machine : \"\",\n requested_at: typeof r.requested_at === \"number\" ? r.requested_at : 0,\n };\n}\n\nexport function parseApprovalResponse(value: unknown): ApprovalResponseKV | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const r = value as Record<string, unknown>;\n if (typeof r.tool_call_id !== \"string\" || typeof r.choice !== \"string\") return null;\n if (![\"allow\", \"deny\", \"always\", \"always_risk\"].includes(r.choice)) return null;\n return {\n tool_call_id: r.tool_call_id,\n choice: r.choice as ApprovalChoice,\n reason: typeof r.reason === \"string\" ? r.reason : undefined,\n decided_at: typeof r.decided_at === \"number\" ? r.decided_at : 0,\n };\n}\n\n/** Watcher side: answer a pending approval request. */\nexport async function writeApprovalResponse(\n api: ApiClient,\n threadId: string,\n response: ApprovalResponseKV\n): Promise<void> {\n await api.kvSet(threadId, APPROVAL_RESPONSE_KEY, response);\n}\n\n/**\n * Daemon side: publish a request and wait for a watcher's response, polling\n * the thread KV. Resolves `null` on timeout (the caller denies safely). The\n * keys are cleared before resolving either way.\n */\nexport async function awaitApprovalViaRelay(\n api: ApiClient,\n threadId: string,\n request: ApprovalRequestKV,\n options: { pollMs?: number; timeoutMs?: number } = {}\n): Promise<ApprovalResponseKV | null> {\n const pollMs = options.pollMs ?? 2000;\n const timeoutMs = options.timeoutMs ?? 24 * 60 * 60 * 1000;\n await api.kvSet(threadId, APPROVAL_REQUEST_KEY, request);\n const deadline = Date.now() + timeoutMs;\n try {\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, pollMs));\n const response = parseApprovalResponse(await api.kvGet(threadId, APPROVAL_RESPONSE_KEY));\n if (response && response.tool_call_id === request.tool_call_id) {\n return response;\n }\n }\n return null;\n } finally {\n await api.kvSet(threadId, APPROVAL_REQUEST_KEY, null).catch(() => {});\n await api.kvSet(threadId, APPROVAL_RESPONSE_KEY, null).catch(() => {});\n }\n}\n","/**\n * Shallow, safe directory scanning for the remote file browser.\n *\n * The web/native \"new session\" flow lets you browse a machine's filesystem to\n * pick (or create) a project directory. That browsing runs HERE, in the daemon,\n * triggered by a machine-scoped KV request (see the fs-browse RPC in\n * `registry.ts` + the daemon poll loop). It is deliberately a STRUCTURE browser,\n * never a file reader:\n *\n * - one directory level per request (depth 1) — names + is-dir + a cheap\n * project/repo marker, never file contents;\n * - dotfiles hidden unless asked; results capped so a huge dir can't blow up a\n * KV value;\n * - `~` / empty resolves to the home directory, and the resolved absolute path\n * + parent come back so the browser can render a breadcrumb and navigate up.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface DirEntry {\n name: string;\n /** True for a directory (or a symlink that resolves to one). */\n dir: boolean;\n /** True when the directory looks like a project root (has .git / a manifest). */\n project?: boolean;\n /** True when the directory is a git repository (has a .git entry). */\n repo?: boolean;\n}\n\nexport interface BrowseResult {\n /** The resolved absolute path that was listed. */\n path: string;\n /** The parent directory, or null at the filesystem root. */\n parent: string | null;\n /** The user's home directory — a natural \"home\" button target. */\n home: string;\n entries: DirEntry[];\n /** True when the listing was capped (more entries exist than `entries`). */\n truncated: boolean;\n error?: string;\n}\n\n/** Files whose presence marks a directory as a \"project\" worth highlighting. */\nconst PROJECT_MARKERS = [\n \".git\",\n \"package.json\",\n \"pyproject.toml\",\n \"Cargo.toml\",\n \"go.mod\",\n \"pom.xml\",\n \"build.gradle\",\n \"Gemfile\",\n \"composer.json\",\n \"requirements.txt\",\n \".standardagents\",\n];\n\nconst MAX_ENTRIES = 500;\n\n/** Expand a leading `~`, default an empty path to home, and normalize. */\nexport function resolveBrowsePath(input: string | undefined | null): string {\n const home = os.homedir();\n let p = (input ?? \"\").trim();\n if (!p) return home;\n if (p === \"~\") return home;\n if (p.startsWith(\"~/\")) p = path.join(home, p.slice(2));\n return path.resolve(p);\n}\n\n/** Cheap project/repo detection: a couple of existsSync probes per directory. */\nfunction markers(dirPath: string): { project: boolean; repo: boolean } {\n let repo = false;\n let project = false;\n for (const marker of PROJECT_MARKERS) {\n let hit = false;\n try {\n hit = fs.existsSync(path.join(dirPath, marker));\n } catch {\n hit = false;\n }\n if (!hit) continue;\n project = true;\n if (marker === \".git\") repo = true;\n if (repo) break;\n }\n return { project, repo };\n}\n\n/**\n * List a single directory level. Never throws — filesystem errors come back in\n * `error` with an empty listing so the browser can show a friendly message\n * (permission denied, not a directory, gone).\n */\nexport function browseDirectory(\n input: string | undefined | null,\n opts: { showHidden?: boolean } = {}\n): BrowseResult {\n const home = os.homedir();\n const abs = resolveBrowsePath(input);\n const parent = path.dirname(abs);\n const base: Omit<BrowseResult, \"entries\" | \"truncated\" | \"error\"> = {\n path: abs,\n parent: parent === abs ? null : parent,\n home,\n };\n\n let dirents: fs.Dirent[];\n try {\n const stat = fs.statSync(abs);\n if (!stat.isDirectory()) {\n return { ...base, entries: [], truncated: false, error: \"Not a directory\" };\n }\n dirents = fs.readdirSync(abs, { withFileTypes: true });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException)?.code;\n const message =\n code === \"EACCES\" || code === \"EPERM\"\n ? \"Permission denied\"\n : code === \"ENOENT\"\n ? \"Folder not found\"\n : \"Could not read this folder\";\n return { ...base, entries: [], truncated: false, error: message };\n }\n\n const showHidden = !!opts.showHidden;\n const rawDirs: DirEntry[] = [];\n const rawFiles: DirEntry[] = [];\n\n for (const d of dirents) {\n const name = d.name;\n if (!showHidden && name.startsWith(\".\")) continue;\n\n let isDir = d.isDirectory();\n // Resolve symlinks so a linked directory still browses as a directory.\n if (d.isSymbolicLink()) {\n try {\n isDir = fs.statSync(path.join(abs, name)).isDirectory();\n } catch {\n isDir = false;\n }\n }\n\n if (isDir) {\n const { project, repo } = markers(path.join(abs, name));\n rawDirs.push({ name, dir: true, project: project || undefined, repo: repo || undefined });\n } else {\n rawFiles.push({ name, dir: false });\n }\n }\n\n const cmp = (a: DirEntry, b: DirEntry) => a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n rawDirs.sort(cmp);\n rawFiles.sort(cmp);\n\n const all = [...rawDirs, ...rawFiles];\n const truncated = all.length > MAX_ENTRIES;\n return { ...base, entries: truncated ? all.slice(0, MAX_ENTRIES) : all, truncated };\n}\n","/**\n * Update check + auto-update for Standard Code.\n *\n * Periodically queries the npm registry for the latest available version of\n * @standardagents/code, caches the result locally (6h TTL), and — when the\n * CLI is a real installed copy (not a dev checkout) — installs the new\n * version in a DETACHED background process so the next launch simply runs it.\n * The install goes through the SAME package manager that installed the CLI\n * (npm/pnpm/yarn/bun, detected from the running module's path): updating a\n * pnpm-managed global with npm would fork the install into two competing\n * copies.\n *\n * State about the background attempt is persisted so a failed install\n * degrades to the manual hint instead of retrying on every launch. All\n * checks fall silently on network errors or timeouts so the CLI startup is\n * never delayed or noisy.\n *\n * Opt-outs: STANDARD_CODE_NO_AUTO_UPDATE=1 disables the background install\n * (the availability hint still shows); NO_UPDATE_NOTIFIER/CI disable the\n * version check entirely.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst PKG_NAME = \"@standardagents/code\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PKG_NAME)}`;\n\n/** Cache lives under ~/.config/standardagents-cli/update-check.json */\nconst CACHE_REL_DIR = \".config/standardagents-cli\";\nconst CACHE_FILE = \"update-check.json\";\n/** Background auto-update attempt state (same directory). */\nconst STATE_FILE = \"auto-update.json\";\nconst CACHE_TTL_MS = 1000 * 60 * 60 * 6; // 6 hours\n\n/** Network timeout — don't delay startup more than this. */\nconst CHECK_TIMEOUT_MS = 4000;\n\n/** How long an in-flight background install is trusted before it's presumed\n * crashed (never wrote its final state) and eligible to start again. */\nconst IN_FLIGHT_TTL_MS = 15 * 60 * 1000;\n\nexport interface UpdateInfo {\n current: string;\n latest: string;\n}\n\ninterface CacheEntry {\n latest: string;\n timestamp: number;\n}\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/** Persisted record of the most recent background install attempt. */\nexport interface AutoUpdateState {\n version: string; // the version the attempt tried to install\n startedAt: number;\n exitCode: number | null; // null while (presumed) in flight\n finishedAt?: number;\n output?: string; // tail of the package manager's output (for diagnostics)\n}\n\nexport type AutoUpdateDecision =\n | \"start\" // no blocking state — kick off a background install\n | \"in_flight\" // an attempt for this version started recently and hasn't finished\n | \"already_failed\" // this version was attempted and the install failed\n | \"path_shadowed\" // the install \"succeeded\" but this process still runs the old version\n | \"dev_checkout\" // running from source, not an installed copy — never auto-update\n | \"disabled\"; // STANDARD_CODE_NO_AUTO_UPDATE opt-out\n\n// ── cache/state helpers ──────────────────────────────────────────────────────\n\nfunction cacheDir(): string {\n return path.join(homedir(), CACHE_REL_DIR);\n}\n\nfunction cachePath(): string {\n return path.join(cacheDir(), CACHE_FILE);\n}\n\nfunction readCache(): CacheEntry | null {\n try {\n const raw = fs.readFileSync(cachePath(), \"utf-8\");\n return JSON.parse(raw) as CacheEntry;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(latest: string): void {\n try {\n const dir = cacheDir();\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(cachePath(), JSON.stringify({ latest, timestamp: Date.now() }));\n } catch {\n // Fail silently — cache write never crashes the CLI.\n }\n}\n\nexport function readAutoUpdateState(dir = cacheDir()): AutoUpdateState | null {\n try {\n const raw = fs.readFileSync(path.join(dir, STATE_FILE), \"utf-8\");\n const state = JSON.parse(raw) as AutoUpdateState;\n return typeof state?.version === \"string\" ? state : null;\n } catch {\n return null;\n }\n}\n\nexport function writeAutoUpdateState(state: AutoUpdateState, dir = cacheDir()): void {\n try {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, STATE_FILE), JSON.stringify(state));\n } catch {\n // Fail silently.\n }\n}\n\nexport function clearAutoUpdateState(dir = cacheDir()): void {\n try {\n fs.unlinkSync(path.join(dir, STATE_FILE));\n } catch {\n // Already gone — fine.\n }\n}\n\n// ── package manager detection ────────────────────────────────────────────────\n\n/**\n * Which package manager owns the running install, judged by where this module\n * executes from. Global installs land in manager-specific trees (pnpm's\n * content-addressed `.pnpm`/PNPM_HOME, bun's `.bun/install/global`, yarn's\n * `.config/yarn/global` or `.yarn`), while a path outside any\n * `node_modules/@standardagents/code` means a dev checkout (returns null —\n * never auto-update source trees). npm is the fallback for a plain global\n * node_modules.\n */\nexport function detectPackageManager(\n selfPath: string = fileURLToPath(import.meta.url),\n env: Record<string, string | undefined> = process.env\n): PackageManager | null {\n // Normalize by the PATH STRING's separators (either style), not the host's\n // path.sep — a Windows-style path must parse the same everywhere.\n const norm = selfPath.split(/[\\\\/]/).join(\"/\");\n if (!norm.includes(\"node_modules/@standardagents/code\")) return null;\n\n const pnpmHome = (env.PNPM_HOME || \"\").split(/[\\\\/]/).join(\"/\");\n if (pnpmHome && norm.startsWith(pnpmHome)) return \"pnpm\";\n if (norm.includes(\"/.pnpm/\") || /\\/pnpm\\/global\\//.test(norm)) return \"pnpm\";\n if (norm.includes(\"/.bun/\")) return \"bun\";\n if (norm.includes(\"/.config/yarn/\") || norm.includes(\"/.yarn/\")) return \"yarn\";\n return \"npm\";\n}\n\n/** The global-install update invocation for a package manager. */\nexport function updateCommand(pm: PackageManager): { cmd: string; args: string[]; display: string } {\n switch (pm) {\n case \"pnpm\":\n return { cmd: \"pnpm\", args: [\"add\", \"-g\", `${PKG_NAME}@latest`], display: `pnpm add -g ${PKG_NAME}@latest` };\n case \"yarn\":\n return { cmd: \"yarn\", args: [\"global\", \"add\", `${PKG_NAME}@latest`], display: `yarn global add ${PKG_NAME}@latest` };\n case \"bun\":\n return { cmd: \"bun\", args: [\"add\", \"-g\", `${PKG_NAME}@latest`], display: `bun add -g ${PKG_NAME}@latest` };\n default:\n return { cmd: \"npm\", args: [\"i\", \"-g\", `${PKG_NAME}@latest`], display: `npm i -g ${PKG_NAME}@latest` };\n }\n}\n\n// ── auto-update decision + launch ────────────────────────────────────────────\n\n/**\n * Decide what to do about an available update. Pure — all inputs explicit —\n * so the retry/backoff rules are testable: attempt each new version once,\n * treat a recent unfinished attempt as in flight, treat a stale unfinished\n * attempt as crashed (eligible to retry), and never loop on a version that\n * already failed or didn't take effect.\n */\nexport function decideAutoUpdate(\n info: UpdateInfo,\n opts: {\n state: AutoUpdateState | null;\n pm: PackageManager | null;\n env?: Record<string, string | undefined>;\n now?: number;\n }\n): AutoUpdateDecision {\n const env = opts.env ?? process.env;\n if (env.STANDARD_CODE_NO_AUTO_UPDATE) return \"disabled\";\n if (!opts.pm) return \"dev_checkout\";\n\n const state = opts.state;\n if (state && state.version === info.latest) {\n if (state.exitCode === null) {\n const now = opts.now ?? Date.now();\n return now - state.startedAt < IN_FLIGHT_TTL_MS ? \"in_flight\" : \"start\";\n }\n // The attempt finished. exitCode 0 but we're still running the old\n // version means the new install isn't what this launcher resolves to\n // (shadowed PATH, multiple installs) — don't reinstall in a loop.\n return state.exitCode === 0 ? \"path_shadowed\" : \"already_failed\";\n }\n return \"start\";\n}\n\n/**\n * Kick off the background install: record an in-flight state, then spawn a\n * DETACHED node child that runs the package manager and writes the final\n * state (exit code + output tail) when it finishes. The CLI does not wait —\n * the new version simply applies on the next launch.\n */\nexport function startBackgroundUpdate(\n latest: string,\n pm: PackageManager,\n dir = cacheDir()\n): boolean {\n const startedAt = Date.now();\n writeAutoUpdateState({ version: latest, startedAt, exitCode: null }, dir);\n const stateFile = path.join(dir, STATE_FILE);\n const { cmd, args } = updateCommand(pm);\n // The child is plain `node -e` (no shell quoting risk for the state path or\n // version — both JSON-encoded), detached with no stdio so it survives this\n // process exiting and can never write to our terminal.\n const script =\n \"const cp=require('child_process');const fs=require('fs');\" +\n `const r=cp.spawnSync(${JSON.stringify(cmd)},${JSON.stringify(args)},{shell:process.platform==='win32',encoding:'utf8'});` +\n \"const out=((r.stdout||'')+(r.stderr||'')).slice(-2000);\" +\n `fs.writeFileSync(${JSON.stringify(stateFile)},JSON.stringify({version:${JSON.stringify(latest)},startedAt:${startedAt},exitCode:r.status==null?-1:r.status,finishedAt:Date.now(),output:out}));`;\n try {\n const child = spawn(process.execPath, [\"-e\", script], { detached: true, stdio: \"ignore\" });\n child.unref();\n return true;\n } catch {\n // Couldn't even spawn — mark failed so the next launch shows the hint.\n writeAutoUpdateState({ version: latest, startedAt, exitCode: -1, finishedAt: Date.now() }, dir);\n return false;\n }\n}\n\n/**\n * If a background update for OUR current version completed successfully, the\n * update has been applied — consume (clear) the state and return it so the\n * caller can mention it once. Any state for the current version is cleared\n * either way (it's spent).\n */\nexport function consumeAppliedUpdate(currentVersion: string, dir = cacheDir()): AutoUpdateState | null {\n const state = readAutoUpdateState(dir);\n if (!state || state.version !== currentVersion) return null;\n clearAutoUpdateState(dir);\n return state.exitCode === 0 ? state : null;\n}\n\n// ── version check ────────────────────────────────────────────────────────────\n\nasync function fetchLatest(currentVersion: string): Promise<string | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: controller.signal,\n headers: {\n Accept: \"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*\",\n \"User-Agent\": `${PKG_NAME}/${currentVersion}`,\n },\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { \"dist-tags\"?: { latest?: string } };\n return data[\"dist-tags\"]?.latest ?? null;\n } catch {\n // Offline, timeout, DNS failure, etc. — remain silent.\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Check whether a newer version of this package is available on npm.\n *\n * Results are cached for 6 hours to avoid hammering the registry. On failure\n * (offline, timeout, malformed response) returns `null` — the CLI should never\n * be blocked or noisy about a version check.\n *\n * @param currentVersion — the locally installed version (from package.json).\n * @returns `UpdateInfo` if a newer version exists, or `null` if up-to-date or\n * the check could not be completed.\n */\n/**\n * True when `candidate` is a strictly newer RELEASE than `current` (semver\n * major.minor.patch; a stable release outranks a same-base prerelease). We\n * compare by precedence rather than mere inequality so the notice NEVER\n * suggests a downgrade or a pointless reinstall when the running build is\n * already at or ahead of the registry's `latest` — e.g. a freshly published\n * build read against a stale cache.\n */\nexport function isNewerVersion(candidate: string, current: string): boolean {\n const parse = (v: string) => {\n const m = v.trim().replace(/^v/, \"\").match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-(.+))?$/);\n return m ? { nums: [Number(m[1]), Number(m[2]), Number(m[3])], pre: m[4] ?? null } : null;\n };\n const a = parse(candidate);\n const b = parse(current);\n if (!a || !b) return false; // unparseable → never prompt\n for (let i = 0; i < 3; i++) {\n if (a.nums[i] !== b.nums[i]) return a.nums[i] > b.nums[i];\n }\n // Same major.minor.patch: a release is newer than a same-base prerelease.\n return a.pre === null && b.pre !== null;\n}\n\nexport async function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\n if (!currentVersion) return null;\n\n // Honour an explicit opt-out.\n if (process.env.NO_UPDATE_NOTIFIER || process.env.CI) return null;\n\n // Check cache first — skip the network call if we checked recently.\n const cached = readCache();\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return isNewerVersion(cached.latest, currentVersion)\n ? { current: currentVersion, latest: cached.latest }\n : null;\n }\n\n const latest = await fetchLatest(currentVersion);\n if (!latest) return null;\n writeCache(latest);\n return isNewerVersion(latest, currentVersion) ? { current: currentVersion, latest } : null;\n}\n\n/**\n * Force a fresh check, bypassing the local cache.\n * Used by the `/update` slash command so the user always gets a live answer.\n */\nexport async function forceCheckForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\n if (!currentVersion) return null;\n if (process.env.NO_UPDATE_NOTIFIER || process.env.CI) return null;\n\n const latest = await fetchLatest(currentVersion);\n if (!latest) return null;\n writeCache(latest);\n return isNewerVersion(latest, currentVersion) ? { current: currentVersion, latest } : null;\n}\n\n/**\n * Run the package manager's global update in the FOREGROUND (the `/update`\n * command), capturing output rather than inheriting stdio — a child writing\n * to the terminal would desync the TUI's bottom-region redraw.\n */\nexport function runUpdate(pm: PackageManager): Promise<{ ok: boolean; output: string }> {\n return new Promise((resolve) => {\n const { cmd, args } = updateCommand(pm);\n const child = spawn(cmd, args, {\n shell: process.platform === \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let out = \"\";\n child.stdout?.on(\"data\", (d) => (out += d));\n child.stderr?.on(\"data\", (d) => (out += d));\n child.on(\"close\", (code) => resolve({ ok: code === 0, output: out }));\n child.on(\"error\", (err) => resolve({ ok: false, output: String(err) }));\n });\n}\n","/**\n * The Standard Code daemon — a headless execution client for this machine.\n *\n * Installed on a VPS (or any always-on box), it holds bridges to every thread\n * assigned to this machine (threads tagged `runner:<machine_id>`), executes\n * the agent's forwarded tool calls against the thread's project directory,\n * and heartbeats into the account-wide machine registry so other clients can\n * offer \"run this session on <machine>\".\n *\n * Design points:\n * - Execution ownership: the daemon connects with the stable client id\n * `daemon:<machine_id>` and claim `if_unowned`, so a restart/reboot\n * reclaims its threads but it never steals a live interactive takeover.\n * A periodic probe re-cycles non-owner bridges with `if_stale` so a thread\n * whose interactive owner vanished (laptop closed) falls back to the daemon.\n * - Approvals: permission-gated calls it can't auto-accept are relayed to\n * watching clients through the thread KV (see relay.ts); no TTY needed.\n * - Self-update: the standard background auto-update runs on a timer; when a\n * newer version lands, the daemon exits cleanly at the next idle moment and\n * the service supervisor (launchd/systemd) restarts it on the new code.\n * - Self-heal: any crash exits the process; the supervisor restarts it.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { ApiClient } from \"./api.ts\";\nimport { permissionKey, type Bridge } from \"./bridge.ts\";\nimport { ExecutionSession } from \"./execution-session.ts\";\nimport { SystemEvents } from \"./events-stream.ts\";\nimport { decide, type PermissionState } from \"./permissions.ts\";\nimport { saveApprovals } from \"./approvals.ts\";\nimport { getCredential, defaultEndpoint, normalizeEndpoint } from \"./credentials.ts\";\nimport { loadMachineIdentity, daemonClientId, type MachineIdentity } from \"./machine.ts\";\nimport {\n touchDaemon,\n registerProject,\n readMachineCommands,\n clearMachineCommands,\n applyMachineCommand,\n readFsRequest,\n writeFsResponse,\n loadMachine,\n getMachineName,\n machineDisplayName,\n} from \"./registry.ts\";\nimport { awaitApprovalViaRelay } from \"./relay.ts\";\nimport { browseDirectory } from \"./fs-browse.ts\";\nimport { runUpdate } from \"./check-update.ts\";\nimport {\n AGENT_ID_VARIANTS,\n PRODUCTION_ENDPOINT,\n readVersion,\n relaxTlsForLocalEndpoint,\n} from \"./product.ts\";\nimport {\n checkForUpdate,\n consumeAppliedUpdate,\n decideAutoUpdate,\n detectPackageManager,\n readAutoUpdateState,\n startBackgroundUpdate,\n} from \"./check-update.ts\";\n\nconst HEARTBEAT_MS = 30_000;\nconst COMMAND_POLL_MS = 8_000;\n// The remote file browser wants to feel interactive, so its request key is\n// polled far more often than the management command queue.\nconst FS_POLL_MS = 1_000;\nconst RECLAIM_PROBE_MS = 2 * 60_000;\nconst UPDATE_CHECK_MS = 6 * 60 * 60_000;\nconst SWEEP_MS = 10 * 60_000;\nconst MAX_WORKERS = 30;\nconst LOG_MAX_BYTES = 1_000_000;\n\nconst LOG_FILE = path.join(os.homedir(), \".standardagents\", \"daemon.log\");\n\n/** Append a timestamped line to the daemon log, rotating at ~1MB. */\nexport function daemonLog(line: string): void {\n try {\n fs.mkdirSync(path.dirname(LOG_FILE), { recursive: true });\n try {\n if (fs.statSync(LOG_FILE).size > LOG_MAX_BYTES) {\n fs.renameSync(LOG_FILE, `${LOG_FILE}.old`);\n }\n } catch {\n // no log yet\n }\n fs.appendFileSync(LOG_FILE, `${new Date().toISOString()} ${line}\\n`);\n } catch {\n // logging must never take the daemon down\n }\n}\n\n/** The `path:` tag value on a thread (with `~` expanded), or null. */\nfunction pathFromTags(tags: string[]): string | null {\n const tag = tags.find((t) => t.startsWith(\"path:\"));\n if (!tag) return null;\n const raw = tag.slice(\"path:\".length);\n return raw.replace(/^~(?=\\/|$)/, os.homedir());\n}\n\n/**\n * One attached thread. The execution stack itself (registry/MCP/HostTools/\n * permission engine/bridge) is the SHARED ExecutionSession — identical to the\n * interactive CLI's — with the daemon supplying only its I/O adapter: log\n * lines instead of TUI prints, and the thread-KV approval relay instead of a\n * dialog.\n */\nclass ThreadWorker {\n readonly session: ExecutionSession;\n private readonly perm: PermissionState;\n private inFlight = 0;\n isOwner = false;\n /** Set by the daemon so a superseded worker can remove itself. */\n onEvicted?: (threadId: string) => void;\n\n constructor(\n api: ApiClient,\n identity: MachineIdentity,\n machineName: string,\n readonly threadId: string,\n readonly projectDir: string,\n readonly createdAt: number\n ) {\n this.perm = { level: 1, alwaysAllow: new Set(), allowRisk: new Set() };\n\n this.session = new ExecutionSession({\n api,\n threadId,\n projectDir,\n machineName,\n perm: this.perm,\n identity: {\n clientId: daemonClientId(identity),\n clientName: machineName,\n clientKind: \"daemon\",\n claim: \"if_unowned\",\n },\n hooks: {\n onActivity: (line) => daemonLog(`[${threadId.slice(0, 8)}] ${line}`),\n onStatus: (_id, summary) => {\n this.inFlight += summary ? 1 : -1;\n if (this.inFlight < 0) this.inFlight = 0;\n },\n onConnection: (state, attempt) => {\n if (state !== \"reconnecting\" || attempt === 1 || attempt % 10 === 0) {\n daemonLog(`[${threadId.slice(0, 8)}] bridge ${state}${attempt ? ` (attempt ${attempt})` : \"\"}`);\n }\n },\n onOwnership: (isOwner, owner) => {\n this.isOwner = isOwner;\n daemonLog(\n `[${threadId.slice(0, 8)}] ownership: ${isOwner ? \"OWNER\" : \"watcher\"}` +\n (owner ? ` (owner: ${owner.client_name || owner.client_id})` : \"\")\n );\n },\n onSuperseded: () => {\n // Another process presented OUR daemon identity (a duplicate daemon,\n // a manual `daemon run` beside the service). The newer process owns\n // this thread now; this worker stands down and the sweep won't\n // re-attach while the duplicate holds the socket.\n daemonLog(`[${threadId.slice(0, 8)}] superseded by another process with this identity — standing down`);\n this.onEvicted?.(threadId);\n },\n // The daemon's approvals are edited by OTHER clients (the watching\n // CLI's level menu writes the thread KV) — re-sync before every\n // permission decision so a level change applies to the next call.\n refreshPermissions: async () => {\n await this.session.loadApprovals().catch(() => {});\n },\n requestApproval: async (req, summary, effectiveRisk) => {\n const permKey = permissionKey(req);\n const fresh = decide(this.perm, permKey, effectiveRisk, !!req.requestPermission);\n if (fresh === \"allow\") return { choice: \"allow\" };\n if (!req.toolCallId) {\n // Non-durable ask with no human present — refuse safely.\n return { choice: \"deny\", reason: \"No one is available to approve this right now.\" };\n }\n daemonLog(`[${threadId.slice(0, 8)}] relaying approval: ${summary} (risk ${effectiveRisk})`);\n const response = await awaitApprovalViaRelay(api, threadId, {\n tool_call_id: req.toolCallId,\n tool: req.tool,\n summary,\n permission: req.requestPermission,\n risk: effectiveRisk,\n machine: machineName,\n requested_at: Date.now(),\n });\n if (!response) {\n return { choice: \"deny\", reason: \"The approval request timed out with no one to approve it.\" };\n }\n if (response.choice === \"always\") this.perm.alwaysAllow.add(permKey);\n if (response.choice === \"always_risk\") this.perm.allowRisk.add(effectiveRisk);\n if (response.choice === \"always\" || response.choice === \"always_risk\") {\n saveApprovals(api, threadId, this.perm);\n }\n return { choice: response.choice, reason: response.reason };\n },\n },\n });\n\n // Enabled MCP servers connect per-thread, mirroring the interactive CLI.\n void this.session.connectEnabledMcpServers().then((results) => {\n for (const r of results.filter((r) => !r.ok)) {\n daemonLog(`[${threadId.slice(0, 8)}] MCP \"${r.name}\" failed: ${r.error}`);\n }\n });\n }\n\n get bridge(): Bridge {\n return this.session.bridge;\n }\n\n get busy(): boolean {\n return this.inFlight > 0;\n }\n\n async start(): Promise<void> {\n await this.session.loadApprovals().catch(() => {});\n // Ground truth for the agent's [SESSION] context: where its shell lives.\n this.session.writeSessionInfo();\n await this.session.bridge.connect();\n }\n\n stop(): void {\n this.session.stop();\n }\n}\n\nexport interface DaemonOptions {\n endpoint?: string;\n}\n\nexport async function runDaemon(options: DaemonOptions = {}): Promise<void> {\n const endpoint = normalizeEndpoint(options.endpoint || defaultEndpoint() || PRODUCTION_ENDPOINT);\n relaxTlsForLocalEndpoint(endpoint);\n const version = readVersion();\n const identity = loadMachineIdentity();\n const runnerTag = `runner:${identity.machine_id}`;\n\n const cred = getCredential(endpoint);\n if (!cred) {\n process.stderr.write(\n `No saved sign-in for ${endpoint}.\\n` +\n `Run \\`standardcode daemon install\\` (or plain \\`standardcode\\`) once to sign in.\\n`\n );\n process.exit(1);\n }\n const api = new ApiClient(endpoint, cred.access_token);\n const check = await api.verifyDetailed();\n if (!check.ok) {\n daemonLog(`startup: credential check failed: ${check.reason}`);\n process.stderr.write(`Sign-in check failed: ${check.reason}\\n`);\n process.exit(1);\n }\n\n // The display name is account data (the user's `.name` key), overlaid on the\n // registry record. Resolve it now and refresh on each heartbeat so a rename\n // from another client propagates to new workers' session_info / client_name.\n let displayName =\n machineDisplayName((await loadMachine(api, identity.machine_id).catch(() => null)) ?? {\n hostname: os.hostname(),\n id: identity.machine_id,\n });\n\n const applied = consumeAppliedUpdate(version);\n daemonLog(\n `daemon starting — v${version}${applied ? \" (freshly auto-updated)\" : \"\"}, machine ${identity.machine_id} (${displayName}), endpoint ${endpoint}`\n );\n\n // Crashes must exit (loudly) so the service supervisor restarts us clean.\n process.on(\"uncaughtException\", (err) => {\n daemonLog(`FATAL uncaughtException: ${err?.stack || err}`);\n process.exit(1);\n });\n process.on(\"unhandledRejection\", (err) => {\n daemonLog(`unhandledRejection: ${err instanceof Error ? err.stack : String(err)}`);\n });\n\n const workers = new Map<string, ThreadWorker>();\n\n const attach = async (threadId: string, tags: string[], createdAt = 0): Promise<void> => {\n if (workers.has(threadId)) return;\n const projectDir = pathFromTags(tags);\n if (!projectDir) return;\n if (workers.size >= MAX_WORKERS) {\n // Evict the oldest idle worker to make room for the new thread.\n const oldest = [...workers.values()]\n .filter((w) => !w.busy)\n .sort((a, b) => a.createdAt - b.createdAt)[0];\n if (!oldest) return;\n oldest.stop();\n workers.delete(oldest.threadId);\n daemonLog(`detached ${oldest.threadId.slice(0, 8)} (worker cap)`);\n }\n // Make sure the project directory exists so forwarded tools have a home;\n // a remote \"new project\" flow may name a directory that isn't there yet.\n try {\n fs.mkdirSync(projectDir, { recursive: true });\n } catch (e) {\n daemonLog(`cannot prepare project dir ${projectDir}: ${e instanceof Error ? e.message : String(e)}`);\n return;\n }\n const worker = new ThreadWorker(api, identity, displayName, threadId, projectDir, createdAt || Date.now());\n worker.onEvicted = (id) => detach(id);\n workers.set(threadId, worker);\n daemonLog(`attached ${threadId.slice(0, 8)} → ${projectDir}`);\n await worker.start();\n // Keep the machine's project list fresh for the session-location picker.\n void registerProject(api, identity, projectDir).catch(() => {});\n };\n\n const detach = (threadId: string): void => {\n const worker = workers.get(threadId);\n if (!worker) return;\n worker.stop();\n workers.delete(threadId);\n daemonLog(`detached ${threadId.slice(0, 8)}`);\n };\n\n /** Attach every (recent) thread assigned to this machine. */\n const sweep = async (): Promise<void> => {\n try {\n const threads = await api.listThreads(AGENT_ID_VARIANTS, [runnerTag]);\n const recent = threads\n .sort((a, b) => (b.created_at ?? 0) - (a.created_at ?? 0))\n .slice(0, MAX_WORKERS);\n for (const t of recent) {\n await attach(t.id, t.tags, (t.created_at ?? 0) * 1000);\n }\n } catch (e) {\n daemonLog(`sweep failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n };\n\n // Live discovery: a laptop starting a remote session creates the thread with\n // our runner tag; the events channel tells us to attach immediately.\n const events = new SystemEvents(api, {\n onOpen: () => void sweep(),\n onThreadCreated: (t) => {\n if (t.tags?.includes(runnerTag)) void attach(t.id, t.tags ?? [], (t.created_at ?? 0) * 1000);\n },\n onThreadUpdated: (t) => {\n if (t.terminated) detach(t.id);\n else if (t.tags?.includes(runnerTag)) void attach(t.id, t.tags ?? [], (t.created_at ?? 0) * 1000);\n },\n onThreadDeleted: (id) => detach(id),\n });\n events.connect();\n await sweep();\n\n // Registry heartbeat: this is what makes the machine show up as an\n // available \"run it there\" target on other clients.\n await touchDaemon(api, identity, version).catch((e) =>\n daemonLog(`heartbeat failed: ${e instanceof Error ? e.message : String(e)}`)\n );\n const heartbeat = setInterval(() => {\n void touchDaemon(api, identity, version).catch(() => {});\n // Keep the cached display name current so a rename elsewhere reaches new\n // workers (existing workers keep their name — it's cosmetic).\n void getMachineName(api, identity.machine_id)\n .then((n) => {\n if (n) displayName = n;\n })\n .catch(() => {});\n }, HEARTBEAT_MS);\n\n // Ownership reclaim probe: claims are evaluated at bridge connect, so a\n // worker that ISN'T owner periodically re-connects with `if_stale` — if the\n // interactive owner is truly gone (no live socket), the daemon takes back\n // execution; if the owner is alive, nothing changes.\n const reclaim = setInterval(() => {\n for (const worker of workers.values()) {\n if (!worker.isOwner) {\n worker.bridge.setClaim(\"if_stale\");\n worker.bridge.refresh();\n } else {\n worker.bridge.setClaim(\"if_unowned\");\n }\n }\n }, RECLAIM_PROBE_MS);\n\n // Self-update: kick the standard background auto-update; once a newer\n // version has installed, exit cleanly at the next idle moment so the\n // service supervisor restarts us on the new code.\n let updateReady = false;\n const checkUpdates = async (): Promise<void> => {\n try {\n const info = await checkForUpdate(version);\n if (!info) return;\n const pm = detectPackageManager();\n const decision = decideAutoUpdate(info, { state: readAutoUpdateState(), pm });\n if (decision === \"start\" && pm) {\n daemonLog(`auto-update: installing v${info.latest} in the background`);\n startBackgroundUpdate(info.latest, pm);\n }\n const state = readAutoUpdateState();\n if (state && state.version === info.latest && state.exitCode === 0) {\n daemonLog(`auto-update: v${info.latest} installed — restarting when idle`);\n updateReady = true;\n }\n } catch {\n // update checks are best-effort\n }\n };\n void checkUpdates();\n const updateTimer = setInterval(() => void checkUpdates(), UPDATE_CHECK_MS);\n\n // Management command channel: apply rename / add-remove project / forced\n // update commands queued for THIS machine by other clients (the /machines\n // menu). Drained every few seconds so remote management feels responsive.\n let draining = false;\n const drainCommands = async (): Promise<void> => {\n if (draining) return;\n draining = true;\n try {\n const cmds = await readMachineCommands(api, identity.machine_id);\n if (cmds.length === 0) return;\n const applied: string[] = [];\n let forcedUpdate = false;\n for (const cmd of cmds) {\n try {\n if (cmd.kind === \"update\") {\n forcedUpdate = true;\n applied.push(cmd.id);\n continue;\n }\n const result = await applyMachineCommand(api, identity, cmd);\n daemonLog(`command ${cmd.kind}: ${result}`);\n applied.push(cmd.id);\n } catch (e) {\n daemonLog(`command ${cmd.kind} failed: ${e instanceof Error ? e.message : String(e)}`);\n applied.push(cmd.id); // drop it — don't retry-loop on a bad command\n }\n }\n await clearMachineCommands(api, identity.machine_id, applied).catch(() => {});\n\n // A forced update runs the package manager now, then exits so the\n // supervisor restarts us on the new version (mirrors the auto-update\n // idle-restart path, but immediate).\n if (forcedUpdate) {\n const pm = detectPackageManager();\n if (!pm) {\n daemonLog(\"forced update requested but this is not an installed build — ignoring\");\n } else if (![...workers.values()].some((w) => w.busy)) {\n daemonLog(`forced update: running ${pm} install now`);\n const { ok, output } = await runUpdate(pm);\n daemonLog(`forced update ${ok ? \"succeeded\" : \"failed\"}: ${output.trim().split(\"\\n\").slice(-2).join(\" | \")}`);\n if (ok) {\n daemonLog(\"restarting to apply the forced update\");\n shutdown(0);\n }\n } else {\n daemonLog(\"forced update deferred — a session is busy; will retry\");\n // Re-queue by leaving updateReady semantics to the sweeper: set the\n // flag so the idle-restart path also applies a background install.\n void checkUpdates();\n }\n }\n } finally {\n draining = false;\n }\n };\n void drainCommands();\n const commandTimer = setInterval(() => void drainCommands(), COMMAND_POLL_MS);\n\n // Remote file-browser RPC: a browsing client (web/native) parks a `.fsreq`\n // in this machine's user-KV; we scan the requested directory (structure only,\n // never file contents) and publish the result to `.fsres`. Correlated by\n // nonce so we answer each request exactly once.\n let lastFsNonce: string | null = null;\n let fsBusy = false;\n const drainFsRequests = async (): Promise<void> => {\n if (fsBusy) return;\n fsBusy = true;\n try {\n const req = await readFsRequest(api, identity.machine_id).catch(() => null);\n if (!req || req.nonce === lastFsNonce) return;\n lastFsNonce = req.nonce;\n let ok = true;\n let result: unknown;\n let error: string | undefined;\n try {\n result = browseDirectory(req.path, { showHidden: req.show_hidden });\n } catch (err) {\n ok = false;\n error = err instanceof Error ? err.message : \"browse failed\";\n }\n await writeFsResponse(api, identity.machine_id, { nonce: req.nonce, ok, result, error }).catch(() => {});\n } finally {\n fsBusy = false;\n }\n };\n const fsTimer = setInterval(() => void drainFsRequests(), FS_POLL_MS);\n\n // Periodic re-sweep as a safety net for missed events, and the idle-restart\n // gate for a ready update.\n const sweeper = setInterval(() => {\n if (updateReady && ![...workers.values()].some((w) => w.busy)) {\n daemonLog(\"restarting to apply the installed update\");\n shutdown(0);\n return;\n }\n void sweep();\n }, SWEEP_MS);\n\n const shutdown = (code: number): void => {\n clearInterval(heartbeat);\n clearInterval(reclaim);\n clearInterval(updateTimer);\n clearInterval(commandTimer);\n clearInterval(fsTimer);\n clearInterval(sweeper);\n for (const worker of workers.values()) worker.stop();\n events.close();\n daemonLog(`daemon exiting (code ${code})`);\n process.exit(code);\n };\n process.on(\"SIGTERM\", () => shutdown(0));\n process.on(\"SIGINT\", () => shutdown(0));\n\n daemonLog(`daemon ready — watching for threads tagged ${runnerTag}`);\n // Keep the process alive forever; all work is event/timer driven.\n await new Promise(() => {});\n}\n","/**\n * Daemon service management: install/uninstall/status of the OS supervisor\n * that keeps `standardcode daemon run` alive across crashes and reboots.\n *\n * - macOS: a LaunchAgent (~/Library/LaunchAgents/ai.standardcode.daemon.plist)\n * with KeepAlive — launchd restarts the daemon on crash and starts it at\n * login.\n * - Linux: a systemd user unit (~/.config/systemd/user/standardcode-daemon\n * .service) with Restart=always, plus `loginctl enable-linger` so the unit\n * runs without an active login session (the VPS case).\n *\n * The supervisor is also the second half of self-update: the daemon exits\n * cleanly once a newer version has installed, and the supervisor restarts it\n * on the new code.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\n\nconst SERVICE_LABEL = \"ai.standardcode.daemon\";\nconst SYSTEMD_UNIT = \"standardcode-daemon.service\";\n\nexport interface ServiceCommand {\n /** argv to launch `standardcode daemon run` (absolute paths only). */\n argv: string[];\n}\n\n/**\n * Resolve how the supervisor should launch the daemon, based on how THIS\n * process was launched. An installed CLI runs its bundled entry under node; a\n * dev checkout (a .ts entry) runs through the repo's tsx.\n */\nexport function resolveDaemonCommand(extraArgs: string[] = []): ServiceCommand {\n const entry = path.resolve(process.argv[1] ?? \"\");\n if (!entry) throw new Error(\"Cannot determine how this CLI was launched.\");\n const argv: string[] = [process.execPath];\n if (entry.endsWith(\".ts\")) {\n // Dev checkout: find the repo's tsx runner so the service can execute TS.\n let dir = path.dirname(entry);\n let tsx: string | null = null;\n for (let i = 0; i < 6 && dir !== path.dirname(dir); i++) {\n const candidate = path.join(dir, \"node_modules\", \"tsx\", \"dist\", \"cli.mjs\");\n if (fs.existsSync(candidate)) {\n tsx = candidate;\n break;\n }\n dir = path.dirname(dir);\n }\n if (!tsx) {\n throw new Error(\n \"This is a source checkout and tsx wasn't found — run `pnpm install` in the repo, or install the CLI globally and re-run daemon install.\"\n );\n }\n argv.push(tsx);\n }\n argv.push(entry, \"daemon\", \"run\", ...extraArgs);\n return { argv };\n}\n\n/** A PATH for the service environment: supervisors start with a minimal PATH,\n * but forwarded bash/tools need the user's usual toolchain locations. */\nfunction servicePath(): string {\n const parts = [\n path.dirname(process.execPath),\n \"/opt/homebrew/bin\",\n \"/usr/local/bin\",\n \"/usr/bin\",\n \"/bin\",\n \"/usr/sbin\",\n \"/sbin\",\n ];\n const current = (process.env.PATH || \"\").split(\":\").filter(Boolean);\n return [...new Set([...current, ...parts])].join(\":\");\n}\n\nfunction run(cmd: string, args: string[]): { ok: boolean; output: string } {\n const res = spawnSync(cmd, args, { encoding: \"utf8\" });\n const output = `${res.stdout ?? \"\"}${res.stderr ?? \"\"}`.trim();\n return { ok: res.status === 0, output };\n}\n\nconst plistPath = () => path.join(os.homedir(), \"Library\", \"LaunchAgents\", `${SERVICE_LABEL}.plist`);\nconst unitPath = () => path.join(os.homedir(), \".config\", \"systemd\", \"user\", SYSTEMD_UNIT);\nconst xmlEscape = (s: string) => s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\nexport interface InstallResult {\n ok: boolean;\n detail: string;\n manualHint?: string;\n}\n\nexport function installService(command: ServiceCommand, endpoint?: string): InstallResult {\n if (process.platform === \"darwin\") return installLaunchd(command, endpoint);\n if (process.platform === \"linux\") return installSystemd(command, endpoint);\n return {\n ok: false,\n detail: `Unsupported platform for the daemon service: ${process.platform}`,\n manualHint: \"Run `standardcode daemon run` under your own supervisor.\",\n };\n}\n\nfunction installLaunchd(command: ServiceCommand, endpoint?: string): InstallResult {\n const logDir = path.join(os.homedir(), \".standardagents\");\n fs.mkdirSync(logDir, { recursive: true });\n fs.mkdirSync(path.dirname(plistPath()), { recursive: true });\n const envEntries = [\n ` <key>PATH</key><string>${xmlEscape(servicePath())}</string>`,\n ...(endpoint ? [` <key>STANDARD_CODE_DAEMON_ENDPOINT</key><string>${xmlEscape(endpoint)}</string>`] : []),\n ].join(\"\\n\");\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n <dict>\n <key>Label</key><string>${SERVICE_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n${command.argv.map((a) => ` <string>${xmlEscape(a)}</string>`).join(\"\\n\")}\n </array>\n <key>RunAtLoad</key><true/>\n <key>KeepAlive</key><true/>\n <key>ThrottleInterval</key><integer>5</integer>\n <key>StandardOutPath</key><string>${xmlEscape(path.join(logDir, \"daemon.out.log\"))}</string>\n <key>StandardErrorPath</key><string>${xmlEscape(path.join(logDir, \"daemon.err.log\"))}</string>\n <key>EnvironmentVariables</key>\n <dict>\n${envEntries}\n </dict>\n </dict>\n</plist>\n`;\n fs.writeFileSync(plistPath(), plist);\n const uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n run(\"launchctl\", [\"bootout\", `gui/${uid}`, plistPath()]); // clear any old copy\n const boot = run(\"launchctl\", [\"bootstrap\", `gui/${uid}`, plistPath()]);\n if (!boot.ok) {\n // Older macOS fallback.\n const load = run(\"launchctl\", [\"load\", \"-w\", plistPath()]);\n if (!load.ok) {\n return {\n ok: false,\n detail: `launchctl failed: ${boot.output || load.output}`,\n manualHint: `Load it manually: launchctl bootstrap gui/${uid} ${plistPath()}`,\n };\n }\n }\n return { ok: true, detail: `LaunchAgent installed (${plistPath()})` };\n}\n\nfunction installSystemd(command: ServiceCommand, endpoint?: string): InstallResult {\n fs.mkdirSync(path.dirname(unitPath()), { recursive: true });\n const unit = `[Unit]\nDescription=Standard Code daemon (headless coding-agent execution client)\nAfter=network-online.target\n\n[Service]\nExecStart=${command.argv.map((a) => (a.includes(\" \") ? `\"${a}\"` : a)).join(\" \")}\nRestart=always\nRestartSec=5\nEnvironment=PATH=${servicePath()}\n${endpoint ? `Environment=STANDARD_CODE_DAEMON_ENDPOINT=${endpoint}\\n` : \"\"}\n[Install]\nWantedBy=default.target\n`;\n fs.writeFileSync(unitPath(), unit);\n const reload = run(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n if (!reload.ok) {\n return {\n ok: false,\n detail: `systemd user manager unavailable: ${reload.output}`,\n manualHint:\n `Unit written to ${unitPath()}. On a server without a user manager, copy it to /etc/systemd/system/ ` +\n `(sudo), change ExecStart's user if needed, then: sudo systemctl enable --now ${SYSTEMD_UNIT}`,\n };\n }\n const enable = run(\"systemctl\", [\"--user\", \"enable\", \"--now\", SYSTEMD_UNIT]);\n if (!enable.ok) {\n return { ok: false, detail: `systemctl enable failed: ${enable.output}` };\n }\n // Without linger the unit dies when the SSH session ends — the whole point\n // of a VPS daemon is surviving that.\n const linger = run(\"loginctl\", [\"enable-linger\", os.userInfo().username]);\n return {\n ok: true,\n detail:\n `systemd user unit installed (${unitPath()})` +\n (linger.ok ? \", lingering enabled\" : ` — enable lingering manually: sudo loginctl enable-linger ${os.userInfo().username}`),\n };\n}\n\nexport function uninstallService(): InstallResult {\n if (process.platform === \"darwin\") {\n const uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n run(\"launchctl\", [\"bootout\", `gui/${uid}`, plistPath()]);\n try {\n fs.unlinkSync(plistPath());\n } catch {\n // already gone\n }\n return { ok: true, detail: \"LaunchAgent removed\" };\n }\n if (process.platform === \"linux\") {\n run(\"systemctl\", [\"--user\", \"disable\", \"--now\", SYSTEMD_UNIT]);\n try {\n fs.unlinkSync(unitPath());\n } catch {\n // already gone\n }\n run(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n return { ok: true, detail: \"systemd user unit removed\" };\n }\n return { ok: false, detail: `Unsupported platform: ${process.platform}` };\n}\n\nexport function serviceStatus(): { installed: boolean; running: boolean; detail: string } {\n if (process.platform === \"darwin\") {\n const installed = fs.existsSync(plistPath());\n const list = run(\"launchctl\", [\"list\", SERVICE_LABEL]);\n const pidMatch = list.output.match(/\"PID\"\\s*=\\s*(\\d+)/);\n return {\n installed,\n running: list.ok && !!pidMatch,\n detail: installed\n ? list.ok\n ? pidMatch\n ? `running (pid ${pidMatch[1]})`\n : \"loaded, not running\"\n : \"installed, not loaded\"\n : \"not installed\",\n };\n }\n if (process.platform === \"linux\") {\n const installed = fs.existsSync(unitPath());\n const active = run(\"systemctl\", [\"--user\", \"is-active\", SYSTEMD_UNIT]);\n return {\n installed,\n running: active.output.trim() === \"active\",\n detail: installed ? active.output.trim() || \"unknown\" : \"not installed\",\n };\n }\n return { installed: false, running: false, detail: `unsupported platform ${process.platform}` };\n}\n","/**\n * `standardcode daemon <command>` — manage this machine's headless execution\n * daemon. Plain stdout/readline (no TUI): install runs over SSH on fresh VPS\n * boxes, so everything must work on a dumb terminal.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport readline from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { ApiClient } from \"./api.ts\";\nimport { getCredential, saveCredential, defaultEndpoint, normalizeEndpoint } from \"./credentials.ts\";\nimport { deviceLogin } from \"./device-login.ts\";\nimport { loadMachineIdentity } from \"./machine.ts\";\nimport {\n clearDaemon,\n daemonOnline,\n loadMachine,\n machineDisplayName,\n setMachineName,\n registerProject,\n unregisterProject,\n updateOwnMachineRecord,\n} from \"./registry.ts\";\nimport { runDaemon } from \"./daemon.ts\";\nimport {\n installService,\n resolveDaemonCommand,\n serviceStatus,\n uninstallService,\n} from \"./daemon-service.ts\";\nimport { PRODUCTION_ENDPOINT, readVersion, relaxTlsForLocalEndpoint } from \"./product.ts\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n teal: \"\\x1b[38;5;37m\",\n};\n\nfunction usage(): void {\n output.write(\n [\n \"\",\n `${c.bold}standardcode daemon${c.reset} — headless execution client for this machine`,\n \"\",\n `${c.bold}Commands${c.reset}`,\n \" install [--endpoint url] Sign in (if needed), name this machine, and install\",\n \" the always-on service (launchd / systemd).\",\n \" uninstall Stop and remove the service.\",\n \" status Service + registry status for this machine.\",\n \" run [--endpoint url] Run the daemon in the foreground (what the service runs).\",\n \" add-project <path> Register a project directory for remote sessions.\",\n \" remove-project <path> Remove a registered project directory.\",\n \"\",\n ].join(\"\\n\")\n );\n}\n\nfunction parseEndpointFlag(args: string[]): { endpoint?: string; rest: string[] } {\n const rest: string[] = [];\n let endpoint: string | undefined;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--endpoint\" || arg === \"-e\") {\n endpoint = args[++i];\n } else if (arg.startsWith(\"--endpoint=\")) {\n endpoint = arg.slice(\"--endpoint=\".length);\n } else {\n rest.push(arg);\n }\n }\n return { endpoint, rest };\n}\n\nfunction resolveEndpoint(flag?: string): string {\n return normalizeEndpoint(\n flag || process.env.STANDARD_CODE_DAEMON_ENDPOINT || defaultEndpoint() || PRODUCTION_ENDPOINT\n );\n}\n\n/** Ensure a working credential for the endpoint, running device login if needed. */\nasync function ensureSignedIn(endpoint: string): Promise<ApiClient> {\n relaxTlsForLocalEndpoint(endpoint);\n const host = endpoint.replace(/^https?:\\/\\//, \"\");\n const stored = getCredential(endpoint);\n if (stored) {\n const api = new ApiClient(endpoint, stored.access_token);\n const check = await api.verifyDetailed();\n if (check.ok) return api;\n output.write(`${c.yellow}Saved sign-in for ${host} failed:${c.reset} ${check.reason}\\n\\n`);\n }\n output.write(`${c.bold}Sign in to Standard Code${c.reset} ${c.dim}(${host})${c.reset}\\n\\n`);\n const token = await deviceLogin(endpoint);\n const api = new ApiClient(endpoint, token);\n const check = await api.verifyDetailed();\n if (!check.ok) throw new Error(`Sign-in didn't verify: ${check.reason}`);\n saveCredential(\n { endpoint, access_token: token, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: false }\n );\n output.write(`${c.green}✓${c.reset} Signed in to ${c.teal}${host}${c.reset}\\n\\n`);\n return api;\n}\n\nasync function installCommand(endpointFlag?: string): Promise<void> {\n const endpoint = resolveEndpoint(endpointFlag);\n const api = await ensureSignedIn(endpoint);\n\n // Name this machine — a label stored on your ACCOUNT (not on this box), so\n // it's what other clients see in the \"where should this session run?\" picker\n // and can be changed from anywhere via /machines.\n const identity = loadMachineIdentity();\n const existing = await loadMachine(api, identity.machine_id).catch(() => null);\n const suggested = machineDisplayName(existing ?? { hostname: os.hostname(), id: identity.machine_id });\n const rl = readline.createInterface({ input, output });\n const answer = (await rl.question(\n `${c.bold}Machine name${c.reset} ${c.dim}(shown in the session picker)${c.reset} [${suggested}]: `\n )).trim();\n rl.close();\n if (answer) await setMachineName(api, identity.machine_id, answer);\n\n // Register the machine record before starting the service so the account\n // knows this machine exists even if the first heartbeat is slow.\n await updateOwnMachineRecord(api, identity);\n const displayName = answer || suggested;\n\n output.write(`${c.dim}Installing the always-on service…${c.reset}\\n`);\n const extra = endpointFlag ? [\"--endpoint\", endpoint] : [];\n const result = installService(resolveDaemonCommand(extra), endpointFlag ? endpoint : undefined);\n if (!result.ok) {\n output.write(`${c.red}✗${c.reset} ${result.detail}\\n`);\n if (result.manualHint) output.write(`${c.dim}${result.manualHint}${c.reset}\\n`);\n process.exit(1);\n }\n output.write(`${c.green}✓${c.reset} ${result.detail}\\n`);\n\n // Wait for the daemon's first registry heartbeat as proof of life.\n output.write(`${c.dim}Waiting for the daemon's first heartbeat…${c.reset}\\n`);\n const deadline = Date.now() + 30_000;\n let alive = false;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 2000));\n const record = await loadMachine(api, identity.machine_id);\n if (record && daemonOnline(record)) {\n alive = true;\n break;\n }\n }\n if (alive) {\n output.write(\n `${c.green}✓${c.reset} ${c.bold}${displayName}${c.reset} is online.\\n\\n` +\n `Sessions started elsewhere can now run on this machine.\\n` +\n `${c.dim}Projects register automatically when you run standardcode in a directory here,\\n` +\n `or add one now: standardcode daemon add-project <path>${c.reset}\\n`\n );\n } else {\n output.write(\n `${c.yellow}⚠${c.reset} The service installed but no heartbeat arrived yet.\\n` +\n `${c.dim}Check ~/.standardagents/daemon.log and \\`standardcode daemon status\\`.${c.reset}\\n`\n );\n }\n}\n\nasync function statusCommand(): Promise<void> {\n const status = serviceStatus();\n const identity = loadMachineIdentity();\n output.write(`${c.bold}Service:${c.reset} ${status.detail}\\n`);\n const endpoint = resolveEndpoint();\n const cred = getCredential(endpoint);\n if (!cred) {\n output.write(\n `${c.bold}Machine:${c.reset} ${os.hostname()} ${c.dim}(${identity.machine_id})${c.reset}\\n`\n );\n output.write(`${c.bold}Account:${c.reset} ${c.yellow}not signed in to ${endpoint}${c.reset}\\n`);\n return;\n }\n relaxTlsForLocalEndpoint(endpoint);\n const api = new ApiClient(endpoint, cred.access_token);\n const record = await loadMachine(api, identity.machine_id).catch(() => null);\n // The machine's display NAME is account data — sourced from the record.\n output.write(\n `${c.bold}Machine:${c.reset} ${machineDisplayName(record ?? { hostname: os.hostname(), id: identity.machine_id })} ${c.dim}(${identity.machine_id})${c.reset}\\n`\n );\n if (!record) {\n output.write(`${c.bold}Registry:${c.reset} not registered yet\\n`);\n return;\n }\n const online = daemonOnline(record);\n const seen = record.daemon\n ? `${Math.round((Date.now() - record.daemon.last_seen_at) / 1000)}s ago (v${record.daemon.version})`\n : \"never\";\n output.write(`${c.bold}Registry:${c.reset} ${online ? `${c.green}online${c.reset}` : `${c.yellow}offline${c.reset}`} · last heartbeat ${seen}\\n`);\n const projects = Object.keys(record.projects);\n output.write(`${c.bold}Projects:${c.reset} ${projects.length ? \"\" : c.dim + \"none registered\" + c.reset}\\n`);\n for (const p of projects.sort()) output.write(` ${c.dim}${p}${c.reset}\\n`);\n}\n\nasync function projectCommand(action: \"add\" | \"remove\", target?: string): Promise<void> {\n if (!target) {\n output.write(`${c.red}✗${c.reset} Expected a project path.\\n`);\n process.exit(1);\n }\n const dir = path.resolve(target);\n if (action === \"add\" && !fs.existsSync(dir)) {\n output.write(`${c.red}✗${c.reset} ${dir} does not exist on this machine.\\n`);\n process.exit(1);\n }\n const endpoint = resolveEndpoint();\n const api = await ensureSignedIn(endpoint);\n const identity = loadMachineIdentity();\n const record = await loadMachine(api, identity.machine_id).catch(() => null);\n const displayName = machineDisplayName(record ?? { hostname: os.hostname(), id: identity.machine_id });\n if (action === \"add\") {\n await registerProject(api, identity, dir);\n output.write(`${c.green}✓${c.reset} Registered ${dir} for remote sessions on ${displayName}.\\n`);\n } else {\n await unregisterProject(api, identity, dir);\n output.write(`${c.green}✓${c.reset} Removed ${dir} from this machine's projects.\\n`);\n }\n}\n\n/** Entry point for `standardcode daemon …` (called from index.ts). */\nexport async function runDaemonCommand(argv: string[]): Promise<void> {\n const [command, ...restArgs] = argv;\n const { endpoint, rest } = parseEndpointFlag(restArgs);\n switch (command) {\n case \"run\":\n await runDaemon({ endpoint: endpoint || process.env.STANDARD_CODE_DAEMON_ENDPOINT });\n return;\n case \"install\":\n await installCommand(endpoint);\n return;\n case \"uninstall\": {\n const result = uninstallService();\n output.write(`${result.ok ? c.green + \"✓\" : c.red + \"✗\"}${c.reset} ${result.detail}\\n`);\n // Clear the registry heartbeat so other clients stop offering this box.\n const ep = resolveEndpoint(endpoint);\n const cred = getCredential(ep);\n if (cred) {\n relaxTlsForLocalEndpoint(ep);\n await clearDaemon(new ApiClient(ep, cred.access_token), loadMachineIdentity()).catch(() => {});\n }\n return;\n }\n case \"status\":\n await statusCommand();\n return;\n case \"add-project\":\n await projectCommand(\"add\", rest[0]);\n return;\n case \"remove-project\":\n await projectCommand(\"remove\", rest[0]);\n return;\n case \"version\":\n output.write(`standardcode daemon v${readVersion()}\\n`);\n return;\n default:\n usage();\n if (command && command !== \"help\" && command !== \"--help\" && command !== \"-h\") {\n process.exit(1);\n }\n }\n}\n","/**\n * Standard Code CLI entry point.\n *\n * Pre-flight (plain readline): resolve the instance endpoint, OAuth-login if\n * needed, then offer to resume a thread tagged for this project+machine or start\n * a new one. Then hand off to the interactive TUI which streams the agent and\n * forwards its tools to this host.\n */\nimport os from \"node:os\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport readline from \"node:readline/promises\";\nimport { spawn } from \"node:child_process\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { ApiClient, type MessageAttachment, type SessionQuote, type SkillInfo, type SubagentInfo } from \"./api.ts\";\nimport type { Bridge } from \"./bridge.ts\";\nimport type { HostTools } from \"./host-tools.ts\";\nimport { ExecutionSession } from \"./execution-session.ts\";\nimport { MessageStream } from \"./stream.ts\";\nimport { SystemEvents } from \"./events-stream.ts\";\nimport { SubagentActivity } from \"./subagent-streams.ts\";\nimport { Tui, INPUT_BOX_MARGIN, type PastedImage } from \"./tui.ts\";\nimport { loadHistory, appendHistory } from \"./history.ts\";\nimport { renderMarkdown } from \"./markdown.ts\";\nimport { ProcessRegistry } from \"./process-registry.ts\";\nimport type { McpManager } from \"./mcp.ts\";\nimport {\n listMcpServers,\n saveMcpServer,\n removeMcpServer,\n setMcpServerEnabled,\n parseServerSpec,\n type McpServerConfig,\n} from \"./mcp-config.ts\";\nimport {\n getCredential,\n saveCredential,\n deleteCredential,\n defaultEndpoint,\n normalizeEndpoint,\n saveDefaultEndpoint,\n} from \"./credentials.ts\";\nimport { LEVELS, levelLabel, type ExecutionOwnerInfo, type Level, type ThreadSummary } from \"./types.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport { loadApprovals, saveApprovals } from \"./approvals.ts\";\nimport { gradientText, brandCycleColor } from \"./render.ts\";\nimport { deviceLogin, openUrl } from \"./device-login.ts\";\nimport {\n AGENT_ID,\n AGENT_ID_VARIANTS,\n PRODUCTION_ENDPOINT,\n readVersion,\n relaxTlsForLocalEndpoint,\n} from \"./product.ts\";\nimport {\n interactiveClientId,\n loadMachineIdentity,\n machineIdFromDaemonClientId,\n type MachineIdentity,\n} from \"./machine.ts\";\nimport {\n daemonOnline,\n loadMachine,\n loadMachines,\n machineDisplayName,\n setMachineName,\n registerProject,\n enqueueMachineCommand,\n applyMachineCommand,\n type MachineRecord,\n type MachineCommand,\n} from \"./registry.ts\";\nimport {\n APPROVAL_REQUEST_KEY,\n parseApprovalRequest,\n writeApprovalResponse,\n} from \"./relay.ts\";\nimport { runDaemonCommand } from \"./daemon-cli.ts\";\nimport { serviceStatus } from \"./daemon-service.ts\";\nimport {\n checkForUpdate,\n consumeAppliedUpdate,\n decideAutoUpdate,\n detectPackageManager,\n forceCheckForUpdate,\n readAutoUpdateState,\n runUpdate,\n startBackgroundUpdate,\n updateCommand,\n type UpdateInfo,\n} from \"./check-update.ts\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n white: \"\\x1b[97m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n gray: \"\\x1b[90m\",\n magenta: \"\\x1b[35m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n teal: \"\\x1b[38;5;37m\", // brand teal (matches the marketing site's teal accent)\n};\n\n/**\n * The Standard Agents logomark — two interlocking squares crossed by a diagonal\n * lens — rendered in full block characters. Printed at the left of the startup\n * banner with the session details aligned to its right.\n */\nconst LOGO_MARK = [\n \" █████████████\",\n \" ███ ██\",\n \" ██ █\",\n \"████ ████████ ██\",\n \"███ ████████ ███\",\n \"██ ████████ ████\",\n \"█ ██\",\n \"██ ███\",\n \"█████████████\",\n];\n\ninterface CliArgs {\n endpoint?: string;\n promptEndpoint: boolean;\n dir?: string;\n help: boolean;\n}\n\nfunction printUsage(): void {\n output.write(\n [\n \"\",\n `${c.bold}Usage${c.reset}`,\n \" standardcode [options] [dir]\",\n \"\",\n `${c.bold}Options${c.reset}`,\n \" -e, --endpoint [url] Use a different Standard Agents instance for this run\",\n \" (default: https://api.standardcode.ai).\",\n \" If url is omitted, prompt for it.\",\n \" Credentials are remembered for that endpoint, but\",\n \" the saved default endpoint is not changed.\",\n \" -h, --help Show this help.\",\n \"\",\n ].join(\"\\n\")\n );\n}\n\nfunction parseArgs(args: string[]): CliArgs {\n const parsed: CliArgs = { help: false, promptEndpoint: false };\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n parsed.help = true;\n continue;\n }\n if (arg === \"--endpoint\" || arg === \"-e\") {\n const value = args[i + 1];\n if (value && !value.startsWith(\"-\")) {\n parsed.endpoint = value;\n i++;\n } else {\n parsed.promptEndpoint = true;\n }\n continue;\n }\n if (arg.startsWith(\"--endpoint=\")) {\n const value = arg.slice(\"--endpoint=\".length);\n if (value) {\n parsed.endpoint = value;\n } else {\n parsed.promptEndpoint = true;\n }\n continue;\n }\n if (arg === \"--\") {\n // Some package-manager script invocations pass their separator through to\n // the script (for example `pnpm code -- --endpoint ...`). Treat a leading\n // separator before another option as a wrapper artifact.\n if (i === 0 && args[i + 1]?.startsWith(\"-\")) continue;\n const rest = args.slice(i + 1);\n if (rest.length > 1) throw new Error(\"Expected at most one project directory.\");\n if (rest[0]) parsed.dir = rest[0];\n break;\n }\n if (arg.startsWith(\"-\")) throw new Error(`Unknown option: ${arg}`);\n if (parsed.dir) throw new Error(\"Expected at most one project directory.\");\n parsed.dir = arg;\n }\n return parsed;\n}\n\n/**\n * Print a user `!command` and its output as a distinct block in the transcript:\n * a magenta `!` gutter line with the command, then the combined stdout/stderr\n * (dim for success, red for failure). `where` notes where it ran (the session's\n * machine) so it reads clearly in a remote session.\n */\nfunction printCommandBlock(tui: Tui, command: string, output: string, ok: boolean, where?: string): void {\n tui.print(\"\");\n const note = where ? ` ${c.dim}(ran on ${where})${c.reset}` : \"\";\n tui.print(`${c.magenta}!${c.reset} ${c.bold}${command}${c.reset}${note}`);\n const body = (output ?? \"\").replace(/\\s+$/, \"\");\n if (body) {\n for (const line of body.split(\"\\n\")) {\n tui.print(` ${ok ? c.dim : c.red}${line}${c.reset}`);\n }\n } else {\n tui.print(` ${c.dim}(no output)${c.reset}`);\n }\n tui.print(\"\");\n}\n\n/**\n * Print an assistant reply: light Markdown formatting, padded with a blank line\n * above and below so successive messages don't run together. A small grey dot\n * marks the first line in the gutter — scanning the left edge shows where each\n * new response begins — with the body indented to align under it.\n */\nfunction printAssistant(tui: Tui, text: string): void {\n const cols = Math.max(20, (process.stdout.columns || 80) - 3); // cushion for the 2-col gutter\n tui.clearStream(); // wipe the live preview; the committed message renders below\n tui.print(\"\");\n let dotted = false;\n for (const line of renderMarkdown(text, cols)) {\n if (!dotted && line.trim()) {\n tui.print(`${c.gray}•${c.reset} ${line}`);\n dotted = true;\n } else {\n tui.print(` ${line}`);\n }\n }\n tui.print(\"\");\n}\n\n/**\n * A single-line animated loading indicator for the pre-TUI phases (verifying\n * credentials, listing sessions, attaching to the thread). Redraws in place on\n * the current line; `stop()` wipes it so the next output starts clean. Safe\n * only while nothing else writes to stdout. Indented to match the boxed HUD's\n * outer margin so the pre-flight stack lines up with the input box.\n */\nfunction startLoader(label: string): { stop: () => void } {\n const frames = [\"⣷\", \"⣯\", \"⣟\", \"⡿\", \"⢿\", \"⣻\", \"⣽\", \"⣾\"];\n const pad = \" \".repeat(INPUT_BOX_MARGIN);\n output.write(\"\\x1b[?25l\"); // hide the cursor while the glyph animates\n const draw = () => {\n const now = Date.now();\n const f = frames[Math.floor(now / 70) % frames.length];\n output.write(`\\r\\x1b[K${pad}${brandCycleColor(now)}${f}${c.reset} ${c.dim}${label}…${c.reset}`);\n };\n draw();\n const timer = setInterval(draw, 70);\n\n return {\n stop: () => {\n clearInterval(timer);\n output.write(\"\\r\\x1b[K\\x1b[?25h\");\n },\n };\n}\n\n/** A calm, branded goodbye printed on a graceful shutdown. */\nfunction farewell(stoppedProcs = 0): void {\n output.write(\"\\x1b[?25h\"); // re-show the cursor in case a loader had it hidden\n if (stoppedProcs > 0) {\n output.write(\n `\\n${c.cyan}⚙${c.reset} Stopped ${stoppedProcs} background process${stoppedProcs === 1 ? \"\" : \"es\"}.\\n`\n );\n }\n output.write(`\\n${c.teal}◇${c.reset} ${c.dim}Standard Code — see you soon.${c.reset}\\n`);\n}\n\n/**\n * Print the startup welcome: the logomark, then the product name, version, the\n * connected instance, and the working directory stacked beneath it — a calm,\n * branded header before the session begins.\n */\nfunction printWelcome(endpoint: string, projectDir: string): void {\n const home = os.homedir();\n const dir = projectDir.startsWith(home) ? \"~\" + projectDir.slice(home.length) : projectDir;\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\");\n const version = readVersion();\n const pad = \" \";\n // Session details, placed to the right of the mark and vertically centered.\n // The hosted instance is the product's home — naming its host on the splash\n // is just noise, so the endpoint line only appears for non-default instances.\n const meta = [\n `${c.bold}${gradientText(\"Standard Code\")}${c.reset}${version ? ` ${c.dim}v${version}${c.reset}` : \"\"}`,\n `${c.dim}terminal coding agent${c.reset}`,\n ...(endpoint === PRODUCTION_ENDPOINT ? [] : [`${c.teal}${host}${c.reset}`]),\n `${c.dim}${dir}${c.reset}`,\n ];\n const markWidth = Math.max(...LOGO_MARK.map((l) => [...l].length));\n const metaTop = Math.floor((LOGO_MARK.length - meta.length) / 2);\n output.write(\"\\n\");\n for (let i = 0; i < LOGO_MARK.length; i++) {\n const glyph = LOGO_MARK[i].padEnd(markWidth); // logo stays white-on-black\n const line = meta[i - metaTop];\n output.write(`${pad}${glyph}${line ? ` ${line}` : \"\"}\\n`);\n }\n output.write(\"\\n\");\n}\n\n/**\n * Colour a tool-activity line for readable contrast: a bright status glyph\n * (green ✓, red ✗, yellow ⛔) with the action text at full contrast and only the\n * trailing parenthetical detail dimmed. Replaces the old wrap-everything-in-gray.\n */\nfunction colorActivity(line: string): string {\n const m = line.match(/^(\\s*)([✓✗⛔])\\s?([\\s\\S]*)$/);\n if (!m) return `${c.dim}${line}${c.reset}`;\n const [, indent, glyph, rest] = m;\n if (glyph === \"✓\") {\n const body = rest.replace(/\\s(\\([^()]*\\))\\s*$/, ` ${c.dim}$1${c.reset}`);\n return `${indent}${c.green}✓${c.reset} ${body}`;\n }\n if (glyph === \"✗\") {\n // Error output (e.g. a failed command's stderr) rides along in `rest` and can\n // run dozens of lines. Show it in red and cap it at a handful of lines so the\n // transcript stays scannable — the model still receives the full untruncated\n // result over the bridge, this only trims what the human sees.\n const ERR_MAX_LINES = 7;\n const lines = rest.split(\"\\n\");\n const shown = lines.slice(0, ERR_MAX_LINES);\n const hidden = lines.length - shown.length;\n const body = shown\n .map((l, i) =>\n i === 0\n ? `${indent}${c.red}✗ ${l}${c.reset}`\n : `${indent}${c.red}${c.dim}${l}${c.reset}`\n )\n .join(\"\\n\");\n if (hidden > 0) {\n return `${body}\\n${indent}${c.dim}… +${hidden} more line${hidden === 1 ? \"\" : \"s\"}${c.reset}`;\n }\n return body;\n }\n return `${indent}${c.yellow}⛔ ${rest}${c.reset}`;\n}\n\n/** Where a session's forwarded tools execute. */\ninterface SessionLocation {\n mode: \"local\" | \"remote\";\n /** This machine's identity (always present). */\n identity: MachineIdentity;\n /** Remote mode: the machine record whose daemon runs the tools. */\n runner?: MachineRecord;\n /** Remote mode: the project directory on the runner. */\n remotePath?: string;\n /** Show the one-line daemon-install tip (no daemon anywhere on the account). */\n suggestDaemonInstall?: boolean;\n}\n\nasync function main(): Promise<void> {\n // `standardcode daemon …` is its own command surface (install/run/status),\n // dispatched before normal arg parsing — its subcommands would otherwise\n // read as project directories.\n if (process.argv[2] === \"daemon\") {\n await runDaemonCommand(process.argv.slice(3));\n return;\n }\n\n let cliArgs: CliArgs;\n try {\n cliArgs = parseArgs(process.argv.slice(2));\n } catch (error) {\n output.write(`${c.red}error:${c.reset} ${error instanceof Error ? error.message : String(error)}\\n`);\n printUsage();\n process.exit(1);\n }\n if (cliArgs.help) {\n printUsage();\n return;\n }\n const endpointArg = cliArgs.endpoint;\n const endpointOverride = cliArgs.promptEndpoint || (typeof endpointArg === \"string\" && endpointArg.trim() !== \"\");\n const dirArg = cliArgs.dir;\n\n const projectDir = path.resolve(dirArg || process.cwd());\n const machine = os.hostname();\n\n // Create the line reader lazily so it never eagerly consumes stdin (which\n // would swallow a message the user pre-types before the interactive prompt).\n // A `SIGINT` listener implements double-press-to-quit during these pre-flight\n // prompts — without it, ctrl-c rejects `question()` with an AbortError and\n // crashes the process with a stack trace.\n const reader: { rl: readline.Interface | null } = { rl: null };\n let handoffClosing = false; // set when we intentionally close the reader for the TUI handoff\n let preflightArmed = false;\n let preflightTimer: ReturnType<typeof setTimeout> | null = null;\n const onPreflightSigint = () => {\n if (preflightArmed) {\n if (preflightTimer) clearTimeout(preflightTimer);\n reader.rl?.close();\n farewell();\n process.exit(0);\n }\n preflightArmed = true;\n output.write(`\\n${c.dim}Press Control-C again to exit${c.reset}\\n`);\n preflightTimer = setTimeout(() => {\n preflightArmed = false;\n preflightTimer = null;\n }, 2000);\n };\n const ask = async (question: string): Promise<string> => {\n if (!reader.rl) {\n reader.rl = readline.createInterface({ input, output });\n reader.rl.on(\"SIGINT\", onPreflightSigint);\n // EOF (ctrl-d / closed stdin) ends the reader — exit gracefully instead of\n // looping into an ERR_USE_AFTER_CLOSE on the next prompt.\n reader.rl.on(\"close\", () => {\n if (handoffClosing) return; // our own handoff close, not the user leaving\n farewell();\n process.exit(0);\n });\n }\n return reader.rl.question(question);\n };\n const askEndpoint = async (): Promise<string> => {\n for (;;) {\n const answer = (await ask(\n `${c.cyan}Standard Agents instance URL${c.reset} (e.g. http://localhost:5178): `\n )).trim();\n if (answer) return answer;\n output.write(`${c.dim}An endpoint URL is required.${c.reset}\\n`);\n }\n };\n // Cover the cooked-mode gaps too (e.g. while resolving threads before the TUI\n // grabs the keyboard) so a stray ctrl-c there also takes two presses and exits\n // gracefully rather than killing the process. Once the TUI enables raw mode,\n // ctrl-c arrives as a keypress and this never fires.\n process.on(\"SIGINT\", onPreflightSigint);\n\n // 1. Resolve endpoint. Normal users never choose one: the hosted Standard\n // Code instance is the default, and the very first thing they ever see is\n // the splash — not a URL prompt. `--endpoint <url>` overrides for a run;\n // bare `--endpoint` explicitly asks; a previously saved default (set by\n // an explicit endpoint flow) is respected for power users.\n let endpointPrompted = false;\n let endpoint = endpointArg || (cliArgs.promptEndpoint ? \"\" : defaultEndpoint() || PRODUCTION_ENDPOINT);\n if (!endpoint) {\n endpoint = await askEndpoint();\n endpointPrompted = true;\n }\n endpoint = normalizeEndpoint(endpoint);\n\n // Local dev instances (OrbStack, etc.) use a CA Node won't trust by default —\n // relax TLS for loopback/.local/private hosts so the CLI can actually connect.\n const tlsRelaxed = relaxTlsForLocalEndpoint(endpoint);\n\n // Welcome banner — printed once the destination instance is known, before any\n // auth prompt, so the session opens with a calm, branded header.\n printWelcome(endpoint, projectDir);\n if (tlsRelaxed) {\n output.write(`${c.dim} TLS verification relaxed for local endpoint.${c.reset}\\n\\n`);\n }\n\n // 3. Check for available updates (fast, cached — silently skipped if\n // offline). When the CLI is an installed copy, a newer version installs\n // itself in a detached background process — via the SAME package manager\n // that owns the install — and applies on the next launch. A dev checkout,\n // an opted-out env, or a previously failed attempt just shows the hint.\n const version = readVersion();\n let updateAvailable: UpdateInfo | null = null;\n {\n const loading = startLoader(\"Checking for updates\");\n updateAvailable = await checkForUpdate(version);\n loading.stop();\n const applied = consumeAppliedUpdate(version);\n if (applied) {\n output.write(` ${c.green}✓${c.reset} ${c.dim}Standard Code updated to v${version}.${c.reset}\\n\\n`);\n }\n if (updateAvailable) {\n const pm = detectPackageManager();\n const decision = decideAutoUpdate(updateAvailable, { state: readAutoUpdateState(), pm });\n if (decision === \"start\" && pm && startBackgroundUpdate(updateAvailable.latest, pm)) {\n output.write(\n ` ${c.teal}⟳${c.reset} ${c.dim}Standard Code ${c.reset}${c.bold}v${updateAvailable.latest}${c.reset}${c.dim} is installing in the background — it applies on your next launch.${c.reset}\\n\\n`\n );\n } else if (decision === \"in_flight\") {\n output.write(\n ` ${c.teal}⟳${c.reset} ${c.dim}Standard Code v${updateAvailable.latest} is still installing in the background.${c.reset}\\n\\n`\n );\n } else {\n const display = updateCommand(pm ?? \"npm\").display;\n output.write(\n ` ${c.teal}◇${c.reset} ${c.dim}Update available:${c.reset} ${c.dim}v${updateAvailable.current}${c.reset} → ${c.bold}v${updateAvailable.latest}${c.reset}\\n` +\n ` ${c.dim}Run ${c.reset}${c.bold}${display}${c.reset}${c.dim} to update${c.reset}\\n\\n`\n );\n }\n }\n }\n\n // 2. Resolve credentials. Use a stored API token if it still works, otherwise\n // ask for one (create it in your Standard Agents instance settings).\n const stored = getCredential(endpoint);\n let api = stored ? new ApiClient(endpoint, stored.access_token) : null;\n let storedCheck: Awaited<ReturnType<ApiClient[\"verifyDetailed\"]>> | null = null;\n if (api) {\n const connecting = startLoader(\"Connecting to Standard Agents\");\n storedCheck = await api.verifyDetailed();\n connecting.stop();\n }\n if (!api || !storedCheck?.ok) {\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\");\n // Say WHY the saved credentials didn't carry over — a stopped server or a\n // dead network is a very different situation from a revoked key, and the\n // user shouldn't be pasting fresh tokens at a connection problem.\n if (storedCheck && !storedCheck.ok) {\n output.write(`${c.red}✗${c.reset} ${c.dim}Saved sign-in for this endpoint failed:${c.reset} ${storedCheck.reason}\\n`);\n if (storedCheck.hint) output.write(` ${c.dim}${storedCheck.hint}${c.reset}\\n`);\n output.write(\"\\n\");\n }\n const explainFailure = (result: { reason: string; hint?: string }, prefix: string) => {\n output.write(`${c.red}✗${c.reset} ${prefix}${result.reason}\\n`);\n if (result.hint) output.write(` ${c.dim}${result.hint}${c.reset}\\n`);\n };\n output.write(`${c.bold}${gradientText(\"Sign in to Standard Code\")}${c.reset}\\n`);\n // The hosted instance is the default home; only surface the raw host when\n // the session points somewhere non-standard, so first-run stays clean.\n if (`https://${host}` !== PRODUCTION_ENDPOINT) {\n output.write(`${c.dim}Connecting to${c.reset} ${c.teal}${host}${c.reset}\\n`);\n }\n output.write(\n `${c.dim}You'll only need to do this once on this machine.${c.reset}\\n\\n`\n );\n output.write(\n `${c.white}Press ${c.bold}Enter${c.reset}${c.white} to open your browser and sign in.${c.reset} ${c.dim}(or paste an API token)${c.reset}\\n\\n`\n );\n for (;;) {\n const token = (await ask(`${c.teal}❯${c.reset} `)).trim();\n if (!token) {\n // Device-code browser login: the instance parks a one-time code, the\n // browser approval (on hosted instances, routed through the Standard\n // Agents platform login) mints a personal API key, and we poll it up.\n const got = await deviceLogin(endpoint).catch((e) => {\n output.write(`${c.red}✗${c.reset} ${c.dim}${e instanceof Error ? e.message : String(e)}${c.reset}\\n`);\n return null;\n });\n if (!got) continue;\n api = new ApiClient(endpoint, got);\n const connecting = startLoader(\"Connecting to Standard Agents\");\n const check = await api.verifyDetailed();\n connecting.stop();\n if (check.ok) {\n saveCredential(\n { endpoint, access_token: got, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: !endpointOverride }\n );\n output.write(`${c.green}✓${c.reset} Connected to ${c.teal}${host}${c.reset}\\n`);\n break;\n }\n explainFailure(check, \"Browser sign-in didn't verify: \");\n continue;\n }\n api = new ApiClient(endpoint, token);\n const connecting = startLoader(\"Connecting to Standard Agents\");\n const check = await api.verifyDetailed();\n connecting.stop();\n if (check.ok) {\n saveCredential(\n { endpoint, access_token: token, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: !endpointOverride }\n );\n output.write(`${c.green}✓${c.reset} Connected to ${c.teal}${host}${c.reset}\\n`);\n break;\n }\n explainFailure(check, \"\");\n }\n } else if (endpointPrompted) {\n saveDefaultEndpoint(endpoint);\n }\n\n if (!api) process.exit(1);\n handoffClosing = true;\n reader.rl?.close();\n\n // 3. Decide WHERE this session runs, then offer to resume or start new.\n // This machine's identity + project go into the account-wide machine\n // registry (best effort — older instances lack the user-KV API), and any\n // machine with a live daemon becomes a \"run it there\" target.\n const identity = loadMachineIdentity();\n void registerProject(api, identity, projectDir).catch(() => {});\n\n const tui = new Tui(1); // auto-accept level 1 by default (asks on anything riskier than a read)\n\n const home = os.homedir();\n const tildeDir = projectDir.startsWith(home) ? \"~\" + projectDir.slice(home.length) : projectDir;\n const shortDir = tildeDir.length > 38 ? \"…\" + tildeDir.slice(-37) : tildeDir;\n\n const session: SessionLocation = { mode: \"local\", identity };\n {\n const loadingMachines = startLoader(\"Checking your machines\");\n const machines = await loadMachines(api).catch(() => [] as MachineRecord[]);\n loadingMachines.stop();\n session.suggestDaemonInstall = machines.every((m) => !m.daemon);\n const remoteTargets = machines.filter((m) => m.id !== identity.machine_id && daemonOnline(m));\n if (remoteTargets.length > 0) {\n const where = await tui.select<MachineRecord | null>(\n `${c.bold}${gradientText(\"Where should this session run?\")}${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n [\n { label: `This machine — ${shortDir}`, hint: \"tools run locally\", value: null },\n ...remoteTargets.map((m) => ({\n label: m.name,\n hint: `${m.hostname} · daemon online${m.daemon ? ` · v${m.daemon.version}` : \"\"}`,\n value: m,\n })),\n ]\n );\n if (where) {\n const remotePath = await pickRemoteProject(tui, where);\n if (remotePath) {\n session.mode = \"remote\";\n session.runner = where;\n session.remotePath = remotePath;\n }\n }\n }\n }\n\n // Tags: `path:` + `machine:` name the project+host a session belongs to\n // (they always have), and `runner:` names the MACHINE ID whose client\n // executes the tools — it's what a daemon watches for. Resume matching for\n // local sessions stays on path+machine so pre-runner threads still appear.\n let tags: string[];\n let resumeTags: string[];\n if (session.mode === \"remote\" && session.runner && session.remotePath) {\n tags = [\n `path:${session.remotePath}`,\n `machine:${session.runner.hostname || session.runner.name}`,\n `runner:${session.runner.id}`,\n ];\n resumeTags = [`path:${session.remotePath}`, `runner:${session.runner.id}`];\n } else {\n tags = [`path:${projectDir}`, `machine:${machine}`, `runner:${identity.machine_id}`];\n resumeTags = [`path:${projectDir}`, `machine:${machine}`];\n }\n\n const loadingSessions = startLoader(\"Loading sessions\");\n let existing: ThreadSummary[] = [];\n try {\n existing = await api.listThreads(AGENT_ID_VARIANTS, resumeTags);\n } catch {\n existing = [];\n }\n const summaries = existing.length > 0 ? await summarizeThreads(api, existing.slice(0, 8)) : [];\n loadingSessions.stop();\n\n // A brand-new remote thread needs its session context seeded from here —\n // the daemon re-asserts it on attach, but the agent's first step shouldn't\n // wait for that.\n const createSessionThread = async (): Promise<string> => {\n const id = await api!.createThread(AGENT_ID, tags);\n if (session.mode === \"remote\" && session.runner && session.remotePath) {\n await api!\n .kvSet(id, \"session_info\", { cwd: session.remotePath, machine: session.runner.name })\n .catch(() => {});\n }\n return id;\n };\n\n let threadId: string;\n let resumed = false;\n // For a brand-new session, ↑/↓ recall seeds from the project's newest prior\n // thread (history lives in the thread KV, not on the local filesystem).\n let historySeed: string | undefined;\n if (existing.length > 0) {\n const items: { label: string; hint?: string; value: string | null }[] = summaries.map((s) => ({\n label: s.label,\n hint: s.hint,\n value: s.id,\n }));\n items.push({ label: \"+ Start a new session\", value: null });\n const whereLabel =\n session.mode === \"remote\" && session.runner\n ? `${session.runner.name}:${shortenPath(session.remotePath ?? \"\")}`\n : shortDir;\n const picked = await tui.select(\n `${c.bold}${gradientText(\"Resume a session\")}${c.reset} ${c.gray}${whereLabel}${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n items\n );\n if (typeof picked === \"string\") {\n threadId = picked;\n resumed = true;\n } else {\n threadId = await createSessionThread();\n historySeed = existing[0]?.id;\n }\n } else {\n threadId = await createSessionThread();\n }\n\n // `/clear` resolves the session with a request for a fresh thread; loop so\n // the new session reuses the same TUI, credentials, and project tags. The\n // old thread seeds ↑/↓ recall so input history survives the clear.\n for (;;) {\n await runInteractive(tui, api, threadId, projectDir, machine, resumed, session, historySeed);\n historySeed = threadId;\n threadId = await createSessionThread();\n // Tell the fresh thread which thread it replaced so the instance releases\n // that thread's simultaneous-thread slot on the new thread's first step\n // (rather than the slot lingering for its ~90s lease TTL after `/clear`).\n await api.kvSet(threadId, \"lease_supersedes\", historySeed);\n resumed = false;\n }\n}\n\n/** Shorten an absolute path for menu labels (keep the tail). */\nfunction shortenPath(p: string, max = 38): string {\n return p.length > max ? \"…\" + p.slice(-(max - 1)) : p;\n}\n\n/**\n * Pick which project on a remote machine the session works in: the machine's\n * registered projects (most recently used first), or a typed-in path. Returns\n * null when the user backs out (the session falls back to local).\n */\nasync function pickRemoteProject(tui: Tui, runner: MachineRecord): Promise<string | null> {\n const ENTER_PATH = \"__enter_path__\";\n const projects = Object.entries(runner.projects).sort(\n (a, b) => (b[1]?.last_used_at ?? 0) - (a[1]?.last_used_at ?? 0)\n );\n const items: { label: string; hint?: string; value: string }[] = projects.map(([dir, p]) => ({\n label: shortenPath(dir, 48),\n hint: p?.last_used_at ? relativeTime(p.last_used_at / 1000) : \"\",\n value: dir,\n }));\n items.push({ label: `+ Another path on ${runner.name}…`, hint: \"type a directory\", value: ENTER_PATH });\n const picked = await tui.select(\n `${c.bold}${gradientText(`Project on ${runner.name}`)}${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n items\n );\n if (!picked) return null;\n if (picked !== ENTER_PATH) return picked;\n const typed = await tui.prompt(\n `Directory on ${runner.name} (absolute, created if missing)`,\n \"~/projects/my-app\"\n );\n if (!typed) return null;\n const trimmed = typed.trim();\n if (!trimmed.startsWith(\"/\") && !trimmed.startsWith(\"~\")) {\n tui.print(`${c.yellow}Use an absolute path (starting with / or ~).${c.reset}`);\n return null;\n }\n return trimmed;\n}\n\n/**\n * A message is \"silent\" when it's a system-injected user turn (subagent result\n * hand-backs, malformed-tool-call replays, queued housekeeping) rather than\n * something the human actually typed — so it must never name a session.\n */\nfunction isSilentMessage(m: any): boolean {\n return m?.silent === true || m?.metadata?.silent === true;\n}\n\n/**\n * Build a one-line preview + timestamp for each thread, naming the session by\n * the LAST thing the human actually said. We read content via `messageText`\n * (user messages can be content-block arrays, not just strings — the old\n * string-only check made every such session render \"(empty session)\"), skip\n * silent/system-injected turns, and take the most recent one.\n */\nasync function summarizeThreads(\n api: ApiClient,\n threads: ThreadSummary[]\n): Promise<{ id: string; label: string; hint: string }[]> {\n return Promise.all(\n threads.map(async (t) => {\n let preview = \"\";\n try {\n // Newest-first so the most recent human message is in-window even for\n // long sessions; we also sort ourselves in case the server ignores it.\n const msgs = await api.getMessages(t.id, 50, \"desc\");\n const latest = msgs\n .filter((m: any) => m.role === \"user\" && m.status !== \"pending\" && !isSilentMessage(m))\n .map((m: any) => ({ at: m.created_at ?? 0, text: messageText(m.content).replace(/\\s+/g, \" \").trim() }))\n .filter((m) => m.text.length > 0)\n .sort((a, b) => b.at - a.at)[0];\n if (latest) preview = latest.text;\n } catch {\n // ignore; show a placeholder\n }\n const label = preview\n ? preview.length > 64\n ? preview.slice(0, 63) + \"…\"\n : preview\n : \"(empty session)\";\n const when = t.created_at ? relativeTime(t.created_at) : \"\";\n const hint = [t.id.slice(0, 8), when].filter(Boolean).join(\" · \");\n return { id: t.id, label, hint };\n })\n );\n}\n\n/**\n * A human-readable label for a subagent: prefer its registry title (e.g.\n * \"Research Assistant\"), else the agent's display title, else a title-cased\n * agent name. A per-instance thread name refines it (\"Research Assistant ·\n * auth-flow\") when present.\n */\nfunction subagentLabel(s: SubagentInfo, titles: Map<string, string>): string {\n const agentName = (s.agent_name || \"\").trim();\n const title =\n (s.title || \"\").trim() ||\n titles.get(agentName) ||\n (agentName ? agentName.replace(/[_-]+/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()) : \"Subagent\");\n const tagged = (s.threadName || \"\").trim();\n return tagged ? `${title} · ${tagged}` : title;\n}\n\n/** Compact relative time from a unix-seconds timestamp. */\nfunction relativeTime(unixSeconds: number): string {\n const diff = Date.now() / 1000 - unixSeconds;\n if (diff < 60) return \"just now\";\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`;\n return `${Math.floor(diff / 86400)}d ago`;\n}\n\n/**\n * Whether a message carries tool calls. The API serializes `tool_calls` as a\n * JSON STRING (not an array), so `Array.isArray` is never true — checking only\n * that would treat a tool-call assistant message (which can also have narration\n * content) as a final answer, completing the turn while a tool/approval is still\n * pending. Handle both shapes.\n */\nfunction hasToolCalls(m: any): boolean {\n const tc = m?.tool_calls;\n if (Array.isArray(tc)) return tc.length > 0;\n if (typeof tc === \"string\") {\n const s = tc.trim();\n return s.length > 0 && s !== \"null\" && s !== \"[]\";\n }\n return false;\n}\n\n/** Extract plain text from a message's content (string or content-block array). */\nfunction messageText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((b: any) => (typeof b === \"string\" ? b : typeof b?.text === \"string\" ? b.text : \"\"))\n .join(\"\");\n }\n return \"\";\n}\n\n/** Whether the thread is currently working (a turn active or queued work pending). */\nfunction threadBusy(msgs: any[]): boolean {\n if (!msgs.length) return false;\n if (msgs.some((m) => m.status === \"pending\")) return true;\n const last = [...msgs].sort((a, b) => (b.created_at ?? 0) - (a.created_at ?? 0))[0];\n if (!last) return false;\n if (last.role === \"user\" || last.role === \"tool\") return true; // turn about to run / mid-turn\n if (last.role === \"assistant\") return hasToolCalls(last); // tool-call message = still going\n return false; // a final assistant text, or a system/stop message → idle\n}\n\n/** Replay a resumed thread's conversation so it feels like picking up mid-session. */\nasync function printHistory(api: ApiClient, threadId: string, tui: Tui): Promise<void> {\n let msgs: any[];\n try {\n msgs = await api.getMessages(threadId, 200);\n } catch {\n return;\n }\n const convo = msgs\n .filter(\n (m) =>\n m.metadata?.user_command ||\n m.role === \"user\" ||\n (m.role === \"assistant\" && messageText(m.content).trim())\n )\n .sort((a, b) => (a.created_at ?? 0) - (b.created_at ?? 0));\n if (!convo.length) return;\n const shown = convo.slice(-24);\n tui.print(`${c.dim}── resuming session · ${convo.length} message${convo.length === 1 ? \"\" : \"s\"} ──${c.reset}`);\n if (shown.length < convo.length) tui.print(`${c.dim} … earlier messages omitted${c.reset}`);\n for (const m of shown) {\n if (m.metadata?.user_command) {\n printCommandBlock(\n tui,\n String(m.metadata.command ?? \"\"),\n String(m.metadata.output ?? messageText(m.content)),\n m.metadata.ok !== false\n );\n continue;\n }\n const text = messageText(m.content).trim();\n if (!text) continue;\n if (m.role === \"user\") tui.printUserMessage(text);\n else printAssistant(tui, text);\n }\n}\n\nasync function runInteractive(\n tui: Tui,\n api: ApiClient,\n threadId: string,\n projectDir: string,\n machine: string,\n resumed: boolean,\n session: SessionLocation,\n historySeedThreadId?: string\n): Promise<void> {\n // Remote sessions are WATCHERS: the thread's tools execute on the runner\n // machine's daemon (the execution owner), while this client streams the\n // conversation, sends messages, and answers relayed approval requests. No\n // bridge, no local host executors, no local MCP host.\n const remote = session.mode === \"remote\";\n const runnerName = session.runner?.name ?? \"the remote machine\";\n // Background-process metadata lives in the thread's KV (server-side), so even\n // a watcher can list what the executing client spawned — this is a thin KV\n // client, not local process state.\n const registry = new ProcessRegistry(api, threadId, machine);\n const refreshBgCount = () => {\n void registry.runningCount().then((n) => tui.setBackgroundCount(n)).catch(() => {});\n };\n const perm: PermissionState = { level: tui.level, alwaysAllow: new Set(), allowRisk: new Set() };\n\n // The SHARED execution stack (registry + MCP host + HostTools + bridge),\n // identical to the daemon's — built only for a client that can execute (a\n // local session). A remote watcher has no execution stack. Constructed just\n // below, once the bridge hooks' dependencies (activeSteps, refreshStatus,\n // offerUpgrade, …) exist; `exec`/`host`/`mcp`/`bridge` are its members.\n let exec: ExecutionSession | null = null;\n let host: HostTools | null = null;\n let mcp: McpManager | null = null;\n let bridge: Bridge | null = null;\n const publishMcpCatalog = () => exec?.publishMcpCatalog();\n\n // Restore this session's saved approvals (auto-accept level + pre-approved\n // tools and risk levels) from the thread KV, so they resume with the session.\n const savedApprovals = await loadApprovals(api, threadId);\n for (const t of savedApprovals.allowTools) perm.alwaysAllow.add(t);\n for (const r of savedApprovals.allowRisk) perm.allowRisk.add(r);\n if (savedApprovals.level) {\n perm.level = savedApprovals.level;\n tui.setLevel(savedApprovals.level);\n }\n tui.onLevelChange((l: Level) => {\n perm.level = l;\n saveApprovals(api, threadId, perm);\n });\n // Persist the effective permission setting now (not just on change) so the\n // backend evaluates the SAME level/approvals when deciding whether a forwarded\n // tool needs approval — otherwise it parks calls the CLI would auto-accept.\n saveApprovals(api, threadId, perm);\n // session_info (the agent's \"where does my shell live\" ground truth) is\n // written AFTER ownership is known, below — a client that turns out to be a\n // non-owner (another terminal or a local daemon holds the thread) must not\n // overwrite the executing client's cwd/machine.\n\n // Everything from here to the banner is session wiring (history load, the\n // bridge/stream/events sockets) — show one loader for the whole stretch.\n // Started after the approvals restore above so its possible level-change\n // print can't collide with the redrawn loader line.\n const attaching = startLoader(\"Attaching to thread\");\n\n // ── state ────────────────────────────────────────────────────────────────\n let busy = false; // is the agent currently working\n // Set when the user hits esc to interrupt: clears the working indicator\n // immediately and suppresses the poller from re-showing it until the backend\n // confirms the turn actually stopped (otherwise \"Working\" lingers a poll or two).\n let interrupting = false;\n // Messages typed while busy, held to send next (with any pasted images).\n const queued: { text: string; images: PastedImage[] }[] = [];\n let editingQueued = false; // input currently holds a pulled queued message\n const shownIds = new Set<string>(); // message ids already printed to the transcript\n // User messages the CLI optimistically displayed on send, keyed by content, so\n // the poller doesn't re-print them — while it DOES render user messages that\n // were submitted from elsewhere (web UI, API, another client).\n const pendingSent = new Map<string, number>();\n // The last message we sent — resent verbatim to continue after an at-limit\n // upgrade (the blocked turn never reached the model).\n let lastSent: { text: string; images: PastedImage[] } | null = null;\n let upgradeInFlight = false;\n\n // ── token feed ──────────────────────────────────────────────────────────\n // Cumulative tokens are authoritative from logs (one row per completed LLM\n // call); a live estimate from streamed content ticks the output count up\n // between log updates so a long generation isn't silent.\n let tokensIn = 0;\n let tokensOut = 0;\n let liveOut = 0; // output tokens for the in-progress response (from `generation` events)\n const countedLogs = new Set<string>();\n\n // ── step indicator (what the agent is doing right now) ────────────────────\n // The label comes from the server stream's tool_call_started/done events — it\n // shows what the agent is doing, which is especially valuable for a long tool.\n // That signal is best-effort though (a reconnect can drop an event), so the\n // bridge — which actually runs the forwarded tools on the host — RECONCILES it:\n // it fills in a `started` the stream missed and clears a `done` it dropped, so\n // the label can't strand on a tool that already finished (see Bridge onStatus).\n // Most recently started active tool wins; cleared when the turn goes idle.\n const activeSteps = new Map<string, string>(); // tool call id -> label\n\n // Push the current totals + step to the prompt. Output total folds in the\n // live in-progress count; the step's own output is the live count.\n const refreshStatus = () => {\n tui.setTokens(tokensIn, tokensOut + liveOut);\n let label: string | null = null;\n for (const v of activeSteps.values()) label = v; // last (most recent) entry\n tui.setStep(label, liveOut);\n };\n\n // Execution ownership: this interactive session claims the thread unless a\n // LIVE other client already owns it. If the recorded owner is a daemon on\n // THIS machine, take over outright — the filesystem is the same and the\n // human at the keyboard should approve and see the tools.\n let claim: \"if_stale\" | \"takeover\" = \"if_stale\";\n if (!remote) {\n const ownerRec = (await api.kvGet(threadId, \"execution_owner\").catch(() => null)) as\n | { client_id?: string }\n | null;\n const ownerDaemonMachine = machineIdFromDaemonClientId(ownerRec?.client_id);\n if (ownerDaemonMachine === session.identity.machine_id) claim = \"takeover\";\n }\n\n if (!remote) {\n // This machine's display NAME is account data (its `.name` key), overlaid\n // on the registry record — resolve it for the bridge client_name shown to\n // other clients. Falls back to the hostname.\n const localDisplayName = machineDisplayName(\n (await loadMachine(api, session.identity.machine_id).catch(() => null)) ?? {\n hostname: machine,\n id: session.identity.machine_id,\n }\n );\n exec = new ExecutionSession({\n api,\n threadId,\n projectDir,\n machineName: machine,\n perm,\n identity: {\n clientId: interactiveClientId(session.identity),\n clientName: `${localDisplayName} (terminal)`,\n clientKind: \"interactive\",\n claim,\n },\n hooks: {\n onActivity: (line, detail) => {\n tui.print(colorActivity(line));\n // Pre-styled extra rows (truncated diffs for edits/writes) print verbatim.\n if (detail) for (const d of detail) tui.print(d);\n refreshBgCount();\n },\n onOwnership: (isOwner: boolean, owner: ExecutionOwnerInfo | null) => {\n if (isOwner) {\n // We execute here now — reassert on any future reconnect so a daemon's\n // stale-claim probe can't quietly take execution during a brief drop.\n bridge?.setClaim(\"takeover\");\n // Owner-only session facts (a watcher must never overwrite them).\n exec?.writeSessionInfo();\n } else {\n tui.print(\n `${c.yellow}⚠ Another client${owner?.client_name ? ` (${owner.client_name})` : \"\"} is executing tools for this session — this terminal is watching.${c.reset}`\n );\n }\n },\n onClaimRefused: (reason: string) => {\n if (reason === \"in_flight\") {\n tui.print(\n `${c.yellow}⚠ The session's current client is mid-operation — execution can't move here until it finishes. Watching for now.${c.reset}`\n );\n }\n },\n onSuperseded: () => {\n tui.print(\n `${c.yellow}⚠ Another Standard Code process on this machine took over this session — this terminal is watching.${c.reset}`\n );\n },\n onStatus: (id, summary) => {\n // Reconcile the stream's best-effort step signal with what the host is\n // really running — the CLI executes the forwarded tools, so it knows:\n // - on start: fill in a `started` the stream may have dropped, but DON'T\n // override a label the stream already set (it can be richer/intentional).\n // - on finish: authoritatively clear it, healing a dropped `done` so the\n // label can't strand on a tool that already completed.\n // Durable calls share the tool-call id with the stream, so this lines up.\n if (summary) {\n if (!activeSteps.has(id)) activeSteps.set(id, summary);\n } else {\n activeSteps.delete(id);\n }\n refreshStatus();\n },\n onConnection: (state, attempt) => {\n // Brief drops are normal (a permission wait, a dev-server reload) and the\n // bridge reconnects on its own — stay quiet unless reconnection is actually\n // struggling (several seconds of failed attempts). The disconnect shows as a\n // TRANSIENT notice line in the bottom region that clears itself the moment we\n // reconnect, so nothing about it lingers in the transcript.\n if (state === \"reconnecting\") {\n if (attempt >= 4) tui.setConnected(false);\n } else {\n tui.setConnected(true);\n }\n },\n requestApproval: async (req, summary, risk) => {\n // Boxed permission dialog (allow / always / deny / deny-with-feedback).\n // Feedback text rides back to the agent on the deny tool result.\n return tui.approval(\n `${summary}${req.requestPermission ? `\\nwhy: ${req.requestPermission}` : \"\"}`,\n risk\n );\n },\n },\n });\n host = exec.host;\n mcp = exec.mcp;\n bridge = exec.bridge;\n }\n\n // The message stream drives two live signals (the transcript itself is\n // rendered from polling for robustness):\n // - `generation` events → the live output-token count (moves during ALL\n // generation, including big tool arguments like file content).\n // - `tool_call_started` / `tool_call_done` → the current step label.\n const stream = new MessageStream(api, threadId, {\n // Live streaming preview: answer text and (opt-in) internal reasoning feed\n // the TUI's ephemeral preview; the committed message still renders from\n // polling, which calls tui.clearStream() first so there's no double-render.\n onChunk: (text, mid) => tui.streamResponseDelta(text, mid),\n onReasoningChunk: (text, mid) => tui.streamThinkingDelta(text, mid),\n onAssistantText: () => {},\n onEvent: (eventType, data) => {\n if (eventType === \"generation\" && typeof data?.outputTokens === \"number\") {\n liveOut = data.outputTokens;\n refreshStatus();\n } else if (eventType === \"tool_call_started\" && data?.id) {\n activeSteps.set(data.id, data.progress || data.name || \"working\");\n refreshStatus();\n } else if (eventType === \"tool_call_done\" && data?.id) {\n activeSteps.delete(data.id);\n refreshStatus();\n } else if (eventType === \"goal_updated\" && data) {\n tui.setGoal(data);\n }\n },\n // A failed turn whose message is the lease service's at-limit denial → offer\n // an in-terminal upgrade right where the friction happened. (offerUpgrade /\n // isSessionLimitError are defined below; this callback only fires mid-session.)\n onError: (err: string) => {\n if (isSessionLimitError(err)) void offerUpgrade({ auto: true });\n },\n });\n\n // ── subagent tracking ──────────────────────────────────────────────────────\n // A subagent runs in its own child thread, but whether it's *actively running*\n // (vs idle or terminated) lives in our thread's child registry — not on the\n // thread-registry events. So we treat the system-events channel purely as a\n // \"something changed\" signal and re-read /api/threads/:id/subagents, showing a\n // line only for subagents whose status is `running`.\n // Running child threadId -> display title, registry status detail, and raw\n // agent name (the TUI colors the compaction agent orange by name).\n const activeSubagents = new Map<string, { title: string; registryDetail: string; agentName?: string }>();\n // Agent name → title, loaded once so subagent lines read \"Research Assistant\"\n // rather than the raw agent name. Best effort; falls back to a prettified name.\n const agentTitles = new Map<string, string>();\n const agentTitlesReady = api\n .listAgents()\n .then((list) => list.forEach((a) => agentTitles.set(a.name, a.title)))\n .catch(() => {});\n // Compose each line as \"Title — activity\". The live stream phrase (what the\n // subagent's own thread is doing RIGHT NOW — reading a page, running a\n // search) wins over the registry status text (setStatus heartbeats, which\n // only some agents publish); with neither, the bare title renders as before.\n const pushSubagents = () =>\n tui.setSubagents(\n [...activeSubagents.entries()].map(([id, s]) => {\n const detail = subActivity.phraseFor(id) ?? s.registryDetail;\n return { id, label: `${s.title}${detail ? ` — ${detail}` : \"\"}`, agentName: s.agentName };\n })\n );\n // Live per-subagent activity: one read-only stream to each running child\n // thread (opened/closed by the reconcile below via sync()); a phrase change\n // just re-pushes the lines.\n const subActivity = new SubagentActivity(api, () => pushSubagents());\n // Rebuild the running-subagent set from the authoritative child registry.\n // Runs on every (re)connect (covering subagents that started before this\n // socket, or during a reconnect gap) and whenever a child thread changes.\n const reconcileSubagents = async () => {\n try {\n await agentTitlesReady;\n const subs = await api.listSubagents(threadId);\n activeSubagents.clear();\n for (const s of subs) {\n // Hide finished/parked children. Anything else is live: \"running\", or a\n // custom working status (agents can publish progress via setStatus /\n // sessionStatus bindings — e.g. the coordinator's code workers heartbeat\n // \"editing src/auth.ts — 2 of 3 call sites done\" into the registry).\n const status = (s.status || \"\").trim();\n if (status === \"idle\" || status === \"terminated\") continue;\n // Keep the registry status text when it's more than the bare lifecycle\n // marker — it's the fallback detail when no live stream phrase exists.\n // Collapsed to one line — agents publish arbitrary status text, and a\n // newline inside a HUD row would desync the TUI's redraw math.\n const oneLineStatus = status.replace(/\\s+/g, \" \");\n activeSubagents.set(s.id, {\n title: subagentLabel(s, agentTitles),\n registryDetail: oneLineStatus && oneLineStatus !== \"running\" ? oneLineStatus.slice(0, 80) : \"\",\n agentName: s.agent_name ?? undefined,\n });\n }\n // Streams follow the registry: open for newcomers, closed for departed.\n subActivity.sync(activeSubagents.keys());\n pushSubagents();\n } catch {\n // Best effort — the next event or reconnect re-reconciles.\n }\n };\n // Coalesce bursts of events into a single registry read; if more events land\n // while a read is in flight, run exactly one more afterwards.\n let reconcileTimer: ReturnType<typeof setTimeout> | null = null;\n let reconcilePending = false;\n const scheduleReconcile = () => {\n if (reconcileTimer) {\n reconcilePending = true;\n return;\n }\n reconcileTimer = setTimeout(async () => {\n reconcileTimer = null;\n await reconcileSubagents();\n if (reconcilePending) {\n reconcilePending = false;\n scheduleReconcile();\n }\n }, 150);\n };\n const events = new SystemEvents(api, {\n onOpen: () => scheduleReconcile(),\n onThreadCreated: (t) => {\n if (t.parent === threadId) scheduleReconcile();\n },\n onThreadUpdated: (t) => {\n if (t.parent === threadId) scheduleReconcile();\n },\n onThreadDeleted: (id) => {\n if (activeSubagents.has(id)) scheduleReconcile();\n },\n });\n // Registry status text (setStatus / sessionStatus heartbeats) changes without\n // firing a thread event, so while any subagent line is visible, refresh it on\n // a slow poll to keep the displayed working state current. Discovery of NEW\n // subagents still comes from the events above; this only keeps text fresh.\n const heartbeatPoll = setInterval(() => {\n if (activeSubagents.size > 0) scheduleReconcile();\n }, 5000);\n heartbeatPoll.unref();\n\n // `/clear` resolves this promise; runInteractive tears the session down and\n // returns, and the caller loops back in with a fresh thread. (Quit never\n // resolves it — quit exits the process directly.)\n let endSession!: () => void;\n const sessionEnded = new Promise<void>((r) => (endSession = r));\n\n const quit = async () => {\n tui.end();\n // Stop the agent's turn on the backend before we exit — the LLM loop runs\n // remotely, so without this it would keep working after the CLI disconnects.\n // ONLY when this client owns execution, though: a watcher (or a demoted\n // non-owner) detaching must not kill the turn the owning client is still\n // executing. Also kill any background processes this machine spawned:\n // they're detached, so without this they'd outlive the session. Fire both,\n // tear down locally, then wait briefly so they land (capped so quitting\n // stays snappy even if the instance is unreachable).\n const stopped = (bridge?.isOwner ?? false)\n ? api.stop(threadId).catch(() => {})\n : Promise.resolve();\n const procsStopped = host ? host.stopAllLocalProcesses().catch(() => 0) : Promise.resolve(0);\n bridge?.close();\n stream.close();\n events.close();\n subActivity.closeAll();\n mcp?.closeAll();\n const [, killed] = await Promise.race([\n Promise.all([stopped, procsStopped]),\n new Promise<[unknown, number]>((r) => setTimeout(() => r([undefined, 0]), 1500)),\n ]);\n farewell(killed);\n process.exit(0);\n };\n tui.setQuitHandler(quit);\n\n // `/logout`: forget the saved token for this instance, then shut down like a\n // normal quit (stop the turn + this machine's background processes). The next\n // launch lands on the sign-in screen.\n const logout = async () => {\n deleteCredential(api.origin);\n const instanceHost = api.origin.replace(/^https?:\\/\\//, \"\");\n tui.print(`${c.gray}Signed out — removed the saved token for ${c.teal}${instanceHost}${c.reset}${c.gray}. Run standardcode to sign in again.${c.reset}`);\n await quit();\n };\n const bgMgr: BgManager = {\n list: () => registry.list(),\n stop: async (id: string) => {\n if (!host) {\n // The processes live on the executing machine (a remote daemon) — this\n // watcher can't signal them. Ask the agent instead (its\n // background_process tool runs there).\n tui.print(\n `${c.gray}That process runs on ${runnerName} — ask the agent to stop it (it manages processes there).${c.reset}`\n );\n return;\n }\n await host.execute(\"background_process\", { action: \"stop\", id });\n refreshBgCount();\n },\n };\n\n // ── MCP control surface (for the /mcp command + slash menu) ────────────────\n // In a remote session the daemon is the MCP host, so this surface is only\n // wired for local sessions (the /mcp command is hidden remotely).\n const mcpCtl: McpController = {\n configured: () => listMcpServers(),\n connectedNames: () => mcp?.connectedNames() ?? [],\n catalog: () => mcp?.catalog() ?? { servers: [] },\n connect: async (cfg) => {\n if (!mcp) return { ok: false, error: \"MCP servers run on the session's machine.\" };\n try {\n const client = await mcp.connect(cfg);\n publishMcpCatalog();\n return { ok: true, tools: client.tools.length };\n } catch (e) {\n publishMcpCatalog();\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n },\n disconnect: (name) => {\n mcp?.disconnect(name);\n publishMcpCatalog();\n },\n add: async (cfg) => {\n saveMcpServer(cfg);\n return mcpCtl.connect(cfg);\n },\n // Seed the request into the main chat — the agent researches + installs it\n // there (using research_agent + the mcp tool's install action), visible in\n // the transcript.\n requestInstall: (query) => {\n void sendNow(\n `Install an MCP server for me: ${query}. Research the best one and its exact launch command, then install it.`\n );\n },\n remove: (name) => {\n mcp?.disconnect(name);\n removeMcpServer(name);\n publishMcpCatalog();\n },\n setEnabled: (name, enabled) => setMcpServerEnabled(name, enabled),\n };\n\n // ── submit / queue / steer ─────────────────────────────────────────────────\n // Pasted images become real message attachments: the instance stores the\n // bytes in the thread filesystem and injects them into the LLM's vision\n // context, exactly like an image sent from the web UI. The `[#Image N]`\n // placeholders stay in the text so the model can reference them by name.\n const extFor = (mime: string): string =>\n ({ \"image/png\": \"png\", \"image/jpeg\": \"jpg\", \"image/gif\": \"gif\", \"image/webp\": \"webp\" })[mime] ?? \"bin\";\n const toAttachments = (images: PastedImage[]): MessageAttachment[] =>\n images.map((img) => ({ name: `image-${img.seq}.${extFor(img.mime)}`, mimeType: img.mime, data: img.data }));\n\n const sendNow = async (text: string, images: PastedImage[] = []) => {\n lastSent = { text, images };\n tui.printUserMessage(text);\n // Mark it shown so the poller (which now also renders user messages) doesn't\n // double-print our own send once the backend persists it.\n const key = text.trim();\n pendingSent.set(key, (pendingSent.get(key) ?? 0) + 1);\n try {\n await api.sendMessage(threadId, text, toAttachments(images));\n } catch (e) {\n const n = (pendingSent.get(key) ?? 1) - 1;\n if (n > 0) pendingSent.set(key, n);\n else pendingSent.delete(key); // send failed — don't suppress a future identical message\n tui.print(`${c.dim}failed to send: ${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n interrupting = false; // a fresh turn — let the working indicator show again\n busy = true;\n tui.setWorking(true);\n };\n // ── `!command` bang ────────────────────────────────────────────────────────\n // A leading `!` runs a shell command NOW on the thread's execution owner\n // (wherever the session runs — a remote VPS daemon, not this watcher), prints\n // the output inline, and records it in thread history (so tuned-in clients see\n // it too). It never goes to the agent. The instance forwards it over the same\n // bridge the agent's tools use, so it always lands where execution lives.\n const whereLabel = remote ? runnerName : \"this machine\";\n let bangRunning = false;\n const runBangCommand = async (command: string) => {\n if (bangRunning) {\n tui.print(`${c.dim}a command is already running — one at a time.${c.reset}`);\n return;\n }\n bangRunning = true;\n tui.print(`${c.magenta}!${c.reset} ${c.dim}running on ${whereLabel}…${c.reset}`);\n try {\n const res = await api.runCommand(threadId, command);\n // The instance persisted it as a `user_command` system message; mark that\n // id shown so the poller doesn't render it a second time on this client.\n if (res.messageId) shownIds.add(res.messageId);\n printCommandBlock(tui, command, res.ok ? res.output ?? \"\" : res.error ?? \"command failed\", res.ok, whereLabel);\n } catch (e) {\n printCommandBlock(tui, command, e instanceof Error ? e.message : String(e), false, whereLabel);\n } finally {\n bangRunning = false;\n }\n };\n\n const flushQueued = async () => {\n if (!queued.length) return;\n const toSend = queued.splice(0);\n tui.setQueuedCount(0);\n for (const q of toSend) await sendNow(q.text, q.images);\n };\n\n // Manually kick off a background compaction. Spawns the non-blocking\n // compaction subagent server-side immediately (even while the thread is idle),\n // which then surfaces through the normal subagent display — no special CLI\n // message needed. Idempotent: a server-side lock prevents overlapping runs.\n const requestCompaction = async () => {\n try {\n await api.compact(threadId);\n } catch (err) {\n tui.print(`${c.red}✗${c.reset} couldn't start compaction: ${(err as Error).message}`);\n }\n };\n\n // /account — open the standardcode.ai dashboard, pre-authed when the\n // instance can mint a magic link for this thread's user (falls back to the\n // plain dashboard where they sign in by inbox link).\n const runAccountCommand = async () => {\n tui.print(`${c.gray}Opening your account…${c.reset}`);\n const link = await api.accountLink(threadId).catch(() => null);\n const target = link?.url ?? \"https://standardcode.ai/account\";\n openUrl(target);\n tui.print(\n link?.preauthed\n ? `${c.gray}→ account dashboard opened in your browser (signed in)${c.reset}`\n : `${c.gray}→ opened ${target} — sign in with your account email${c.reset}`\n );\n };\n\n // ── in-terminal parallel-session upgrade ──────────────────────────────────\n const ordinal = (n: number): string => {\n const s = [\"th\", \"st\", \"nd\", \"rd\"], v = n % 100;\n return `${n}${s[(v - 20) % 10] ?? s[v] ?? s[0]}`;\n };\n const fmtCost = (q: SessionQuote): string | null =>\n typeof q.amount_cents === \"number\" && q.amount_cents !== 0\n ? `$${(Math.abs(q.amount_cents) / 100).toFixed(2)}`\n : null;\n\n // A delightful, on-brand panel: gradient title, a session meter (● in use,\n // gradient + for the one being added, dim · for headroom), and an unambiguous\n // cost line (with the amber trial-conversion warning when applicable).\n const renderUpgradePanel = (q: SessionQuote): string => {\n const dots: string[] = [];\n for (let i = 0; i < q.max; i++) {\n if (i < q.current) dots.push(`${c.teal}●${c.reset}`);\n else if (i === q.current) dots.push(`${c.bold}${gradientText(\"+\")}${c.reset}`);\n else dots.push(`${c.dim}·${c.reset}`);\n }\n const cost = fmtCost(q);\n const lines = [\n \"\",\n `${c.bold}${gradientText(\"✦ Add a parallel session\")}${c.reset}`,\n \"\",\n `${dots.join(\" \")} ${c.dim}${q.current} of ${q.current} session${q.current === 1 ? \"\" : \"s\"} in use${c.reset}`,\n ];\n if (q.ends_trial) {\n lines.push(\n `${c.yellow}Your $5 trial covers 1 session. Adding a ${ordinal(q.sessions)} ends the trial${c.reset}`,\n `${c.yellow}and starts your $49/mo plan now${cost ? ` — ${c.bold}${cost} charged today${c.reset}${c.yellow}` : \"\"}.${c.reset}`,\n );\n } else if (cost) {\n lines.push(`Add a ${ordinal(q.sessions)} session at $49/mo — ${c.bold}${cost} charged now${c.reset}.`);\n } else {\n lines.push(`Add a ${ordinal(q.sessions)} session at $49/mo — prorated on your next invoice.`);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n };\n\n // Offer + apply an upgrade. `auto` = triggered by hitting the limit mid-turn\n // (we then resend the blocked message so the session just continues).\n const offerUpgrade = async (opts: { auto?: boolean } = {}) => {\n if (upgradeInFlight) return;\n upgradeInFlight = true;\n try {\n // Say WHY this appeared before doing anything else. When triggered by a\n // blocked turn (auto), the raw denial was deliberately swallowed — with\n // no explanation the browser opening reads as a glitch, not a limit.\n if (opts.auto) {\n tui.print(\n `${c.yellow}You're out of simultaneous sessions — another Standard Code session is using your slot.${c.reset}`\n );\n }\n const quote = await api.sessionsQuote(threadId);\n if (!quote) {\n // No subscription or billing unreachable → hand off to the dashboard.\n const link = await api.accountLink(threadId).catch(() => null);\n const target = link?.url ?? \"https://standardcode.ai/account\";\n tui.print(\n `${c.gray}Close the other session (its slot frees within ~90s) — or add another` +\n ` simultaneous session to your plan, then resend your message.${c.reset}`\n );\n openUrl(target);\n tui.print(`${c.gray}→ opened ${target} to manage your plan${c.reset}`);\n return;\n }\n if (quote.current >= quote.max) {\n tui.print(\n `${c.yellow}You're at the maximum of ${quote.max} parallel session${quote.max === 1 ? \"\" : \"s\"}.${c.reset}\\n` +\n `${c.gray}Close another session (its slot frees within ~90s), then resend your message.${c.reset}`\n );\n return;\n }\n tui.print(renderUpgradePanel(quote));\n const cost = fmtCost(quote);\n const confirmLabel = quote.ends_trial\n ? `End trial & start now${cost ? ` — pay ${cost} today` : \"\"}`\n : `Confirm${cost ? ` — pay ${cost} now` : \" — add the session\"}`;\n const choice = await tui.select(`Add a ${ordinal(quote.sessions)} parallel session?`, [\n { label: confirmLabel, value: \"go\" as const },\n { label: \"Not now\", value: \"no\" as const },\n ]);\n if (choice !== \"go\") {\n tui.print(`${c.gray}No change made — you can upgrade anytime with /upgrade.${c.reset}`);\n return;\n }\n tui.print(`${c.gray}Applying…${c.reset}`);\n let applied: { ok?: boolean; sessions?: number; error?: string };\n try {\n applied = await api.sessionsUpgrade(threadId, quote.sessions);\n } catch (e) {\n tui.print(`${c.red}✗${c.reset} Upgrade failed: ${e instanceof Error ? e.message : String(e)}`);\n return;\n }\n if (!applied?.ok) {\n tui.print(`${c.red}✗${c.reset} Upgrade failed: ${applied?.error ?? \"unknown error\"}`);\n return;\n }\n const n = applied.sessions ?? quote.sessions;\n tui.print(`${c.green}✓${c.reset} ${c.bold}${gradientText(`You now have ${n} parallel session${n === 1 ? \"\" : \"s\"}.`)}${c.reset}`);\n // Continue the blocked turn: resend the message that hit the limit.\n if (opts.auto && lastSent) {\n tui.print(`${c.gray}Continuing…${c.reset}`);\n await sendNow(lastSent.text, lastSent.images);\n }\n } finally {\n upgradeInFlight = false;\n }\n };\n\n // Recognize the lease service's at-limit / no-subscription denials (surfaced\n // as the hook's blocked-turn error text) so we can offer an upgrade in place.\n const isSessionLimitError = (msg: string): boolean =>\n /thread limit reached|simultaneous (thread|session)s?.*in use|no active standard code subscription/i.test(msg);\n\n // ── skills control surface (for the /skills command) ──────────────────────\n // Skills live in the INSTANCE (global across sessions); the CLI only lists\n // and toggles them over the API — nothing skill-related is stored locally.\n const skillsCtl: SkillsController = {\n list: () => api.listSkills(),\n setEnabled: (name, enabled) => api.setSkillEnabled(name, enabled),\n remove: (name) => api.removeSkill(name),\n // Seed the request into the main chat — the agent researches or authors\n // the skill there (research_agent + the skill tool's install action),\n // visible in the transcript.\n requestInstall: (query) => {\n void sendNow(\n `Install a skill for me: ${query}. Find the skill's published files (or author a proper SKILL.md from your research), install it, then tell me what it can do.`\n );\n },\n };\n\n // Slash-command palette: typing \"/\" filters this list inline above the prompt.\n // Each command is individually addressable (/compact, /mcp, …). Hints are\n // functions so live state (context %, level, counts) stays fresh as it redraws.\n tui.setCommands([\n {\n name: \"clear\",\n label: \"Clear conversation\",\n hint: \"start a fresh session\",\n run: () => endSession(),\n },\n {\n name: \"compact\",\n label: \"Compact conversation now\",\n hint: () => tui.contextPctLabel() || \"free up context\",\n run: requestCompaction,\n },\n { name: \"level\", label: \"Auto-accept level\", hint: () => `level ${tui.level}`, run: () => runLevelMenu(tui, perm) },\n {\n name: \"permissions\",\n label: \"Approved commands\",\n hint: () => {\n const n = perm.alwaysAllow.size + perm.allowRisk.size;\n return n ? `${n} approved` : \"none\";\n },\n run: () => runApprovalsMenu(tui, perm, () => saveApprovals(api, threadId, perm)),\n },\n // MCP servers are hosted by whichever client executes the tools — hide\n // the local MCP manager in a remote session (the daemon hosts them there).\n ...(remote\n ? []\n : [\n {\n name: \"mcp\",\n label: \"MCP servers\",\n hint: () => {\n const n = mcpCtl.connectedNames().length;\n return n ? `${n} connected` : \"none\";\n },\n run: () => runMcpMenu(tui, mcpCtl),\n },\n ]),\n {\n name: \"machines\",\n label: \"Your machines\",\n hint: \"list, rename, update, manage projects\",\n run: () => runMachinesMenu(tui, api, session.identity),\n },\n {\n name: \"daemon\",\n label: \"Machine daemon\",\n hint: () => (serviceStatus().installed ? \"installed on this machine\" : \"not installed here\"),\n run: () => showDaemonInfo(tui, session),\n },\n {\n name: \"skills\",\n label: \"Agent skills\",\n hint: \"list / install / manage\",\n run: () => runSkillsMenu(tui, skillsCtl),\n },\n {\n name: \"account\",\n label: \"Manage your account\",\n hint: \"billing & sessions, opens in browser\",\n run: () => runAccountCommand(),\n },\n {\n name: \"upgrade\",\n label: \"Add a parallel session\",\n hint: \"run more sessions at once\",\n run: () => offerUpgrade(),\n },\n { name: \"background\", label: \"Background processes\", hint: \"list / stop\", run: () => runProcessMenu(tui, bgMgr) },\n { name: \"keybindings\", label: \"Keyboard shortcuts\", run: () => showKeybindings(tui) },\n { name: \"update\", label: \"Check for updates\", hint: \"check for a newer version\", run: () => runUpdateCommand(tui) },\n { name: \"logout\", label: \"Sign out\", hint: \"delete the saved token & quit\", run: () => logout() },\n { name: \"quit\", label: \"Quit\", run: () => quit() },\n ]);\n\n // Seed ↑/↓ recall from the thread KV (inheriting the project's newest prior\n // thread on a fresh session); every submit appends (whether it sends now or\n // queues) so history survives across sessions — all server-side, nothing on\n // the local filesystem.\n const history = await loadHistory(api, threadId, historySeedThreadId);\n tui.setHistory(history);\n\n tui.onSubmit = (text, images) => {\n // `!command` — run a shell command on the execution owner immediately,\n // out of band from the agent. `!!` escapes to a literal message starting\n // with `!`. A bare `!` (no command) is ignored.\n const trimmed = text.trimStart();\n if (trimmed.startsWith(\"!\") && !trimmed.startsWith(\"!!\")) {\n const command = trimmed.slice(1).trim();\n if (command) {\n appendHistory(api, threadId, history, text);\n void runBangCommand(command);\n }\n return;\n }\n const outgoing = trimmed.startsWith(\"!!\") ? text.replace(\"!!\", \"!\") : text;\n appendHistory(api, threadId, history, outgoing);\n text = outgoing;\n if (editingQueued) {\n editingQueued = false;\n queued.push({ text, images });\n tui.setQueuedCount(queued.length);\n tui.print(`${c.gray}⏳ queued:${c.reset} ${text}`);\n return;\n }\n if (busy) {\n queued.push({ text, images });\n tui.setQueuedCount(queued.length);\n tui.print(`${c.gray}⏳ queued:${c.reset} ${text} ${c.dim}(esc to steer now)${c.reset}`);\n } else {\n void sendNow(text, images);\n }\n };\n\n tui.onInterrupt = () => {\n if (queued.length > 0) {\n tui.print(`${c.yellow}↪ steering — stopping current work and sending your message…${c.reset}`);\n void api\n .stop(threadId)\n .catch(() => {})\n .then(() => flushQueued());\n } else if (busy) {\n // Optimistically stop the working indicator so esc feels immediate.\n interrupting = true;\n busy = false;\n activeSteps.clear();\n liveOut = 0;\n tui.setWorking(false);\n refreshStatus();\n tui.print(`${c.yellow}[interrupted by user]${c.reset}`);\n void api.stop(threadId).catch(() => {});\n }\n };\n\n // Enter on the ←-selected [⚙ n bg] prompt badge opens the same panel as\n // the /background slash command.\n tui.onBgBadge = () => {\n void runProcessMenu(tui, bgMgr).catch(() => {});\n };\n\n // Up on an empty top line first pulls the last QUEUED message back for\n // editing (returning true consumes the key); otherwise the TUI falls through\n // to history recall.\n tui.onUpArrow = () => {\n if (tui.getInput().trim() || queued.length === 0) return false;\n const q = queued.pop()!;\n tui.setQueuedCount(queued.length);\n editingQueued = true;\n tui.setInput(q.text, q.images);\n return true;\n };\n\n events.connect();\n await Promise.all([...(bridge ? [bridge.connect()] : []), stream.connect()]);\n // Whether THIS client executes forwarded tools — gates owner-only side\n // effects below (MCP hosting/catalog). Legacy instances never answer, so\n // the timeout falls back to the assumed-owner default.\n const ownsExecution = bridge ? await bridge.whenOwnershipKnown(3000) : false;\n\n // Seed the live goal checklist; it then stays current via goal_updated events.\n void api.getGoal(threadId).then((g) => tui.setGoal(g)).catch(() => {});\n\n attaching.stop();\n tui.banner(\n remote\n ? [\n `${c.bold}${c.magenta}Standard Code${c.reset} ${c.dim}— coding agent${c.reset}`,\n `${c.gray}project:${c.reset} ${session.remotePath ?? \"?\"} ${c.teal}on ${runnerName}${c.reset}`,\n `${c.gray}runs on:${c.reset} ${runnerName} ${c.dim}(daemon executes tools; you're watching from ${machine})${c.reset} ${c.gray}thread:${c.reset} ${threadId.slice(0, 8)}`,\n ]\n : [\n `${c.bold}${c.magenta}Standard Code${c.reset} ${c.dim}— coding agent${c.reset}`,\n `${c.gray}project:${c.reset} ${projectDir}`,\n `${c.gray}machine:${c.reset} ${machine} ${c.gray}thread:${c.reset} ${threadId.slice(0, 8)}`,\n ]\n );\n if (!remote && session.suggestDaemonInstall && process.platform !== \"win32\" && !serviceStatus().installed) {\n tui.print(\n `${c.dim}Tip: install the always-on daemon (${c.reset}standardcode daemon install${c.dim}) to start sessions on this machine from anywhere.${c.reset}`\n );\n }\n\n if (resumed) await printHistory(api, threadId, tui);\n\n // Seed shown-ids so the poller doesn't re-print existing history.\n try {\n (await api.getMessages(threadId, 200)).forEach((m: any) => shownIds.add(m.id));\n } catch {\n // ignore\n }\n\n const runningProcs = (await registry.list()).filter((p) => p.status === \"running\");\n if (runningProcs.length) {\n tui.print(\n `${c.cyan}⚙ ${runningProcs.length} background process${runningProcs.length === 1 ? \"\" : \"es\"} running:${c.reset}`\n );\n for (const p of runningProcs) tui.print(`${c.gray} ${p.id} ${p.description || p.command}${c.reset}`);\n }\n refreshBgCount();\n\n // Connect every enabled MCP server, then publish the catalog so the agent sees\n // the tools on its very first step. (The CLI is the MCP host; this is the real\n // initialize/tools-list handshake with each local server, via the shared\n // ExecutionSession.) A remote session or a non-owner skips this — the\n // executing client owns the MCP catalog.\n if (exec && ownsExecution) {\n for (const res of await exec.connectEnabledMcpServers()) {\n if (res.ok) {\n tui.print(`${c.cyan}⚡ MCP \"${res.name}\" connected${c.reset} ${c.gray}(${res.tools} tool${res.tools === 1 ? \"\" : \"s\"})${c.reset}`);\n } else {\n tui.print(`${c.red}⚠ MCP \"${res.name}\" failed:${c.reset} ${c.gray}${res.error}${c.reset}`);\n }\n }\n }\n\n tui.start(); // begin the persistent input line\n\n // ── approval relay (remote sessions) ───────────────────────────────────────\n // When the runner's daemon needs a human decision, it parks an\n // `approval_request` in the thread KV. This watching client renders the\n // normal approval prompt and writes the decision back; the daemon applies\n // it and clears the keys. First responder wins if several clients watch.\n const answeredApprovals = new Set<string>();\n let approvalPromptOpen = false;\n const relayApprovals = async (): Promise<void> => {\n // Any non-executing client relays: a remote watcher, but also a local\n // session that lost (or never got) ownership — e.g. this machine's daemon\n // or another terminal owns the thread and needs a human to approve.\n const watching = remote || (bridge ? !bridge.isOwner : false);\n if (!watching || approvalPromptOpen) return;\n const request = parseApprovalRequest(await api.kvGet(threadId, APPROVAL_REQUEST_KEY));\n if (!request || answeredApprovals.has(request.tool_call_id)) return;\n approvalPromptOpen = true;\n try {\n // The approval dialog handles deny-with-feedback itself and returns the\n // final { choice, reason } — write it straight through to the relay.\n const { choice, reason } = await tui.approval(\n `${request.summary}${request.permission ? `\\n${c.bold}why: ${request.permission}${c.reset}` : \"\"}\\n${c.dim}runs on ${request.machine || runnerName}${c.reset}`,\n request.risk\n );\n answeredApprovals.add(request.tool_call_id);\n await writeApprovalResponse(api, threadId, {\n tool_call_id: request.tool_call_id,\n choice,\n reason,\n decided_at: Date.now(),\n });\n } finally {\n approvalPromptOpen = false;\n }\n };\n\n // ── poller: display new messages, drive the working indicator, flush queue ──\n const poll = async () => {\n let msgs: any[];\n try {\n msgs = await api.getMessages(threadId, 60);\n } catch {\n return;\n }\n const sorted = [...msgs].sort((a, b) => (a.created_at ?? 0) - (b.created_at ?? 0));\n for (const m of sorted) {\n if (shownIds.has(m.id) || m.status === \"pending\") continue;\n shownIds.add(m.id);\n const text = messageText(m.content).trim();\n // At-limit / no-subscription denial (from the enforce_thread_leases hook)\n // → offer the in-terminal upgrade instead of printing the raw error. The\n // stream's onError catches the same condition; upgradeInFlight dedups.\n const denial = (typeof m.error === \"string\" && m.error) || text;\n if (denial && isSessionLimitError(denial)) {\n void offerUpgrade({ auto: true });\n continue;\n }\n // A user `!command` is persisted as a system message tagged\n // `user_command` — render it as a command block on every client (the one\n // that ran it already marked its id shown; this is for the others).\n if (m.metadata?.user_command) {\n printCommandBlock(\n tui,\n String(m.metadata.command ?? \"\"),\n String(m.metadata.output ?? text),\n m.metadata.ok !== false\n );\n continue;\n }\n if (m.role === \"assistant\" && text) printAssistant(tui, text);\n else if (m.role === \"system\" && text) tui.print(`${c.dim}${text}${c.reset}`);\n else if (m.role === \"user\" && text) {\n const pending = pendingSent.get(text) ?? 0;\n if (pending > 0) {\n // Our own optimistic send, now confirmed — already on screen.\n if (pending === 1) pendingSent.delete(text);\n else pendingSent.set(text, pending - 1);\n } else {\n // Submitted from elsewhere — render it as a normal sent user message.\n tui.printUserMessage(text);\n }\n }\n }\n const polledBusy = threadBusy(msgs);\n // While interrupting, keep the indicator off until the backend has actually\n // gone idle — then clear the latch so future turns show \"Working\" again.\n if (interrupting) {\n if (!polledBusy) interrupting = false;\n busy = false;\n } else {\n busy = polledBusy;\n }\n tui.setWorking(busy);\n if (!busy) {\n // Turn finished — clear any stale step + in-progress live count.\n if (activeSteps.size) activeSteps.clear();\n liveOut = 0;\n refreshStatus();\n if (queued.length > 0 && !editingQueued) await flushQueued();\n }\n refreshBgCount();\n void relayApprovals().catch(() => {});\n\n // Authoritative token totals from completed LLM-call logs.\n try {\n const logs = await api.getLogs(threadId, 100);\n let landed = 0;\n for (const l of logs) {\n // Skip until the call is finalized — an in-progress log has null tokens,\n // and counting it early would mark its id seen before the real counts land.\n if (!l.is_complete) continue;\n const id = l.id ?? `${l.created_at}:${l.total_tokens}`;\n if (countedLogs.has(id)) continue;\n countedLogs.add(id);\n const inT = Number(l.input_tokens) || 0;\n const outT = Number(l.output_tokens) || 0;\n tokensIn += inT;\n tokensOut += outT;\n landed += outT;\n }\n if (landed > 0) liveOut = 0; // a real count arrived; drop the live estimate\n refreshStatus();\n } catch {\n // ignore — token feed is best-effort\n }\n\n // Context gauge: the runtime records the latest request's input tokens\n // (the true serialized context size) and the model's window to thread KV.\n // Scaled to the COMPACTION POINT, not the raw window: the instance triggers\n // background compaction at half the model's context (its\n // TRIGGER_CONTEXT_FRACTION), so 100% here = \"compaction is about to run\",\n // which is the only ceiling the user can actually hit.\n const COMPACTION_TRIGGER_FRACTION = 0.5;\n // Mirrors the instance's TRIGGER_TOKENS_CAP: compaction fires at\n // min(50% of the window, 50k tokens), so the gauge tops out there too.\n const COMPACTION_TRIGGER_CAP = 50_000;\n try {\n const cu = (await api.kvGet(threadId, \"context_usage\")) as\n | { inputTokens?: number; maxContextTokens?: number }\n | null;\n const used = Number(cu?.inputTokens) || 0;\n const max = Math.min(\n (Number(cu?.maxContextTokens) || 0) * COMPACTION_TRIGGER_FRACTION || Infinity,\n COMPACTION_TRIGGER_CAP,\n );\n tui.setContextPct(max > 0 && used > 0 ? (used / max) * 100 : null);\n } catch {\n // ignore — gauge is best-effort\n }\n };\n const pollTimer = setInterval(() => void poll().catch(() => {}), 1200);\n\n // Event-driven from here. The promise resolves only on `/clear` — quit exits\n // the process without ever resolving it.\n await sessionEnded;\n\n // ── /clear teardown: silence this session so the next one owns the TUI ────\n clearInterval(pollTimer);\n clearInterval(heartbeatPoll);\n // Stop the remote turn (the LLM loop runs server-side) and this machine's\n // background processes — the fresh thread's registry won't know about them.\n // Only the execution owner stops the turn: clearing away from a session\n // that runs elsewhere must not kill the work still executing there.\n const stopped = (bridge?.isOwner ?? false)\n ? api.stop(threadId).catch(() => {})\n : Promise.resolve();\n const procsStopped = host ? host.stopAllLocalProcesses().catch(() => 0) : Promise.resolve(0);\n bridge?.close();\n stream.close();\n events.close();\n subActivity.closeAll();\n mcp?.closeAll();\n const [, killed] = await Promise.race([\n Promise.all([stopped, procsStopped]),\n new Promise<[unknown, number]>((r) => setTimeout(() => r([undefined, 0]), 1500)),\n ]);\n // Reset the live bottom-region signals so nothing from the old thread lingers\n // while the new session boots and re-seeds them.\n tui.setWorking(false);\n tui.setSubagents([]);\n tui.setGoal(null);\n tui.setQueuedCount(0);\n tui.setContextPct(null);\n tui.setStep(null, 0);\n tui.setBackgroundCount(0);\n if (killed > 0) {\n tui.print(`${c.cyan}⚙${c.reset} Stopped ${killed} background process${killed === 1 ? \"\" : \"es\"}.`);\n }\n tui.print(`${c.dim}── conversation cleared — starting a fresh session ──${c.reset}`);\n}\n\ninterface BgManager {\n list: () => Promise<{ id: string; command: string; description?: string; status: string; pid: number; exitCode?: number | null }[]>;\n stop: (id: string) => Promise<void>;\n}\n\ninterface SkillsController {\n list: () => Promise<SkillInfo[]>;\n setEnabled: (name: string, enabled: boolean) => Promise<void>;\n remove: (name: string) => Promise<void>;\n /** Seed an install request into the main chat for the agent to research + install. */\n requestInstall: (query: string) => void;\n}\n\n/**\n * Interactive skills control surface (reached via `/skills`). Lists installed\n * skills with enabled state, and lets you install (free-text request handled\n * by the agent in-chat), enable/disable, inspect, and remove — all menu-driven.\n */\nasync function runSkillsMenu(tui: Tui, skills: SkillsController): Promise<void> {\n let list: SkillInfo[];\n try {\n list = await skills.list();\n } catch (e) {\n tui.print(`${c.red}✗ couldn't load skills:${c.reset} ${c.gray}${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n\n const INSTALL = \"__install__\";\n const items = list.map((s) => ({\n label: s.name,\n hint: `${s.enabled ? \"enabled\" : \"disabled\"} · ${s.files.length} file${s.files.length === 1 ? \"\" : \"s\"}`,\n value: s.name,\n }));\n items.push({ label: \"+ Install a skill…\", hint: \"find & install\", value: INSTALL });\n\n const picked = await tui.select(\n `${c.bold}Agent skills${c.reset} ${c.dim}(↑/↓ · enter · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n\n if (picked === INSTALL) {\n const query = await tui.prompt(\n \"What skill do you want to install?\",\n \"the anthropic pdf skill / a skill for writing conventional commits\"\n );\n if (query) skills.requestInstall(query);\n return;\n }\n\n const skill = list.find((s) => s.name === picked)!;\n tui.print(`${c.cyan}${skill.name}${c.reset}${skill.version ? ` ${c.dim}v${skill.version}${c.reset}` : \"\"} ${c.gray}— ${skill.description}${c.reset}`);\n const action = await tui.select(`${c.bold}${picked}${c.reset}`, [\n skill.enabled\n ? { label: \"Disable (hide from the agent)\", value: \"disable\" as const }\n : { label: \"Enable\", value: \"enable\" as const },\n { label: \"View files\", value: \"files\" as const },\n { label: \"Remove this skill\", value: \"remove\" as const },\n { label: \"Back\", value: \"back\" as const },\n ]);\n\n try {\n if (action === \"enable\" || action === \"disable\") {\n await skills.setEnabled(picked, action === \"enable\");\n tui.print(`${c.gray}${action}d ${picked}${c.reset}`);\n } else if (action === \"files\") {\n for (const f of skill.files) tui.print(` ${c.gray}${f}${c.reset}`);\n } else if (action === \"remove\") {\n await skills.remove(picked);\n tui.print(`${c.gray}removed ${picked}${c.reset}`);\n }\n } catch (e) {\n tui.print(`${c.red}✗ ${e instanceof Error ? e.message : String(e)}${c.reset}`);\n }\n}\n\ninterface McpController {\n configured: () => McpServerConfig[];\n connectedNames: () => string[];\n catalog: () => { servers: { name: string; status: string; tools: { name: string; description?: string }[]; resources: { uri: string }[]; error?: string }[] };\n connect: (cfg: McpServerConfig) => Promise<{ ok: boolean; tools?: number; error?: string }>;\n disconnect: (name: string) => void;\n add: (cfg: McpServerConfig) => Promise<{ ok: boolean; tools?: number; error?: string }>;\n remove: (name: string) => void;\n setEnabled: (name: string, enabled: boolean) => void;\n /** Seed an install request into the main chat for the agent to research + install. */\n requestInstall: (query: string) => void;\n}\n\n/** The `/` configuration menu: clear, permission mode, approvals, processes, shortcuts, sign out, quit. */\n/** The auto-accept level submenu (reached via `/level`). */\nasync function runLevelMenu(tui: Tui, perm: PermissionState): Promise<void> {\n const picked = await tui.select(\n `${c.bold}Auto-accept level${c.reset} ${c.dim}(↑/↓ · enter · shift-tab cycles)${c.reset}`,\n LEVELS.map((l) => ({\n label: levelLabel(l),\n hint: l === tui.level ? \"current\" : \"\",\n value: l,\n }))\n );\n if (picked) {\n tui.setLevel(picked);\n perm.level = picked;\n }\n}\n\n/**\n * `/machines` — manage the machines on your account: list them (name,\n * hostname, platform, version, online status, projects), rename, force a\n * standardcode update, and add/remove project directories. The LOCAL machine\n * is managed directly (this client is on its filesystem); a REMOTE machine is\n * managed by queueing a command its daemon drains within ~8s.\n */\nasync function runMachinesMenu(tui: Tui, api: ApiClient, self: MachineIdentity): Promise<void> {\n let machines: MachineRecord[];\n try {\n machines = await loadMachines(api);\n } catch (e) {\n tui.print(`${c.red}✗ couldn't load machines:${c.reset} ${c.gray}${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n if (!machines.length) {\n tui.print(`${c.gray}No machines registered yet. Run standardcode on a machine (or install its daemon) to register it.${c.reset}`);\n return;\n }\n machines.sort((a, b) => (b.updated_at ?? 0) - (a.updated_at ?? 0));\n\n const picked = await tui.select(\n `${c.bold}Your machines${c.reset} ${c.dim}(↑/↓ · enter · esc)${c.reset}`,\n machines.map((m) => {\n const isSelf = m.id === self.machine_id;\n const online = daemonOnline(m);\n const daemonBit = m.daemon ? (online ? \"daemon online\" : \"daemon offline\") : \"no daemon\";\n const nproj = Object.keys(m.projects).length;\n return {\n label: `${m.name}${isSelf ? \" (this machine)\" : \"\"}`,\n hint: `${m.hostname} · ${m.platform}/${m.arch} · v${m.version ?? \"?\"} · ${daemonBit} · ${nproj} project${nproj === 1 ? \"\" : \"s\"}`,\n value: m.id,\n };\n })\n );\n if (!picked) return;\n const machine = machines.find((m) => m.id === picked)!;\n await manageMachine(tui, api, self, machine);\n}\n\n/** Submenu for one machine: rename / update / projects. */\nasync function manageMachine(\n tui: Tui,\n api: ApiClient,\n self: MachineIdentity,\n machine: MachineRecord\n): Promise<void> {\n const isSelf = machine.id === self.machine_id;\n const online = daemonOnline(machine);\n // Rename is an ACCOUNT edit — works for any machine with no daemon needed.\n // Update / project changes act on the machine's filesystem, so they need a\n // daemon there (queued for a remote machine); this machine can always do them.\n const canRunCommands = isSelf || !!machine.daemon;\n\n const options: { label: string; hint?: string; value: string }[] = [\n { label: \"Rename\", value: \"rename\" },\n ];\n if (canRunCommands) {\n options.push(\n { label: \"Update standardcode\", hint: `v${machine.version ?? \"?\"} → latest`, value: \"update\" },\n { label: \"Manage projects\", hint: `${Object.keys(machine.projects).length}`, value: \"projects\" }\n );\n }\n options.push({ label: \"Back\", value: \"back\" });\n\n if (!isSelf && !machine.daemon) {\n tui.print(\n `${c.dim}${machine.name} has no daemon — you can rename it here; update and project changes need its daemon installed.${c.reset}`\n );\n } else if (!isSelf && machine.daemon && !online) {\n tui.print(\n `${c.dim}${machine.name}'s daemon is offline — queued changes apply when it next comes online.${c.reset}`\n );\n }\n\n const action = await tui.select(`${c.bold}${machine.name}${c.reset}`, options);\n if (!action || action === \"back\") return;\n\n // update / project changes: apply directly on the local machine, or queue a\n // command for a remote machine's daemon to drain.\n const dispatch = async (\n kind: MachineCommand[\"kind\"],\n args?: Record<string, unknown>\n ): Promise<void> => {\n if (isSelf) {\n await applyMachineCommand(api, self, { id: \"local\", kind, args, requested_at: Date.now() });\n } else {\n await enqueueMachineCommand(api, machine.id, kind, args);\n }\n };\n const applyNote = isSelf\n ? \"applied\"\n : `queued — ${machine.name}'s daemon will apply it within ~10s`;\n\n if (action === \"rename\") {\n const name = await tui.prompt(`New name for ${machine.name}`, machine.name);\n if (name === null || !name.trim()) return;\n // Names are ACCOUNT data — a direct user-KV write, authoritative for any\n // machine (no daemon round-trip, can't be reverted by a heartbeat).\n await setMachineName(api, machine.id, name.trim());\n tui.print(`${c.green}✓${c.reset} Renamed ${c.bold}${machine.name}${c.reset} → ${c.bold}${name.trim()}${c.reset}.`);\n } else if (action === \"update\") {\n if (isSelf) {\n // Updating THIS machine's CLI = the normal foreground update.\n await runUpdateCommand(tui);\n } else {\n const go = await tui.select(`Force ${machine.name} to update standardcode now?`, [\n { label: \"Yes, update & restart its daemon\", value: \"yes\" as const },\n { label: \"Cancel\", value: \"no\" as const },\n ]);\n if (go !== \"yes\") return;\n await dispatch(\"update\");\n tui.print(`${c.green}✓${c.reset} Update ${c.gray}${applyNote} (its daemon updates and restarts on the new version).${c.reset}`);\n }\n } else if (action === \"projects\") {\n await manageMachineProjects(tui, api, self, machine, dispatch, applyNote);\n }\n}\n\n/** Add/remove project directories on a machine. */\nasync function manageMachineProjects(\n tui: Tui,\n api: ApiClient,\n self: MachineIdentity,\n machine: MachineRecord,\n dispatch: (kind: MachineCommand[\"kind\"], args?: Record<string, unknown>) => Promise<void>,\n applyNote: string\n): Promise<void> {\n const ADD = \"__add__\";\n const paths = Object.keys(machine.projects).sort();\n const picked = await tui.select(\n `${c.bold}Projects on ${machine.name}${c.reset} ${c.dim}(enter to remove · esc)${c.reset}`,\n [\n ...paths.map((p) => ({ label: p, hint: \"enter to remove\", value: p })),\n { label: \"+ Add a project directory…\", hint: \"absolute path\", value: ADD },\n ]\n );\n if (!picked) return;\n if (picked === ADD) {\n const path = await tui.prompt(\n `Absolute project path on ${machine.name}`,\n machine.id === self.machine_id ? process.cwd() : \"/home/you/project\"\n );\n if (!path || !path.trim()) return;\n const trimmed = path.trim();\n if (!trimmed.startsWith(\"/\") && !trimmed.startsWith(\"~\")) {\n tui.print(`${c.yellow}Use an absolute path (starting with / or ~).${c.reset}`);\n return;\n }\n await dispatch(\"add_project\", { path: trimmed });\n tui.print(`${c.green}✓${c.reset} Add ${trimmed} ${c.gray}${applyNote}.${c.reset}`);\n } else {\n await dispatch(\"remove_project\", { path: picked });\n tui.print(`${c.green}✓${c.reset} Remove ${picked} ${c.gray}${applyNote}.${c.reset}`);\n }\n}\n\n/**\n * `/daemon` — where this session executes + how to install the always-on\n * daemon on this machine. Installation itself runs outside the TUI\n * (`standardcode daemon install`) because it needs plain readline + launchd/\n * systemd interaction.\n */\nfunction showDaemonInfo(tui: Tui, session: SessionLocation): void {\n if (session.mode === \"remote\" && session.runner) {\n tui.print(\n `${c.gray}This session runs on${c.reset} ${c.bold}${session.runner.name}${c.reset} ${c.gray}(${session.runner.hostname}) — its daemon executes the tools.${c.reset}`\n );\n } else {\n tui.print(`${c.gray}This session runs on this machine.${c.reset}`);\n }\n const status = serviceStatus();\n tui.print(\n `${c.gray}Daemon on this machine:${c.reset} ${status.installed ? status.detail : \"not installed\"}`\n );\n if (!status.installed) {\n tui.print(\n `${c.gray}Install it to start sessions on this machine from anywhere:${c.reset} ${c.bold}standardcode daemon install${c.reset}`\n );\n tui.print(\n `${c.dim}The daemon keeps running after you close the terminal — it self-restarts, self-updates, and executes sessions you start from other machines.${c.reset}`\n );\n } else {\n tui.print(`${c.dim}Manage it with standardcode daemon status | uninstall | add-project <path>.${c.reset}`);\n }\n}\n\n/** Print the keyboard-shortcut reference (reached via `/keybindings`). */\nfunction showKeybindings(tui: Tui): void {\n tui.print(`${c.gray}shortcuts:${c.reset}`);\n tui.print(`${c.gray} shift-tab${c.reset} cycle auto-accept level (1–5)`);\n tui.print(`${c.gray} /${c.reset} open the command palette (type to filter)`);\n tui.print(`${c.gray} !cmd${c.reset} run a shell command on the session's machine (e.g. !ls); !! to send a literal !`);\n tui.print(`${c.gray} ctrl-v${c.reset} paste an image from the clipboard ([#Image 1])`);\n tui.print(`${c.gray} ↑ / ↓${c.reset} cycle past messages (on the input's top line)`);\n tui.print(`${c.gray} ←${c.reset} from the start of the input: select the [⚙ n bg] badge (enter opens it)`);\n tui.print(`${c.gray} ctrl-c${c.reset} quit`);\n}\n\n/** Check npm for a newer version and prompt to update. */\nasync function runUpdateCommand(tui: Tui): Promise<void> {\n const version = readVersion();\n const result = await forceCheckForUpdate(version);\n if (!result) {\n tui.print(`${c.green}✓${c.reset} ${c.gray}@standardagents/code${c.reset} is up to date (v${version})`);\n return;\n }\n const { latest } = result;\n tui.print(`\\n ${c.yellow}⟳${c.reset} Update available: ${c.gray}v${version}${c.reset} → ${c.green}v${latest}${c.reset}`);\n // Update through the package manager that owns this install — updating a\n // pnpm/bun/yarn-managed global with npm would fork it into competing copies.\n const pm = detectPackageManager();\n if (!pm) {\n tui.print(` ${c.gray}This is a source checkout — pull the repo to update.${c.reset}`);\n return;\n }\n const { display } = updateCommand(pm);\n const choice = await tui.select(`Update now with \\`${display}\\`?`, [\n { label: \"Yes, update now\", value: \"yes\" as const },\n { label: \"No, skip\", value: \"no\" as const },\n ]);\n if (choice === \"yes\") {\n tui.print(` ${c.gray}Running ${display}…${c.reset}`);\n const { ok, output: pmOutput } = await runUpdate(pm);\n if (ok) {\n tui.print(` ${c.green}✓${c.reset} Updated to v${latest}. Restart to use the new version.`);\n } else {\n tui.print(` ${c.red}✗${c.reset} Update failed:`);\n for (const line of pmOutput.trim().split(\"\\n\").slice(-6)) {\n tui.print(` ${c.dim}${line}${c.reset}`);\n }\n }\n } else {\n tui.print(` ${c.gray}Skipped. Run /update later.${c.reset}`);\n }\n}\n\n/** Submenu listing tracked background processes; lets you stop a running one. */\nasync function runProcessMenu(tui: Tui, bg: BgManager): Promise<void> {\n const procs = await bg.list();\n if (!procs.length) {\n tui.print(`${c.gray}No background processes for this session.${c.reset}`);\n return;\n }\n const items = procs.map((p) => {\n const status =\n p.status === \"running\"\n ? `${c.green}running${c.reset}`\n : `${c.gray}${p.status}${typeof p.exitCode === \"number\" ? ` (exit ${p.exitCode})` : \"\"}${c.reset}`;\n return {\n label: `${p.description || p.command}`,\n hint: `${p.id} · ${status}`,\n value: p.id,\n };\n });\n const picked = await tui.select(\n `${c.bold}Background processes${c.reset} ${c.dim}(↑/↓ · enter to manage · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n const proc = procs.find((p) => p.id === picked);\n if (!proc || proc.status !== \"running\") {\n tui.print(`${c.gray}${picked} is not running.${c.reset}`);\n return;\n }\n const action = await tui.select(`${c.bold}${proc.description || proc.command}${c.reset}`, [\n { label: \"Stop this process\", value: \"stop\" as const },\n { label: \"Leave it running\", value: \"leave\" as const },\n ]);\n if (action === \"stop\") {\n await bg.stop(picked);\n tui.print(`${c.gray}stopped ${picked}${c.reset}`);\n }\n}\n\n/** Submenu showing the session's pre-approved tools/risk levels; pick one to revoke. */\nasync function runApprovalsMenu(tui: Tui, perm: PermissionState, save: () => void): Promise<void> {\n const tools = Array.from(perm.alwaysAllow).sort();\n const risks = Array.from(perm.allowRisk).sort((a, b) => a - b);\n if (!tools.length && !risks.length) {\n tui.print(\n `${c.gray}No pre-approved commands. At a permission prompt, choose \"Always allow this tool\" or \"Allow all level N\" to add some.${c.reset}`\n );\n return;\n }\n const items = [\n ...tools.map((t) => ({ label: `Tool: ${t}`, hint: \"always allowed\", value: `tool:${t}` })),\n ...risks.map((r) => ({ label: `Risk level ${r} and below`, hint: \"auto-accepted\", value: `risk:${r}` })),\n { label: \"Clear all approvals\", hint: \"\", value: \"clear\" },\n ];\n const picked = await tui.select(\n `${c.bold}Approved commands${c.reset} ${c.dim}(enter to revoke · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n if (picked === \"clear\") {\n perm.alwaysAllow.clear();\n perm.allowRisk.clear();\n tui.print(`${c.gray}cleared all approvals${c.reset}`);\n } else if (picked.startsWith(\"tool:\")) {\n const t = picked.slice(5);\n perm.alwaysAllow.delete(t);\n tui.print(`${c.gray}revoked tool ${t}${c.reset}`);\n } else if (picked.startsWith(\"risk:\")) {\n const r = Number(picked.slice(5));\n perm.allowRisk.delete(r);\n tui.print(`${c.gray}revoked level ${r}${c.reset}`);\n }\n save();\n}\n\n/**\n * Interactive MCP control surface (reached via `/` → \"MCP servers\"). Lists\n * configured servers with status, and lets you add (free-text command), view\n * tools, connect/disconnect, enable/disable, and remove — all menu-driven.\n */\nasync function runMcpMenu(tui: Tui, mcp: McpController): Promise<void> {\n const configured = mcp.configured();\n const connected = new Set(mcp.connectedNames());\n const cat = mcp.catalog();\n\n const INSTALL = \"__install__\";\n const ADD_MANUAL = \"__manual__\";\n const items = configured.map((s) => {\n const entry = cat.servers.find((e) => e.name === s.name);\n const status = !s.enabled\n ? \"disabled\"\n : connected.has(s.name)\n ? `connected · ${entry?.tools.length ?? 0} tools`\n : entry?.error\n ? \"error\"\n : \"disconnected\";\n return { label: s.name, hint: status, value: s.name };\n });\n items.push({ label: \"+ Install a new MCP server…\", hint: \"find & install\", value: INSTALL });\n items.push({ label: \"Add manually (name: command)…\", hint: \"advanced\", value: ADD_MANUAL });\n\n const picked = await tui.select(\n `${c.bold}MCP servers${c.reset} ${c.dim}(↑/↓ · enter · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n\n if (picked === INSTALL) {\n await installMcpServerFlow(tui, mcp);\n return;\n }\n if (picked === ADD_MANUAL) {\n await addMcpServer(tui, mcp);\n return;\n }\n\n const server = configured.find((s) => s.name === picked)!;\n const isConnected = connected.has(picked);\n\n const action = await tui.select(`${c.bold}${picked}${c.reset}`, [\n { label: \"View tools\", value: \"tools\" as const },\n isConnected\n ? { label: \"Disconnect\", value: \"disconnect\" as const }\n : { label: \"Connect\", value: \"connect\" as const },\n server.enabled\n ? { label: \"Disable (don't auto-connect)\", value: \"disable\" as const }\n : { label: \"Enable (auto-connect on start)\", value: \"enable\" as const },\n { label: \"Remove this server\", value: \"remove\" as const },\n { label: \"Back\", value: \"back\" as const },\n ]);\n\n if (action === \"tools\") {\n const entry = mcp.catalog().servers.find((e) => e.name === picked);\n if (!entry || entry.status !== \"connected\") {\n tui.print(`${c.gray}${picked} is not connected — connect it to list tools.${c.reset}`);\n return;\n }\n if (!entry.tools.length) tui.print(`${c.gray}${picked} exposes no tools.${c.reset}`);\n for (const t of entry.tools) tui.print(` ${c.cyan}${t.name}${c.reset}${t.description ? ` ${c.gray}— ${t.description}${c.reset}` : \"\"}`);\n if (entry.resources.length) tui.print(` ${c.gray}${entry.resources.length} resource(s)${c.reset}`);\n } else if (action === \"connect\") {\n const res = await mcp.connect(server);\n tui.print(res.ok ? `${c.cyan}⚡ connected (${res.tools} tools)${c.reset}` : `${c.red}⚠ ${res.error}${c.reset}`);\n } else if (action === \"disconnect\") {\n mcp.disconnect(picked);\n tui.print(`${c.gray}disconnected ${picked}${c.reset}`);\n } else if (action === \"enable\") {\n mcp.setEnabled(picked, true);\n const res = await mcp.connect(server);\n tui.print(res.ok ? `${c.cyan}⚡ enabled + connected (${res.tools} tools)${c.reset}` : `${c.red}⚠ enabled but failed: ${res.error}${c.reset}`);\n } else if (action === \"disable\") {\n mcp.setEnabled(picked, false);\n mcp.disconnect(picked);\n tui.print(`${c.gray}disabled + disconnected ${picked}${c.reset}`);\n } else if (action === \"remove\") {\n mcp.remove(picked);\n tui.print(`${c.gray}removed ${picked}${c.reset}`);\n }\n}\n\n/** Prompt for a new MCP server (`name: command args`), then save + connect it. */\nasync function addMcpServer(tui: Tui, mcp: McpController): Promise<void> {\n const spec = await tui.prompt(\n \"Add an MCP server — enter name: command [args…]\",\n \"fs: npx -y @modelcontextprotocol/server-filesystem .\"\n );\n if (!spec) return;\n const cfg = parseServerSpec(spec);\n if (!cfg) {\n tui.print(`${c.yellow}couldn't parse that. Use name: command [args]${c.reset}`);\n return;\n }\n tui.print(`${c.gray}connecting MCP \"${cfg.name}\" (${cfg.command} ${cfg.args.join(\" \")})…${c.reset}`);\n const res = await mcp.add(cfg);\n if (res.ok) tui.print(`${c.cyan}⚡ MCP \"${cfg.name}\" connected${c.reset} ${c.gray}(${res.tools} tool${res.tools === 1 ? \"\" : \"s\"})${c.reset}`);\n else tui.print(`${c.red}⚠ MCP \"${cfg.name}\" failed:${c.reset} ${c.gray}${res.error}${c.reset} ${c.dim}(saved; retry from the MCP menu)${c.reset}`);\n}\n\n/**\n * The \"Install a new MCP server\" flow: ask what the user wants, then seed that\n * request into the main chat. The agent researches the right server (via\n * research_agent) and installs it (the mcp tool's install action) right there\n * in the transcript — so the same thing happens whether you use this menu or\n * just ask in chat. We land straight back in the conversation.\n */\nasync function installMcpServerFlow(tui: Tui, mcp: McpController): Promise<void> {\n const query = await tui.prompt(\n \"What MCP server do you want to install?\",\n \"the best computer-use mcp server for mac\"\n );\n if (!query) return;\n mcp.requestInstall(query);\n}\n\nmain().catch((err) => {\n process.stderr.write(`\\n${err instanceof Error ? err.stack || err.message : String(err)}\\n`);\n process.exit(1);\n});\n"]}