@lunnoa/client 2.4.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/auth.ts","../src/core/errors.ts","../src/core/http.ts","../src/streaming/sse.ts","../src/streaming/agent-chat.ts","../src/resources/actions.ts","../src/define/index.ts","../src/resources/common.ts","../src/resources/agents.ts","../src/auth/types.ts","../src/resources/auth.ts","../src/resources/ai-connections.ts","../src/resources/connections.ts","../src/resources/discovery.ts","../src/core/pagination.ts","../src/resources/entities.ts","../src/resources/entity-types.ts","../src/resources/tables.ts","../src/resources/approvals.ts","../src/streaming/execution-progress.ts","../src/resources/executions.ts","../src/resources/knowledge.ts","../src/resources/queue-items.ts","../src/resources/queues.ts","../src/resources/runs.ts","../src/resources/scorecards.ts","../src/resources/tasks.ts","../src/resources/variables.ts","../src/resources/workflow-apps.ts","../src/resources/workflows.ts","../src/client.ts","../src/auth/token-store.ts","../src/auth/create-client.ts"],"names":["generateMessageId"],"mappings":";AACO,IAAM,cAAA,GAAiB;AAGvB,SAAS,oBAAA,GAAgC;AAC9C,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC3B;AAQO,SAAS,iCAAiC,MAAA,EAAsB;AACrE,EAAA,IAAI,sBAAqB,EAAG;AAC1B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,cAAc,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,sDAAsD,cAAc,CAAA,uFAAA;AAAA,KAEtE;AAAA,EACF;AACF;;;AC5BO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA;AAAA,EAE/B,MAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,IAAA;AAAA,EAET,YAAY,IAAA,EAKT;AACD,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,KAAA;AAAA,MACE,CAAA,2BAAA,EAA8B,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,QAAA,EAAM,IAAA,CAAK,MAAM,CAAA,EAAG,MAAA,GAAS,CAAA,EAAA,EAAK,MAAM,MAAM,EAAE,CAAA;AAAA,KACxG;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,cAAA,GAA0B;AAC5B,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,aAAA,GAAyB;AAC3B,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AACF;AAEA,SAAS,eAAe,IAAA,EAAmC;AACzD,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,MAAM,MAAA,GAAS,IAAA;AACf,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,KAAA;AAC3C,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,MAAA,OAAO,SAAA,CAAU,OAAO,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACjE;AAAA,EACF;AACA,EAAA,IAAI,OAAO,SAAS,QAAA,IAAY,IAAA,CAAK,SAAS,CAAA,IAAK,IAAA,CAAK,SAAS,GAAA,EAAK;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;;;ACMO,IAAM,aAAN,MAAiB;AAAA,EACb,OAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EACQ,MAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACT,eAAA,GAA2C,IAAA;AAAA,EAEnD,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,CAAC,QAAQ,MAAA,IAAU,CAAC,QAAQ,WAAA,IAAe,CAAC,QAAQ,UAAA,EAAY;AAClE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,gCAAA,CAAiC,QAAQ,MAAM,CAAA;AAAA,IACjD;AACA,IAAA,IACE,OAAO,QAAQ,WAAA,KAAgB,QAAA,IAC/B,QAAQ,WAAA,CAAY,UAAA,CAAW,cAAc,CAAA,EAC7C;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACjD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,WAAA,GACH,QAAQ,WAAA,IAAe,OAAA,CAAQ,QAAQ,UAAA,IAAc,CAAC,QAAQ,MAAM,CAAA;AACtE,IAAA,IAAA,CAAK,QACH,OAAA,CAAQ,KAAA,IAAU,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,CAAA;AACpD,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,EAC5C;AAAA,EAEA,MAAM,iBAAA,GAAqC;AACzC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,CAAA,OAAA,EAAU,KAAK,MAAM,CAAA,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,UAAA,CAAW,cAAA,EAAe;AACvD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SAEF;AAAA,MACF;AACA,MAAA,OAAO,UAAU,SAAS,CAAA,CAAA;AAAA,IAC5B;AACA,IAAA,MAAM,KAAA,GACJ,OAAO,IAAA,CAAK,WAAA,KAAgB,aACxB,MAAM,IAAA,CAAK,WAAA,EAAY,GACvB,IAAA,CAAK,WAAA;AACX,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,UAAU,KAAK,CAAA,CAAA;AAAA,EACxB;AAAA,EAEA,QAAA,CAAS,MAAc,KAAA,EAA4C;AACjE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,UAAU,IAAI,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAYA,MAAM,OAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACJ;AACvB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,KAAK,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,IAAA,CAAK,cAAA;AAAA,MACR,GAAG,OAAA,CAAQ;AAAA,KACb;AAEA,IAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACvD;AAEA,IAAA,MAAM,OAAoB,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA,EAAO;AACpE,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,IACzC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAE3C,IAAA,IACE,CAAC,QAAA,CAAS,EAAA,IACV,SAAS,MAAA,KAAW,GAAA,IACpB,CAAC,OAAA,CAAQ,QAAA,IACT,CAAC,OAAA,CAAQ,wBACT,IAAA,CAAK,WAAA,IACL,KAAK,UAAA,IACL,CAAC,KAAK,MAAA,EACN;AACA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,qBAAA,EAAsB;AACnD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAO,IAAA,CAAK,OAAA,CAAW,MAAA,EAAQ,IAAA,EAAM;AAAA,UACnC,GAAG,OAAA;AAAA,UACH,oBAAA,EAAsB;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAC3C,MAAA,MAAM,IAAI,cAAA,CAAe;AAAA,QACvB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,IAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAQ,MAAM,gBAAgB,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEA,GAAA,CAAO,MAAc,OAAA,EAAsC;AACzD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,IAAA,CAAQ,MAAc,OAAA,EAAsC;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,KAAA,CAAS,MAAc,OAAA,EAAsC;AAC3D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,OAAA,EAAS,IAAA,EAAM,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEA,GAAA,CAAO,MAAc,OAAA,EAAsC;AACzD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAA,CAAU,MAAc,OAAA,EAAsC;AAC5D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAA,GAA0C;AAC9C,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,cAAA,EAAe,CAAE,QAAQ,MAAM;AACzD,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,MAAc,cAAA,GAAmC;AAC/C,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAY,eAAA,EAAgB;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,yBAAyB,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK;AAAA,QACrC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,cAAc;AAAA,OACtC,CAAA;AACD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAA,CAAK,WAAY,KAAA,EAAM;AAC7B,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,GAAQ,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAG5C,MAAA,IAAI,CAAC,MAAM,YAAA,EAAc;AACvB,QAAA,MAAM,IAAA,CAAK,WAAY,KAAA,EAAM;AAC7B,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAM,KAAK,UAAA,CAAY,SAAA,CAAU,EAAE,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA;AACnE,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAA,CAAK,WAAY,KAAA,EAAM;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,gBAAgB,QAAA,EAAsC;AACnE,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACrSA,gBAAuB,eACrB,MAAA,EACyC;AACzC,EAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAChD,IAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,MAAA,MAAM,KAAA,CAAM,IAAA;AAAA,IACd;AAAA,EACF;AACF;AAaA,gBAAuB,eACrB,MAAA,EAC2C;AAC3C,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,UAAU,IAAI,WAAA,CAAY,SAAS,EAAE,KAAA,EAAO,OAAO,CAAA;AACzD,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA;AAAA,MACF;AACA,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAGhD,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AACrC,MAAA,IAAI,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACpC,MAAA,OAAO,aAAa,CAAA,CAAA,EAAI;AACtB,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AACzC,QAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AAClC,QAAA,QAAA,GAAW,MAAA,CAAO,QAAQ,MAAM,CAAA;AAEhC,QAAA,MAAM,MAAA,GAAS,aAAa,QAAQ,CAAA;AACpC,QAAA,IAAI,MAAA,CAAO,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,UAAU,SAAA,EAAW;AACtD,UAAA,MAAM,MAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,EAAK;AAC9B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,MAAA,GAAS,aAAa,SAAS,CAAA;AACrC,MAAA,IAAI,MAAA,CAAO,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,UAAU,SAAA,EAAW;AACtD,QAAA,MAAM,MAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAEA,SAAS,aAAa,QAAA,EAA4B;AAChD,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,IAAI,SAAA,GAAY,SAAA;AAEhB,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG;AACvC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,MAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AACtC,MAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,QAAA,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,MACvB;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,SAAA,GAAY,KAAA;AAAA,MACd;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,MAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACrC,MAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,QAAA,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,MACvB;AACA,MAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAA;AAAA,IACP,MAAM,SAAA,CAAU,MAAA,KAAW,IAAI,IAAA,GAAO,SAAA,CAAU,KAAK,IAAI;AAAA,GAC3D;AACF;;;ACxDO,IAAM,kBAAN,MAA+D;AAAA,EASpE,WAAA,CACmB,UACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEjB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAAA,EACnD;AAAA,EAJmB,QAAA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EANV,KAAA;AAAA,EAED,QAAA,GAAW,KAAA;AAAA,EASnB,CAAC,MAAA,CAAO,aAAa,CAAA,GAAqD;AACxE,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA,EAEA,OAAO,MAAA,GAA0D;AAC/D,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,IAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,MAAiB,IAAA,IAAQ,cAAA,CAAe,IAAI,CAAA,EAAG;AAC7C,MAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS;AACjC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,UAAU,MAAA,EAAQ;AAC5D,QAAA,MAAM,MAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAAoD;AAClD,IAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO;AAC7B,IAAA,OAAO,IAAI,cAAA,CAA+B;AAAA,MACxC,MAAM,KAAK,UAAA,EAAY;AACrB,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,SAAS,IAAA,EAAK;AAC5C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,UAAA,CAAW,KAAA,EAAM;AAAA,QACnB,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA;AAAA,MACA,MAAM,MAAA,GAAS;AACb,QAAA,MAAM,SAAS,MAAA,EAAO;AAAA,MACxB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAA,GAAwB;AAC5B,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,MAAA,EAAO,EAAG;AACvC,MAAA,IAAI,MAAM,IAAA,KAAS,YAAA,IAAgB,OAAO,KAAA,CAAM,UAAU,QAAA,EAAU;AAClE,QAAA,IAAA,IAAQ,KAAA,CAAM,KAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU7B,MAAM,aAAA,CACJ,OAAA,EACA,QACA,OAAA,EACA,OAAA,GAAgC,EAAC,EACP;AAC1B,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf;AAAA,MACE,IAAI,iBAAA,EAAkB;AAAA,MACtB,IAAA,EAAM,MAAA;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,SAAS;AAAA,KACzC,GACA,OAAA;AAEN,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA;AAAA,MAC/B,MAAA;AAAA,MACA,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,CAAA;AAAA,MACtC;AAAA,QACE,GAAA,EAAK,IAAA;AAAA,QACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS,EAAE,MAAA,EAAQ,mBAAA,EAAoB;AAAA,QACvC,IAAA,EAAM,eAAA,CAAgB,SAAA,EAAW,OAAO;AAAA;AAC1C,KACF;AAEA,IAAA,OAAO,IAAI,eAAA,CAAgB,QAAA,EAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,CACJ,OAAA,EACA,MAAA,EACA,OAAA,GAAoC,EAAC,EACJ;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA;AAAA,MAC/B,KAAA;AAAA,MACA,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,CAAA;AAAA,MACtC;AAAA,QACE,GAAA,EAAK,IAAA;AAAA,QACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS,EAAE,MAAA,EAAQ,mBAAA;AAAoB;AACzC,KACF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAI,eAAA,CAAgB,QAAA,EAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CACJ,OAAA,EACA,MAAA,EACA,OAAA,GAA6B,EAAC,EACJ;AAC1B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,oBAAA,CAAA;AAAA,MACtC;AAAA,QACE,IAAA,EAAM,QAAQ,gBAAA,GACV,EAAE,kBAAkB,OAAA,CAAQ,gBAAA,KAC5B;AAAC;AACP,KACF;AAAA,EACF;AACF;AAEO,SAAS,eAAA,CACd,OAAA,EACA,OAAA,GAAgD,EAAC,EACjD;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,IAClB,QAAA,EAAU,QAAQ,QAAA,IAAY,SAAA;AAAA,IAC9B,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,IAC7C,GAAI,QAAQ,aAAA,GAAgB,EAAE,eAAe,OAAA,CAAQ,aAAA,KAAkB;AAAC,GAC1E;AACF;AAEA,SAAS,iBAAA,GAA4B;AACnC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAA;AAC7B,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,OAAO,UAAU,UAAA,EAAW;AAAA,EAC9B;AACA,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACrE;;;ACzNO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,WAAA,CACmB,MACA,UAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAanB,IAAI,OAAA,EAAqD;AACvD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAsB,kBAAA,EAAoB;AAAA,MACzD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CACJ,OAAA,EACA,WAAA,EACoB;AACpB,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,IAAA,CAAK,IAAI,OAAO,CAAA;AACrC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,iBAAA,CAAkB,EAAA,EAAI;AAAA,MAC3C,GAAG,WAAA;AAAA,MACH,SAAA,EAAW;AAAA,QACT,eAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,WAAA,EAAa,SAAA,IAAa;AAAC;AACjC,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAA,CACJ,KAAA,EACA,QAAA,EAC8C;AAC9C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAK3B,oBAAoB,CAAA;AACtB,IAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC3C,IAAA,OAAO,KAAK,OAAA,EAAS,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,EAC9D;AACF;;;AC7EO,IAAM,YAAA,GAAe;AAAA,EAC1B,UAAA,EAAY,YAAA;AAAA,EACZ,YAAA,EAAc,cAAA;AAAA,EACd,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY;AACd;AA2HO,SAAS,gBAAA,CACd,MAAA,GAA6C,EAAC,EACxB;AACtB,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,UAAA,EAAY,GAAG,MAAA,EAAO;AACpD;AAEO,SAAS,kBAAA,CACd,MAAA,GAA+C,EAAC,EACxB;AACxB,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,YAAA,EAAc,GAAG,MAAA,EAAO;AACtD;AAEO,SAAS,aACd,MAAA,EACkB;AAClB,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,IAAA,EAAK,EAAG;AACtB,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,MAAA,EAAQ,GAAG,MAAA,EAAO;AAChD;AAEA,SAAS,oBAAoB,MAAA,EAA+C;AAC1E,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,IAAA,EAAK,EAAG;AACtB,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO,EAAA,EAAI,IAAA,EAAK,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AAAA,EACF;AACA,EAAA,IAAI,OAAO,MAAA,EAAQ,MAAA,IAAU,OAAO,EAAA,CAAG,IAAA,OAAW,iBAAA,EAAmB;AACnE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAEO,SAAS,cACd,MAAA,EACmB;AACnB,EAAA,mBAAA,CAAoB,MAAM,CAAA;AAC1B,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,OAAA,EAAS,GAAG,MAAA,EAAO;AACjD;AAEA,IAAM,iBAAA,GAAoB,6BAAA;AAC1B,IAAM,WAAA,GAAc,SAAA;AACpB,IAAM,gBAAA,GAAmB,0BAAA;AACzB,IAAM,gBAAA,GAAmB,oBAAA;AAEzB,SAAS,SAAA,CAAU,KAAa,IAAA,EAAsC;AACpE,EAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,GAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AACvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2DAAA,EAA8D,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACvF;AAAA,EACF;AACA,EAAA,OAAO,CAAA,QAAA,EAAW,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA;AACnC;AAOO,IAAM,GAAA,GAAM;AAAA;AAAA,EAEjB,OAAA,EAAS,CAAC,KAAA,EAAA,GAAkB,IAAA,KAC1B,SAAA,CAAU,aAAa,CAAC,KAAA,EAAO,GAAG,IAAI,CAAC,CAAA;AAAA;AAAA,EAEzC,MAAM,CAAC,GAAA,EAAA,GAAgB,IAAA,KACrB,SAAA,CAAU,KAAK,IAAI;AACvB;AAEA,SAAS,WAAA,CAAY,OAAgB,GAAA,EAAuB;AAC1D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACpD,MAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAAA,IACzD;AAAA,EACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/B,IAAA,KAAA,CAAM,QAAQ,CAAC,IAAA,KAAS,WAAA,CAAY,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EAChD,CAAA,MAAA,IAAW,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS,WAAA,CAAY,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EAC/D;AACF;AAGA,SAAS,eAAe,MAAA,EAAgD;AACtE,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,EAAS,EAAA,CAAG,MAAK,IAAK,iBAAA;AAC/C,EAAA,MAAM,gBACJ,SAAA,KAAc,iBAAA,GACV,IAAI,GAAA,CAAA,CAAK,MAAA,CAAO,SAAS,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,IAAA,EAAM,CAAC,CAAA,GAC9D,MAAA;AACN,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAW;AAC5B,IAAA,IAAI,CAAC,iBAAiB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA,CAAK,QAAQ,WAAA,EAAa;AAChE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,UAAA,EAAa,IAAA,CAAK,GAAG,CAAA,qEAAA,EAAwE,WAAW,CAAA,EAAA;AAAA,OAC1G;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,IAAA,CAAK,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACzD;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACtB;AAEA,EAAA,MAAM,OAAA,mBAAU,IAAI,GAAA,CAAY,CAAC,WAAW,CAAC,CAAA;AAC7C,EAAA,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AACpC,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,WAAA,CAAY,CAAC,IAAA,CAAK,GAAA,EAAK,OAAO,IAAA,CAAK,KAAK,GAAG,IAAI,CAAA;AAC/C,IAAA,MAAM,QAAQ,CAAA,MAAA,EAAS,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,IAAQ,QAAQ,CAAC,CAAA,CAAA,CAAA;AACzD,IAAA,KAAA,MAAW,CAAC,GAAA,GAAM,EAAA,EAAI,GAAG,IAAI,KAAK,IAAA,EAAM;AACtC,MAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,GAAA,EAAK,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA;AACjD,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,GACX,GAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,sEAAA,CAAA,GAClB,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,uBAAuB,GAAG,CAAA,0CAAA;AAAA,SAClD;AAAA,MACF;AACA,MAAA,IAAI,GAAA,KAAQ,WAAA,IAAe,aAAA,IAAiB,CAAC,aAAA,CAAc,IAAI,IAAA,CAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AAC7E,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,wBAAwB,IAAA,CAAK,CAAC,KAAK,EAAE,CAAA,2CAAA;AAAA,SACzD;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACpC,CAAC,CAAA;AACH;AAEO,SAAS,eACd,MAAA,EACoB;AACpB,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,IAAA,EAAK,EAAG;AACxB,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,mBAAA,CAAoB,OAAO,OAAO,CAAA;AAAA,EACpC;AACA,EAAA,cAAA,CAAe,MAAM,CAAA;AACrB,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,QAAA,EAAU,GAAG,MAAA,EAAO;AAClD;AAEO,SAAS,YACd,MAAA,EACiB;AACjB,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,IAAA,EAAK,EAAG;AACxB,IAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,IAAA,EAAK,EAAG;AACzB,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,MAAA,CAAO,gBAAgB,IAAA,EAAM;AAC/B,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,KAAA,EAAO,GAAG,MAAA,EAAO;AAC/C;AAsBO,SAAS,iBACd,MAAA,EACsB;AACtB,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,IAAA,EAAK,EAAG;AACxB,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AACA,EAAA,IACE,CAAC,MAAA,CAAO,eAAA,IACR,OAAO,MAAA,CAAO,eAAA,KAAoB,QAAA,IAClC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,eAAe,CAAA,EACpC;AACA,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO;AAAA,IACL,MAAM,YAAA,CAAa,UAAA;AAAA,IACnB,sBAAA,EAAwB,KAAA;AAAA,IACxB,GAAG;AAAA,GACL;AACF;AAGO,SAAS,mBAAmB,MAAA,EAAkC;AACnE,EAAA,IAAI,MAAA,CAAO,KAAA,EAAO,IAAA,EAAK,EAAG;AACxB,IAAA,OAAO,MAAA,CAAO,MAAM,IAAA,EAAK;AAAA,EAC3B;AACA,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAA,CAAG,IAAA,EAAK;AAC1B,EAAA,MAAM,YAAA,GAAe,UAAA;AACrB,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,OAAA,CAAQ,YAAY,CAAA;AAC3C,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA;AAAA,EAChC;AACA,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,kCAAkC,EAAE,CAAA,yBAAA;AAAA,GACtC;AACF;AAGO,SAAS,oBAAoB,OAAA,EAAoC;AACtE,EAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,MAAM,IAAA,EAAK;AAAA,EAC5B;AACA,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,EAAA,CAAG,IAAA,EAAK;AAC3B,EAAA,MAAM,MAAA,GAAS,WAAA;AACf,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,OAAA,CAAQ,MAAM,CAAA;AACrC,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA;AAAA,EAChC;AACA,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,mCAAmC,EAAE,CAAA,yBAAA;AAAA,GACvC;AACF;AAEO,SAAS,iBAAiB,OAAA,EAAoC;AACnE,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,EAAA,CAAG,IAAA,EAAK;AAC3B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK;AAClC,EAAA,IAAI,SAAS,EAAA,CAAG,UAAA,CAAW,CAAA,EAAG,KAAK,GAAG,CAAA,EAAG;AACvC,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,MAAA,GAAS,WAAA;AACf,EAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AACvB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,gBAAgB,MAAA,EAAkC;AAChE,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAA,CAAG,IAAA,EAAK;AAC1B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,EAAO,IAAA,EAAK;AACjC,EAAA,IAAI,SAAS,EAAA,CAAG,UAAA,CAAW,CAAA,EAAG,KAAK,GAAG,CAAA,EAAG;AACvC,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,MAAA,GAAS,UAAA;AACf,EAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AACvB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,EAAA;AACT;;;AC5YO,SAAS,kBAAA,CACd,OAAA,GAA4B,EAAC,EACD;AAC5B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAA,IACzC,QAAA,EAAU,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC5C,WAAA,EAAa,YAAA,CAAa,OAAA,CAAQ,WAAW;AAAA,GAC/C;AACF;AAEO,SAAS,aACd,KAAA,EACoB;AACpB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAM,OAAA,CAAQ,KAAK,IAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAClD;AAEO,SAAS,kBACd,KAAA,EACoB;AACpB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,OAAA,CAAQ,KAAK,CAAA,CACxB,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,WAAW,CAAA,KAAM,GAAG,GAAG,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,CAAA,CACnD,KAAK,GAAG,CAAA;AACb;;;ACTA,SAAS,WACP,IAAA,EACuC;AACvC,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,GAAA,EAAK;AAC7B,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,uBAAA,CACd,KACA,OAAA,EACwB;AACxB,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,MAAM,cAAc,CAAC,GAAI,OAAA,EAAS,WAAA,IAAe,EAAG,CAAA;AAEpD,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,IAAS,EAAC,EAAG;AAClC,IAAA,MAAM,SAAA,GAAY,WAAW,IAAI,CAAA;AACjC,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,YAAA,CAAa,QAAA,EAAU;AAG5C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,YAAA,CAAa,MAAA,EAAQ;AAC1C,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,KAAA,EAAO,mBAAmB,SAAS,CAAA;AAAA,QACnC,QAAA,EAAU,gBAAgB,SAAS,CAAA;AAAA,QACnC,YAAA,EAAc,UAAU,UAAA,EAAY,EAAA;AAAA,QACpC,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,OAAO,SAAA,CAAU;AAAA,OAClB,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,cAAc,GAAA,CAAI,YAAA;AAAA,IAClB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,cAAA,EAAgB,IAAI,YAAA,EAAc,EAAA;AAAA,IAClC,aAAA,EAAe,GAAA,CAAI,WAAA,EACf,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAChB,MAAA,CAAO,CAAC,EAAA,KAAqB,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,IAC3C,WAAA,EAAa,WAAA,CAAY,MAAA,GAAS,WAAA,GAAc,MAAA;AAAA,IAChD,KAAA;AAAA,IACA,aAAA,EAAe;AAAA,GACjB;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAA8C;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,aAAA,EAAe;AAAA,MAC3C,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,SAAiB,OAAA,EAA+D;AAClF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,EAAI;AAAA,MACpD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CACE,MACA,OAAA,EACgB;AAChB,IAAA,MAAM,OAAA,GACJ,UAAU,IAAA,IAAQ,IAAA,CAAK,SAAS,OAAA,GAC5B,uBAAA,CAAwB,IAAA,EAAM,OAAO,CAAA,GACrC,IAAA;AACN,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAY,oBAAA,EAAsB;AAAA,MACjD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF;;;AClGO,SAAS,mBACd,MAAA,EAC4B;AAC5B,EAAA,OAAO,aAAA,IAAiB,MAAA,IAAU,MAAA,CAAO,WAAA,KAAgB,IAAA;AAC3D;AAkDO,SAAS,cAAc,IAAA,EAGqB;AACjD,EAAA,OAAO;AAAA,IACL,aAAa,IAAA,CAAK,YAAA;AAAA,IAClB,GAAI,KAAK,aAAA,KAAkB,MAAA,GACvB,EAAE,YAAA,EAAc,IAAA,CAAK,aAAA,EAAc,GACnC;AAAC,GACP;AACF;AAEO,SAAS,aAAa,IAAA,EAAsC;AACjE,EAAA,IAAI,aAAA,IAAiB,IAAA,IAAQ,IAAA,CAAK,WAAA,EAAa;AAC7C,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA;AAAA,MACb,cAAc,IAAA,CAAK;AAAA,KACrB;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,YAAA;AAAA,IACpB,cAAc,MAAA,CAAO;AAAA,GACvB;AACF;;;AC9EO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,CACmB,MACA,UAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAEjB,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,eAAA,CAAgB,IAAI,CAAA;AAAA,EACrC;AAAA,EAJmB,IAAA;AAAA,EACA,UAAA;AAAA,EAJV,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBT,MAAM,MAAM,KAAA,EAGa;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,KAAwB,iBAAA,EAAmB;AAAA,MACtE,MAAM,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,MACrD,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAChC,IAAA,IAAI,CAAC,kBAAA,CAAmB,MAAM,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,KAAA,EAGG;AACtB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC3B,4BAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM;AAAA,UACJ,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,QACA,QAAA,EAAU;AAAA;AACZ,KACF;AACA,IAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAChC,IAAA,IAAI,kBAAA,CAAmB,MAAM,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,KAAA,EAA+C;AAClE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,KAG1B,4BAAA,EAA8B;AAAA,MAC/B,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,MAC3B,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,MAAA,GAAqB;AAAA,MACzB,aAAa,IAAA,CAAK,YAAA;AAAA,MAClB,cAAc,IAAA,CAAK;AAAA,KACrB;AACA,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,KAAA,EAEX;AACD,IAAA,MAAM,eACJ,KAAA,EAAO,YAAA,IAAiB,MAAM,IAAA,CAAK,UAAA,EAAY,iBAAgB,IAAM,IAAA;AACvE,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC3B,yBAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,EAAE,YAAA,EAAa;AAAA,QACrB,QAAA,EAAU;AAAA;AACZ,KACF;AACA,IAAA,MAAM,MAAA,GAAS,cAAc,IAAI,CAAA;AACjC,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,IAAA,CAAK,WAAW,SAAA,CAAU;AAAA,QAC9B,aAAa,MAAA,CAAO,WAAA;AAAA;AAAA,QAEpB,cAAc,MAAA,CAAO;AAAA,OACtB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,WAAA,EAAY;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,EAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,eAAe,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAM,UAAA,GAA+B;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAA,EAAY,cAAA,EAAe;AACpD,IAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,EACtB;AAAA,EAEA,MAAc,cAAc,MAAA,EAAmC;AAC7D,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,WAAW,SAAA,CAAU;AAAA,MAC9B,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO;AAAA,KACtB,CAAA;AAAA,EACH;AACF;AAWO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,aAAA,GAA+C;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA0B,yBAAA,EAA2B;AAAA,MACpE,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAAA,EAA4B;AACtC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,KAAK,IAAA,CAAK,QAAA;AAAA,MACf,CAAA,cAAA,EAAiB,kBAAA,CAAmB,UAAU,CAAC,CAAA,MAAA;AAAA,KACjD;AAAA,EACF;AACF;;;ACvLO,IAAM,wBAAN,MAA4B;AAAA,EACjC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAoB,qBAAqB,CAAA;AAAA,EAC5D;AACF;;;AC9BO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAAmD;AACtD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAkB,kBAAA,EAAoB;AAAA,MACrD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,cACA,OAAA,EACqB;AACrB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAA,EAAI;AAAA,MACnE,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AACF;;;ACpBO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,eAAA,GAA4C;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAqB,iCAAiC,CAAA;AAAA,EACzE;AACF;;;ACOA,gBAAuB,aACrB,SAAA,EACoC;AACpC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,MAAM,UAAU,IAAI,CAAA;AACjD,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,MAAM,IAAA;AAAA,IACR;AACA,IAAA,IAAI,IAAA,IAAQ,UAAA,CAAW,UAAA,IAAc,IAAA,CAAK,WAAW,CAAA,EAAG;AACtD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,IAAQ,CAAA;AAAA,EACV;AACF;AAMA,gBAAuB,cACrB,UAAA,EACoC;AACpC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI,MAAM,WAAW,MAAM,CAAA;AACrD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,IAAA;AAAA,IACR;AACA,IAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAChB,IAAA,MAAM,SAAA,GACJ,KAAA,CAAM,MAAA,KAAW,CAAA,KAChB,UAAA,CAAW,OAAA,KAAY,MAAA,GACpB,CAAC,UAAA,CAAW,OAAA,GACZ,MAAA,IAAU,UAAA,CAAW,KAAA,CAAA;AAC3B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA;AAAA,IACF;AAAA,EACF;AACF;;;ACIO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,CAAK,OAAA,GAA+B,EAAC,EAA+B;AAClE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAuB,cAAA,EAAgB;AAAA,MACtD,KAAA,EAAO,IAAA,CAAK,oBAAA,CAAqB,OAAO;AAAA,KACzC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,CACE,OAAA,GAA6C,EAAC,EACL;AACzC,IAAA,OAAO,YAAA,CAAqB,OAAO,IAAA,KAAS;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AACnD,MAAA,OAAO,EAAE,MAAM,MAAA,CAAO,IAAA,IAAQ,EAAC,EAAG,UAAA,EAAY,OAAO,UAAA,EAAW;AAAA,IAClE,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,QAAA,EACA,OAAA,GAA6C,EAAC,EAC7B;AACjB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAY,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI;AAAA,MACvD,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,IAAA,EACA,OAAA,GAA6C,EAAC,EAC7B;AACjB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAa,cAAA,EAAgB;AAAA,MAC5C,IAAA,EAAM,IAAA;AAAA,MACN,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,QAAA,EACA,IAAA,EACA,OAAA,GAA6C,EAAC,EAC7B;AACjB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAc,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI;AAAA,MACzD,IAAA,EAAM,IAAA;AAAA,MACN,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,QAAA,EAAoC;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAgB,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,WAAA,CACE,UACA,IAAA,EACkC;AAClC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,gBAAgB,QAAQ,CAAA,MAAA,CAAA;AAAA,MACxB,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,CACE,QAAA,EACA,OAAA,GAA8B,EAAC,EACK;AACpC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,gBAAgB,QAAQ,CAAA,cAAA,CAAA;AAAA,MACxB,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAM;AAAE,KACpC;AAAA,EACF;AAAA;AAAA,EAGA,oBAAoB,QAAA,EAAmD;AACrE,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,gBAAgB,QAAQ,CAAA,kBAAA;AAAA,KAC1B;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,IAAA,EAA0D;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA2B,qBAAA,EAAuB;AAAA,MACjE,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,IAAA,EAAoE;AACzE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,qBAAA;AAAA,MACA,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,kBAAkB,YAAA,EAA+C;AAC/D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,gCAAgC,YAAY,CAAA;AAAA,KAC9C;AAAA,EACF;AAAA,EAEQ,qBACN,OAAA,EAC4B;AAC5B,IAAA,OAAO;AAAA,MACL,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,MAChC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS;AAAA,KAC3C;AAAA,EACF;AACF;;;ACzKO,SAAS,6BACd,GAAA,EAC6B;AAC7B,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,iBAAiB,GAAA,CAAI,eAAA;AAAA,IACrB,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,sBAAA,EAAwB,IAAI,sBAAA,IAA0B,KAAA;AAAA,IACtD,aAAA,EAAe;AAAA,GACjB;AACF;AAEO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAA,CACE,OAAA,GAAiE,EAAC,EAC3C;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAkB,mBAAA,EAAqB;AAAA,MACtD,KAAA,EAAO;AAAA,QACL,iBAAiB,OAAA,CAAQ,eAAA;AAAA,QACzB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS;AAAA;AAC3C,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,EAAA,EAAY,OAAA,GAAiC,EAAC,EAAwB;AACxE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,CAAA,kBAAA,EAAqB,EAAE,CAAA,CAAA,EAAI;AAAA,MAC1D,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,SAAA,CACE,IAAA,EACA,OAAA,GAAiC,EAAC,EACb;AACrB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAA,EAAI;AAAA,MACjE,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aACE,UAAA,EACqB;AACrB,IAAA,MAAM,OAAA,GACJ,UAAU,UAAA,IAAc,UAAA,CAAW,SAAS,YAAA,GACxC,4BAAA,CAA6B,UAAU,CAAA,GACtC,UAAA;AAEP,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAiB,0BAAA,EAA4B;AAAA,MAC5D,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,SAAA,EAAW;AAAA;AACb,KACD,CAAA;AAAA,EACH;AACF;;;ACjGO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,aAAa,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,IAAI,EAAA,EAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,CAAA,YAAA,EAAe,EAAE,CAAA,CAAE,CAAA;AAAA,EACjD;AAAA;AAAA,EAGA,UAAU,IAAA,EAA8B;AACtC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,KAAA,EAA+C;AAC1D,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAY,sBAAsB,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,EACpE;AACF;;;ACQO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,MAAM,MAAM,OAAA,EAEgC;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,EAAwB;AAAA,MAC3C,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAU,SAAA;AAAU,KAC/C,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,MAAA,CACJ,UAAA,EACA,IAAA,EAWC;AACD,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,eAAA,EAAkB,UAAU,CAAA,OAAA,CAAA,EAAW,EAAE,MAAM,CAAA;AAAA,EACvE;AACF;;;AC1BO,IAAM,0BAAN,MAA6E;AAAA,EAGlF,WAAA,CACmB,UACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAFgB,QAAA;AAAA,EACA,OAAA;AAAA,EAJX,QAAA,GAAW,KAAA;AAAA,EAOnB,CAAC,MAAA,CAAO,aAAa,CAAA,GAA2D;AAC9E,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA,EAEA,OAAO,MAAA,GAAgE;AACrE,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,IAC3E;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,IAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,IAAI,CAAA,EAAG;AAC9C,MAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS;AACjC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,QAAA;AAAA,MACF;AACA,MAAA,MAAM;AAAA,QACJ,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AACA,MAAA,IAAI,KAAA,CAAM,KAAA,KAAU,oBAAA,IAAwB,KAAA,CAAM,UAAU,iBAAA,EAAmB;AAC7E,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,mBAAA,CACpB,IAAA,EACA,WAAA,EACA,OAAA,EACkC;AAClC,EAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,KAAA,EAAO,CAAA,gBAAA,EAAmB,WAAW,CAAA,OAAA,CAAA,EAAW;AAAA,IAClF,GAAA,EAAK,IAAA;AAAA,IACL,QAAQ,OAAA,EAAS;AAAA,GAClB,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACxD,IAAA,IAAI,MAAA,GAAkB,IAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,IAAI,cAAA,CAAe;AAAA,MACvB,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,mBAAmB,WAAW,CAAA,OAAA;AAAA,KACrC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAI,uBAAA,CAAwB,QAAA,EAAU,OAAO,CAAA;AACtD;;;ACnGA,IAAM,iBAAA,uBAA6C,GAAA,CAAI;AAAA,EACrD,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAuBM,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAC/C,WAAA,CACW,aACA,SAAA,EACT;AACA,IAAA,KAAA;AAAA,MACE,CAAA,UAAA,EAAa,WAAW,CAAA,uBAAA,EAA0B,SAAS,CAAA,yFAAA;AAAA,KAC7D;AALS,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAKT,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AAAA,EAPW,WAAA;AAAA,EACA,SAAA;AAOb;AA4BO,IAAM,qBAAN,MAAyB;AAAA,EAG9B,WAAA,CACmB,MACA,YAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,YAAA;AAAA,EAJX,YAAA,GAAqC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW7C,OAAA,CACE,YACA,SAAA,EACgC;AAChC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,6BAA6B,UAAU,CAAA,QAAA,CAAA;AAAA,MACvC,EAAE,IAAA,EAAM,EAAE,WAAW,SAAA,IAAa,IAAG;AAAE,KACzC;AAAA,EACF;AAAA;AAAA,EAGA,KAAK,OAAA,EAAkD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,iBAAA,EAAmB;AAAA,MACnD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CACE,aACA,OAAA,EACoB;AACpB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,CAAA,gBAAA,EAAmB,WAAW,CAAA,CAAA,EAAI;AAAA,MAChE,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,WAAA,EAAiD;AACjE,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa;AAAA,MAC5C,SAAA,EAAW;AAAA,QACT,QAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QACA,cAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CACE,aACA,OAAA,EACkC;AAClC,IAAA,OAAO,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa,OAAO,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,aAAA,CACL,WAAA,EACA,OAAA,EACoD;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,aAAa,OAAO,CAAA;AACrD,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,IAAI,KAAA,CAAM,UAAU,oBAAA,EAAsB;AACxC,QAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AACtB,QAAA,MAAM,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAAA,MAC/C,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,KAAU,oBAAA,EAAsB;AAE/C,QAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA;AACxC,QAAA;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,KAAU,iBAAA,EAAmB;AAC5C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,OAAO,MAAM,IAAA,CAAK,OAAA,KAAY,WAC1B,KAAA,CAAM,IAAA,CAAK,OAAA,GACX,CAAA,2BAAA,EAA8B,WAAW,CAAA;AAAA,SAC/C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAA,CACJ,WAAA,EACA,OAAA,GAAoC,EAAC,EACjB;AACpB,IAAA,MAAM;AAAA,MACJ,SAAA,GAAY,KAAK,EAAA,GAAK,GAAA;AAAA,MACtB,cAAA,GAAiB,GAAA;AAAA,MACjB,UAAA,GAAa,GAAA;AAAA,MACb,aAAA,GAAgB,GAAA;AAAA,MAChB,gBAAA,GAAmB,IAAA;AAAA,MACnB,YAAY,EAAC;AAAA,MACb,MAAA;AAAA,MACA,KAAA,GAAQ;AAAA,KACV,GAAI,OAAA;AAEJ,IAAA,MAAM,gBAAgB,KAAA,CAAM,IAAA;AAAA,sBAC1B,IAAI,IAAI,CAAC,QAAA,EAAU,iBAAiB,QAAA,EAAU,GAAG,SAAS,CAAC;AAAA,KAC7D;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,KAAA,GAAQ,cAAA;AAEZ,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAA,EAAQ,cAAA,EAAe;AAEvB,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa;AAAA,QAC5C,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AAEzB,MAAA,IAAI,MAAA,IAAU,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC3C,QAAA,OAAO,SAAA;AAAA,MACT;AACA,MAAA,IAAI,gBAAA,IAAoB,WAAW,aAAA,EAAe;AAChD,QAAA,OAAO,SAAA;AAAA,MACT;AAEA,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,EAAI,GAAI,WAAW,QAAQ,CAAA;AACzD,MAAA,IAAI,OAAA,GAAU,QAAQ,SAAA,EAAW;AAC/B,QAAA,MAAM,IAAI,qBAAA,CAAsB,WAAA,EAAa,SAAS,CAAA;AAAA,MACxD;AAEA,MAAA,MAAM,MAAM,KAAK,CAAA;AACjB,MAAA,QAAA,IAAY,KAAA;AACZ,MAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,aAAA,EAAe,UAAU,CAAA;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,WAAA,CACJ,WAAA,EACA,MAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA;AAAA,MACd,CAAA,yBAAA,EAA4B,WAAW,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA,CAAA;AAAA,MACvD,EAAE,MAAM,MAAA;AAAO,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,WAAA,EACA,MAAA,EACA,IAAA,EAWC;AACD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,gBAAA,EAAmB,WAAW,CAAA,OAAA,EAAU,MAAM,CAAA,UAAA,CAAA;AAAA,MAC9C,EAAE,IAAA;AAAK,KACT;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAAA,EAAkD;AAClE,IAAA,MAAM,IAAA,GAAQ,SAAA,CAAU,aAAA,IAAiB,EAAC;AAC1C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAC1C,IAAA,OAAO;AAAA,MACL,aAAa,SAAA,CAAU,EAAA;AAAA,MACvB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,aAAA,EAAe,UAAU,aAAA,IAAiB,IAAA;AAAA,MAC1C,IAAA,EAAO,UAAuC,IAAA,IAAQ,IAAA;AAAA,MACtD,MAAA,EAAS,UAAyC,MAAA,IAAU,IAAA;AAAA,MAC5D,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,SAAA,EAAW,UAAU,SAAA,IAAa,IAAA;AAAA,MAClC,KAAA;AAAA,MACA,cAAe,SAAA,CAAyC,YAAA;AAAA,MACxD,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,eAAA,EAAiB,oBAAoB,KAAK;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,OAAA,EAC4B;AAC5B,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,aAAa,OAAA,CAAQ,aAAA,IAAiB,EAAE,CAAA;AACjE,IAAA,OAAO;AAAA,MACL,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,MAAA,EAAQ,QAAQ,MAAA,IAAU,MAAA;AAAA,MAC1B,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,KAAA;AAAA,MACA,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,eAAA,EAAiB,oBAAoB,KAAK;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,IAAA,EACkC;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,EAAa;AACxC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AACxB,MAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,KAAK,CAAA;AACpD,MAAA,MAAM,MAAA,GACJ,KAAK,QAAA,IAAY,KAAA,CAAM,QAAQ,GAAA,EAAK,OAAO,CAAA,GACtC,GAAA,CAAK,OAAA,CAAsC,IAAA;AAAA,QAC1C,CAAC,MAAM,CAAA,IAAK,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,OAAO,IAAA,CAAK;AAAA,OACrD,GACA,MAAA;AACN,MAAA,MAAM,OAAA,GACJ,KAAK,SAAA,IAAa,KAAA,CAAM,QAAQ,GAAA,EAAK,QAAQ,CAAA,GACxC,GAAA,CAAK,QAAA,CAAuC,IAAA;AAAA,QAC3C,CAAC,MAAM,CAAA,IAAK,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,OAAO,IAAA,CAAK;AAAA,OACrD,GACA,MAAA;AACN,MAAA,MAAM,OAAA,GACH,OAAO,MAAA,EAAQ,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,OAAA,IAC9C,OAAO,OAAA,EAAS,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,OAAA,IACjD,IAAA;AACF,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,SAAA,EAAW,KAAK,OAAO,CAAA;AACjE,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,UAAA,EAAY,KAAK,OAAA,IAAW,IAAA;AAAA,QAC5B,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAA,GAA8C;AAClD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,YAAA,GAAe,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AAAA,MACnD,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AACF;AAEA,SAAS,oBAAoB,KAAA,EAAwC;AACnE,EAAA,MAAM,MAAM,KAAA,CAAM,SAAA;AAAA,IAChB,CAAC,CAAA,KACC,CAAA,CAAE,MAAA,KAAW,aACb,CAAA,CAAE,MAAA,KAAW,aAAA,IACb,CAAA,CAAE,WAAW,UAAA,IACb,CAAA,CAAE,MAAA,KAAW,SAAA,IACb,EAAE,MAAA,KAAW;AAAA,GACjB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,iBAAA,CACP,OACA,GAAA,EACe;AACf,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK,OAAO,IAAA;AAC3B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACxB,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA,CAAO,MAAM,CAAC,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG,OAAO,IAAA;AACxD,EAAA,OAAO,CAAA,GAAI,CAAA;AACb;AAEA,SAAS,aAAa,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACnYO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,CAAK,OAAA,GAA6C,EAAC,EAAyB;AAC1E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,gBAAA,EAAkB;AAAA,MAClD,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,WAAA,EACA,OAAA,GAA6C,EAAC,EAC1B;AACpB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAA,EAAI;AAAA,MAC/D,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,IAAA,EAAgD;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAgB,kBAAkB,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACnE;AAAA;AAAA,EAGA,MAAA,CAAO,aAAqB,IAAA,EAAgD;AAC1E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAiB,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAA,EAAI;AAAA,MACjE,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,WAAA,EAAuC;AAC5C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAgB,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAE,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,gBAAA,CACE,aACA,IAAA,EACkB;AAClB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,kBAAkB,WAAW,CAAA,iBAAA,CAAA;AAAA,MAC7B,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,WAAA,EAAmD;AAC/D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,kBAAkB,WAAW,CAAA,UAAA;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA,EAGA,gBAAA,CACE,aACA,OAAA,EACiC;AACjC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,eAAA,EAAkB,WAAW,CAAA,WAAA,EAAc,OAAO,CAAA;AAAA,KACpD;AAAA,EACF;AAAA;AAAA,EAGA,mBAAA,CAAoB,aAAqB,OAAA,EAAmC;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,MACf,CAAA,eAAA,EAAkB,WAAW,CAAA,WAAA,EAAc,OAAO,CAAA;AAAA,KACpD;AAAA,EACF;AACF;;;AClCO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,CACE,OAAA,EACA,OAAA,GAAiC,EAAC,EACV;AACxB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,CAAA,YAAA,EAAe,OAAO,CAAA,MAAA,CAAA,EAAU;AAAA,MAClE,KAAA,EAAO;AAAA,QACL,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAA,QACzC,QAAA,EAAU,iBAAA,CAAkB,OAAA,CAAQ,QAAQ;AAAA;AAC9C,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAA,CACE,OAAA,EACA,OAAA,GAAiD,EAAC,EACN;AAC5C,IAAA,OAAO,aAAA,CAAyB,OAAO,MAAA,KAAW;AAChD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,CAAA;AAC9D,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAC;AAAA,QACxB,YAAY,MAAA,CAAO;AAAA,OACrB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,SAAiB,MAAA,EAAwC;AAC3D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA;AAAA,KACxC;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CACE,SACA,IAAA,EAC2B;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAuB,CAAA,YAAA,EAAe,OAAO,CAAA,MAAA,CAAA,EAAU;AAAA,MACtE,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CACE,QAAA,EACA,OAAA,GAAyC,EAAC,EAClB;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,gBAAgB,QAAQ,CAAA,YAAA,CAAA;AAAA,MACxB;AAAA,QACE,KAAA,EAAO;AAAA,UACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS;AAAA;AAC3C;AACF,KACF;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,CACE,QAAA,EACA,OAAA,GAAyD,EAAC,EACd;AAC5C,IAAA,OAAO,aAAA,CAAyB,OAAO,MAAA,KAAW;AAChD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU;AAAA,QAC/C,GAAG,OAAA;AAAA,QACH;AAAA,OACD,CAAA;AACD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAC;AAAA,QACxB,YAAY,MAAA,CAAO;AAAA,OACrB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,UAAA,CACE,SACA,IAAA,EACqC;AACrC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,eAAe,OAAO,CAAA,WAAA,CAAA;AAAA,MACtB,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CACE,OAAA,EACA,MAAA,EACA,IAAA,EACoB;AACpB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAA,MACtC,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CAAO,SAAiB,MAAA,EAA+C;AACrE,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA;AAAA,KACxC;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,CAAU,OAAA,EAAiB,OAAA,GAA8B,EAAC,EAAyB;AACjF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,CAAA,YAAA,EAAe,OAAO,CAAA,YAAA,CAAA,EAAgB;AAAA,MACtE,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA;AAAM,KAC/B,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,cAAc,OAAA,EAAuC;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,CAAA,YAAA,EAAe,OAAO,CAAA,YAAA,CAAc,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,YAAA,CACE,OAAA,EACA,MAAA,EACA,OAAA,GAA+C,EAAC,EACxB;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAA;AAAA,MAC7C,EAAE,OAAO,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO;AAAE,KAC5D;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,CAAgB,SAAiB,UAAA,EAA4C;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,gBAAA,EAAmB,UAAU,CAAA;AAAA,KACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,CACE,OAAA,EACA,KAAA,EACA,OAAA,GAAmD,EAAC,EAC5B;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,eAAe,OAAO,CAAA,aAAA,CAAA;AAAA,MACtB;AAAA,QACE,KAAA,EAAO;AAAA,UACL,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAA,UACzC,QAAA,EAAU,iBAAA,CAAkB,EAAE,MAAA,EAAQ,OAAO;AAAA;AAC/C;AACF,KACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAA,EAA0C;AAC9C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAoB,CAAA,YAAA,EAAe,OAAO,CAAA,YAAA,CAAc,CAAA;AAAA,EAC3E;AAAA;AAAA,EAGA,UAAA,CAAW,SAAiB,MAAA,EAAgD;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,OAAA;AAAA,KACxC;AAAA,EACF;AAAA;AAAA,EAGA,YAAA,CACE,OAAA,EACA,MAAA,EACA,MAAA,EACoB;AACpB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,OAAA,CAAA;AAAA,MACtC,EAAE,IAAA,EAAM,EAAE,MAAA,EAAO;AAAE,KACrB;AAAA,EACF;AAAA;AAAA,EAGA,aAAA,CACE,OAAA,EACA,MAAA,EACA,WAAA,EACoB;AACpB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,CAAA;AAAA,MACtC,EAAE,IAAA,EAAM,EAAE,WAAA,EAAY;AAAE,KAC1B;AAAA,EACF;AAAA;AAAA,EAGA,KAAA,CAAM,SAAiB,MAAA,EAAoC;AACzD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA;AAAA,KACxC;AAAA,EACF;AAAA;AAAA,EAGA,QAAA,CACE,OAAA,EACA,MAAA,EACA,KAAA,EACoB;AACpB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA,CAAA;AAAA,MACtC;AAAA,QACE,IAAA,EAAM;AAAA,UACJ,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,YAAA,EAAc,qBAAA,CAAsB,KAAA,CAAM,YAAY;AAAA;AACxD;AACF,KACF;AAAA,EACF;AACF;AAEA,SAAS,sBACP,KAAA,EACoB;AACpB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACjE;;;ACrRO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAA8C;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,aAAA,EAAe;AAAA,MAC3C,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,SAAiB,OAAA,EAA+D;AAClF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,EAAI;AAAA,MACpD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,IAAA,EAAwC;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAY,eAAe,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAA,CAAO,SAAiB,IAAA,EAAwC;AAC9D,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAAa,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,EAAI,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,OAAO,OAAA,EAAgD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAA6B,CAAA,YAAA,EAAe,OAAO,CAAA,CAAE,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,OAAA,EAAsC;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,CAAA,YAAA,EAAe,OAAO,CAAA,MAAA,CAAQ,CAAA;AAAA,EACjE;AAAA;AAAA,EAGA,SAAS,OAAA,EAAiC;AACxC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAa,CAAA,YAAA,EAAe,OAAO,CAAA,SAAA,CAAW,CAAA;AAAA,EACjE;AAAA;AAAA,EAGA,WAAW,OAAA,EAAiC;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAa,CAAA,YAAA,EAAe,OAAO,CAAA,WAAA,CAAa,CAAA;AAAA,EACnE;AACF;;;AClBA,SAAS,qBAAqB,KAAA,EAA6C;AACzE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,MAA6B,IAAA,KAAS,UAAA;AAE3C;AAEA,SAAS,mBAAmB,KAAA,EAA2C;AACrE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,MAA2B,IAAA,KAAS,QAAA;AAEzC;AAEA,SAAS,mBACP,IAAA,EACc;AACd,EAAA,IAAI,OAAA,IAAW,QAAQ,UAAA,IAAc,IAAA,IAAQ,EAAE,KAAA,IAAS,IAAA,CAAA,IAAS,EAAE,MAAA,IAAU,IAAA,CAAA,EAAO;AAClF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,kBAAA,CAAmB,IAAI,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,mBAAmB,IAAI,CAAA;AAAA,MAC9B,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,MAC9B,GAAI,IAAA,CAAK,UAAA,EAAY,EAAA,GAAK,EAAE,cAAc,IAAA,CAAK,UAAA,CAAW,EAAA,EAAG,GAAI,EAAC;AAAA,MAClE,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU,EAAC;AAAA,MAC1C,GAAI,KAAK,IAAA,GAAO,EAAE,MAAM,IAAA,CAAK,IAAA,KAAS;AAAC,KACzC;AAAA,EACF;AACA,EAAA,MAAM,MAAO,IAAA,CAAgC,GAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,GAAI,GAAA,CAAI,KAAA,IAAS,EAAC;AAAA,IAClB,GAAK,IAAA,CAAgC,KAAA,IAAS;AAAC,GACjD;AACA,EAAA,MAAM,MAAO,IAAA,CAAgC,GAAA;AAC7C,EAAA,OAAO;AAAA,IACL,GAAI,GAAA,GAAM,EAAE,GAAA,KAAQ,EAAC;AAAA,IACrB,KAAA,EAAO,mBAAmB,GAAG,CAAA;AAAA,IAC7B,QAAA,EAAU,gBAAgB,GAAG,CAAA;AAAA,IAC7B,GAAI,GAAA,CAAI,UAAA,EAAY,EAAA,GAAK,EAAE,cAAc,GAAA,CAAI,UAAA,CAAW,EAAA,EAAG,GAAI,EAAC;AAAA,IAChE,GAAI,OAAO,IAAA,CAAK,KAAK,EAAE,MAAA,GAAS,EAAE,KAAA,EAAM,GAAI,EAAC;AAAA,IAC7C,GAAM,IAAA,CAAgC,IAAA,IAAQ,GAAA,CAAI,IAAA,GAC9C,EAAE,IAAA,EAAO,IAAA,CAAgC,IAAA,IAAQ,GAAA,CAAI,IAAA,EAAK,GAC1D;AAAC,GACP;AACF;AAEA,SAAS,uBAAuB,KAAA,EAAuC;AACrE,EAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAE/B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,kBAAkB,CAAA;AAAA,MACzC,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM;AAAA,KAC5B;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAQ,CAAC,CAAA,EAAE;AAAA,EACjE;AACA,EAAA,OAAO,KAAA;AACT;AAKO,IAAM,eAAN,MAAmB;AAAA,EACxB,WAAA,CACmB,MACA,UAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnB,MAAM,KAAA,EAAgD;AACpD,IAAA,MAAM,OAAA,GAAU,uBAAuB,KAAK,CAAA;AAC5C,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,EAAO,MAAA,EAAQ;AAC1B,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAsB,WAAA,EAAa;AAAA,MAClD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAA,CACJ,KAAA,EACA,WAAA,EACoB;AACpB,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AACrC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,iBAAA,CAAkB,EAAA,EAAI;AAAA,MAC3C,GAAG,WAAA;AAAA,MACH,SAAA,EAAW;AAAA,QACT,eAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,WAAA,EAAa,SAAA,IAAa;AAAC;AACjC,KACD,CAAA;AAAA,EACH;AACF;;;ACrEO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAwB,iBAAiB,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGA,IAAI,WAAA,EAAyC;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,CAAA,gBAAA,EAAmB,WAAW,CAAA,CAAE,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,CACE,WACA,IAAA,EACgC;AAChC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,4BAA4B,SAAS,CAAA,OAAA,CAAA;AAAA,MACrC,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AACF;;;ACjFO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAAqD;AACxD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAoB,YAAA,EAAc;AAAA,MACjD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,QAAgB,OAAA,EAA8D;AAChF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,EAAI;AAAA,MACjD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,OAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,CAAA,YAAA,EAAe,OAAO,CAAA,MAAA,CAAA,EAAU;AAAA,MAC1D,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,MAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAY,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,EAAI;AAAA,MACnD,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,MAAA,EAAsC;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAoB,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QACE,OAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,GAAgD,EAAC,EAClB;AAC/B,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf;AAAA,MACE,IAAIA,kBAAAA,EAAkB;AAAA,MACtB,IAAA,EAAM,MAAA;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,SAAS;AAAA,KACzC,GACA,OAAA;AAEN,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,QAAA,CAAA;AAAA,MACtC,EAAE,IAAA,EAAM,eAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AAAE,KAC9C;AAAA,EACF;AACF;AAEA,SAASA,kBAAAA,GAA4B;AACnC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAA;AAC7B,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,OAAO,UAAU,UAAA,EAAW;AAAA,EAC9B;AACA,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACrE;;;ACxFO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAAiD;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,gBAAA,EAAkB;AAAA,MACjD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,YACA,OAAA,EACmB;AACnB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAc,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,EAAI;AAAA,MAC7D,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,IAAA,EAA8C;AACnD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAe,kBAAkB,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,MAAA,CAAO,YAAoB,IAAA,EAA8C;AACvE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAgB,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,EAAI;AAAA,MAC/D,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,UAAA,EAAsC;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAgB,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAE,CAAA;AAAA,EACjE;AACF;;;ACnCO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,oBAAoB,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CACE,KAAA,EACA,YAAA,EACA,KAAA,EACkB;AAClB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,mBAAA,EAAsB,KAAK,CAAA,aAAA,EAAgB,YAAY,CAAA,QAAA,CAAA;AAAA,MACvD,EAAE,MAAM,KAAA;AAAM,KAChB;AAAA,EACF;AACF;;;ACqBA,SAAS,qBACP,OAAA,EAC4B;AAC5B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,iBAAiB,OAAO,CAAA;AAAA,IACnC,KAAA,EAAO,oBAAoB,OAAO,CAAA;AAAA,IAClC,GAAI,OAAA,CAAQ,UAAA,EAAY,EAAA,GAAK,EAAE,cAAc,OAAA,CAAQ,UAAA,CAAW,EAAA,EAAG,GAAI,EAAC;AAAA,IACxE,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,IAChD,GAAI,QAAQ,MAAA,EAAQ,MAAA,GAAS,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,IAC3D,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,IAC7C,GAAI,QAAQ,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB;AAAC,GACpE;AACF;AAEA,SAAS,kBACP,IAAA,EACyB;AACzB,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,EAAA,OAAO;AAAA,IACL,GAAI,KAAK,GAAA,GAAM,EAAE,KAAK,IAAA,CAAK,GAAA,KAAQ,EAAC;AAAA,IACpC,KAAA,EAAO,mBAAmB,GAAG,CAAA;AAAA,IAC7B,QAAA,EAAU,gBAAgB,GAAG,CAAA;AAAA,IAC7B,YAAA,EAAc,IAAI,UAAA,EAAY,EAAA;AAAA,IAC9B,KAAA,EAAO;AAAA,MACL,GAAI,GAAA,CAAI,KAAA,IAAS,EAAC;AAAA,MAClB,GAAI,IAAA,CAAK,KAAA,IAAS;AAAC,KACrB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,GAAA,CAAI,IAAA;AAAA,IACvB,aAAa,GAAA,CAAI;AAAA,GACnB;AACF;AAEO,SAAS,2BACd,GAAA,EAC2B;AAC3B,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,GAAI,GAAA,CAAI,OAAA,GAAU,EAAE,OAAA,EAAS,qBAAqB,GAAA,CAAI,OAAO,CAAA,EAAE,GAAI,EAAC;AAAA,IACpE,aAAA,EAAe,IAAA;AAAA,IACf,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,iBAAiB;AAAA,GACxC;AACF;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,WAAA,CACmB,MACA,UAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAInB,KAAK,OAAA,EAAiD;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,gBAAA,EAAkB;AAAA,MACjD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CACE,YACA,OAAA,EACmB;AACnB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAc,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,EAAI;AAAA,MAC7D,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aACE,IAAA,EACmB;AACnB,IAAA,MAAM,OAAA,GACJ,UAAU,IAAA,IAAQ,IAAA,CAAK,SAAS,UAAA,GAC5B,0BAAA,CAA2B,IAAI,CAAA,GAC/B,IAAA;AACN,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAe,uBAAA,EAAyB;AAAA,MACvD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,CACE,YACA,MAAA,EACgC;AAChC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,UAAA,EAAY,MAAM,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CACJ,UAAA,EACA,MAAA,EACA,WAAA,EACoB;AACpB,IAAA,MAAM,EAAE,IAAG,GAAI,MAAM,KAAK,UAAA,CAAW,OAAA,CAAQ,YAAY,MAAM,CAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,iBAAA,CAAkB,EAAA,EAAI,WAAW,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,CACE,YACA,OAAA,EAC8C;AAC9C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,2BAA2B,UAAU,CAAA,CAAA;AAAA,MACrC,EAAE,IAAA,EAAM,OAAA,IAAW,EAAC;AAAE,KACxB;AAAA,EACF;AACF;;;AC/IO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAEf,IAAA;AAAA;AAAA,EAGA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAEA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EAET,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,OAAO,CAAA;AAElC,IAAA,IAAA,CAAK,OAAO,IAAI,YAAA,CAAa,KAAK,IAAA,EAAM,IAAA,CAAK,KAAK,UAAU,CAAA;AAC5D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AACtD,IAAA,IAAA,CAAK,aAAa,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAA,EAAM,KAAK,YAAY,CAAA;AACrE,IAAA,IAAA,CAAK,UAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,KAAK,UAAU,CAAA;AAC7D,IAAA,IAAA,CAAK,OAAO,IAAI,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,KAAK,UAAU,CAAA;AACvD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,YAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,KAAK,UAAU,CAAA;AACjE,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAAA,EAClD;AACF;;;ACnFO,SAAS,uBACd,OAAA,EACY;AACZ,EAAA,IAAI,WAAA,GAA6B,SAAS,WAAA,IAAe,IAAA;AACzD,EAAA,IAAI,YAAA,GAA8B,SAAS,YAAA,IAAgB,IAAA;AAE3D,EAAA,OAAO;AAAA,IACL,gBAAgB,MAAM,WAAA;AAAA,IACtB,iBAAiB,MAAM,YAAA;AAAA,IACvB,SAAA,EAAW,CAAC,MAAA,KAAW;AACrB,MAAA,WAAA,GAAc,MAAA,CAAO,WAAA;AACrB,MAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAW;AACrC,QAAA,YAAA,GAAe,MAAA,CAAO,YAAA;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAAA,GACF;AACF;AAoBO,SAAS,4BAAA,CACd,OAAA,GAAyC,EAAC,EAC9B;AACZ,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,aAAA;AACjD,EAAA,MAAM,eAAA,GAAkB,QAAQ,eAAA,IAAmB,cAAA;AACnD,EAAA,MAAM,UACJ,OAAA,CAAQ,OAAA,KACP,OAAO,UAAA,KAAe,WAAA,GAClB,WAA0C,YAAA,GAC3C,MAAA,CAAA;AAEN,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AAAA,IACpD,eAAA,EAAiB,MAAM,OAAA,CAAQ,OAAA,CAAQ,eAAe,CAAA;AAAA,IACtD,SAAA,EAAW,CAAC,MAAA,KAAW;AACrB,MAAA,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,MAAA,CAAO,WAAW,CAAA;AAClD,MAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAW;AACrC,QAAA,OAAA,CAAQ,OAAA,CAAQ,eAAA,EAAiB,MAAA,CAAO,YAAY,CAAA;AAAA,MACtD;AAAA,IACF,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,WAAW,cAAc,CAAA;AACjC,MAAA,OAAA,CAAQ,WAAW,eAAe,CAAA;AAAA,IACpC;AAAA,GACF;AACF;;;ACxDO,SAAS,oBACd,OAAA,EACc;AACd,EAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,UAAA,IAAc,4BAAA,EAA6B;AACrD,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,UAAA;AAAA,IACA,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,IACpC,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AACH;AA2BO,SAAS,mBACd,OAAA,EACc;AACd,EAAA,IAAI,CAAC,QAAQ,MAAA,IAAU,CAAC,QAAQ,WAAA,IAAe,CAAC,QAAQ,UAAA,EAAY;AAClE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AACH","file":"index.js","sourcesContent":["/** Prefix of Lunnoa Automate machine (service-account) API keys. */\nexport const API_KEY_PREFIX = 'lna_';\n\n/** Returns true when running inside a browser (or browser-like) environment. */\nexport function isBrowserEnvironment(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * API keys are operator credentials (CLI, codegen, deploy). Shipping one to a\n * browser exposes the whole workspace the key is scoped to, so the SDK refuses.\n *\n * Apps authenticate end users with a Lunnoa user JWT.\n */\nexport function assertApiKeyAllowedInEnvironment(apiKey: string): void {\n if (isBrowserEnvironment()) {\n throw new Error(\n 'Refusing to use a Lunnoa API key (lna_...) in a browser environment. ' +\n 'API keys are for the CLI and operator scripts, not for app login. ' +\n 'Anyone opening dev tools could read the key and act as the service account across its whole workspace. ' +\n 'Sign the end user in with lunnoa.auth.login and pass their JWT as `accessToken`.',\n );\n }\n if (!apiKey.startsWith(API_KEY_PREFIX)) {\n throw new Error(\n `Invalid Lunnoa API key: expected it to start with \"${API_KEY_PREFIX}\". ` +\n 'If you are passing a user JWT, use the `accessToken` option instead of `apiKey`.',\n );\n }\n}\n","/** Error thrown for every non-2xx response from a Lunnoa Automate deployment. */\nexport class LunnoaApiError extends Error {\n /** HTTP status code of the failed response. */\n readonly status: number;\n /** Parsed JSON error body when the server returned one, otherwise the raw text. */\n readonly body: unknown;\n /** HTTP method of the failed request. */\n readonly method: string;\n /** Path of the failed request (without the base URL). */\n readonly path: string;\n\n constructor(args: {\n status: number;\n body: unknown;\n method: string;\n path: string;\n }) {\n const detail = extractMessage(args.body);\n super(\n `Lunnoa API request failed: ${args.method} ${args.path} → ${args.status}${detail ? ` (${detail})` : ''}`,\n );\n this.name = 'LunnoaApiError';\n this.status = args.status;\n this.body = args.body;\n this.method = args.method;\n this.path = args.path;\n }\n\n /** True for 401 responses (missing, revoked, or expired credential). */\n get isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n /** True for 403 responses (missing permission or feature not licensed). */\n get isForbidden(): boolean {\n return this.status === 403;\n }\n\n /** True for 404 responses. */\n get isNotFound(): boolean {\n return this.status === 404;\n }\n\n /** True for 429 responses (rate limited). */\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === 'object') {\n const record = body as Record<string, unknown>;\n const candidate = record.message ?? record.error;\n if (typeof candidate === 'string') {\n return candidate;\n }\n if (Array.isArray(candidate)) {\n return candidate.filter((m) => typeof m === 'string').join('; ');\n }\n }\n if (typeof body === 'string' && body.length > 0 && body.length < 300) {\n return body;\n }\n return undefined;\n}\n","import { API_KEY_PREFIX, assertApiKeyAllowedInEnvironment } from './auth';\nimport { LunnoaApiError } from './errors';\nimport type { TokenStore } from '../auth/token-store';\n\nexport type FetchLike = (\n input: string | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface LunnoaClientOptions {\n /**\n * Base URL of the Lunnoa Automate deployment, e.g. `https://lunnoa.acme.example`.\n * Paths are appended under `/api/*`.\n */\n baseUrl: string;\n /**\n * Machine credential (`lna_...`) for the CLI and operator scripts, not for app login.\n * Never usable in browsers: the constructor throws if one is supplied while `window` exists.\n */\n apiKey?: string;\n /**\n * User JWT obtained from login / SSO. The supported credential for browser\n * applications. May be a function so refreshed tokens are picked up per request.\n *\n * Prefer {@link tokenStore} so login/refresh can persist tokens\n * and optionally auto-refresh on 401.\n */\n accessToken?: string | (() => string | Promise<string>);\n /**\n * Optional JWT store for a signed-in Lunnoa user. When set, authenticated requests read\n * the access token from the store. Login / refresh helpers write back into it.\n */\n tokenStore?: TokenStore;\n /**\n * When true (default if `tokenStore` is set), a 401 triggers one\n * `POST /api/auth/refresh-token` attempt using the stored refresh token,\n * then retries the original request.\n */\n autoRefresh?: boolean;\n /** Custom fetch implementation (testing, polyfills, interceptors). */\n fetch?: FetchLike;\n /** Extra headers sent with every request. */\n headers?: Record<string, string>;\n}\n\nexport type QueryValue = string | number | boolean | undefined | null;\n\nexport interface RequestOptions {\n query?: Record<string, QueryValue>;\n body?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n /**\n * Return the raw Response instead of parsing JSON. Used by the streaming\n * module and endpoints that may legitimately return 204.\n */\n raw?: boolean;\n /**\n * Skip the Authorization header. Used for public auth endpoints\n * (login, refresh, SSO providers).\n */\n skipAuth?: boolean;\n /** Internal: set after an auto-refresh retry so we do not loop. */\n _retriedAfterRefresh?: boolean;\n}\n\n/**\n * Minimal typed HTTP layer shared by every resource namespace. Handles auth\n * header resolution, query serialisation, JSON parsing, and error mapping.\n */\nexport class HttpClient {\n readonly baseUrl: string;\n readonly tokenStore?: TokenStore;\n /** Underlying fetch (shared with AI SDK transports when needed). */\n readonly fetch: FetchLike;\n private readonly apiKey?: string;\n private readonly accessToken?: string | (() => string | Promise<string>);\n private readonly autoRefresh: boolean;\n private readonly defaultHeaders: Record<string, string>;\n private refreshInFlight: Promise<boolean> | null = null;\n\n constructor(options: LunnoaClientOptions) {\n if (!options.baseUrl) {\n throw new Error('LunnoaClient requires a baseUrl.');\n }\n if (!options.apiKey && !options.accessToken && !options.tokenStore) {\n throw new Error(\n 'LunnoaClient requires an accessToken or tokenStore (Lunnoa user JWT), or an apiKey for operator scripts.',\n );\n }\n if (options.apiKey) {\n assertApiKeyAllowedInEnvironment(options.apiKey);\n }\n if (\n typeof options.accessToken === 'string' &&\n options.accessToken.startsWith(API_KEY_PREFIX)\n ) {\n throw new Error(\n 'The accessToken option received an lna_ API key. API keys must be passed as `apiKey` ' +\n '(and never in a browser); accessToken is for user JWTs only.',\n );\n }\n\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.accessToken = options.accessToken;\n this.tokenStore = options.tokenStore;\n this.autoRefresh =\n options.autoRefresh ?? Boolean(options.tokenStore && !options.apiKey);\n this.fetch =\n options.fetch ?? (globalThis.fetch.bind(globalThis) as FetchLike);\n this.defaultHeaders = options.headers ?? {};\n }\n\n async resolveAuthHeader(): Promise<string> {\n if (this.apiKey) {\n return `Bearer ${this.apiKey}`;\n }\n if (this.tokenStore) {\n const fromStore = await this.tokenStore.getAccessToken();\n if (!fromStore) {\n throw new Error(\n 'No access token in the token store. Call lunnoa.auth.login(...) first, ' +\n 'or seed the store with setTokens / createMemoryTokenStore({ accessToken }).',\n );\n }\n return `Bearer ${fromStore}`;\n }\n const token =\n typeof this.accessToken === 'function'\n ? await this.accessToken()\n : this.accessToken;\n if (!token) {\n throw new Error('accessToken resolved to an empty value.');\n }\n return `Bearer ${token}`;\n }\n\n buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(this.baseUrl + path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions & { raw: true },\n ): Promise<Response>;\n async request<T>(\n method: string,\n path: string,\n options?: RequestOptions,\n ): Promise<T>;\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T | Response> {\n const url = this.buildUrl(path, options.query);\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...options.headers,\n };\n\n if (!options.skipAuth) {\n headers.Authorization = await this.resolveAuthHeader();\n }\n\n const init: RequestInit = { method, headers, signal: options.signal };\n if (options.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n\n const response = await this.fetch(url, init);\n\n if (\n !response.ok &&\n response.status === 401 &&\n !options.skipAuth &&\n !options._retriedAfterRefresh &&\n this.autoRefresh &&\n this.tokenStore &&\n !this.apiKey\n ) {\n const refreshed = await this.tryRefreshAccessToken();\n if (refreshed) {\n return this.request<T>(method, path, {\n ...options,\n _retriedAfterRefresh: true,\n });\n }\n }\n\n if (!response.ok) {\n const body = await parseBodySafely(response);\n throw new LunnoaApiError({\n status: response.status,\n body,\n method,\n path,\n });\n }\n\n if (options.raw) {\n return response;\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await parseBodySafely(response)) as T;\n }\n\n get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, options);\n }\n\n post<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, options);\n }\n\n patch<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, options);\n }\n\n put<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, options);\n }\n\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, options);\n }\n\n /**\n * Single-flight refresh using the token store. Returns false when refresh\n * is impossible or fails (store is cleared on failure).\n */\n async tryRefreshAccessToken(): Promise<boolean> {\n if (!this.tokenStore) {\n return false;\n }\n if (!this.refreshInFlight) {\n this.refreshInFlight = this.performRefresh().finally(() => {\n this.refreshInFlight = null;\n });\n }\n return this.refreshInFlight;\n }\n\n private async performRefresh(): Promise<boolean> {\n const refreshToken = await this.tokenStore!.getRefreshToken();\n if (!refreshToken) {\n return false;\n }\n\n try {\n const url = this.buildUrl('/api/auth/refresh-token');\n const response = await this.fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken }),\n });\n if (!response.ok) {\n await this.tokenStore!.clear();\n return false;\n }\n const body = (await parseBodySafely(response)) as {\n access_token?: string;\n };\n if (!body?.access_token) {\n await this.tokenStore!.clear();\n return false;\n }\n await this.tokenStore!.setTokens({ accessToken: body.access_token });\n return true;\n } catch {\n await this.tokenStore!.clear();\n return false;\n }\n }\n}\n\nasync function parseBodySafely(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) {\n return undefined;\n }\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","/**\n * Minimal Server-Sent Events parser.\n *\n * Takes the byte stream of a `text/event-stream` response and yields the\n * `data:` payload of each event. Comment lines (keep-alive `:` pings sent by\n * the Lunnoa server every 15s) and other fields are ignored. Multi-line\n * `data:` fields are joined with `\\n` per the SSE specification.\n */\nexport async function* parseSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<string, void, undefined> {\n for await (const event of parseSseEvents(stream)) {\n if (event.data !== null) {\n yield event.data;\n }\n }\n}\n\nexport interface SseEvent {\n /** SSE `event:` field, or `\"message\"` when omitted. */\n event: string;\n /** Joined `data:` payload, or null when the frame had no data lines. */\n data: string | null;\n}\n\n/**\n * Like {@link parseSseStream}, but preserves the SSE event name.\n * Used by execution progress streams (`execution.progress`, `loop.progress`, …).\n */\nexport async function* parseSseEvents(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseEvent, void, undefined> {\n const reader = stream.getReader();\n const decoder = new TextDecoder('utf-8', { fatal: false });\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n\n // Events are separated by a blank line. Normalise CRLF first.\n buffer = buffer.replace(/\\r\\n/g, '\\n');\n let boundary = buffer.indexOf('\\n\\n');\n while (boundary !== -1) {\n const rawEvent = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf('\\n\\n');\n\n const parsed = extractEvent(rawEvent);\n if (parsed.data !== null || parsed.event !== 'message') {\n yield parsed;\n }\n }\n }\n\n // Flush a trailing event without a final blank line (lenient).\n const remaining = buffer.trim();\n if (remaining) {\n const parsed = extractEvent(remaining);\n if (parsed.data !== null || parsed.event !== 'message') {\n yield parsed;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractEvent(rawEvent: string): SseEvent {\n const dataLines: string[] = [];\n let eventName = 'message';\n\n for (const line of rawEvent.split('\\n')) {\n if (line.startsWith(':')) {\n continue; // SSE comment (keep-alive)\n }\n if (line.startsWith('event:')) {\n let value = line.slice('event:'.length);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n if (value) {\n eventName = value;\n }\n continue;\n }\n if (line.startsWith('data:')) {\n let value = line.slice('data:'.length);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n dataLines.push(value);\n }\n }\n\n return {\n event: eventName,\n data: dataLines.length === 0 ? null : dataLines.join('\\n'),\n };\n}\n","import type { UIMessage, UIMessageChunk } from 'ai';\n\nimport type { HttpClient } from '../core/http';\nimport { parseSseStream } from './sse';\n\nexport type ChatMode = 'builder' | 'preview';\n\nexport interface StreamMessageOptions {\n /**\n * Agent chat mode. Defaults to `preview` (10 model rounds, a normal agent run).\n * `builder` is the agent-editor interview and stops after 4 rounds.\n */\n chatMode?: ChatMode;\n /** Optional image attachment forwarded with this turn. */\n data?: { imageUrl?: string };\n /**\n * Answer to an ask-before-sending personal-data prompt.\n * Applies to this message only.\n */\n piiResolution?: 'anonymize' | 'fallback';\n /** Abort the stream (closes the HTTP connection; the run keeps going server-side — call `stop` to cancel it). */\n signal?: AbortSignal;\n}\n\nexport interface StopStreamOptions {\n /**\n * Partial assistant message (AI SDK UIMessage) received so far; the server\n * persists it so the partial turn is not lost.\n */\n assistantMessage?: UIMessage;\n}\n\n/**\n * An in-flight agent chat turn, exposed as an async iterable of AI SDK\n * `UIMessageChunk`s (`text-delta`, `tool-*`, `finish`, ...).\n *\n * ```ts\n * const stream = await client.agentChat.streamMessage(agentId, taskId, message);\n * for await (const chunk of stream) {\n * if (chunk.type === 'text-delta') process.stdout.write(chunk.delta);\n * }\n * ```\n *\n * Use {@link AgentChatStream.toUIMessageStream} with the AI SDK's\n * `readUIMessageStream` to consume assembled `UIMessage` snapshots instead of\n * raw chunks.\n */\nexport class AgentChatStream implements AsyncIterable<UIMessageChunk> {\n /**\n * Server run id of this turn (`X-Task-Run-Id` response header), when\n * provided. Useful for diagnostics.\n */\n readonly runId: string | null;\n\n private consumed = false;\n\n constructor(\n private readonly response: Response,\n private readonly options?: { signal?: AbortSignal },\n ) {\n this.runId = response.headers.get('X-Task-Run-Id');\n }\n\n [Symbol.asyncIterator](): AsyncGenerator<UIMessageChunk, void, undefined> {\n return this.chunks();\n }\n\n async *chunks(): AsyncGenerator<UIMessageChunk, void, undefined> {\n if (this.consumed) {\n throw new Error('This AgentChatStream has already been consumed.');\n }\n this.consumed = true;\n\n const body = this.response.body;\n if (!body) {\n return;\n }\n\n for await (const data of parseSseStream(body)) {\n if (this.options?.signal?.aborted) {\n return;\n }\n if (data === '[DONE]') {\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n continue; // Skip malformed events rather than killing the stream.\n }\n if (parsed && typeof parsed === 'object' && 'type' in parsed) {\n yield parsed as UIMessageChunk;\n }\n }\n }\n\n /**\n * The same chunks as a web `ReadableStream`, ready for the AI SDK's\n * `readUIMessageStream({ stream })` to assemble into `UIMessage` snapshots.\n */\n toUIMessageStream(): ReadableStream<UIMessageChunk> {\n const iterator = this.chunks();\n return new ReadableStream<UIMessageChunk>({\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iterator.return();\n },\n });\n }\n\n /** Collects the full text of the turn (concatenated `text-delta` chunks). */\n async text(): Promise<string> {\n let text = '';\n for await (const chunk of this.chunks()) {\n if (chunk.type === 'text-delta' && typeof chunk.delta === 'string') {\n text += chunk.delta;\n }\n }\n return text;\n }\n}\n\n/**\n * Hand-written client for the Agent Runtime SSE endpoints\n * (`POST/GET /api/agents/:agentId/tasks/:taskId/stream-message` and `/stop`).\n * Code generators handle SSE poorly, so this module wraps the wire protocol\n * the bundled UI uses (AI SDK UIMessage chunks, SSE-framed, resumable).\n */\nexport class AgentChatClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Sends a user message to an agent task and streams the assistant turn.\n * Creates the task row when `taskId` does not exist yet (client-generated\n * UUIDs are supported, mirroring the bundled UI).\n *\n * `message` may be a plain string (wrapped into a UIMessage) or a full AI\n * SDK `UIMessage`.\n */\n async streamMessage(\n agentId: string,\n taskId: string,\n message: string | UIMessage,\n options: StreamMessageOptions = {},\n ): Promise<AgentChatStream> {\n const uiMessage: UIMessage =\n typeof message === 'string'\n ? {\n id: generateMessageId(),\n role: 'user',\n parts: [{ type: 'text', text: message }],\n }\n : message;\n\n const response = await this.http.request<Response>(\n 'POST',\n `/api/agents/${agentId}/tasks/${taskId}/stream-message`,\n {\n raw: true,\n signal: options.signal,\n headers: { Accept: 'text/event-stream' },\n body: messageTaskBody(uiMessage, options),\n },\n );\n\n return new AgentChatStream(response, { signal: options.signal });\n }\n\n /**\n * Reattaches to an in-flight agent turn after a disconnect (the resumable\n * stream replays from the beginning of the turn). Returns `null` when\n * there is no active stream to resume (server responds 204).\n */\n async resumeStream(\n agentId: string,\n taskId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<AgentChatStream | null> {\n const response = await this.http.request<Response>(\n 'GET',\n `/api/agents/${agentId}/tasks/${taskId}/stream-message`,\n {\n raw: true,\n signal: options.signal,\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (response.status === 204) {\n return null;\n }\n return new AgentChatStream(response, { signal: options.signal });\n }\n\n /**\n * Requests cancellation of the active agent turn for a task. Idempotent:\n * succeeds even when no stream is active. Optionally persists the partial\n * assistant message received so far.\n */\n async stop(\n agentId: string,\n taskId: string,\n options: StopStreamOptions = {},\n ): Promise<{ ok: boolean }> {\n return this.http.post<{ ok: boolean }>(\n `/api/agents/${agentId}/tasks/${taskId}/stream-message/stop`,\n {\n body: options.assistantMessage\n ? { assistantMessage: options.assistantMessage }\n : {},\n },\n );\n }\n}\n\nexport function messageTaskBody(\n message: UIMessage,\n options: Omit<StreamMessageOptions, 'signal'> = {},\n) {\n return {\n messages: [message],\n chatMode: options.chatMode ?? 'preview',\n ...(options.data ? { data: options.data } : {}),\n ...(options.piiResolution ? { piiResolution: options.piiResolution } : {}),\n };\n}\n\nfunction generateMessageId(): string {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n","import type { HttpClient } from '../core/http';\nimport type { Execution, RunActionResult } from '../types';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface RunActionOptions {\n /** Workflow app id (catalogue slug), e.g. `http`, `gmail`. */\n appId: string;\n /** Action id within the app, e.g. `http_action_send-request`. */\n actionId: string;\n /**\n * Connection instance UUID (`Connection.id`). Required when the action needs\n * a connection and the workspace has more than one for the app. When omitted\n * and exactly one connection exists, the platform uses that connection.\n */\n connectionId?: string;\n /** Action input fields (keys from the action `inputConfig`). */\n input?: Record<string, unknown>;\n /** Optional display name for the ad-hoc Execution. */\n name?: string;\n}\n\nexport class ActionsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /**\n * Run a single catalogue action as a one-step ad-hoc Execution (`source: SDK`).\n *\n * The platform runs the action synchronously and returns the execution id\n * plus status/output/executionPath. You can also poll\n * {@link ExecutionsResource.get} / {@link ExecutionsResource.waitUntilFinished}\n * with the returned id.\n *\n * Discover `appId` / `actionId` / `inputConfig` via `workflowApps.list()`.\n */\n run(options: RunActionOptions): Promise<RunActionResult> {\n return this.http.post<RunActionResult>('/api/actions/run', {\n body: options,\n });\n }\n\n /**\n * Convenience: run the action and wait until the Execution reaches a\n * terminal status (or pauses in `NEEDS_INPUT`). Prefer {@link run} when the\n * synchronous response is enough.\n */\n async runAndWait(\n options: RunActionOptions,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.run(options);\n return this.executions.waitUntilFinished(id, {\n ...waitOptions,\n expansion: [\n 'executionPath',\n 'source',\n ...(waitOptions?.expansion ?? []),\n ],\n });\n }\n\n /**\n * Thin discovery helper: find one action definition from `workflowApps.list()`.\n * Prefer calling `workflowApps.list()` once and caching when looking up many\n * actions.\n */\n async get(\n appId: string,\n actionId: string,\n ): Promise<Record<string, unknown> | undefined> {\n const apps = await this.http.get<\n Array<{\n id?: string;\n actions?: Array<Record<string, unknown>>;\n }>\n >('/api/workflow-apps');\n const app = apps.find((a) => a.id === appId);\n return app?.actions?.find((action) => action.id === actionId);\n }\n}\n","/**\n * Pure typed definition factories for local workflow/agent authoring.\n * These do not call the network. Deploy with the CLI; run ad-hoc with `runs.start`.\n *\n * Not the same as `@lunnoa/toolkit` `createAction` / `createApp` (in-platform apps).\n */\n\nexport const DEFINE_KINDS = {\n connection: 'connection',\n aiConnection: 'aiConnection',\n action: 'action',\n trigger: 'trigger',\n workflow: 'workflow',\n agent: 'agent',\n entityType: 'entityType',\n} as const;\n\nexport type DefineKind = (typeof DEFINE_KINDS)[keyof typeof DEFINE_KINDS];\n\n/** Ref to an existing app Connection (credentials stay on Lunnoa). */\nexport interface ConnectionDefinition {\n kind: typeof DEFINE_KINDS.connection;\n /** Connection instance UUID. Optional when the platform can resolve sole/default. */\n id?: string;\n}\n\n/** Ref to an existing AiProviderConnection. */\nexport interface AiConnectionDefinition {\n kind: typeof DEFINE_KINDS.aiConnection;\n /** AiProviderConnection UUID. Optional when platform AI defaults apply. */\n id?: string;\n}\n\nexport interface ActionDefinition {\n kind: typeof DEFINE_KINDS.action;\n /**\n * Catalogue action id, e.g. `http_action_send-request`.\n * Optionally `appId.actionId` (first segment before `.` used as appId when\n * `appId` is omitted and the id contains a dot that is not part of the\n * usual `_action_` pattern).\n */\n id: string;\n /** Workflow app id. Inferred from `id` when it matches `{app}_action_…`. */\n appId?: string;\n /** Optional Connection ref. Omit to let the platform resolve. */\n connection?: ConnectionDefinition;\n /** Default input merged at run/deploy time. */\n input?: Record<string, unknown>;\n name?: string;\n description?: string;\n}\n\n/** One field on a Manually Run trigger. Stored as `customInputConfig`. */\nexport interface TriggerInputFieldDefinition {\n /** Field id. Callers pass this key to `workflows.execute`. */\n id: string;\n label?: string;\n description?: string;\n /** `text`, `number`, `date`, or `select`. Defaults to `text` on deploy. */\n inputType?: string;\n required?: boolean | { missingMessage?: string; missingStatus?: string };\n defaultValue?: unknown;\n selectOptions?: Array<{ label?: string; value?: string }>;\n}\n\n/** Ref to a catalogue trigger. Credentials stay on the connection, when one is set. */\nexport interface TriggerDefinition {\n kind: typeof DEFINE_KINDS.trigger;\n /**\n * Catalogue trigger id, e.g. `flow-control_trigger_manual`.\n * Discover with `apps get <appId> --json` (`triggers[].triggerId`).\n */\n id: string;\n /** Workflow app id. Inferred from `id` when it matches `{app}_trigger_…`. */\n appId?: string;\n /** Optional Connection ref. Omit to let the platform resolve. */\n connection?: ConnectionDefinition;\n /** Catalogue trigger config (webhook method, schedule, app trigger fields). */\n input?: Record<string, unknown>;\n /** Manual-trigger fields. Stored as `customInputConfig`. */\n inputs?: TriggerInputFieldDefinition[];\n name?: string;\n description?: string;\n}\n\nexport interface WorkflowStepDefinition {\n /**\n * Name later steps use with `ref.step(key, ...)`. Keyed steps keep their\n * node id across deploys. `trigger` is reserved.\n */\n key?: string;\n /** Action definition (or inline action-shaped object). */\n use: ActionDefinition;\n /** Per-step input overrides. Values may contain `ref.trigger` / `ref.step`. */\n input?: Record<string, unknown>;\n name?: string;\n}\n\nexport interface WorkflowDefinition {\n kind: typeof DEFINE_KINDS.workflow;\n /** Stable slug, unique in the workspace (upsert key). */\n slug: string;\n name?: string;\n description?: string;\n isActive?: boolean;\n /**\n * Catalogue trigger. Omit for Manually Run with no input fields.\n * `runs.start` ignores this and runs the steps only.\n */\n trigger?: TriggerDefinition;\n /** Linear steps (v1; no branches). */\n steps: WorkflowStepDefinition[];\n}\n\nexport type AgentToolDefinition =\n | ActionDefinition\n | WorkflowDefinition\n | { use: ActionDefinition | WorkflowDefinition };\n\nexport interface AgentDefinition {\n kind: typeof DEFINE_KINDS.agent;\n /** Stable slug, unique in the workspace (upsert key). */\n slug: string;\n name?: string;\n description?: string;\n /**\n * Catalogue model id from `ai-connections list` (`models[].id`).\n * Example on Lunnoa LLMs: `deepseek-ai/DeepSeek-V4-Pro`.\n */\n model: string;\n instructions: string;\n aiConnection?: AiConnectionDefinition;\n /** App Connection refs the agent may use for tools. */\n connections?: ConnectionDefinition[];\n /** Action and/or workflow tool refs. */\n tools?: AgentToolDefinition[];\n}\n\nexport function defineConnection(\n config: Omit<ConnectionDefinition, 'kind'> = {},\n): ConnectionDefinition {\n return { kind: DEFINE_KINDS.connection, ...config };\n}\n\nexport function defineAiConnection(\n config: Omit<AiConnectionDefinition, 'kind'> = {},\n): AiConnectionDefinition {\n return { kind: DEFINE_KINDS.aiConnection, ...config };\n}\n\nexport function defineAction(\n config: Omit<ActionDefinition, 'kind'>,\n): ActionDefinition {\n if (!config.id?.trim()) {\n throw new Error('defineAction requires id (catalogue action id)');\n }\n return { kind: DEFINE_KINDS.action, ...config };\n}\n\nfunction assertTriggerConfig(config: Omit<TriggerDefinition, 'kind'>): void {\n if (!config.id?.trim()) {\n throw new Error('defineTrigger requires id (catalogue trigger id)');\n }\n for (const field of config.inputs ?? []) {\n if (!field?.id?.trim()) {\n throw new Error('defineTrigger inputs require id');\n }\n }\n if (config.inputs?.length && config.id.trim() !== MANUAL_TRIGGER_ID) {\n throw new Error(\n 'defineTrigger inputs are only valid on flow-control_trigger_manual',\n );\n }\n}\n\nexport function defineTrigger(\n config: Omit<TriggerDefinition, 'kind'>,\n): TriggerDefinition {\n assertTriggerConfig(config);\n return { kind: DEFINE_KINDS.trigger, ...config };\n}\n\nconst MANUAL_TRIGGER_ID = 'flow-control_trigger_manual';\nconst TRIGGER_KEY = 'trigger';\nconst STEP_KEY_PATTERN = /^[A-Za-z][A-Za-z0-9_-]*$/;\nconst STEP_REF_PATTERN = /={{step:([^}]*)}}/g;\n\nfunction refString(key: string, path: Array<string | number>): string {\n const parts = [key, ...path.map(String)];\n for (const part of parts) {\n if (!part || /[,{}]/.test(part)) {\n throw new Error(`ref path parts must be non-empty and contain no , { or }: \"${part}\"`);\n }\n }\n return `={{step:${parts.join(',')}}}`;\n}\n\n/**\n * References for step inputs. The server swaps them for the real node ids on\n * deploy, and the builder shows them as mapped fields from earlier nodes.\n * They are plain strings, so they also work inside text and nested objects.\n */\nexport const ref = {\n /** A trigger output field, e.g. a Manually Run input id. */\n trigger: (field: string, ...path: Array<string | number>): string =>\n refString(TRIGGER_KEY, [field, ...path]),\n /** An earlier step's output, by its `key`. Array indexes are numbers. */\n step: (key: string, ...path: Array<string | number>): string =>\n refString(key, path),\n};\n\nfunction collectRefs(value: unknown, out: string[][]): void {\n if (typeof value === 'string') {\n for (const match of value.matchAll(STEP_REF_PATTERN)) {\n out.push(match[1].split(',').map((part) => part.trim()));\n }\n } else if (Array.isArray(value)) {\n value.forEach((item) => collectRefs(item, out));\n } else if (value && typeof value === 'object') {\n Object.values(value).forEach((item) => collectRefs(item, out));\n }\n}\n\n/** Same checks the server runs on deploy, so mistakes show up locally. */\nfunction assertStepRefs(config: Omit<WorkflowDefinition, 'kind'>): void {\n const triggerId = config.trigger?.id.trim() ?? MANUAL_TRIGGER_ID;\n const triggerFields =\n triggerId === MANUAL_TRIGGER_ID\n ? new Set((config.trigger?.inputs ?? []).map((f) => f.id.trim()))\n : undefined;\n const allKeys = new Set<string>();\n for (const step of config.steps) {\n if (step.key === undefined) continue;\n if (!STEP_KEY_PATTERN.test(step.key) || step.key === TRIGGER_KEY) {\n throw new Error(\n `Step key \"${step.key}\" must start with a letter, use letters, digits, - or _, and not be \"${TRIGGER_KEY}\".`,\n );\n }\n if (allKeys.has(step.key)) {\n throw new Error(`Step key \"${step.key}\" is used twice.`);\n }\n allKeys.add(step.key);\n }\n\n const earlier = new Set<string>([TRIGGER_KEY]);\n config.steps.forEach((step, index) => {\n const refs: string[][] = [];\n collectRefs([step.use?.input, step.input], refs);\n const where = `Step \"${step.key ?? step.name ?? index + 1}\"`;\n for (const [key = '', ...path] of refs) {\n const shown = `={{step:${[key, ...path].join(',')}}}`;\n if (!earlier.has(key)) {\n throw new Error(\n allKeys.has(key)\n ? `${where}: ${shown} refers to itself or a later step. Use the trigger or an earlier step.`\n : `${where}: ${shown} names unknown key \"${key}\". Use \"trigger\" or an earlier step's key.`,\n );\n }\n if (key === TRIGGER_KEY && triggerFields && !triggerFields.has(path[0] ?? '')) {\n throw new Error(\n `${where}: ${shown} uses trigger field \"${path[0] ?? ''}\", which is not declared in trigger inputs.`,\n );\n }\n }\n if (step.key) earlier.add(step.key);\n });\n}\n\nexport function defineWorkflow(\n config: Omit<WorkflowDefinition, 'kind'>,\n): WorkflowDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineWorkflow requires slug');\n }\n if (!config.steps?.length) {\n throw new Error('defineWorkflow requires at least one step');\n }\n if (config.trigger) {\n assertTriggerConfig(config.trigger);\n }\n assertStepRefs(config);\n return { kind: DEFINE_KINDS.workflow, ...config };\n}\n\nexport function defineAgent(\n config: Omit<AgentDefinition, 'kind'>,\n): AgentDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineAgent requires slug');\n }\n if (!config.model?.trim()) {\n throw new Error('defineAgent requires model');\n }\n if (config.instructions == null) {\n throw new Error('defineAgent requires instructions');\n }\n return { kind: DEFINE_KINDS.agent, ...config };\n}\n\nexport interface EntityTypeDefinition {\n kind: typeof DEFINE_KINDS.entityType;\n /** Stable deployment-wide slug (upsert key). Granted to the deployer's workspace when new. */\n slug: string;\n name?: string;\n namePlural?: string;\n description?: string;\n icon?: string;\n color?: string;\n /** Field definitions grouped into sections (same contract as Adminspace). */\n attributeSchema: Record<string, unknown>;\n stateSchema?: Record<string, unknown> | null;\n isEnabled?: boolean;\n /**\n * When false (default), entity writes reject undeclared attribute keys.\n * Reserved key `extensions` is always allowed as a JSON object.\n */\n allowUnknownAttributes?: boolean;\n}\n\nexport function defineEntityType(\n config: Omit<EntityTypeDefinition, 'kind'>,\n): EntityTypeDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineEntityType requires slug');\n }\n if (\n !config.attributeSchema ||\n typeof config.attributeSchema !== 'object' ||\n Array.isArray(config.attributeSchema)\n ) {\n throw new Error('defineEntityType requires attributeSchema object');\n }\n return {\n kind: DEFINE_KINDS.entityType,\n allowUnknownAttributes: false,\n ...config,\n };\n}\n\n/** Infer appId from catalogue action ids like `http_action_send-request`. */\nexport function resolveActionAppId(action: ActionDefinition): string {\n if (action.appId?.trim()) {\n return action.appId.trim();\n }\n const id = action.id.trim();\n const actionMarker = '_action_';\n const markerIndex = id.indexOf(actionMarker);\n if (markerIndex > 0) {\n return id.slice(0, markerIndex);\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(0, dot);\n }\n throw new Error(\n `Cannot infer appId for action \"${id}\". Pass appId explicitly.`,\n );\n}\n\n/** Infer appId from catalogue trigger ids like `flow-control_trigger_manual`. */\nexport function resolveTriggerAppId(trigger: TriggerDefinition): string {\n if (trigger.appId?.trim()) {\n return trigger.appId.trim();\n }\n const id = trigger.id.trim();\n const marker = '_trigger_';\n const markerIndex = id.indexOf(marker);\n if (markerIndex > 0) {\n return id.slice(0, markerIndex);\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(0, dot);\n }\n throw new Error(\n `Cannot infer appId for trigger \"${id}\". Pass appId explicitly.`,\n );\n}\n\nexport function resolveTriggerId(trigger: TriggerDefinition): string {\n const id = trigger.id.trim();\n const appId = trigger.appId?.trim();\n if (appId && id.startsWith(`${appId}.`)) {\n return id.slice(appId.length + 1);\n }\n const marker = '_trigger_';\n if (id.includes(marker)) {\n return id;\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(dot + 1);\n }\n return id;\n}\n\nexport function resolveActionId(action: ActionDefinition): string {\n const id = action.id.trim();\n const appId = action.appId?.trim();\n if (appId && id.startsWith(`${appId}.`)) {\n return id.slice(appId.length + 1);\n }\n const marker = '_action_';\n if (id.includes(marker)) {\n return id;\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(dot + 1);\n }\n return id;\n}\n","import type { QueryValue } from '../core/http';\n\n/**\n * Standard list-query conventions shared by most Lunnoa list endpoints:\n *\n * - `expansion` — comma-separated field names to include beyond the defaults\n * - `filterBy` — comma-separated `key:value` pairs\n * - `includeType` — comma-separated inclusion flags (e.g. `all`, `internal`)\n */\nexport interface ListQueryOptions {\n expansion?: string | string[];\n filterBy?: string | Record<string, string>;\n includeType?: string | string[];\n}\n\nexport function serializeListQuery(\n options: ListQueryOptions = {},\n): Record<string, QueryValue> {\n return {\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy(options.filterBy),\n includeType: serializeCsv(options.includeType),\n };\n}\n\nexport function serializeCsv(\n value: string | string[] | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return Array.isArray(value) ? value.join(',') : value;\n}\n\nexport function serializeFilterBy(\n value: string | Record<string, string> | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, filterValue]) => `${key}:${filterValue}`)\n .join(',');\n}\n","import type { HttpClient } from '../core/http';\nimport type { Agent } from '../types';\nimport type {\n ActionDefinition,\n AgentDefinition,\n AgentToolDefinition,\n WorkflowDefinition,\n} from '../define';\nimport {\n DEFINE_KINDS,\n resolveActionAppId,\n resolveActionId,\n} from '../define';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport interface UpsertAgentToolInput {\n appId: string;\n actionId: string;\n connectionId?: string;\n name?: string;\n description?: string;\n input?: Record<string, unknown>;\n}\n\nexport interface UpsertAgentBySlugInput {\n slug: string;\n name?: string;\n description?: string;\n instructions: string;\n model: string;\n aiConnectionId?: string;\n connectionIds?: string[];\n workflowIds?: string[];\n tools?: UpsertAgentToolInput[];\n managedByCode?: boolean;\n}\n\nfunction unwrapTool(\n tool: AgentToolDefinition,\n): ActionDefinition | WorkflowDefinition {\n if ('use' in tool && tool.use) {\n return tool.use;\n }\n return tool as ActionDefinition | WorkflowDefinition;\n}\n\nexport function agentDefinitionToUpsert(\n def: AgentDefinition,\n options?: { workflowIds?: string[] },\n): UpsertAgentBySlugInput {\n const tools: UpsertAgentToolInput[] = [];\n const workflowIds = [...(options?.workflowIds ?? [])];\n\n for (const tool of def.tools ?? []) {\n const unwrapped = unwrapTool(tool);\n if (unwrapped.kind === DEFINE_KINDS.workflow) {\n // Workflow tools are linked via AgentWorkflow (workflowIds), not tools[].\n // Callers should deploy workflows first and pass resolved UUIDs.\n continue;\n }\n if (unwrapped.kind === DEFINE_KINDS.action) {\n tools.push({\n appId: resolveActionAppId(unwrapped),\n actionId: resolveActionId(unwrapped),\n connectionId: unwrapped.connection?.id,\n name: unwrapped.name,\n description: unwrapped.description,\n input: unwrapped.input,\n });\n }\n }\n\n return {\n slug: def.slug,\n name: def.name,\n description: def.description,\n instructions: def.instructions,\n model: def.model,\n aiConnectionId: def.aiConnection?.id,\n connectionIds: def.connections\n ?.map((c) => c.id)\n .filter((id): id is string => Boolean(id)),\n workflowIds: workflowIds.length ? workflowIds : undefined,\n tools,\n managedByCode: true,\n };\n}\n\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists agents visible to the caller in the current workspace. */\n list(options?: ListQueryOptions): Promise<Agent[]> {\n return this.http.get<Agent[]>('/api/agents', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single agent. */\n get(agentId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Agent> {\n return this.http.get<Agent>(`/api/agents/${agentId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Upsert an agent by slug inside the workspace on the API key.\n * Prefer the CLI (`npx @lunnoa/client agents deploy`) for happy-path deploy.\n */\n upsertBySlug(\n body: UpsertAgentBySlugInput | AgentDefinition,\n options?: { workflowIds?: string[] },\n ): Promise<Agent> {\n const payload =\n 'kind' in body && body.kind === 'agent'\n ? agentDefinitionToUpsert(body, options)\n : body;\n return this.http.post<Agent>('/api/agents/upsert', {\n body: payload,\n });\n }\n}\n","/**\n * Tokens returned by login / 2FA / login-with-token.\n * Mapped from the wire format (`access_token` / `refresh_token`).\n */\nexport interface AuthTokens {\n accessToken: string;\n refreshToken: string;\n}\n\n/** Successful password login without 2FA, or after 2FA / token exchange. */\nexport type LoginSuccess = AuthTokens;\n\n/**\n * Password login when the user has 2FA enabled.\n * Call {@link AuthResource.verify2faLogin} with the session token and TOTP/backup code.\n */\nexport interface LoginRequires2FA {\n requires2FA: true;\n sessionToken: string;\n}\n\nexport type LoginResult = LoginSuccess | LoginRequires2FA;\n\nexport function isLoginRequires2FA(\n result: LoginResult,\n): result is LoginRequires2FA {\n return 'requires2FA' in result && result.requires2FA === true;\n}\n\n/** Wire payload from `POST /api/auth/login` (and related). */\nexport type LoginWireResponse =\n | {\n access_token: string;\n refresh_token: string;\n }\n | {\n requires2FA: true;\n sessionToken: string;\n };\n\n/** Wire payload from `POST /api/auth/refresh-token`. */\nexport interface RefreshWireResponse {\n access_token: string;\n refresh_token?: string;\n}\n\n/** Public SSO discovery from `GET /api/auth/sso/providers`. */\nexport interface SsoProvidersResponse {\n providers: SsoProviderSummary[];\n passwordAuthDisabled: boolean;\n googleAuthDisabled: boolean;\n ssoEnforced: boolean;\n}\n\nexport interface SsoProviderSummary {\n id: string;\n name: string;\n buttonLabel: string | null;\n}\n\n/**\n * Current user from `GET /api/users/me`.\n * Password is never returned.\n */\nexport interface CurrentUser {\n id: string;\n email: string;\n name: string | null;\n createdAt?: string;\n updatedAt?: string;\n rootProfileImageUrl?: string | null;\n emailVerifiedAt?: string | null;\n toursCompleted?: unknown;\n hasPassword?: boolean;\n ssoProviders?: string[];\n}\n\nexport function mapWireTokens(wire: {\n access_token: string;\n refresh_token?: string;\n}): { accessToken: string; refreshToken?: string } {\n return {\n accessToken: wire.access_token,\n ...(wire.refresh_token !== undefined\n ? { refreshToken: wire.refresh_token }\n : {}),\n };\n}\n\nexport function mapLoginWire(wire: LoginWireResponse): LoginResult {\n if ('requires2FA' in wire && wire.requires2FA) {\n return {\n requires2FA: true,\n sessionToken: wire.sessionToken,\n };\n }\n const tokens = wire as { access_token: string; refresh_token: string };\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n };\n}\n","import {\n isLoginRequires2FA,\n mapLoginWire,\n mapWireTokens,\n type AuthTokens,\n type CurrentUser,\n type LoginResult,\n type LoginWireResponse,\n type RefreshWireResponse,\n type SsoProvidersResponse,\n} from '../auth/types';\nimport type { TokenStore } from '../auth/token-store';\nimport type { HttpClient } from '../core/http';\n\n/**\n * Login, refresh, SSO discovery, and session helpers for Lunnoa users.\n *\n * Password login, token exchange, refresh, and SSO provider listing are\n * **public** endpoints (no Bearer). `me()` requires a user JWT.\n *\n * There is no server logout endpoint: {@link AuthResource.logout} only clears\n * the configured {@link TokenStore}.\n */\nexport class AuthResource {\n readonly sso: SsoAuthResource;\n\n constructor(\n private readonly http: HttpClient,\n private readonly tokenStore?: TokenStore,\n ) {\n this.sso = new SsoAuthResource(http);\n }\n\n /**\n * `POST /api/auth/login`\n *\n * On success without 2FA, tokens are written to the token store (when set).\n * When 2FA is required, returns `{ requires2FA, sessionToken }` and does not\n * store tokens until {@link verify2faLogin} succeeds.\n */\n async login(input: {\n email: string;\n password: string;\n }): Promise<LoginResult> {\n const wire = await this.http.post<LoginWireResponse>('/api/auth/login', {\n body: { email: input.email, password: input.password },\n skipAuth: true,\n });\n const result = mapLoginWire(wire);\n if (!isLoginRequires2FA(result)) {\n await this.persistTokens(result);\n }\n return result;\n }\n\n /**\n * `POST /api/auth/2fa/verify-login`\n *\n * Completes password login after TOTP or backup-code verification.\n */\n async verify2faLogin(input: {\n sessionToken: string;\n token: string;\n }): Promise<AuthTokens> {\n const wire = await this.http.post<LoginWireResponse>(\n '/api/auth/2fa/verify-login',\n {\n body: {\n sessionToken: input.sessionToken,\n token: input.token,\n },\n skipAuth: true,\n },\n );\n const result = mapLoginWire(wire);\n if (isLoginRequires2FA(result)) {\n throw new Error(\n 'Unexpected 2FA challenge after verify2faLogin; expected access and refresh tokens.',\n );\n }\n await this.persistTokens(result);\n return result;\n }\n\n /**\n * `POST /api/auth/login-with-token`\n *\n * Exchanges a short-lived hidden JWT (SSO callback or email verification)\n * for access and refresh tokens.\n */\n async loginWithToken(input: { token: string }): Promise<AuthTokens> {\n const wire = await this.http.post<{\n access_token: string;\n refresh_token: string;\n }>('/api/auth/login-with-token', {\n body: { token: input.token },\n skipAuth: true,\n });\n const tokens: AuthTokens = {\n accessToken: wire.access_token,\n refreshToken: wire.refresh_token,\n };\n await this.persistTokens(tokens);\n return tokens;\n }\n\n /**\n * `POST /api/auth/refresh-token`\n *\n * Returns a new access token. The refresh token itself is not rotated.\n * When a token store is configured and `refreshToken` is omitted, the\n * stored refresh token is used.\n */\n async refresh(input?: { refreshToken?: string }): Promise<{\n accessToken: string;\n }> {\n const refreshToken =\n input?.refreshToken ?? (await this.tokenStore?.getRefreshToken()) ?? null;\n if (!refreshToken) {\n throw new Error(\n 'auth.refresh requires a refreshToken argument or a token store that holds one.',\n );\n }\n\n const wire = await this.http.post<RefreshWireResponse>(\n '/api/auth/refresh-token',\n {\n body: { refreshToken },\n skipAuth: true,\n },\n );\n const mapped = mapWireTokens(wire);\n if (this.tokenStore) {\n await this.tokenStore.setTokens({\n accessToken: mapped.accessToken,\n // Keep existing refresh token; refresh responses omit it.\n refreshToken: mapped.refreshToken,\n });\n }\n return { accessToken: mapped.accessToken };\n }\n\n /**\n * `GET /api/users/me` — current user profile for the active JWT.\n */\n me(): Promise<CurrentUser> {\n return this.http.get<CurrentUser>('/api/users/me');\n }\n\n /**\n * Clears tokens from the token store.\n * There is no server-side logout endpoint; access tokens remain valid until expiry\n * (or until the user's `tokensValidFrom` watermark invalidates them).\n */\n async logout(): Promise<void> {\n await this.tokenStore?.clear();\n }\n\n /** True when the token store has an access token (sync stores only wait on Promise). */\n async hasSession(): Promise<boolean> {\n const token = await this.tokenStore?.getAccessToken();\n return Boolean(token);\n }\n\n private async persistTokens(tokens: AuthTokens): Promise<void> {\n if (!this.tokenStore) {\n return;\n }\n await this.tokenStore.setTokens({\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken,\n });\n }\n}\n\n/**\n * SSO discovery and login URL helpers.\n *\n * Browser SSO callbacks redirect to the deployment's `CLIENT_URL/verify-token`,\n * not to an arbitrary custom origin. Custom portals typically complete the\n * exchange with {@link AuthResource.loginWithToken} after receiving the hidden\n * token (for example via a BFF that can see the verify-token page, or by\n * setting `CLIENT_URL` to the custom app).\n */\nexport class SsoAuthResource {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/auth/sso/providers` (public). */\n listProviders(): Promise<SsoProvidersResponse> {\n return this.http.get<SsoProvidersResponse>('/api/auth/sso/providers', {\n skipAuth: true,\n });\n }\n\n /**\n * Absolute URL for `GET /api/auth/sso/:providerId/login`.\n * Navigate the browser here to start the OIDC redirect.\n */\n getLoginUrl(providerId: string): string {\n if (!providerId) {\n throw new Error('sso.getLoginUrl requires a providerId.');\n }\n return this.http.buildUrl(\n `/api/auth/sso/${encodeURIComponent(providerId)}/login`,\n );\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport interface AiConnectionModel {\n /** Catalogue id for `defineAgent({ model })`. */\n id: string;\n name: string;\n isDefault: boolean;\n supportsTools: boolean;\n supportsVision: boolean;\n supportsReasoning: boolean;\n}\n\nexport interface AiConnection {\n /** AiProviderConnection UUID for `defineAiConnection({ id })`. */\n id: string;\n name: string;\n /** Provider slug, for example `featherless` or `openai`. */\n provider: string;\n /** True when agent deploy uses this connection if `aiConnection` is omitted. */\n isDefault: boolean;\n models: AiConnectionModel[];\n}\n\nexport class AiConnectionsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Lists AI connections the caller can assign to an agent, with the model\n * ids each connection accepts. Credentials are never included.\n * Requires `agents:create` (the same permission as agent deploy).\n */\n list(): Promise<AiConnection[]> {\n return this.http.get<AiConnection[]>('/api/ai-connections');\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { Connection } from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class ConnectionsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists connections in the workspace. */\n list(options?: ListQueryOptions): Promise<Connection[]> {\n return this.http.get<Connection[]>('/api/connections', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single connection (secrets are never included). */\n get(\n connectionId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Connection> {\n return this.http.get<Connection>(`/api/connections/${connectionId}`, {\n query: serializeListQuery(options),\n });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { EnabledFeatures } from '../types';\n\nexport class DiscoveryResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Returns the deployment's feature flags (storage, vector database, email,\n * SSO, edition gating), letting a custom UI adapt to what is enabled.\n */\n enabledFeatures(): Promise<EnabledFeatures> {\n return this.http.get<EnabledFeatures>('/api/discovery/enabled-features');\n }\n}\n","/** Pagination block returned by page-based list endpoints (entities). */\nexport interface PagePagination {\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\n/** Pagination block returned by offset-based list endpoints (queue items). */\nexport interface OffsetPagination {\n total: number;\n limit: number;\n offset: number;\n hasMore?: boolean;\n}\n\n/**\n * Iterates every item of a page-based (`page`/`pageSize`) paginated endpoint,\n * fetching pages lazily as the consumer advances.\n */\nexport async function* iteratePages<T>(\n fetchPage: (page: number) => Promise<{ data: T[]; pagination: PagePagination }>,\n): AsyncGenerator<T, void, undefined> {\n let page = 1;\n while (true) {\n const { data, pagination } = await fetchPage(page);\n for (const item of data) {\n yield item;\n }\n if (page >= pagination.totalPages || data.length === 0) {\n return;\n }\n page += 1;\n }\n}\n\n/**\n * Iterates every item of an offset-based (`limit`/`offset`) paginated\n * endpoint, fetching batches lazily as the consumer advances.\n */\nexport async function* iterateOffset<T>(\n fetchBatch: (offset: number) => Promise<{ items: T[]; pagination: OffsetPagination }>,\n): AsyncGenerator<T, void, undefined> {\n let offset = 0;\n while (true) {\n const { items, pagination } = await fetchBatch(offset);\n for (const item of items) {\n yield item;\n }\n offset += items.length;\n const exhausted =\n items.length === 0 ||\n (pagination.hasMore !== undefined\n ? !pagination.hasMore\n : offset >= pagination.total);\n if (exhausted) {\n return;\n }\n }\n}\n","import type { HttpClient, QueryValue } from '../core/http';\nimport { iteratePages } from '../core/pagination';\nimport type {\n ChangeEntityStateInput,\n ChangeEntityStateResult,\n CreateEntityInput,\n Entity,\n EntityStateHistoryEntry,\n EntityStateTransitions,\n ImportEntitiesResult,\n ImportTemplate,\n PaginatedEntities,\n UpdateEntityInput,\n} from '../types';\nimport { serializeCsv } from './common';\n\nexport interface ListEntitiesOptions {\n /** Filter by entity type ID. */\n objectTypeId?: string;\n /** Filter by entity type slug (alternative to objectTypeId). */\n objectTypeSlug?: string;\n /** Filter by a single state. */\n state?: string;\n /** Filter by several states (comma-separated server-side). */\n states?: string[];\n /** Free-text search over entity names. */\n search?: string;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n /** 1-based page number. */\n page?: number;\n /** Items per page (max 100). */\n pageSize?: number;\n /** Fields to expand, e.g. `['attributes', 'objectType']`. */\n expansion?: string | string[];\n}\n\nexport interface ImportEntitiesInput {\n entityTypeId: string;\n columnMappings: Array<{\n sourceColumn: string;\n targetFieldId: string;\n transform?: 'none' | 'date' | 'number' | 'boolean';\n }>;\n rows: Array<Record<string, string>>;\n updateExisting?: boolean;\n matchField?: string;\n}\n\nexport interface ExportEntitiesInput {\n entityTypeId: string;\n fieldIds: string[];\n filters?: Array<{ fieldId: string; operator: string; value: unknown }>;\n format?: 'csv' | 'xlsx';\n}\n\n/**\n * Entities (the platform calls them Objects internally): the structured data\n * layer custom UIs query heavily. Attribute values are keyed by field ID as\n * defined on the entity type's `attributeSchema` — run\n * `npx @lunnoa/client codegen` against your deployment for fully typed,\n * per-entity-type accessors.\n */\nexport class EntitiesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Returns one page of entities matching the filter. */\n list(options: ListEntitiesOptions = {}): Promise<PaginatedEntities> {\n return this.http.get<PaginatedEntities>('/api/objects', {\n query: this.serializeListOptions(options),\n });\n }\n\n /**\n * Async-iterates every entity matching the filter, fetching pages lazily.\n *\n * ```ts\n * for await (const invoice of client.entities.iterate({ objectTypeSlug: 'invoice' })) { ... }\n * ```\n */\n iterate(\n options: Omit<ListEntitiesOptions, 'page'> = {},\n ): AsyncGenerator<Entity, void, undefined> {\n return iteratePages<Entity>(async (page) => {\n const result = await this.list({ ...options, page });\n return { data: result.data ?? [], pagination: result.pagination };\n });\n }\n\n /** Returns a single entity. Request `expansion: ['attributes']` for field values. */\n get(\n entityId: string,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.get<Entity>(`/api/objects/${entityId}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Creates an entity. `attributes` are keyed by field ID. */\n create(\n data: CreateEntityInput,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.post<Entity>('/api/objects', {\n body: data,\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Partially updates an entity; supplied attributes are merged. */\n update(\n entityId: string,\n data: UpdateEntityInput,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.patch<Entity>(`/api/objects/${entityId}`, {\n body: data,\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Soft-deletes an entity. */\n delete(entityId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/objects/${entityId}`);\n }\n\n /** Moves an entity to a new state (validated against the type's state machine). */\n changeState(\n entityId: string,\n data: ChangeEntityStateInput,\n ): Promise<ChangeEntityStateResult> {\n return this.http.post<ChangeEntityStateResult>(\n `/api/objects/${entityId}/state`,\n { body: data },\n );\n }\n\n /** Returns the entity's state changes, newest first. */\n getStateHistory(\n entityId: string,\n options: { limit?: number } = {},\n ): Promise<EntityStateHistoryEntry[]> {\n return this.http.get<EntityStateHistoryEntry[]>(\n `/api/objects/${entityId}/state/history`,\n { query: { limit: options.limit } },\n );\n }\n\n /** Returns the current state and the transitions allowed from it. */\n getStateTransitions(entityId: string): Promise<EntityStateTransitions> {\n return this.http.get<EntityStateTransitions>(\n `/api/objects/${entityId}/state/transitions`,\n );\n }\n\n /** Imports pre-parsed rows into an entity type (SuperAdmin only). */\n import(data: ImportEntitiesInput): Promise<ImportEntitiesResult> {\n return this.http.post<ImportEntitiesResult>('/api/objects/import', {\n body: data,\n });\n }\n\n /** Exports entities of a type as flat JSON rows. */\n export(data: ExportEntitiesInput): Promise<Array<Record<string, unknown>>> {\n return this.http.post<Array<Record<string, unknown>>>(\n '/api/objects/export',\n { body: data },\n );\n }\n\n /** Returns the column headers and a sample row for importing (SuperAdmin only). */\n getImportTemplate(entityTypeId: string): Promise<ImportTemplate> {\n return this.http.get<ImportTemplate>(\n `/api/objects/import/template/${entityTypeId}`,\n );\n }\n\n private serializeListOptions(\n options: ListEntitiesOptions,\n ): Record<string, QueryValue> {\n return {\n objectTypeId: options.objectTypeId,\n objectTypeSlug: options.objectTypeSlug,\n state: options.state,\n states: options.states?.join(','),\n search: options.search,\n sortBy: options.sortBy,\n sortOrder: options.sortOrder,\n page: options.page,\n pageSize: options.pageSize,\n expansion: serializeCsv(options.expansion),\n };\n }\n}\n","import type { EntityTypeDefinition as DefineEntityTypeDefinition } from '../define';\nimport type { HttpClient } from '../core/http';\nimport type { EntityType } from '../types';\nimport { serializeCsv } from './common';\n\nexport interface EntityTypeReadOptions {\n /** Fields to expand, e.g. `['attributeSchema', 'stateSchema', 'description']`. */\n expansion?: string | string[];\n}\n\n/** Payload for `POST /api/object-types/upsert`. */\nexport interface UpsertEntityTypeBySlugInput {\n slug: string;\n name?: string;\n namePlural?: string;\n description?: string;\n icon?: string;\n color?: string;\n attributeSchema: Record<string, unknown>;\n stateSchema?: Record<string, unknown> | null;\n isEnabled?: boolean;\n allowUnknownAttributes?: boolean;\n managedByCode?: boolean;\n}\n\nexport function entityTypeDefinitionToUpsert(\n def: DefineEntityTypeDefinition,\n): UpsertEntityTypeBySlugInput {\n return {\n slug: def.slug,\n name: def.name,\n namePlural: def.namePlural,\n description: def.description,\n icon: def.icon,\n color: def.color,\n attributeSchema: def.attributeSchema,\n stateSchema: def.stateSchema,\n isEnabled: def.isEnabled,\n allowUnknownAttributes: def.allowUnknownAttributes ?? false,\n managedByCode: true,\n };\n}\n\nexport class EntityTypesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Lists entity types granted to the API key's workspace. Request\n * `expansion: ['attributeSchema', 'stateSchema']` for the field and state\n * machine definitions the codegen CLI builds types from.\n */\n list(\n options: EntityTypeReadOptions & { includeDisabled?: boolean } = {},\n ): Promise<EntityType[]> {\n return this.http.get<EntityType[]>('/api/object-types', {\n query: {\n includeDisabled: options.includeDisabled,\n expansion: serializeCsv(options.expansion),\n },\n });\n }\n\n /** Returns a single entity type by ID. */\n get(id: string, options: EntityTypeReadOptions = {}): Promise<EntityType> {\n return this.http.get<EntityType>(`/api/object-types/${id}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Returns a single entity type by its URL-safe slug. */\n getBySlug(\n slug: string,\n options: EntityTypeReadOptions = {},\n ): Promise<EntityType> {\n return this.http.get<EntityType>(`/api/object-types/slug/${slug}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /**\n * Creates or updates an entity type by deployment-wide slug.\n * A new slug is granted to the API key's workspace. A slug already shared\n * with another workspace is rejected unless the key belongs to a platform admin.\n * Prefer the CLI (`npx @lunnoa/client entity-types deploy`) for happy-path deploy.\n */\n upsertBySlug(\n definition: DefineEntityTypeDefinition | UpsertEntityTypeBySlugInput,\n ): Promise<EntityType> {\n const payload =\n 'kind' in definition && definition.kind === 'entityType'\n ? entityTypeDefinitionToUpsert(definition)\n : (definition as UpsertEntityTypeBySlugInput);\n\n return this.http.post<EntityType>('/api/object-types/upsert', {\n body: payload,\n query: {\n expansion: 'attributeSchema,stateSchema,description',\n },\n });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { Table, UpsertTableBySlugInput } from '../types';\n\nexport class TablesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists tables in the API key's workspace (without columns and rows). */\n list(): Promise<Table[]> {\n return this.http.get<Table[]>('/api/tables');\n }\n\n /** Returns a single table by ID, including columns and rows. */\n get(id: string): Promise<Table> {\n return this.http.get<Table>(`/api/tables/${id}`);\n }\n\n /** Returns a single table by its workspace slug, including columns and rows. */\n getBySlug(slug: string): Promise<Table> {\n return this.http.get<Table>(`/api/tables/slug/${slug}`);\n }\n\n /**\n * Creates or updates a table by workspace slug. Omitted columns or rows\n * keep their current value. Marks `managedByCode` by default.\n */\n upsertBySlug(input: UpsertTableBySlugInput): Promise<Table> {\n return this.http.post<Table>('/api/tables/upsert', { body: input });\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport type EligibleApprover = {\n workspaceUserId: string;\n email: string;\n name?: string;\n};\n\nexport type ApprovalInboxItem = {\n approvalId: string;\n executionId: string;\n nodeId: string;\n title: string;\n status: string;\n requiredCount: number;\n receivedApprovals: number;\n expiresAt?: string;\n createdAt?: string;\n updatedAt?: string;\n canDecide?: boolean;\n executionNumber?: number;\n workflow?: { id: string; name: string };\n project?: { id: string; name: string };\n myDecision?: {\n decision: string;\n comment?: string;\n decidedAt?: string;\n };\n /** People who can still decide. */\n eligibleApprovers?: EligibleApprover[];\n approval?: Record<string, unknown>;\n};\n\n/**\n * Authenticated Approvals inbox helpers (workspace API; not Public API v1).\n */\nexport class ApprovalsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * @param options.status `pending` (default) for actionable items, or `done` for history.\n */\n async inbox(options?: {\n status?: 'pending' | 'done' | string;\n }): Promise<{ items: ApprovalInboxItem[] }> {\n return this.http.get('/api/approvals/inbox', {\n query: { status: options?.status ?? 'pending' },\n });\n }\n\n async decide(\n approvalId: string,\n body: {\n decision: 'approved' | 'rejected';\n comment?: string;\n },\n ): Promise<{\n executionId: string;\n nodeId: string;\n approvalId?: string;\n terminal: boolean;\n canDecide: boolean;\n approval: Record<string, unknown>;\n }> {\n return this.http.post(`/api/approvals/${approvalId}/decide`, { body });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { LunnoaApiError } from '../core/errors';\nimport { parseSseEvents } from './sse';\nimport type { ExecutionPathStep, ExecutionStatus } from '../types';\n\nexport type ExecutionStreamEventType =\n | 'connected'\n | 'heartbeat'\n | 'execution.progress'\n | 'execution.finished'\n | 'execution.error'\n | 'loop.progress'\n | string;\n\nexport interface ExecutionProgressPayload {\n executionId: string;\n status: ExecutionStatus | string | null;\n statusMessage: string | null;\n name: string | null;\n source: string | null;\n startedAt?: string;\n stoppedAt?: string | null;\n executionPath: ExecutionPathStep[];\n pendingInput?: unknown;\n output?: unknown;\n}\n\nexport interface ExecutionStreamEvent {\n event: ExecutionStreamEventType;\n data: Record<string, unknown>;\n}\n\nexport interface WatchProgressOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Opens `GET /api/executions/:id/stream` and yields typed SSE events.\n * Prefer {@link ExecutionsResource.watchProgress} for timeline UIs.\n */\nexport class ExecutionProgressStream implements AsyncIterable<ExecutionStreamEvent> {\n private consumed = false;\n\n constructor(\n private readonly response: Response,\n private readonly options?: WatchProgressOptions,\n ) {}\n\n [Symbol.asyncIterator](): AsyncGenerator<ExecutionStreamEvent, void, undefined> {\n return this.events();\n }\n\n async *events(): AsyncGenerator<ExecutionStreamEvent, void, undefined> {\n if (this.consumed) {\n throw new Error('This ExecutionProgressStream has already been consumed.');\n }\n this.consumed = true;\n\n const body = this.response.body;\n if (!body) {\n return;\n }\n\n for await (const frame of parseSseEvents(body)) {\n if (this.options?.signal?.aborted) {\n return;\n }\n if (frame.data === null) {\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(frame.data);\n } catch {\n continue;\n }\n if (!parsed || typeof parsed !== 'object') {\n continue;\n }\n yield {\n event: frame.event,\n data: parsed as Record<string, unknown>,\n };\n if (frame.event === 'execution.finished' || frame.event === 'execution.error') {\n return;\n }\n }\n }\n}\n\nexport async function openExecutionStream(\n http: HttpClient,\n executionId: string,\n options?: WatchProgressOptions,\n): Promise<ExecutionProgressStream> {\n const response = await http.request('GET', `/api/executions/${executionId}/stream`, {\n raw: true,\n signal: options?.signal,\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => undefined);\n let parsed: unknown = body;\n try {\n parsed = body ? JSON.parse(body) : undefined;\n } catch {\n // keep text\n }\n throw new LunnoaApiError({\n status: response.status,\n body: parsed,\n method: 'GET',\n path: `/api/executions/${executionId}/stream`,\n });\n }\n\n return new ExecutionProgressStream(response, options);\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n ExecuteWorkflowResult,\n Execution,\n ExecutionPathStep,\n ExecutionStatus,\n WorkflowApp,\n} from '../types';\nimport {\n openExecutionStream,\n type ExecutionProgressPayload,\n type ExecutionProgressStream,\n type WatchProgressOptions,\n} from '../streaming/execution-progress';\nimport { serializeListQuery, type ListQueryOptions } from './common';\nimport type { WorkflowAppsResource } from './workflow-apps';\n\n/** Execution statuses that end an execution. */\nconst TERMINAL_STATUSES: ReadonlySet<string> = new Set([\n 'SUCCESS',\n 'FAILED',\n 'CANCELLED',\n]);\n\nexport interface WaitUntilFinishedOptions {\n /** Give up after this long. Default: 10 minutes. */\n timeoutMs?: number;\n /** First delay between polls. Default: 500ms. */\n initialDelayMs?: number;\n /** Cap on the delay between polls. Default: 5s. */\n maxDelayMs?: number;\n /** Multiplier applied to the delay after each poll. Default: 1.5. */\n backoffFactor?: number;\n /**\n * Also stop waiting when the execution pauses in `NEEDS_INPUT` (so a form\n * can be shown). Default: true.\n */\n stopOnNeedsInput?: boolean;\n /** Extra expansion fields to request with each poll (always includes `status,statusMessage,output`). */\n expansion?: string[];\n signal?: AbortSignal;\n /** Injectable sleep, for tests. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nexport class ExecutionTimeoutError extends Error {\n constructor(\n readonly executionId: string,\n readonly timeoutMs: number,\n ) {\n super(\n `Execution ${executionId} did not finish within ${timeoutMs}ms. It is still running server-side; keep polling executions.get() or increase timeoutMs.`,\n );\n this.name = 'ExecutionTimeoutError';\n }\n}\n\n/** One step in a timeline-ready progress snapshot. */\nexport interface ExecutionProgressStep extends ExecutionPathStep {\n /** App logo URL from the workflow-apps catalogue, when resolvable. */\n appLogoUrl?: string | null;\n /** Action/trigger icon URL from the catalogue, when resolvable. */\n iconUrl?: string | null;\n /** Duration in ms when both startTime and endTime are present. */\n durationMs?: number | null;\n}\n\n/** Timeline-ready progress for a custom UI (status bar / step list). */\nexport interface ExecutionProgress {\n executionId: string;\n status?: ExecutionStatus | string;\n statusMessage?: string | null;\n name?: string | null;\n source?: string | null;\n startedAt?: string;\n stoppedAt?: string | null;\n steps: ExecutionProgressStep[];\n pendingInput?: unknown;\n output?: unknown;\n /** Index of the first non-terminal step, or -1 when all done / unknown. */\n activeStepIndex: number;\n}\n\nexport class ExecutionsResource {\n private catalogCache: WorkflowApp[] | null = null;\n\n constructor(\n private readonly http: HttpClient,\n private readonly workflowApps?: WorkflowAppsResource,\n ) {}\n\n /**\n * Starts a new execution of a workflow. Only the execution ID is returned;\n * use {@link waitUntilFinished} or `get` to track progress.\n */\n execute(\n workflowId: string,\n inputData?: Record<string, unknown>,\n ): Promise<ExecuteWorkflowResult> {\n return this.http.post<ExecuteWorkflowResult>(\n `/api/executions/workflows/${workflowId}/execute`,\n { body: { inputData: inputData ?? {} } },\n );\n }\n\n /** Lists executions in the current workspace, most recently started first. */\n list(options?: ListQueryOptions): Promise<Execution[]> {\n return this.http.get<Execution[]>('/api/executions', {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Returns a single execution. Request `expansion: ['status', 'executionPath']`\n * for the business-readable step list custom UIs render progress from.\n */\n get(\n executionId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Execution> {\n return this.http.get<Execution>(`/api/executions/${executionId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Timeline-ready progress: `executionPath` plus catalogue icons/logos.\n * Use this for a custom status bar / step list (not raw nodes/edges).\n */\n async getProgress(executionId: string): Promise<ExecutionProgress> {\n const execution = await this.get(executionId, {\n expansion: [\n 'status',\n 'statusMessage',\n 'executionPath',\n 'pendingInput',\n 'source',\n 'name',\n 'startedAt',\n 'stoppedAt',\n 'output',\n ],\n });\n return this.#toProgress(execution);\n }\n\n /**\n * Opens the Public API SSE stream (`GET /executions/:id/stream`).\n * Yields `execution.progress`, `loop.progress`, `execution.finished`, etc.\n * For a simple timeline, prefer {@link watchProgress}.\n */\n stream(\n executionId: string,\n options?: WatchProgressOptions,\n ): Promise<ExecutionProgressStream> {\n return openExecutionStream(this.http, executionId, options);\n }\n\n /**\n * Live progress snapshots for a custom timeline UI.\n * Subscribes to SSE `execution.progress` events (and enriches steps with icons).\n * Completes when the execution reaches a terminal status or the signal aborts.\n */\n async *watchProgress(\n executionId: string,\n options?: WatchProgressOptions,\n ): AsyncGenerator<ExecutionProgress, void, undefined> {\n const stream = await this.stream(executionId, options);\n for await (const frame of stream) {\n if (frame.event === 'execution.progress') {\n const payload = frame.data as unknown as ExecutionProgressPayload;\n yield await this.#progressFromPayload(payload);\n } else if (frame.event === 'execution.finished') {\n // Ensure a final enriched snapshot even if the last progress was skipped.\n yield await this.getProgress(executionId);\n return;\n } else if (frame.event === 'execution.error') {\n throw new Error(\n typeof frame.data.message === 'string'\n ? frame.data.message\n : `Execution stream error for ${executionId}`,\n );\n }\n }\n }\n\n /**\n * Polls an execution with exponential backoff until it reaches a terminal\n * status (`SUCCESS`, `FAILED`, `CANCELLED`) — or pauses in `NEEDS_INPUT`\n * (unless `stopOnNeedsInput: false`). Resolves with the final execution\n * including `status`, `statusMessage`, and `output`.\n */\n async waitUntilFinished(\n executionId: string,\n options: WaitUntilFinishedOptions = {},\n ): Promise<Execution> {\n const {\n timeoutMs = 10 * 60 * 1000,\n initialDelayMs = 500,\n maxDelayMs = 5_000,\n backoffFactor = 1.5,\n stopOnNeedsInput = true,\n expansion = [],\n signal,\n sleep = defaultSleep,\n } = options;\n\n const pollExpansion = Array.from(\n new Set(['status', 'statusMessage', 'output', ...expansion]),\n );\n\n const startedAt = Date.now();\n // Accumulated requested sleep time; combined with wall-clock elapsed so the\n // budget holds both in real use and with an injected (instant) sleep.\n let waitedMs = 0;\n let delay = initialDelayMs;\n\n while (true) {\n signal?.throwIfAborted();\n\n const execution = await this.get(executionId, {\n expansion: pollExpansion,\n });\n const status = execution.status as ExecutionStatus | undefined;\n\n if (status && TERMINAL_STATUSES.has(status)) {\n return execution;\n }\n if (stopOnNeedsInput && status === 'NEEDS_INPUT') {\n return execution;\n }\n\n const elapsed = Math.max(Date.now() - startedAt, waitedMs);\n if (elapsed + delay > timeoutMs) {\n throw new ExecutionTimeoutError(executionId, timeoutMs);\n }\n\n await sleep(delay);\n waitedMs += delay;\n delay = Math.min(delay * backoffFactor, maxDelayMs);\n }\n }\n\n /**\n * Resumes an execution paused in `NEEDS_INPUT` by submitting values for the\n * waiting node. Identify the waiting node and its field schema via\n * `expansion: ['pendingInput', 'executionPath']` (prefer `pendingInput` for\n * the form contract; `executionPath` steps with status `NEEDS_INPUT` also\n * carry the `nodeId`). Required fields from the schema must be present.\n * The server acknowledges immediately and resumes asynchronously — follow\n * up with {@link waitUntilFinished}.\n */\n async submitInput(\n executionId: string,\n nodeId: string,\n values: Record<string, unknown>,\n ): Promise<void> {\n await this.http.post<unknown>(\n `/api/webhooks/executions/${executionId}/nodes/${nodeId}/input`,\n { body: values },\n );\n }\n\n /**\n * Submit an approve/reject decision for a Request Approval node.\n * Uses the authenticated Approvals API (not the public input webhook).\n * Partial approvals keep the execution paused; terminal decisions resume it.\n */\n async submitApproval(\n executionId: string,\n nodeId: string,\n body: {\n decision: 'approved' | 'rejected';\n comment?: string;\n },\n ): Promise<{\n executionId: string;\n nodeId: string;\n approvalId?: string;\n terminal: boolean;\n canDecide: boolean;\n approval: Record<string, unknown>;\n }> {\n return this.http.post(\n `/api/executions/${executionId}/nodes/${nodeId}/approvals`,\n { body },\n );\n }\n\n async #toProgress(execution: Execution): Promise<ExecutionProgress> {\n const path = (execution.executionPath ?? []) as ExecutionPathStep[];\n const steps = await this.#enrichSteps(path);\n return {\n executionId: execution.id,\n status: execution.status,\n statusMessage: execution.statusMessage ?? null,\n name: (execution as { name?: string | null }).name ?? null,\n source: (execution as { source?: string | null }).source ?? null,\n startedAt: execution.startedAt,\n stoppedAt: execution.stoppedAt ?? null,\n steps,\n pendingInput: (execution as { pendingInput?: unknown }).pendingInput,\n output: execution.output,\n activeStepIndex: findActiveStepIndex(steps),\n };\n }\n\n async #progressFromPayload(\n payload: ExecutionProgressPayload,\n ): Promise<ExecutionProgress> {\n const steps = await this.#enrichSteps(payload.executionPath ?? []);\n return {\n executionId: payload.executionId,\n status: payload.status ?? undefined,\n statusMessage: payload.statusMessage,\n name: payload.name,\n source: payload.source,\n startedAt: payload.startedAt,\n stoppedAt: payload.stoppedAt,\n steps,\n pendingInput: payload.pendingInput,\n output: payload.output,\n activeStepIndex: findActiveStepIndex(steps),\n };\n }\n\n async #enrichSteps(\n path: ExecutionPathStep[],\n ): Promise<ExecutionProgressStep[]> {\n const catalog = await this.#loadCatalog();\n return path.map((step) => {\n const app = catalog?.find((a) => a.id === step.appId);\n const action =\n step.actionId && Array.isArray(app?.actions)\n ? (app!.actions as Record<string, unknown>[]).find(\n (a) => a && typeof a === 'object' && a.id === step.actionId,\n )\n : undefined;\n const trigger =\n step.triggerId && Array.isArray(app?.triggers)\n ? (app!.triggers as Record<string, unknown>[]).find(\n (t) => t && typeof t === 'object' && t.id === step.triggerId,\n )\n : undefined;\n const iconUrl =\n (typeof action?.iconUrl === 'string' && action.iconUrl) ||\n (typeof trigger?.iconUrl === 'string' && trigger.iconUrl) ||\n null;\n const durationMs = computeDurationMs(step.startTime, step.endTime);\n return {\n ...step,\n appLogoUrl: app?.logoUrl ?? null,\n iconUrl,\n durationMs,\n };\n });\n }\n\n async #loadCatalog(): Promise<WorkflowApp[] | null> {\n if (!this.workflowApps) {\n return null;\n }\n if (!this.catalogCache) {\n try {\n this.catalogCache = await this.workflowApps.list();\n } catch {\n return null;\n }\n }\n return this.catalogCache;\n }\n}\n\nfunction findActiveStepIndex(steps: ExecutionProgressStep[]): number {\n const idx = steps.findIndex(\n (s) =>\n s.status === 'RUNNING' ||\n s.status === 'NEEDS_INPUT' ||\n s.status === 'RETRYING' ||\n s.status === 'WAITING' ||\n s.status === 'SCHEDULED',\n );\n return idx;\n}\n\nfunction computeDurationMs(\n start?: string,\n end?: string,\n): number | null {\n if (!start || !end) return null;\n const a = Date.parse(start);\n const b = Date.parse(end);\n if (Number.isNaN(a) || Number.isNaN(b) || b < a) return null;\n return b - a;\n}\n\nfunction defaultSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateKnowledgeInput,\n Knowledge,\n KnowledgeDocument,\n KnowledgeDocumentGroup,\n SaveUploadedTextInput,\n UpdateKnowledgeInput,\n} from '../types';\nimport { serializeCsv } from './common';\n\nexport class KnowledgeResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists knowledge notebooks in the workspace. */\n list(options: { expansion?: string | string[] } = {}): Promise<Knowledge[]> {\n return this.http.get<Knowledge[]>('/api/knowledge', {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Returns a single knowledge notebook. */\n get(\n knowledgeId: string,\n options: { expansion?: string | string[] } = {},\n ): Promise<Knowledge> {\n return this.http.get<Knowledge>(`/api/knowledge/${knowledgeId}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Creates a knowledge notebook. Subject to the deployment's storage/vector infrastructure. */\n create(data: CreateKnowledgeInput): Promise<Knowledge> {\n return this.http.post<Knowledge>('/api/knowledge', { body: data });\n }\n\n /** Updates a knowledge notebook. */\n update(knowledgeId: string, data: UpdateKnowledgeInput): Promise<Knowledge> {\n return this.http.patch<Knowledge>(`/api/knowledge/${knowledgeId}`, {\n body: data,\n });\n }\n\n /** Deletes a knowledge notebook. */\n delete(knowledgeId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/knowledge/${knowledgeId}`);\n }\n\n /** Saves raw text into the notebook (chunked, embedded, and indexed server-side). */\n saveUploadedText(\n knowledgeId: string,\n data: SaveUploadedTextInput,\n ): Promise<unknown> {\n return this.http.post<unknown>(\n `/api/knowledge/${knowledgeId}/saveUploadedText`,\n { body: data },\n );\n }\n\n /** Lists the documents stored in a notebook. */\n listDocuments(knowledgeId: string): Promise<KnowledgeDocument[]> {\n return this.http.get<KnowledgeDocument[]>(\n `/api/knowledge/${knowledgeId}/documents`,\n );\n }\n\n /** Returns one document group (an uploaded document and its chunks). */\n getDocumentGroup(\n knowledgeId: string,\n groupId: string,\n ): Promise<KnowledgeDocumentGroup> {\n return this.http.get<KnowledgeDocumentGroup>(\n `/api/knowledge/${knowledgeId}/documents/${groupId}`,\n );\n }\n\n /** Deletes one document group from the notebook. */\n deleteDocumentGroup(knowledgeId: string, groupId: string): Promise<boolean> {\n return this.http.delete<boolean>(\n `/api/knowledge/${knowledgeId}/documents/${groupId}`,\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { iterateOffset, type OffsetPagination } from '../core/pagination';\nimport type {\n BulkCreateQueueItemsInput,\n BulkCreateQueueItemsResult,\n CreateQueueItemInput,\n QueueItem,\n QueueItemCreated,\n QueueItemErrorEntry,\n QueueItemFull,\n QueueItemList,\n QueueItemStats,\n UpdateQueueItemInput,\n} from '../types';\n\nexport type QueueItemStatus =\n | 'PENDING'\n | 'PROCESSING'\n | 'SUCCESS'\n | 'FAILED'\n | 'RETRYING';\n\nexport interface AddQueueItemErrorInput {\n /** Error message recorded on the item. */\n error: string;\n /**\n * Extra details. An object is sent as a JSON string, which is what the\n * server validates.\n */\n errorDetails?: string | Record<string, unknown>;\n}\nimport { serializeCsv, serializeFilterBy } from './common';\n\nexport interface ListQueueItemsOptions {\n limit?: number;\n offset?: number;\n expansion?: string | string[];\n /** Supports keys including `status`, `externalId`, `objectId`, `priority`. */\n filterBy?: string | Record<string, string>;\n}\n\nexport interface ListQueueItemsByObjectOptions {\n status?: string;\n limit?: number;\n offset?: number;\n expansion?: string | string[];\n}\n\nexport class QueueItemsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Returns one page of items in a queue (offset-based pagination). */\n list(\n queueId: string,\n options: ListQueueItemsOptions = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(`/api/queues/${queueId}/items`, {\n query: {\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy(options.filterBy),\n },\n });\n }\n\n /** Async-iterates every item in a queue, fetching batches lazily. */\n iterate(\n queueId: string,\n options: Omit<ListQueueItemsOptions, 'offset'> = {},\n ): AsyncGenerator<QueueItem, void, undefined> {\n return iterateOffset<QueueItem>(async (offset) => {\n const result = await this.list(queueId, { ...options, offset });\n return {\n items: result.items ?? [],\n pagination: result.pagination as unknown as OffsetPagination,\n };\n });\n }\n\n /** Returns a single queue item. */\n get(queueId: string, itemId: string): Promise<QueueItemFull> {\n return this.http.get<QueueItemFull>(\n `/api/queues/${queueId}/items/${itemId}`,\n );\n }\n\n /** Adds an item to a queue. Pass `objectId` to link the item to an entity. */\n create(\n queueId: string,\n data: CreateQueueItemInput,\n ): Promise<QueueItemCreated> {\n return this.http.post<QueueItemCreated>(`/api/queues/${queueId}/items`, {\n body: data,\n });\n }\n\n /**\n * Lists queue items linked to an Object across all queues in the workspace.\n * Use for Object detail \"Work\" panels.\n */\n listByObject(\n objectId: string,\n options: ListQueueItemsByObjectOptions = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/objects/${objectId}/queue-items`,\n {\n query: {\n status: options.status,\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n },\n },\n );\n }\n\n /** Async-iterates every queue item linked to an Object. */\n iterateByObject(\n objectId: string,\n options: Omit<ListQueueItemsByObjectOptions, 'offset'> = {},\n ): AsyncGenerator<QueueItem, void, undefined> {\n return iterateOffset<QueueItem>(async (offset) => {\n const result = await this.listByObject(objectId, {\n ...options,\n offset,\n });\n return {\n items: result.items ?? [],\n pagination: result.pagination as unknown as OffsetPagination,\n };\n });\n }\n\n /** Adds many items to a queue in one call. */\n bulkCreate(\n queueId: string,\n data: BulkCreateQueueItemsInput,\n ): Promise<BulkCreateQueueItemsResult> {\n return this.http.post<BulkCreateQueueItemsResult>(\n `/api/queues/${queueId}/items/bulk`,\n { body: data },\n );\n }\n\n /** Updates a queue item. */\n update(\n queueId: string,\n itemId: string,\n data: UpdateQueueItemInput,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}`,\n { body: data },\n );\n }\n\n /** Deletes a queue item. */\n delete(queueId: string, itemId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(\n `/api/queues/${queueId}/items/${itemId}`,\n );\n }\n\n /** Returns items that are ready to be processed. */\n listReady(queueId: string, options: { limit?: number } = {}): Promise<QueueItem[]> {\n return this.http.get<QueueItem[]>(`/api/queues/${queueId}/items/ready`, {\n query: { limit: options.limit },\n });\n }\n\n /** Returns items eligible for retry. */\n listRetryable(queueId: string): Promise<QueueItem[]> {\n return this.http.get<QueueItem[]>(`/api/queues/${queueId}/items/retry`);\n }\n\n /** Returns a page of items with the given status. */\n listByStatus(\n queueId: string,\n status: QueueItemStatus,\n options: { limit?: number; offset?: number } = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/queues/${queueId}/items/status/${status}`,\n { query: { limit: options.limit, offset: options.offset } },\n );\n }\n\n /** Looks an item up by the external ID your system supplied. */\n getByExternalId(queueId: string, externalId: string): Promise<QueueItemFull> {\n return this.http.get<QueueItemFull>(\n `/api/queues/${queueId}/items/external/${externalId}`,\n );\n }\n\n /**\n * Searches items by external id, item data, and metadata.\n * Returns one page, same shape as `list`.\n */\n search(\n queueId: string,\n query: string,\n options: Omit<ListQueueItemsOptions, 'filterBy'> = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/queues/${queueId}/items/search`,\n {\n query: {\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy({ search: query }),\n },\n },\n );\n }\n\n /** Returns per-status and per-priority counts for the queue. */\n stats(queueId: string): Promise<QueueItemStats> {\n return this.http.get<QueueItemStats>(`/api/queues/${queueId}/items/stats`);\n }\n\n /** Returns the recorded processing errors of an item. */\n listErrors(queueId: string, itemId: string): Promise<QueueItemErrorEntry[]> {\n return this.http.get<QueueItemErrorEntry[]>(\n `/api/queues/${queueId}/items/${itemId}/errors`,\n );\n }\n\n /** Updates the processing status of an item. */\n updateStatus(\n queueId: string,\n itemId: string,\n status: string,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/status`,\n { body: { status } },\n );\n }\n\n /** Links an item to the workflow execution that processed it. */\n linkExecution(\n queueId: string,\n itemId: string,\n executionId: string,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/link-execution`,\n { body: { executionId } },\n );\n }\n\n /** Queues the item for another processing attempt. */\n retry(queueId: string, itemId: string): Promise<QueueItem> {\n return this.http.post<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/retry`,\n );\n }\n\n /** Records a processing error on the item. */\n addError(\n queueId: string,\n itemId: string,\n error: AddQueueItemErrorInput,\n ): Promise<QueueItem> {\n return this.http.post<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/error`,\n {\n body: {\n error: error.error,\n errorDetails: serializeErrorDetails(error.errorDetails),\n },\n },\n );\n }\n}\n\nfunction serializeErrorDetails(\n value: string | Record<string, unknown> | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return typeof value === 'string' ? value : JSON.stringify(value);\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateQueueInput,\n Queue,\n QueueStats,\n UpdateQueueInput,\n} from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class QueuesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists queues in the workspace, ordered by priority then creation date. */\n list(options?: ListQueryOptions): Promise<Queue[]> {\n return this.http.get<Queue[]>('/api/queues', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single queue. */\n get(queueId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Queue> {\n return this.http.get<Queue>(`/api/queues/${queueId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a queue. */\n create(data: CreateQueueInput): Promise<Queue> {\n return this.http.post<Queue>('/api/queues', { body: data });\n }\n\n /** Updates a queue. */\n update(queueId: string, data: UpdateQueueInput): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}`, { body: data });\n }\n\n /** Deletes a queue. */\n delete(queueId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/api/queues/${queueId}`);\n }\n\n /** Returns aggregate statistics for a queue. */\n stats(queueId: string): Promise<QueueStats> {\n return this.http.get<QueueStats>(`/api/queues/${queueId}/stats`);\n }\n\n /** Activates a queue. */\n activate(queueId: string): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}/activate`);\n }\n\n /** Deactivates a queue. */\n deactivate(queueId: string): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}/deactivate`);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n ActionDefinition,\n WorkflowDefinition,\n WorkflowStepDefinition,\n} from '../define';\nimport {\n resolveActionAppId,\n resolveActionId,\n} from '../define';\nimport type { Execution, RunActionResult } from '../types';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface StartRunStep {\n /** Name later steps use with `ref.step(key, ...)`. */\n key?: string;\n appId: string;\n actionId: string;\n connectionId?: string;\n input?: Record<string, unknown>;\n name?: string;\n}\n\nexport interface StartRunOptions {\n steps: StartRunStep[];\n name?: string;\n}\n\nexport type StartRunInput =\n | StartRunOptions\n | WorkflowDefinition\n | WorkflowStepDefinition[]\n | StartRunStep[];\n\nfunction isWorkflowDefinition(value: unknown): value is WorkflowDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as WorkflowDefinition).kind === 'workflow'\n );\n}\n\nfunction isActionDefinition(value: unknown): value is ActionDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as ActionDefinition).kind === 'action'\n );\n}\n\nfunction stepFromDefinition(\n step: WorkflowStepDefinition | StartRunStep | ActionDefinition,\n): StartRunStep {\n if ('appId' in step && 'actionId' in step && !('use' in step) && !('kind' in step)) {\n return step as StartRunStep;\n }\n if (isActionDefinition(step)) {\n return {\n appId: resolveActionAppId(step),\n actionId: resolveActionId(step),\n ...(step.connection?.id ? { connectionId: step.connection.id } : {}),\n ...(step.input ? { input: step.input } : {}),\n ...(step.name ? { name: step.name } : {}),\n };\n }\n const use = (step as WorkflowStepDefinition).use;\n const input = {\n ...(use.input ?? {}),\n ...((step as WorkflowStepDefinition).input ?? {}),\n };\n const key = (step as WorkflowStepDefinition).key;\n return {\n ...(key ? { key } : {}),\n appId: resolveActionAppId(use),\n actionId: resolveActionId(use),\n ...(use.connection?.id ? { connectionId: use.connection.id } : {}),\n ...(Object.keys(input).length ? { input } : {}),\n ...(((step as WorkflowStepDefinition).name ?? use.name)\n ? { name: (step as WorkflowStepDefinition).name ?? use.name }\n : {}),\n };\n}\n\nfunction normalizeStartRunInput(input: StartRunInput): StartRunOptions {\n if (isWorkflowDefinition(input)) {\n // Ad-hoc runs have no trigger node. `trigger` is for deploy only.\n return {\n steps: input.steps.map(stepFromDefinition),\n name: input.name ?? input.slug,\n };\n }\n if (Array.isArray(input)) {\n return { steps: input.map((s) => stepFromDefinition(s as any)) };\n }\n return input;\n}\n\n/**\n * Multi-step ad-hoc runs (`POST /api/runs`) → one Execution with `source: SDK`.\n */\nexport class RunsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /**\n * Start a linear multi-step ad-hoc Execution.\n *\n * Accepts a `defineWorkflow` result, a step array, or an explicit\n * `{ steps, name? }` payload.\n */\n start(input: StartRunInput): Promise<RunActionResult> {\n const options = normalizeStartRunInput(input);\n if (!options.steps?.length) {\n throw new Error('runs.start requires at least one step');\n }\n return this.http.post<RunActionResult>('/api/runs', {\n body: options,\n });\n }\n\n /** Convenience: start and wait until terminal / NEEDS_INPUT. */\n async startAndWait(\n input: StartRunInput,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.start(input);\n return this.executions.waitUntilFinished(id, {\n ...waitOptions,\n expansion: [\n 'executionPath',\n 'source',\n ...(waitOptions?.expansion ?? []),\n ],\n });\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport type ScorecardMeasureStatus = 'ON_TRACK' | 'AT_RISK' | 'OFF_TRACK' | 'NO_DATA';\n\nexport type ScorecardSummary = {\n id: string;\n name: string;\n periodLabel: string | null;\n description: string | null;\n FK_ownerId: string | null;\n createdAt: string;\n _count: { objectives: number };\n};\n\nexport type ScorecardMeasure = {\n id: string;\n name: string;\n unit: string;\n currency: string | null;\n direction: 'HIGHER_IS_BETTER' | 'LOWER_IS_BETTER';\n kind: 'LEADING' | 'LAGGING';\n cadence: 'DAILY' | 'WEEKLY' | 'MONTHLY';\n sourceType: 'MANUAL' | 'API' | 'WORKFLOW' | 'BUILT_IN';\n builtInKey: string | null;\n target: number;\n atRiskThreshold: number | null;\n latest: { value: number; periodStart: string; createdAt: string } | null;\n previousValue: number | null;\n series: { periodStart: string; value: number }[];\n status: ScorecardMeasureStatus;\n stale: boolean;\n};\n\nexport type ScorecardObjective = {\n id: string;\n perspective: 'FINANCIAL' | 'CUSTOMER' | 'PROCESS' | 'LEARNING';\n name: string;\n description: string | null;\n ownerLabel: string | null;\n drivesIds: string[];\n position: number;\n status: ScorecardMeasureStatus;\n measures: ScorecardMeasure[];\n};\n\nexport type Scorecard = Omit<ScorecardSummary, '_count'> & {\n aiSpendUsdThisMonth: number;\n objectives: ScorecardObjective[];\n};\n\nexport type ScorecardMeasureValue = {\n id: string;\n FK_measureId: string;\n periodStart: string;\n value: number;\n note: string | null;\n sourceType: ScorecardMeasure['sourceType'];\n supersededAt: string | null;\n createdAt: string;\n};\n\nexport type RecordMeasureValueInput = {\n value: number;\n /** Any ISO date inside the target period; defaults to the current period. */\n period?: string;\n note?: string;\n};\n\n/**\n * Balanced Scorecard (workspace API). Pushing values needs `scorecard:record`.\n */\nexport class ScorecardsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists scorecards in the workspace. */\n list(): Promise<ScorecardSummary[]> {\n return this.http.get<ScorecardSummary[]>('/api/scorecards');\n }\n\n /** Returns a scorecard with objectives, measures, latest values and status. */\n get(scorecardId: string): Promise<Scorecard> {\n return this.http.get<Scorecard>(`/api/scorecards/${scorecardId}`);\n }\n\n /**\n * Records a measure value. A value for the same period replaces the current\n * one; the old value is kept as superseded history.\n */\n recordValue(\n measureId: string,\n data: RecordMeasureValueInput,\n ): Promise<ScorecardMeasureValue> {\n return this.http.post<ScorecardMeasureValue>(\n `/api/scorecards/measures/${measureId}/values`,\n { body: data },\n );\n }\n}\n","import type { UIMessage } from 'ai';\n\nimport type { HttpClient } from '../core/http';\nimport type {\n CreateTaskInput,\n DeletedTask,\n Task,\n TaskListItem,\n UpdateTaskInput,\n} from '../types';\nimport {\n messageTaskBody,\n type StreamMessageOptions,\n} from '../streaming/agent-chat';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class TasksResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists tasks (conversation threads) visible to the caller, most recently updated first. */\n list(options?: ListQueryOptions): Promise<TaskListItem[]> {\n return this.http.get<TaskListItem[]>('/api/tasks', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single task. Request `expansion: ['messages']` for the conversation history. */\n get(taskId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Task> {\n return this.http.get<Task>(`/api/tasks/${taskId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a task (conversation thread) for an agent. */\n create(\n agentId: string,\n data: CreateTaskInput,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Task> {\n return this.http.post<Task>(`/api/agents/${agentId}/tasks`, {\n body: data,\n query: serializeListQuery(options),\n });\n }\n\n /** Updates the task name or description. */\n update(\n taskId: string,\n data: UpdateTaskInput,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Task> {\n return this.http.patch<Task>(`/api/tasks/${taskId}`, {\n body: data,\n query: serializeListQuery(options),\n });\n }\n\n /** Permanently deletes a task and its messages. */\n delete(taskId: string): Promise<DeletedTask> {\n return this.http.delete<DeletedTask>(`/api/tasks/${taskId}`);\n }\n\n /**\n * Sends a message to an agent task and waits for the full agent turn to\n * finish (non-streaming). Returns either a plain string or the assistant\n * messages in AI SDK UIMessage format. For token-by-token output use\n * `client.agentChat.streamMessage` instead.\n */\n message(\n agentId: string,\n taskId: string,\n message: string | UIMessage,\n options: Omit<StreamMessageOptions, 'signal'> = {},\n ): Promise<string | UIMessage[]> {\n const uiMessage: UIMessage =\n typeof message === 'string'\n ? {\n id: generateMessageId(),\n role: 'user',\n parts: [{ type: 'text', text: message }],\n }\n : message;\n\n return this.http.post<string | UIMessage[]>(\n `/api/agents/${agentId}/tasks/${taskId}/message`,\n { body: messageTaskBody(uiMessage, options) },\n );\n }\n}\n\nfunction generateMessageId(): string {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateVariableInput,\n UpdateVariableInput,\n Variable,\n} from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class VariablesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists variables in the workspace. */\n list(options?: ListQueryOptions): Promise<Variable[]> {\n return this.http.get<Variable[]>('/api/variables', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single variable. */\n get(\n variableId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Variable> {\n return this.http.get<Variable>(`/api/variables/${variableId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a variable. */\n create(data: CreateVariableInput): Promise<Variable> {\n return this.http.post<Variable>('/api/variables', { body: data });\n }\n\n /** Updates a variable. */\n update(variableId: string, data: UpdateVariableInput): Promise<Variable> {\n return this.http.patch<Variable>(`/api/variables/${variableId}`, {\n body: data,\n });\n }\n\n /** Deletes a variable. */\n delete(variableId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/variables/${variableId}`);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { WorkflowApp } from '../types';\n\n/**\n * Read-only catalog of workflow apps and their actions/triggers. Custom UIs\n * use it to resolve `executionPath` step `appId`/`actionId` pairs to\n * human-readable names and icons, and to read the declarative\n * `ActionUIDefinition` metadata for rendering rich action outputs.\n */\nexport class WorkflowAppsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists all workflow apps installed on the deployment. */\n list(): Promise<WorkflowApp[]> {\n return this.http.get<WorkflowApp[]>('/api/workflow-apps');\n }\n\n /**\n * Creates a connection for an app where the connection type is\n * non-interactive (API key, basic auth). OAuth connections require the\n * browser flow inside the bundled UI and cannot be created here.\n */\n connect(\n appId: string,\n connectionId: string,\n value: Record<string, unknown>,\n ): Promise<unknown> {\n return this.http.post<unknown>(\n `/api/workflow-apps/${appId}/connections/${connectionId}/connect`,\n { body: value },\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { ExecuteWorkflowResult, Execution, Workflow } from '../types';\nimport type {\n TriggerDefinition,\n WorkflowDefinition,\n WorkflowStepDefinition,\n} from '../define';\nimport {\n resolveActionAppId,\n resolveActionId,\n resolveTriggerAppId,\n resolveTriggerId,\n} from '../define';\nimport { serializeListQuery, type ListQueryOptions } from './common';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface UpsertWorkflowStepInput {\n /** Name later steps use in `={{step:<key>,path}}`. Keeps the node id stable. */\n key?: string;\n appId: string;\n actionId: string;\n connectionId?: string;\n input?: Record<string, unknown>;\n name?: string;\n description?: string;\n}\n\nexport interface UpsertWorkflowTriggerInput {\n triggerId: string;\n appId?: string;\n connectionId?: string;\n /** Catalogue trigger config. */\n input?: Record<string, unknown>;\n /** Manual-trigger fields. Stored as `customInputConfig`. */\n inputs?: TriggerDefinition['inputs'];\n name?: string;\n description?: string;\n}\n\nexport interface UpsertWorkflowBySlugInput {\n slug: string;\n name?: string;\n description?: string;\n isActive?: boolean;\n /** Omit for Manually Run with no input fields. */\n trigger?: UpsertWorkflowTriggerInput;\n steps: UpsertWorkflowStepInput[];\n managedByCode?: boolean;\n}\n\nfunction triggerToUpsertInput(\n trigger: TriggerDefinition,\n): UpsertWorkflowTriggerInput {\n return {\n triggerId: resolveTriggerId(trigger),\n appId: resolveTriggerAppId(trigger),\n ...(trigger.connection?.id ? { connectionId: trigger.connection.id } : {}),\n ...(trigger.input ? { input: trigger.input } : {}),\n ...(trigger.inputs?.length ? { inputs: trigger.inputs } : {}),\n ...(trigger.name ? { name: trigger.name } : {}),\n ...(trigger.description ? { description: trigger.description } : {}),\n };\n}\n\nfunction stepToUpsertInput(\n step: WorkflowStepDefinition,\n): UpsertWorkflowStepInput {\n const use = step.use;\n return {\n ...(step.key ? { key: step.key } : {}),\n appId: resolveActionAppId(use),\n actionId: resolveActionId(use),\n connectionId: use.connection?.id,\n input: {\n ...(use.input ?? {}),\n ...(step.input ?? {}),\n },\n name: step.name ?? use.name,\n description: use.description,\n };\n}\n\nexport function workflowDefinitionToUpsert(\n def: WorkflowDefinition,\n): UpsertWorkflowBySlugInput {\n return {\n slug: def.slug,\n name: def.name,\n description: def.description,\n isActive: def.isActive,\n ...(def.trigger ? { trigger: triggerToUpsertInput(def.trigger) } : {}),\n managedByCode: true,\n steps: def.steps.map(stepToUpsertInput),\n };\n}\n\nexport class WorkflowsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /** Lists workflows in the current workspace. */\n list(options?: ListQueryOptions): Promise<Workflow[]> {\n return this.http.get<Workflow[]>('/api/workflows', {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Returns a single workflow. Request `expansion: ['triggerNode']` to read\n * the manual trigger's custom input field definitions.\n */\n get(\n workflowId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Workflow> {\n return this.http.get<Workflow>(`/api/workflows/${workflowId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Upsert a workflow by slug inside the workspace on the API key.\n * Prefer the CLI (`npx @lunnoa/client workflows deploy`) for happy-path deploy.\n */\n upsertBySlug(\n body: UpsertWorkflowBySlugInput | WorkflowDefinition,\n ): Promise<Workflow> {\n const payload =\n 'kind' in body && body.kind === 'workflow'\n ? workflowDefinitionToUpsert(body)\n : body;\n return this.http.post<Workflow>('/api/workflows/upsert', {\n body: payload,\n });\n }\n\n /**\n * Starts a new execution of the workflow with the given trigger inputs.\n * Returns immediately with the execution ID.\n */\n execute(\n workflowId: string,\n inputs?: Record<string, unknown>,\n ): Promise<ExecuteWorkflowResult> {\n return this.executions.execute(workflowId, inputs);\n }\n\n /**\n * Convenience: execute the workflow and wait (poll with backoff) until it\n * reaches a terminal status or pauses in `NEEDS_INPUT`.\n */\n async executeAndWait(\n workflowId: string,\n inputs?: Record<string, unknown>,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.executions.execute(workflowId, inputs);\n return this.executions.waitUntilFinished(id, waitOptions);\n }\n\n /**\n * Triggers a workflow through its unauthenticated custom webhook endpoint\n * (`POST /api/webhooks/workflows/:workflowId`). Only works for workflows\n * with a webhook trigger. Returns the synchronous trigger output when the\n * workflow responds synchronously.\n */\n triggerWebhook(\n workflowId: string,\n payload?: Record<string, unknown>,\n ): Promise<Record<string, unknown> | undefined> {\n return this.http.post<Record<string, unknown> | undefined>(\n `/api/webhooks/workflows/${workflowId}`,\n { body: payload ?? {} },\n );\n }\n}\n","import { HttpClient, type LunnoaClientOptions } from './core/http';\nimport { AgentChatClient } from './streaming/agent-chat';\nimport { ActionsResource } from './resources/actions';\nimport { AgentsResource } from './resources/agents';\nimport { AuthResource } from './resources/auth';\nimport { AiConnectionsResource } from './resources/ai-connections';\nimport { ConnectionsResource } from './resources/connections';\nimport { DiscoveryResource } from './resources/discovery';\nimport { EntitiesResource } from './resources/entities';\nimport { EntityTypesResource } from './resources/entity-types';\nimport { TablesResource } from './resources/tables';\nimport { ApprovalsResource } from './resources/approvals';\nimport { ExecutionsResource } from './resources/executions';\nimport { KnowledgeResource } from './resources/knowledge';\nimport { QueueItemsResource } from './resources/queue-items';\nimport { QueuesResource } from './resources/queues';\nimport { RunsResource } from './resources/runs';\nimport { ScorecardsResource } from './resources/scorecards';\nimport { TasksResource } from './resources/tasks';\nimport { VariablesResource } from './resources/variables';\nimport { WorkflowAppsResource } from './resources/workflow-apps';\nimport { WorkflowsResource } from './resources/workflows';\n\n/**\n * Typed client for the Lunnoa Automate Public API.\n *\n * Apps sign people in as Lunnoa users:\n * ```ts\n * import { createBrowserClient } from '@lunnoa/client';\n * const lunnoa = createBrowserClient({ baseUrl: 'https://lunnoa.acme.example' });\n * await lunnoa.auth.login({ email, password });\n * ```\n *\n * `apiKey` (`lna_...`) is for the CLI and operator scripts (codegen, discovery,\n * deploy). It is not an app login. Passing one while `window` exists throws:\n * a leaked key acts as that service account across its whole workspace.\n */\nexport class LunnoaClient {\n /** The underlying HTTP layer, exposed for advanced/escape-hatch requests. */\n readonly http: HttpClient;\n\n /** Login, refresh, SSO discovery, and session helpers for Lunnoa users. */\n readonly auth: AuthResource;\n readonly agents: AgentsResource;\n readonly tasks: TasksResource;\n /** Hand-written SSE streaming client for agent chat (AI SDK UIMessage chunks). */\n readonly agentChat: AgentChatClient;\n readonly workflows: WorkflowsResource;\n readonly executions: ExecutionsResource;\n /** Run catalogue actions as one-step ad-hoc Executions (`source: SDK`). */\n readonly actions: ActionsResource;\n /**\n * Multi-step ad-hoc Executions (`source: SDK`) via `POST /api/runs`.\n * Prefer `defineWorkflow` + `runs.start` for local linear chains.\n */\n readonly runs: RunsResource;\n /** Authenticated Approvals inbox (workspace API). */\n readonly approvals: ApprovalsResource;\n readonly entities: EntitiesResource;\n readonly entityTypes: EntityTypesResource;\n /** Small reference / lookup tables (rows stored inline; use entities for transactional data). */\n readonly tables: TablesResource;\n readonly knowledge: KnowledgeResource;\n readonly queues: QueuesResource;\n readonly queueItems: QueueItemsResource;\n readonly variables: VariablesResource;\n readonly scorecards: ScorecardsResource;\n readonly connections: ConnectionsResource;\n /** AI provider connections and the model ids each one accepts. */\n readonly aiConnections: AiConnectionsResource;\n readonly workflowApps: WorkflowAppsResource;\n readonly discovery: DiscoveryResource;\n\n constructor(options: LunnoaClientOptions) {\n this.http = new HttpClient(options);\n\n this.auth = new AuthResource(this.http, this.http.tokenStore);\n this.agents = new AgentsResource(this.http);\n this.tasks = new TasksResource(this.http);\n this.agentChat = new AgentChatClient(this.http);\n this.workflowApps = new WorkflowAppsResource(this.http);\n this.executions = new ExecutionsResource(this.http, this.workflowApps);\n this.actions = new ActionsResource(this.http, this.executions);\n this.runs = new RunsResource(this.http, this.executions);\n this.approvals = new ApprovalsResource(this.http);\n this.workflows = new WorkflowsResource(this.http, this.executions);\n this.entities = new EntitiesResource(this.http);\n this.entityTypes = new EntityTypesResource(this.http);\n this.tables = new TablesResource(this.http);\n this.knowledge = new KnowledgeResource(this.http);\n this.queues = new QueuesResource(this.http);\n this.queueItems = new QueueItemsResource(this.http);\n this.variables = new VariablesResource(this.http);\n this.scorecards = new ScorecardsResource(this.http);\n this.connections = new ConnectionsResource(this.http);\n this.aiConnections = new AiConnectionsResource(this.http);\n this.discovery = new DiscoveryResource(this.http);\n }\n}\n","/**\n * Pluggable storage for Lunnoa user JWTs.\n * The SDK never uses httpOnly cookies: Automate auth is bearer JWT based.\n */\nexport interface TokenStore {\n getAccessToken(): string | null | Promise<string | null>;\n getRefreshToken(): string | null | Promise<string | null>;\n setTokens(tokens: {\n accessToken: string;\n refreshToken?: string;\n }): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\n/** In-memory store (SSR, tests, or short-lived server handlers). */\nexport function createMemoryTokenStore(\n initial?: { accessToken?: string; refreshToken?: string },\n): TokenStore {\n let accessToken: string | null = initial?.accessToken ?? null;\n let refreshToken: string | null = initial?.refreshToken ?? null;\n\n return {\n getAccessToken: () => accessToken,\n getRefreshToken: () => refreshToken,\n setTokens: (tokens) => {\n accessToken = tokens.accessToken;\n if (tokens.refreshToken !== undefined) {\n refreshToken = tokens.refreshToken;\n }\n },\n clear: () => {\n accessToken = null;\n refreshToken = null;\n },\n };\n}\n\nexport interface LocalStorageTokenStoreOptions {\n /**\n * Defaults match the built-in Automate UI (`accessToken` / `refreshToken`)\n * so a custom portal can share a session with the product UI when desired.\n */\n accessTokenKey?: string;\n refreshTokenKey?: string;\n /**\n * Storage backend. Defaults to `globalThis.localStorage`.\n * Pass a mock in tests.\n */\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n}\n\n/**\n * Browser `localStorage` token store.\n * Throws if neither `options.storage` nor `globalThis.localStorage` is available.\n */\nexport function createLocalStorageTokenStore(\n options: LocalStorageTokenStoreOptions = {},\n): TokenStore {\n const accessTokenKey = options.accessTokenKey ?? 'accessToken';\n const refreshTokenKey = options.refreshTokenKey ?? 'refreshToken';\n const storage =\n options.storage ??\n (typeof globalThis !== 'undefined'\n ? (globalThis as { localStorage?: Storage }).localStorage\n : undefined);\n\n if (!storage) {\n throw new Error(\n 'createLocalStorageTokenStore requires localStorage (or a custom storage option). ' +\n 'On the server, use createMemoryTokenStore or pass accessToken / apiKey instead.',\n );\n }\n\n return {\n getAccessToken: () => storage.getItem(accessTokenKey),\n getRefreshToken: () => storage.getItem(refreshTokenKey),\n setTokens: (tokens) => {\n storage.setItem(accessTokenKey, tokens.accessToken);\n if (tokens.refreshToken !== undefined) {\n storage.setItem(refreshTokenKey, tokens.refreshToken);\n }\n },\n clear: () => {\n storage.removeItem(accessTokenKey);\n storage.removeItem(refreshTokenKey);\n },\n };\n}\n","import {\n createLocalStorageTokenStore,\n createMemoryTokenStore,\n type TokenStore,\n} from './token-store';\nimport { LunnoaClient } from '../client';\nimport type { FetchLike } from '../core/http';\n\nexport interface CreateBrowserClientOptions {\n /** Base URL of the Lunnoa Automate deployment. */\n baseUrl: string;\n /**\n * JWT store. Defaults to `localStorage` keys `accessToken` / `refreshToken`\n * (same as the built-in Automate UI).\n */\n tokenStore?: TokenStore;\n /**\n * Retry once after `POST /api/auth/refresh-token` on 401.\n * Defaults to true.\n */\n autoRefresh?: boolean;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n}\n\n/**\n * Browser (or isomorphic) client with JWT storage,\n * `lunnoa.auth.login` / refresh, and optional auto-refresh on 401.\n *\n * Never pass an `lna_` API key here.\n */\nexport function createBrowserClient(\n options: CreateBrowserClientOptions,\n): LunnoaClient {\n const tokenStore =\n options.tokenStore ?? createLocalStorageTokenStore();\n return new LunnoaClient({\n baseUrl: options.baseUrl,\n tokenStore,\n autoRefresh: options.autoRefresh ?? true,\n fetch: options.fetch,\n headers: options.headers,\n });\n}\n\nexport interface CreateServerClientOptions {\n /** Base URL of the Lunnoa Automate deployment. */\n baseUrl: string;\n /**\n * Workspace API key (`lna_...`) for operator scripts and the CLI.\n * Not an app login: people using an app authenticate as Lunnoa users.\n * Mutually exclusive with `accessToken` / `tokenStore`.\n */\n apiKey?: string;\n /**\n * User JWT (or getter) when the server already holds a signed-in Lunnoa user's token.\n */\n accessToken?: string | (() => string | Promise<string>);\n /** Optional store when the server holds both access and refresh tokens. */\n tokenStore?: TokenStore;\n autoRefresh?: boolean;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n}\n\n/**\n * Node helper for a Lunnoa user JWT held on the server, or an `lna_` key for\n * operator scripts. App login uses {@link createBrowserClient}. Throws if\n * used with an API key in a browser.\n */\nexport function createServerClient(\n options: CreateServerClientOptions,\n): LunnoaClient {\n if (!options.apiKey && !options.accessToken && !options.tokenStore) {\n throw new Error(\n 'createServerClient requires apiKey, accessToken, or tokenStore.',\n );\n }\n return new LunnoaClient({\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n accessToken: options.accessToken,\n tokenStore: options.tokenStore,\n autoRefresh: options.autoRefresh,\n fetch: options.fetch,\n headers: options.headers,\n });\n}\n\nexport { createLocalStorageTokenStore, createMemoryTokenStore };\nexport type { TokenStore };\n"]}
1
+ {"version":3,"sources":["../src/core/auth.ts","../src/core/errors.ts","../src/core/http.ts","../src/streaming/sse.ts","../src/streaming/agent-chat.ts","../src/resources/actions.ts","../src/define/files.ts","../src/define/index.ts","../src/resources/common.ts","../src/resources/agents.ts","../src/auth/types.ts","../src/resources/auth.ts","../src/resources/ai-connections.ts","../src/resources/connections.ts","../src/resources/discovery.ts","../src/core/pagination.ts","../src/resources/entities.ts","../src/resources/entity-types.ts","../src/resources/tables.ts","../src/resources/approvals.ts","../src/streaming/execution-progress.ts","../src/resources/executions.ts","../src/resources/knowledge.ts","../src/resources/queue-items.ts","../src/resources/queues.ts","../src/resources/runs.ts","../src/resources/scorecards.ts","../src/resources/tasks.ts","../src/resources/variables.ts","../src/resources/workflow-apps.ts","../src/resources/code-sync.ts","../src/resources/workflows.ts","../src/client.ts","../src/auth/token-store.ts","../src/auth/create-client.ts"],"names":["STEP_KEY_PATTERN","generateMessageId","syncFields"],"mappings":";AACO,IAAM,cAAA,GAAiB;AAGvB,SAAS,oBAAA,GAAgC;AAC9C,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC3B;AAQO,SAAS,iCAAiC,MAAA,EAAsB;AACrE,EAAA,IAAI,sBAAqB,EAAG;AAC1B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,cAAc,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,sDAAsD,cAAc,CAAA,uFAAA;AAAA,KAEtE;AAAA,EACF;AACF;;;AC5BO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA;AAAA,EAE/B,MAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,eAAA;AAAA,EAET,YAAY,IAAA,EAKT;AACD,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAQ,eAAA,GAAkB,CAAA,iBAAA,EAAoB,eAAe,CAAA,CAAA,GAAK,MAAS,CAAA,CACvF,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,IAAA,KAAA;AAAA,MACE,CAAA,2BAAA,EAA8B,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,QAAA,EAAM,IAAA,CAAK,MAAM,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAK,MAAM,EAAE,CAAA;AAAA,KACtG;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,cAAA,GAA0B;AAC5B,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,aAAA,GAAyB;AAC3B,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AACF;AASA,SAAS,uBAAuB,IAAA,EAAmC;AACjE,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,MAAA;AAC9C,EAAA,MAAM,WAAY,IAAA,CAAiC,eAAA;AACnD,EAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AACnD;AAEA,SAAS,eAAe,IAAA,EAAmC;AACzD,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,MAAM,MAAA,GAAS,IAAA;AACf,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,KAAA;AAC3C,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,MAAA,OAAO,SAAA,CAAU,OAAO,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACjE;AAAA,EACF;AACA,EAAA,IAAI,OAAO,SAAS,QAAA,IAAY,IAAA,CAAK,SAAS,CAAA,IAAK,IAAA,CAAK,SAAS,GAAA,EAAK;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;;;ACdO,IAAM,aAAN,MAAiB;AAAA,EACb,OAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EACQ,MAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACT,eAAA,GAA2C,IAAA;AAAA,EAEnD,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,CAAC,QAAQ,MAAA,IAAU,CAAC,QAAQ,WAAA,IAAe,CAAC,QAAQ,UAAA,EAAY;AAClE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,gCAAA,CAAiC,QAAQ,MAAM,CAAA;AAAA,IACjD;AACA,IAAA,IACE,OAAO,QAAQ,WAAA,KAAgB,QAAA,IAC/B,QAAQ,WAAA,CAAY,UAAA,CAAW,cAAc,CAAA,EAC7C;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACjD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,WAAA,GACH,QAAQ,WAAA,IAAe,OAAA,CAAQ,QAAQ,UAAA,IAAc,CAAC,QAAQ,MAAM,CAAA;AACtE,IAAA,IAAA,CAAK,QACH,OAAA,CAAQ,KAAA,IAAU,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,CAAA;AACpD,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,EAC5C;AAAA,EAEA,MAAM,iBAAA,GAAqC;AACzC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,CAAA,OAAA,EAAU,KAAK,MAAM,CAAA,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,UAAA,CAAW,cAAA,EAAe;AACvD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SAEF;AAAA,MACF;AACA,MAAA,OAAO,UAAU,SAAS,CAAA,CAAA;AAAA,IAC5B;AACA,IAAA,MAAM,KAAA,GACJ,OAAO,IAAA,CAAK,WAAA,KAAgB,aACxB,MAAM,IAAA,CAAK,WAAA,EAAY,GACvB,IAAA,CAAK,WAAA;AACX,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,UAAU,KAAK,CAAA,CAAA;AAAA,EACxB;AAAA,EAEA,QAAA,CAAS,MAAc,KAAA,EAA4C;AACjE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,UAAU,IAAI,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAYA,MAAM,OAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACJ;AACvB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,KAAK,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,IAAA,CAAK,cAAA;AAAA,MACR,GAAG,OAAA,CAAQ;AAAA,KACb;AAEA,IAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACvD;AAEA,IAAA,MAAM,OAAoB,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA,EAAO;AACpE,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,IACzC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAE3C,IAAA,IACE,CAAC,QAAA,CAAS,EAAA,IACV,SAAS,MAAA,KAAW,GAAA,IACpB,CAAC,OAAA,CAAQ,QAAA,IACT,CAAC,OAAA,CAAQ,wBACT,IAAA,CAAK,WAAA,IACL,KAAK,UAAA,IACL,CAAC,KAAK,MAAA,EACN;AACA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,qBAAA,EAAsB;AACnD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAO,IAAA,CAAK,OAAA,CAAW,MAAA,EAAQ,IAAA,EAAM;AAAA,UACnC,GAAG,OAAA;AAAA,UACH,oBAAA,EAAsB;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAC3C,MAAA,MAAM,IAAI,cAAA,CAAe;AAAA,QACvB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,IAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAQ,MAAM,gBAAgB,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEA,GAAA,CAAO,MAAc,OAAA,EAAsC;AACzD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,IAAA,CAAQ,MAAc,OAAA,EAAsC;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,KAAA,CAAS,MAAc,OAAA,EAAsC;AAC3D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,OAAA,EAAS,IAAA,EAAM,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEA,GAAA,CAAO,MAAc,OAAA,EAAsC;AACzD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAA,CAAU,MAAc,OAAA,EAAsC;AAC5D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAA,GAA0C;AAC9C,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,cAAA,EAAe,CAAE,QAAQ,MAAM;AACzD,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,MAAc,cAAA,GAAmC;AAC/C,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAY,eAAA,EAAgB;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,yBAAyB,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK;AAAA,QACrC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,cAAc;AAAA,OACtC,CAAA;AACD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAA,CAAK,WAAY,KAAA,EAAM;AAC7B,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,GAAQ,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAG5C,MAAA,IAAI,CAAC,MAAM,YAAA,EAAc;AACvB,QAAA,MAAM,IAAA,CAAK,WAAY,KAAA,EAAM;AAC7B,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAM,KAAK,UAAA,CAAY,SAAA,CAAU,EAAE,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA;AACnE,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAA,CAAK,WAAY,KAAA,EAAM;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,gBAAgB,QAAA,EAAsC;AACnE,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACrSA,gBAAuB,eACrB,MAAA,EACyC;AACzC,EAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAChD,IAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,MAAA,MAAM,KAAA,CAAM,IAAA;AAAA,IACd;AAAA,EACF;AACF;AAaA,gBAAuB,eACrB,MAAA,EAC2C;AAC3C,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,UAAU,IAAI,WAAA,CAAY,SAAS,EAAE,KAAA,EAAO,OAAO,CAAA;AACzD,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA;AAAA,MACF;AACA,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAGhD,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AACrC,MAAA,IAAI,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACpC,MAAA,OAAO,aAAa,CAAA,CAAA,EAAI;AACtB,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AACzC,QAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AAClC,QAAA,QAAA,GAAW,MAAA,CAAO,QAAQ,MAAM,CAAA;AAEhC,QAAA,MAAM,MAAA,GAAS,aAAa,QAAQ,CAAA;AACpC,QAAA,IAAI,MAAA,CAAO,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,UAAU,SAAA,EAAW;AACtD,UAAA,MAAM,MAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,EAAK;AAC9B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,MAAA,GAAS,aAAa,SAAS,CAAA;AACrC,MAAA,IAAI,MAAA,CAAO,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,UAAU,SAAA,EAAW;AACtD,QAAA,MAAM,MAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAEA,SAAS,aAAa,QAAA,EAA4B;AAChD,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,IAAI,SAAA,GAAY,SAAA;AAEhB,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG;AACvC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,MAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AACtC,MAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,QAAA,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,MACvB;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,SAAA,GAAY,KAAA;AAAA,MACd;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,MAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACrC,MAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,QAAA,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,MACvB;AACA,MAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAA;AAAA,IACP,MAAM,SAAA,CAAU,MAAA,KAAW,IAAI,IAAA,GAAO,SAAA,CAAU,KAAK,IAAI;AAAA,GAC3D;AACF;;;ACxDO,IAAM,kBAAN,MAA+D;AAAA,EASpE,WAAA,CACmB,UACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEjB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAAA,EACnD;AAAA,EAJmB,QAAA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EANV,KAAA;AAAA,EAED,QAAA,GAAW,KAAA;AAAA,EASnB,CAAC,MAAA,CAAO,aAAa,CAAA,GAAqD;AACxE,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA,EAEA,OAAO,MAAA,GAA0D;AAC/D,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,IAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,MAAiB,IAAA,IAAQ,cAAA,CAAe,IAAI,CAAA,EAAG;AAC7C,MAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS;AACjC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,UAAU,MAAA,EAAQ;AAC5D,QAAA,MAAM,MAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAAoD;AAClD,IAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO;AAC7B,IAAA,OAAO,IAAI,cAAA,CAA+B;AAAA,MACxC,MAAM,KAAK,UAAA,EAAY;AACrB,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,SAAS,IAAA,EAAK;AAC5C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,UAAA,CAAW,KAAA,EAAM;AAAA,QACnB,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA;AAAA,MACA,MAAM,MAAA,GAAS;AACb,QAAA,MAAM,SAAS,MAAA,EAAO;AAAA,MACxB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAA,GAAwB;AAC5B,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,MAAA,EAAO,EAAG;AACvC,MAAA,IAAI,MAAM,IAAA,KAAS,YAAA,IAAgB,OAAO,KAAA,CAAM,UAAU,QAAA,EAAU;AAClE,QAAA,IAAA,IAAQ,KAAA,CAAM,KAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU7B,MAAM,aAAA,CACJ,OAAA,EACA,QACA,OAAA,EACA,OAAA,GAAgC,EAAC,EACP;AAC1B,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf;AAAA,MACE,IAAI,iBAAA,EAAkB;AAAA,MACtB,IAAA,EAAM,MAAA;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,SAAS;AAAA,KACzC,GACA,OAAA;AAEN,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA;AAAA,MAC/B,MAAA;AAAA,MACA,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,CAAA;AAAA,MACtC;AAAA,QACE,GAAA,EAAK,IAAA;AAAA,QACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS,EAAE,MAAA,EAAQ,mBAAA,EAAoB;AAAA,QACvC,IAAA,EAAM,eAAA,CAAgB,SAAA,EAAW,OAAO;AAAA;AAC1C,KACF;AAEA,IAAA,OAAO,IAAI,eAAA,CAAgB,QAAA,EAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,CACJ,OAAA,EACA,MAAA,EACA,OAAA,GAAoC,EAAC,EACJ;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA;AAAA,MAC/B,KAAA;AAAA,MACA,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,CAAA;AAAA,MACtC;AAAA,QACE,GAAA,EAAK,IAAA;AAAA,QACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS,EAAE,MAAA,EAAQ,mBAAA;AAAoB;AACzC,KACF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAI,eAAA,CAAgB,QAAA,EAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CACJ,OAAA,EACA,MAAA,EACA,OAAA,GAA6B,EAAC,EACJ;AAC1B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,oBAAA,CAAA;AAAA,MACtC;AAAA,QACE,IAAA,EAAM,QAAQ,gBAAA,GACV,EAAE,kBAAkB,OAAA,CAAQ,gBAAA,KAC5B;AAAC;AACP,KACF;AAAA,EACF;AACF;AAEO,SAAS,eAAA,CACd,OAAA,EACA,OAAA,GAAgD,EAAC,EACjD;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,IAClB,QAAA,EAAU,QAAQ,QAAA,IAAY,SAAA;AAAA,IAC9B,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,IAC7C,GAAI,QAAQ,aAAA,GAAgB,EAAE,eAAe,OAAA,CAAQ,aAAA,KAAkB;AAAC,GAC1E;AACF;AAEA,SAAS,iBAAA,GAA4B;AACnC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAA;AAC7B,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,OAAO,UAAU,UAAA,EAAW;AAAA,EAC9B;AACA,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACrE;;;ACzNO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,WAAA,CACmB,MACA,UAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAanB,IAAI,OAAA,EAAqD;AACvD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAsB,kBAAA,EAAoB;AAAA,MACzD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CACJ,OAAA,EACA,WAAA,EACoB;AACpB,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,IAAA,CAAK,IAAI,OAAO,CAAA;AACrC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,iBAAA,CAAkB,EAAA,EAAI;AAAA,MAC3C,GAAG,WAAA;AAAA,MACH,SAAA,EAAW;AAAA,QACT,eAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,WAAA,EAAa,SAAA,IAAa;AAAC;AACjC,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAA,CACJ,KAAA,EACA,QAAA,EAC8C;AAC9C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAK3B,oBAAoB,CAAA;AACtB,IAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC3C,IAAA,OAAO,KAAK,OAAA,EAAS,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,EAC9D;AACF;;;AC0IA,IAAM,gBAAA,GAAmB,0BAAA;AAEzB,SAAS,oBAAoB,MAAA,EAA0C;AACrE,EAAA,IAAI,OAAO,YAAA,IAAgB,OAAO,MAAA,CAAO,YAAA,KAAiB,UAAU,OAAO,IAAA;AAC3E,EAAA,IAAI,OAAO,QAAA,IAAY,OAAO,MAAA,CAAO,QAAA,KAAa,UAAU,OAAO,IAAA;AACnE,EAAA,IACE,WAAA,IAAe,MAAA,IACf,QAAA,IAAY,MAAA,IACZ,eAAe,MAAA,IACf,WAAA,IAAe,MAAA,IACf,SAAA,IAAa,UACb,aAAA,IAAiB,MAAA,IACjB,YAAA,IAAgB,MAAA,IAChB,eAAe,MAAA,EACf;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OACE,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,IAC1B,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,CAAC,IAAA,KACC,IAAA,IACA,OAAO,IAAA,KAAS,YAChB,EAAE,MAAA,IAAU,IAAA,CAAA,IACZ,EAAE,KAAA,IAAS,IAAA;AAAA,GACf;AAEJ;AAEO,SAAS,iBAAiB,MAAA,EAA2C;AAC1E,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,UAAU,OAAO,KAAA;AAClD,EAAA,OAAO,oBAAoB,MAAiC,CAAA;AAC9D;AAGO,SAAS,iBAAiB,MAAA,EAAgD;AAC/E,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,UAAU,OAAO,KAAA;AAClD,EAAA,OAAO,oBAAoB,MAAiC,CAAA;AAC9D;AAEO,SAAS,gBAAgB,MAAA,EAA6C;AAC3E,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAK;AAC/B,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,2BAA2B,CAAA;AACtD,EAAA,MAAM,eAAe,MAAA,CAAO,YAAA;AAC5B,EAAA,MAAM,OAAA,GACJ,YAAA,IACA,OAAO,YAAA,KAAiB,QAAA,IACxB,OAAO,YAAA,CAAa,IAAA,KAAS,QAAA,IAC7B,YAAA,CAAa,IAAA,CAAK,IAAA,GAAO,MAAA,GAAS,CAAA;AACpC,EAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,CAAC,OAAA,EAAS;AAChD,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,EAAA,OAAO,IAAA,CAAK,OAAA;AACZ,EAAA,OAAO,IAAA,CAAK,IAAA;AACZ,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,MAAM,YAAA,EAAa;AACtD;AAEA,SAAS,cAAA,CAAe,OAA2B,IAAA,EAAyB;AAC1E,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,IAAS,EAAC,EAAG;AAC9B,IAAA,IAAI,CAAC,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,MAAK,EAAG;AAC1B,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAW;AAC1B,MAAA,IAAI,CAAC,iBAAiB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC9D,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,UAAA,EAAa,KAAK,GAAG,CAAA,8EAAA;AAAA,SACvB;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,IAAA,CAAK,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,MACzD;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACnB;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AACnC,MAAA,cAAA,CAAe,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,IAAI,CAAA;AAAA,IACvC;AAAA,EACF;AACF;AAEO,SAAS,wBACd,MAAA,EAC6B;AAC7B,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAK;AAC/B,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,8BAA8B,CAAA;AACzD,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,OAAO,OAAA,IAAW,CAAC,OAAO,OAAA,CAAQ,EAAA,EAAI,MAAK,EAAG;AAChD,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,cAAA,CAAe,MAAA,CAAO,KAAA,kBAAO,IAAI,GAAA,EAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,EAAA,OAAO,IAAA,CAAK,OAAA;AACZ,EAAA,OAAO,IAAA,CAAK,IAAA;AACZ,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR;AAAA,GACF;AACF;AAEO,SAAS,wBACd,MAAA,EAC6B;AAC7B,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAK;AAC/B,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,8BAA8B,CAAA;AACzD,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7D,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACvD;AACA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM,GAAA,IAAO,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAU;AAC9C,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,UAAA,EAAa,KAAK,GAAG,CAAA,0EAAA;AAAA,OACvB;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,IAAA,CAAK,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,CAAA;AACjB,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,SAAA,EAAW,QAAA,IAAY,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA,IAAK,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,cAAc,IAAA,EAAM,MAAA,IAAU,EAAE,CAAA,MAAA,EAAS,IAAA,EAAM,UAAU,EAAE,CAAA,4BAAA;AAAA,OAC7D;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,EAAA,OAAO,IAAA,CAAK,OAAA;AACZ,EAAA,OAAO,IAAA,CAAK,IAAA;AACZ,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA;AAAA,IACA,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS;AAAC,GAC1B;AACF;AAEO,SAAS,qBAAqB,MAAA,EAAmD;AACtF,EAAA,OACE,CAAC,CAAC,MAAA,IACF,OAAO,MAAA,KAAW,QAAA,IACjB,OAA+B,MAAA,KAAW,OAAA;AAE/C;AAEO,SAAS,oBAAoB,MAAA,EAAmD;AACrF,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,UAAU,OAAO,KAAA;AAClD,EAAA,MAAM,MAAA,GAAS,MAAA;AACf,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,OAAA,EAAS,OAAO,IAAA;AACtC,EAAA,IACE,MAAA,CAAO,OAAA,IACP,OAAO,MAAA,CAAO,YAAY,QAAA,IACzB,MAAA,CAAO,OAAA,CAA8B,IAAA,KAAS,SAAA,IAC/C,OAAQ,MAAA,CAAO,OAAA,CAA4B,OAAO,QAAA,EAClD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OACE,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,IAC1B,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,CAAC,IAAA,KACC,IAAA,IACA,OAAO,IAAA,KAAS,YACf,IAAA,CAAqC,GAAA,IACrC,IAAA,CAAqC,GAAA,EAAK,IAAA,KAAS;AAAA,GACxD;AAEJ;;;AC1XO,IAAM,YAAA,GAAe;AAAA,EAC1B,UAAA,EAAY,YAAA;AAAA,EACZ,YAAA,EAAc,cAAA;AAAA,EACd,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY;AACd;AAiGO,IAAM,eAAA,GAAkB;AAAA,EAC7B,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,6BAAA;AAAA,EACA,0BAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF;AA+DO,SAAS,gBAAA,CACd,MAAA,GAA6C,EAAC,EACxB;AACtB,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,UAAA,EAAY,GAAG,MAAA,EAAO;AACpD;AAEO,SAAS,kBAAA,CACd,MAAA,GAA+C,EAAC,EACxB;AACxB,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,YAAA,EAAc,GAAG,MAAA,EAAO;AACtD;AAEO,SAAS,aACd,MAAA,EACkB;AAClB,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,IAAA,EAAK,EAAG;AACtB,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,MAAA,EAAQ,GAAG,MAAA,EAAO;AAChD;AAEA,SAAS,oBAAoB,MAAA,EAA+C;AAC1E,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,IAAA,EAAK,EAAG;AACtB,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO,EAAA,EAAI,IAAA,EAAK,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AAAA,EACF;AACA,EAAA,IAAI,OAAO,MAAA,EAAQ,MAAA,IAAU,OAAO,EAAA,CAAG,IAAA,OAAW,iBAAA,EAAmB;AACnE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAEO,SAAS,cACd,MAAA,EACmB;AACnB,EAAA,mBAAA,CAAoB,MAAM,CAAA;AAC1B,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,OAAA,EAAS,GAAG,MAAA,EAAO;AACjD;AAEA,IAAM,iBAAA,GAAoB,6BAAA;AAC1B,IAAM,WAAA,GAAc,SAAA;AACpB,IAAMA,iBAAAA,GAAmB,0BAAA;AACzB,IAAM,gBAAA,GAAmB,oBAAA;AAEzB,SAAS,SAAA,CAAU,KAAa,IAAA,EAAsC;AACpE,EAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,GAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AACvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2DAAA,EAA8D,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACvF;AAAA,EACF;AACA,EAAA,OAAO,CAAA,QAAA,EAAW,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA;AACnC;AAOO,IAAM,GAAA,GAAM;AAAA;AAAA,EAEjB,OAAA,EAAS,CAAC,KAAA,EAAA,GAAkB,IAAA,KAC1B,SAAA,CAAU,aAAa,CAAC,KAAA,EAAO,GAAG,IAAI,CAAC,CAAA;AAAA;AAAA,EAEzC,MAAM,CAAC,GAAA,EAAA,GAAgB,IAAA,KACrB,SAAA,CAAU,KAAK,IAAI;AACvB;AAEA,SAAS,WAAA,CAAY,OAAgB,GAAA,EAAuB;AAC1D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACpD,MAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAAA,IACzD;AAAA,EACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/B,IAAA,KAAA,CAAM,QAAQ,CAAC,IAAA,KAAS,WAAA,CAAY,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EAChD,CAAA,MAAA,IAAW,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS,WAAA,CAAY,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EAC/D;AACF;AAEA,IAAM,oBAAA,GAAuB,uCAAA;AAC7B,IAAM,WAAA,GAAc,sCAAA;AACpB,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,oBAAA;AAAA,EACA,2CAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,kBAAA,GAAqB,IAAI,GAAA,CAAY,eAAe,CAAA;AAC1D,IAAM,kBAAA,GAAqB,mBAAA;AAE3B,SAAS,WAAA,CAAY,OAAiC,IAAA,EAAyB;AAC7E,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAW;AAC1B,MAAA,IAAI,CAACA,kBAAiB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA,CAAK,QAAQ,WAAA,EAAa;AAChE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,UAAA,EAAa,IAAA,CAAK,GAAG,CAAA,qEAAA,EAAwE,WAAW,CAAA,EAAA;AAAA,SAC1G;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,IAAA,CAAK,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,MACzD;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACnB;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,cAAe,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,IAAI,CAAA;AAAA,EACzE;AACF;AAGA,SAAS,eAAe,MAAA,EAAgD;AACtE,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,EAAS,EAAA,CAAG,MAAK,IAAK,iBAAA;AAC/C,EAAA,MAAM,gBACJ,SAAA,KAAc,iBAAA,GACV,IAAI,GAAA,CAAA,CAAK,MAAA,CAAO,SAAS,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,IAAA,EAAM,CAAC,CAAA,GAC9D,MAAA;AACN,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,WAAA,CAAY,MAAA,CAAO,OAAO,OAAO,CAAA;AAEjC,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,EAAgB,OAAA,EAAsB,KAAA,KAAkB;AACzE,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,WAAA,CAAY,OAAO,IAAI,CAAA;AACvB,IAAA,KAAA,MAAW,CAAC,GAAA,GAAM,EAAA,EAAI,GAAG,IAAI,KAAK,IAAA,EAAM;AACtC,MAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,GAAA,EAAK,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA;AACjD,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,GACX,GAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,gHAAA,CAAA,GAClB,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,uBAAuB,GAAG,CAAA,0CAAA;AAAA,SAClD;AAAA,MACF;AACA,MAAA,IAAI,GAAA,KAAQ,WAAA,IAAe,aAAA,IAAiB,CAAC,aAAA,CAAc,IAAI,IAAA,CAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AAC7E,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,wBAAwB,IAAA,CAAK,CAAC,KAAK,EAAE,CAAA,2CAAA;AAAA,SACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAiC,OAAA,KAAyB;AAC5E,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAO,CAAA;AAC/B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,QAAQ,CAAA,MAAA,EAAS,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,IAAQ,QAAQ,CAAC,CAAA,CAAA,CAAA;AACzD,MAAA,SAAA,CAAU,CAAC,KAAK,GAAA,EAAK,KAAA,EAAO,KAAK,KAAK,CAAA,EAAG,SAAS,KAAK,CAAA;AACvD,MAAA,IAAI,IAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAG,CAAA;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ;AAEzB,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,GAAM,eAAA,CAAgB,IAAA,CAAK,GAAG,CAAA,GAAI,EAAA;AACxD,MAAA,IAAI,CAAC,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACvC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,qBAAA,EAAwB,CAAC,GAAG,oBAAoB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MACzF;AACA,MAAA,IAAI,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,GAAG,KAAK,CAAA,wFAAA;AAAA,SACV;AAAA,MACF;AACA,MAAA,IAAI,QAAA,KAAa,WAAA,IAAe,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AACrD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,qEAAA,CAAuE,CAAA;AAAA,MACjG;AACA,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,QAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAChC,QAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,2BAAA,CAA6B,CAAA;AACjE,QAAA,IAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,gBAAA,CAAkB,CAAA;AACvF,QAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAChB,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAa,QAAA,KAAa,oBAAA,EAAsB;AAChE,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,yCAAA,CAA2C,CAAA;AAAA,QACrE;AACA,QAAA,KAAA,MAAW,cAAc,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG,MAAK,EAAG;AAChD,UAAA,IAAI,CAAC,mBAAmB,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA,EAAK,IAAK,EAAE,CAAA,EAAG;AAC5D,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,CAAA,EAAG,KAAK,CAAA,QAAA,EAAW,KAAK,CAAA,qEAAA;AAAA,aAC1B;AAAA,UACF;AACA,UAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAChD,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,CAAA,EAAG,KAAK,CAAA,QAAA,EAAW,KAAK,CAAA,cAAA,EAAiB,SAAA,CAAU,SAAS,CAAA,gCAAA,EAAmC,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,aAC3H;AAAA,UACF;AAAA,QACF;AACA,QAAA,SAAA,CAAU,KAAK,IAAA,EAAM,OAAA,EAAS,GAAG,KAAK,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAG,CAAA;AACzD,QAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,QAAA,EAAW,KAAK,CAAA,0BAAA,CAA4B,CAAA;AAC7F,QAAA,UAAA,CAAW,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,MAChC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,UAAA,CAAW,OAAO,KAAA,kBAAO,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;AACjD;AAOO,SAAS,eACd,MAAA,EAIgF;AAChF,EAAA,MAAM,MAAA,GAAS,MAAA;AACf,EAAA,IACE,oBAAA,CAAqB,MAAM,CAAA,IAC1B,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAC3D;AACA,IAAA,OAAO,wBAAwB,MAAgC,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,mBAAA,CAAoB,MAAM,CAAA,EAAG;AAC/B,IAAA,OAAO,wBAAwB,MAAM,CAAA;AAAA,EACvC;AACA,EAAA,MAAM,QAAA,GAAW,EAAE,GAAI,MAAA,EAAmE;AAC1F,EAAA,OAAO,QAAA,CAAS,OAAA;AAChB,EAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAM,IAAA,EAAK,EAAG;AAC1B,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,KAAA,EAAO,MAAA,EAAQ;AAC3B,IAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,EACtC;AACA,EAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,QAAA,EAAU,GAAG,QAAA,EAAS;AACpD;AAIO,SAAS,YACd,MAAA,EACuC;AACvC,EAAA,IAAI,gBAAA,CAAiB,MAAM,CAAA,EAAG;AAC5B,IAAA,OAAO,gBAAgB,MAAM,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,QAAA,GAAW,EAAE,GAAI,MAAA,EAAgE;AACvF,EAAA,OAAO,QAAA,CAAS,OAAA;AAChB,EAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAM,IAAA,EAAK,EAAG;AAC1B,IAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,KAAA,EAAO,IAAA,EAAK,EAAG;AAC3B,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,QAAA,CAAS,gBAAgB,IAAA,EAAM;AACjC,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,CAAa,KAAA,EAAO,GAAG,QAAA,EAAS;AACjD;AAsBO,SAAS,iBACd,MAAA,EACsB;AACtB,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,IAAA,EAAK,EAAG;AACxB,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AACA,EAAA,IACE,CAAC,MAAA,CAAO,eAAA,IACR,OAAO,MAAA,CAAO,eAAA,KAAoB,QAAA,IAClC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,eAAe,CAAA,EACpC;AACA,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO;AAAA,IACL,MAAM,YAAA,CAAa,UAAA;AAAA,IACnB,sBAAA,EAAwB,KAAA;AAAA,IACxB,GAAG;AAAA,GACL;AACF;AAGO,SAAS,mBAAmB,MAAA,EAAkC;AACnE,EAAA,IAAI,MAAA,CAAO,KAAA,EAAO,IAAA,EAAK,EAAG;AACxB,IAAA,OAAO,MAAA,CAAO,MAAM,IAAA,EAAK;AAAA,EAC3B;AACA,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAA,CAAG,IAAA,EAAK;AAC1B,EAAA,MAAM,YAAA,GAAe,UAAA;AACrB,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,OAAA,CAAQ,YAAY,CAAA;AAC3C,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA;AAAA,EAChC;AACA,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,kCAAkC,EAAE,CAAA,yBAAA;AAAA,GACtC;AACF;AAGO,SAAS,oBAAoB,OAAA,EAAoC;AACtE,EAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,MAAM,IAAA,EAAK;AAAA,EAC5B;AACA,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,EAAA,CAAG,IAAA,EAAK;AAC3B,EAAA,MAAM,MAAA,GAAS,WAAA;AACf,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,OAAA,CAAQ,MAAM,CAAA;AACrC,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA;AAAA,EAChC;AACA,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,mCAAmC,EAAE,CAAA,yBAAA;AAAA,GACvC;AACF;AAEO,SAAS,iBAAiB,OAAA,EAAoC;AACnE,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,EAAA,CAAG,IAAA,EAAK;AAC3B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK;AAClC,EAAA,IAAI,SAAS,EAAA,CAAG,UAAA,CAAW,CAAA,EAAG,KAAK,GAAG,CAAA,EAAG;AACvC,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,MAAA,GAAS,WAAA;AACf,EAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AACvB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,EAAA;AACT;AAyBO,SAAS,gBAAgB,MAAA,EAAkC;AAChE,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAA,CAAG,IAAA,EAAK;AAC1B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,EAAO,IAAA,EAAK;AACjC,EAAA,IAAI,SAAS,EAAA,CAAG,UAAA,CAAW,CAAA,EAAG,KAAK,GAAG,CAAA,EAAG;AACvC,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,MAAA,GAAS,UAAA;AACf,EAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AACvB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,EAAA;AACT;;;AC5kBO,SAAS,kBAAA,CACd,OAAA,GAA4B,EAAC,EACD;AAC5B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAA,IACzC,QAAA,EAAU,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC5C,WAAA,EAAa,YAAA,CAAa,OAAA,CAAQ,WAAW;AAAA,GAC/C;AACF;AAEO,SAAS,aACd,KAAA,EACoB;AACpB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAM,OAAA,CAAQ,KAAK,IAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAClD;AAEO,SAAS,kBACd,KAAA,EACoB;AACpB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,OAAA,CAAQ,KAAK,CAAA,CACxB,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,WAAW,CAAA,KAAM,GAAG,GAAG,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,CAAA,CACnD,KAAK,GAAG,CAAA;AACb;;;ACkBA,SAAS,WACP,IAAA,EACuC;AACvC,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,GAAA,EAAK;AAC7B,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,OAAA,EAGlB;AACA,EAAA,OAAO;AAAA,IACL,GAAI,SAAS,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,KAAiB,EAAC;AAAA,IACtE,GAAI,OAAA,EAAS,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAA,KAAS;AAAC,GAC1C;AACF;AAEA,SAAS,MAAM,KAAA,EAAgE;AAC7E,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,EAAE,CAAA;AACpC;AAEO,SAAS,uBAAA,CACd,KACA,OAAA,EACwB;AACxB,EAAA,IAAI,gBAAA,CAAiB,GAAG,CAAA,EAAG;AACzB,IAAA,OAAO,iBAAA,CAAkB,KAA4B,OAAO,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,MAAM,cAAc,CAAC,GAAI,OAAA,EAAS,WAAA,IAAe,EAAG,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,GAAA;AAEjB,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,KAAA,IAAS,EAAC,EAAG;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,IAAI,CAAA;AACjC,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,YAAA,CAAa,QAAA,EAAU;AAG5C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,YAAA,CAAa,MAAA,EAAQ;AAC1C,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,KAAA,EAAO,mBAAmB,SAAS,CAAA;AAAA,QACnC,QAAA,EAAU,gBAAgB,SAAS,CAAA;AAAA,QACnC,YAAA,EAAc,UAAU,UAAA,EAAY,EAAA;AAAA,QACpC,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,OAAO,SAAA,CAAU;AAAA,OAClB,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,aAAa,QAAA,CAAS,WAAA;AAAA,IACtB,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,cAAA,EAAgB,SAAS,YAAA,EAAc,EAAA;AAAA,IACvC,aAAA,EAAe,QAAA,CAAS,WAAA,EACpB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAChB,MAAA,CAAO,CAAC,EAAA,KAAqB,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,IAC3C,WAAA,EAAa,WAAA,CAAY,MAAA,GAAS,WAAA,GAAc,MAAA;AAAA,IAChD,KAAA;AAAA,IACA,UAAA,EAAY,SAAS,UAAA,IAAc,WAAA;AAAA,IACnC,GAAG,WAAW,OAAO;AAAA,GACvB;AACF;AAEA,SAAS,iBAAA,CACP,KACA,OAAA,EACwB;AACxB,EAAA,IAAI,OAAO,GAAA,CAAI,YAAA,KAAiB,QAAA,EAAU;AACxC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,IAAS,EAAC,EAAG;AAClC,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,MAAM,YAAA,CAAa,MAAA;AAAA,MACnB,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,EAAA,GACzB,EAAE,IAAA,EAAM,YAAA,CAAa,UAAA,EAAY,EAAA,EAAI,IAAA,CAAK,UAAA,CAAW,EAAA,EAAG,GACxD;AAAA,KACN;AACA,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,KAAA,EAAO,mBAAmB,MAAM,CAAA;AAAA,MAChC,QAAA,EAAU,gBAAgB,MAAM,CAAA;AAAA,MAChC,YAAA,EAAc,KAAK,UAAA,EAAY,EAAA;AAAA,MAC/B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AACA,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA;AAAA,IAEV,WAAA,EAAa,IAAI,WAAA,IAAe,IAAA;AAAA,IAChC,cAAc,GAAA,CAAI,YAAA;AAAA,IAClB,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,IACpB,cAAA,EAAgB,IAAI,YAAA,EAAc,EAAA;AAAA,IAClC,GAAI,IAAI,QAAA,GAAW,EAAE,UAAU,GAAA,CAAI,QAAA,KAAa,EAAC;AAAA,IACjD,GAAI,GAAA,CAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,IAC7B,GAAI,IAAI,SAAA,GAAY,EAAE,WAAW,GAAA,CAAI,SAAA,KAAc,EAAC;AAAA,IACpD,GAAI,IAAI,MAAA,GAAS,EAAE,QAAQ,GAAA,CAAI,MAAA,KAAW,EAAC;AAAA,IAC3C,GAAI,GAAA,CAAI,WAAA,GAAc,EAAE,aAAA,EAAe,MAAM,GAAA,CAAI,WAAW,CAAA,EAAE,GAAI,EAAC;AAAA,IACnE,GAAI,GAAA,CAAI,SAAA,GAAY,EAAE,YAAA,EAAc,MAAM,GAAA,CAAI,SAAS,CAAA,EAAE,GAAI,EAAC;AAAA,IAC9D,GAAI,GAAA,CAAI,SAAA,GAAY,EAAE,WAAA,EAAa,MAAM,GAAA,CAAI,SAAS,CAAA,EAAE,GAAI,EAAC;AAAA,IAC7D,GAAI,GAAA,CAAI,OAAA,GAAU,EAAE,SAAA,EAAW,MAAM,GAAA,CAAI,OAAO,CAAA,EAAE,GAAI,EAAC;AAAA,IACvD,GAAI,GAAA,CAAI,WAAA,GAAc,EAAE,aAAA,EAAe,MAAM,GAAA,CAAI,WAAW,CAAA,EAAE,GAAI,EAAC;AAAA,IACnE,GAAI,IAAI,UAAA,GAAa,EAAE,YAAY,GAAA,CAAI,UAAA,KAAe,EAAC;AAAA,IACvD,GAAI,GAAA,CAAI,SAAA,GAAY,EAAE,WAAA,EAAa,MAAM,GAAA,CAAI,SAAS,CAAA,EAAE,GAAI,EAAC;AAAA,IAC7D,UAAA,EAAY,QAAA;AAAA,IACZ,GAAG,WAAW,OAAO;AAAA,GACvB;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAA8C;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,aAAA,EAAe;AAAA,MAC3C,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,SAAiB,OAAA,EAA+D;AAClF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,EAAI;AAAA,MACpD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,cAAc,IAAA,EAAoE;AAChF,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,IAAI,CAAC,CAAA,WAAA;AAAA,KAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CACE,MACA,OAAA,EAC8D;AAC9D,IAAA,MAAM,OAAA,GACJ,UAAU,IAAA,IAAQ,IAAA,CAAK,SAAS,OAAA,GAC5B,uBAAA,CAAwB,IAAA,EAAM,OAAO,CAAA,GACrC,IAAA;AACN,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,oBAAA;AAAA,MACA,EAAE,MAAM,OAAA;AAAQ,KAClB;AAAA,EACF;AACF;;;AC/MO,SAAS,mBACd,MAAA,EAC4B;AAC5B,EAAA,OAAO,aAAA,IAAiB,MAAA,IAAU,MAAA,CAAO,WAAA,KAAgB,IAAA;AAC3D;AAkDO,SAAS,cAAc,IAAA,EAGqB;AACjD,EAAA,OAAO;AAAA,IACL,aAAa,IAAA,CAAK,YAAA;AAAA,IAClB,GAAI,KAAK,aAAA,KAAkB,MAAA,GACvB,EAAE,YAAA,EAAc,IAAA,CAAK,aAAA,EAAc,GACnC;AAAC,GACP;AACF;AAEO,SAAS,aAAa,IAAA,EAAsC;AACjE,EAAA,IAAI,aAAA,IAAiB,IAAA,IAAQ,IAAA,CAAK,WAAA,EAAa;AAC7C,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA;AAAA,MACb,cAAc,IAAA,CAAK;AAAA,KACrB;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,YAAA;AAAA,IACpB,cAAc,MAAA,CAAO;AAAA,GACvB;AACF;;;AC9EO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,CACmB,MACA,UAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAEjB,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,eAAA,CAAgB,IAAI,CAAA;AAAA,EACrC;AAAA,EAJmB,IAAA;AAAA,EACA,UAAA;AAAA,EAJV,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBT,MAAM,MAAM,KAAA,EAGa;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,KAAwB,iBAAA,EAAmB;AAAA,MACtE,MAAM,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,MACrD,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAChC,IAAA,IAAI,CAAC,kBAAA,CAAmB,MAAM,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,KAAA,EAGG;AACtB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC3B,4BAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM;AAAA,UACJ,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,QACA,QAAA,EAAU;AAAA;AACZ,KACF;AACA,IAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAChC,IAAA,IAAI,kBAAA,CAAmB,MAAM,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,KAAA,EAA+C;AAClE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,KAG1B,4BAAA,EAA8B;AAAA,MAC/B,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,MAC3B,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,MAAA,GAAqB;AAAA,MACzB,aAAa,IAAA,CAAK,YAAA;AAAA,MAClB,cAAc,IAAA,CAAK;AAAA,KACrB;AACA,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,KAAA,EAEX;AACD,IAAA,MAAM,eACJ,KAAA,EAAO,YAAA,IAAiB,MAAM,IAAA,CAAK,UAAA,EAAY,iBAAgB,IAAM,IAAA;AACvE,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC3B,yBAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,EAAE,YAAA,EAAa;AAAA,QACrB,QAAA,EAAU;AAAA;AACZ,KACF;AACA,IAAA,MAAM,MAAA,GAAS,cAAc,IAAI,CAAA;AACjC,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,IAAA,CAAK,WAAW,SAAA,CAAU;AAAA,QAC9B,aAAa,MAAA,CAAO,WAAA;AAAA;AAAA,QAEpB,cAAc,MAAA,CAAO;AAAA,OACtB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,WAAA,EAAY;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,EAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,eAAe,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAM,UAAA,GAA+B;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAA,EAAY,cAAA,EAAe;AACpD,IAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,EACtB;AAAA,EAEA,MAAc,cAAc,MAAA,EAAmC;AAC7D,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,WAAW,SAAA,CAAU;AAAA,MAC9B,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO;AAAA,KACtB,CAAA;AAAA,EACH;AACF;AAWO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,aAAA,GAA+C;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA0B,yBAAA,EAA2B;AAAA,MACpE,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAAA,EAA4B;AACtC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,KAAK,IAAA,CAAK,QAAA;AAAA,MACf,CAAA,cAAA,EAAiB,kBAAA,CAAmB,UAAU,CAAC,CAAA,MAAA;AAAA,KACjD;AAAA,EACF;AACF;;;ACvLO,IAAM,wBAAN,MAA4B;AAAA,EACjC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAoB,qBAAqB,CAAA;AAAA,EAC5D;AACF;;;AC9BO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAAmD;AACtD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAkB,kBAAA,EAAoB;AAAA,MACrD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,cACA,OAAA,EACqB;AACrB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAA,EAAI;AAAA,MACnE,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AACF;;;ACpBO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,eAAA,GAA4C;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAqB,iCAAiC,CAAA;AAAA,EACzE;AACF;;;ACOA,gBAAuB,aACrB,SAAA,EACoC;AACpC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,MAAM,UAAU,IAAI,CAAA;AACjD,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,MAAM,IAAA;AAAA,IACR;AACA,IAAA,IAAI,IAAA,IAAQ,UAAA,CAAW,UAAA,IAAc,IAAA,CAAK,WAAW,CAAA,EAAG;AACtD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,IAAQ,CAAA;AAAA,EACV;AACF;AAMA,gBAAuB,cACrB,UAAA,EACoC;AACpC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI,MAAM,WAAW,MAAM,CAAA;AACrD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,IAAA;AAAA,IACR;AACA,IAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAChB,IAAA,MAAM,SAAA,GACJ,KAAA,CAAM,MAAA,KAAW,CAAA,KAChB,UAAA,CAAW,OAAA,KAAY,MAAA,GACpB,CAAC,UAAA,CAAW,OAAA,GACZ,MAAA,IAAU,UAAA,CAAW,KAAA,CAAA;AAC3B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA;AAAA,IACF;AAAA,EACF;AACF;;;ACIO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,CAAK,OAAA,GAA+B,EAAC,EAA+B;AAClE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAuB,cAAA,EAAgB;AAAA,MACtD,KAAA,EAAO,IAAA,CAAK,oBAAA,CAAqB,OAAO;AAAA,KACzC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,CACE,OAAA,GAA6C,EAAC,EACL;AACzC,IAAA,OAAO,YAAA,CAAqB,OAAO,IAAA,KAAS;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AACnD,MAAA,OAAO,EAAE,MAAM,MAAA,CAAO,IAAA,IAAQ,EAAC,EAAG,UAAA,EAAY,OAAO,UAAA,EAAW;AAAA,IAClE,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,QAAA,EACA,OAAA,GAA6C,EAAC,EAC7B;AACjB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAY,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI;AAAA,MACvD,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,IAAA,EACA,OAAA,GAA6C,EAAC,EAC7B;AACjB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAa,cAAA,EAAgB;AAAA,MAC5C,IAAA,EAAM,IAAA;AAAA,MACN,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,QAAA,EACA,IAAA,EACA,OAAA,GAA6C,EAAC,EAC7B;AACjB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAc,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI;AAAA,MACzD,IAAA,EAAM,IAAA;AAAA,MACN,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,QAAA,EAAoC;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAgB,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,WAAA,CACE,UACA,IAAA,EACkC;AAClC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,gBAAgB,QAAQ,CAAA,MAAA,CAAA;AAAA,MACxB,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,CACE,QAAA,EACA,OAAA,GAA8B,EAAC,EACK;AACpC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,gBAAgB,QAAQ,CAAA,cAAA,CAAA;AAAA,MACxB,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAM;AAAE,KACpC;AAAA,EACF;AAAA;AAAA,EAGA,oBAAoB,QAAA,EAAmD;AACrE,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,gBAAgB,QAAQ,CAAA,kBAAA;AAAA,KAC1B;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,IAAA,EAA0D;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA2B,qBAAA,EAAuB;AAAA,MACjE,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,IAAA,EAAoE;AACzE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,qBAAA;AAAA,MACA,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,kBAAkB,YAAA,EAA+C;AAC/D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,gCAAgC,YAAY,CAAA;AAAA,KAC9C;AAAA,EACF;AAAA,EAEQ,qBACN,OAAA,EAC4B;AAC5B,IAAA,OAAO;AAAA,MACL,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,MAChC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS;AAAA,KAC3C;AAAA,EACF;AACF;;;ACzKO,SAAS,6BACd,GAAA,EAC6B;AAC7B,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,iBAAiB,GAAA,CAAI,eAAA;AAAA,IACrB,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,sBAAA,EAAwB,IAAI,sBAAA,IAA0B,KAAA;AAAA,IACtD,aAAA,EAAe;AAAA,GACjB;AACF;AAEO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAA,CACE,OAAA,GAAiE,EAAC,EAC3C;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAkB,mBAAA,EAAqB;AAAA,MACtD,KAAA,EAAO;AAAA,QACL,iBAAiB,OAAA,CAAQ,eAAA;AAAA,QACzB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS;AAAA;AAC3C,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,EAAA,EAAY,OAAA,GAAiC,EAAC,EAAwB;AACxE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,CAAA,kBAAA,EAAqB,EAAE,CAAA,CAAA,EAAI;AAAA,MAC1D,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,SAAA,CACE,IAAA,EACA,OAAA,GAAiC,EAAC,EACb;AACrB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAA,EAAI;AAAA,MACjE,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aACE,UAAA,EACqB;AACrB,IAAA,MAAM,OAAA,GACJ,UAAU,UAAA,IAAc,UAAA,CAAW,SAAS,YAAA,GACxC,4BAAA,CAA6B,UAAU,CAAA,GACtC,UAAA;AAEP,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAiB,0BAAA,EAA4B;AAAA,MAC5D,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,SAAA,EAAW;AAAA;AACb,KACD,CAAA;AAAA,EACH;AACF;;;ACjGO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,aAAa,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,IAAI,EAAA,EAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,CAAA,YAAA,EAAe,EAAE,CAAA,CAAE,CAAA;AAAA,EACjD;AAAA;AAAA,EAGA,UAAU,IAAA,EAA8B;AACtC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,KAAA,EAA+C;AAC1D,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAY,sBAAsB,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,EACpE;AACF;;;ACQO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,MAAM,MAAM,OAAA,EAEgC;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,EAAwB;AAAA,MAC3C,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAU,SAAA;AAAU,KAC/C,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,MAAA,CACJ,UAAA,EACA,IAAA,EAWC;AACD,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,eAAA,EAAkB,UAAU,CAAA,OAAA,CAAA,EAAW,EAAE,MAAM,CAAA;AAAA,EACvE;AACF;;;AC1BO,IAAM,0BAAN,MAA6E;AAAA,EAGlF,WAAA,CACmB,UACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAFgB,QAAA;AAAA,EACA,OAAA;AAAA,EAJX,QAAA,GAAW,KAAA;AAAA,EAOnB,CAAC,MAAA,CAAO,aAAa,CAAA,GAA2D;AAC9E,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA,EAEA,OAAO,MAAA,GAAgE;AACrE,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,IAC3E;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,IAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,IAAI,CAAA,EAAG;AAC9C,MAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS;AACjC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,QAAA;AAAA,MACF;AACA,MAAA,MAAM;AAAA,QACJ,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AACA,MAAA,IAAI,KAAA,CAAM,KAAA,KAAU,oBAAA,IAAwB,KAAA,CAAM,UAAU,iBAAA,EAAmB;AAC7E,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,mBAAA,CACpB,IAAA,EACA,WAAA,EACA,OAAA,EACkC;AAClC,EAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,KAAA,EAAO,CAAA,gBAAA,EAAmB,WAAW,CAAA,OAAA,CAAA,EAAW;AAAA,IAClF,GAAA,EAAK,IAAA;AAAA,IACL,QAAQ,OAAA,EAAS;AAAA,GAClB,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACxD,IAAA,IAAI,MAAA,GAAkB,IAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,IAAI,cAAA,CAAe;AAAA,MACvB,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,mBAAmB,WAAW,CAAA,OAAA;AAAA,KACrC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAI,uBAAA,CAAwB,QAAA,EAAU,OAAO,CAAA;AACtD;;;ACnGA,IAAM,iBAAA,uBAA6C,GAAA,CAAI;AAAA,EACrD,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAuBM,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAC/C,WAAA,CACW,aACA,SAAA,EACT;AACA,IAAA,KAAA;AAAA,MACE,CAAA,UAAA,EAAa,WAAW,CAAA,uBAAA,EAA0B,SAAS,CAAA,yFAAA;AAAA,KAC7D;AALS,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAKT,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AAAA,EAPW,WAAA;AAAA,EACA,SAAA;AAOb;AA4BO,IAAM,qBAAN,MAAyB;AAAA,EAG9B,WAAA,CACmB,MACA,YAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,YAAA;AAAA,EAJX,YAAA,GAAqC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW7C,OAAA,CACE,YACA,SAAA,EACgC;AAChC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,6BAA6B,UAAU,CAAA,QAAA,CAAA;AAAA,MACvC,EAAE,IAAA,EAAM,EAAE,WAAW,SAAA,IAAa,IAAG;AAAE,KACzC;AAAA,EACF;AAAA;AAAA,EAGA,KAAK,OAAA,EAAkD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,iBAAA,EAAmB;AAAA,MACnD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CACE,aACA,OAAA,EACoB;AACpB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,CAAA,gBAAA,EAAmB,WAAW,CAAA,CAAA,EAAI;AAAA,MAChE,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,WAAA,EAAiD;AACjE,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa;AAAA,MAC5C,SAAA,EAAW;AAAA,QACT,QAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QACA,cAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CACE,aACA,OAAA,EACkC;AAClC,IAAA,OAAO,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa,OAAO,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,aAAA,CACL,WAAA,EACA,OAAA,EACoD;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,aAAa,OAAO,CAAA;AACrD,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,IAAI,KAAA,CAAM,UAAU,oBAAA,EAAsB;AACxC,QAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AACtB,QAAA,MAAM,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAAA,MAC/C,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,KAAU,oBAAA,EAAsB;AAE/C,QAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA;AACxC,QAAA;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,KAAU,iBAAA,EAAmB;AAC5C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,OAAO,MAAM,IAAA,CAAK,OAAA,KAAY,WAC1B,KAAA,CAAM,IAAA,CAAK,OAAA,GACX,CAAA,2BAAA,EAA8B,WAAW,CAAA;AAAA,SAC/C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAA,CACJ,WAAA,EACA,OAAA,GAAoC,EAAC,EACjB;AACpB,IAAA,MAAM;AAAA,MACJ,SAAA,GAAY,KAAK,EAAA,GAAK,GAAA;AAAA,MACtB,cAAA,GAAiB,GAAA;AAAA,MACjB,UAAA,GAAa,GAAA;AAAA,MACb,aAAA,GAAgB,GAAA;AAAA,MAChB,gBAAA,GAAmB,IAAA;AAAA,MACnB,YAAY,EAAC;AAAA,MACb,MAAA;AAAA,MACA,KAAA,GAAQ;AAAA,KACV,GAAI,OAAA;AAEJ,IAAA,MAAM,gBAAgB,KAAA,CAAM,IAAA;AAAA,sBAC1B,IAAI,IAAI,CAAC,QAAA,EAAU,iBAAiB,QAAA,EAAU,GAAG,SAAS,CAAC;AAAA,KAC7D;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,KAAA,GAAQ,cAAA;AAEZ,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAA,EAAQ,cAAA,EAAe;AAEvB,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa;AAAA,QAC5C,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AAEzB,MAAA,IAAI,MAAA,IAAU,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC3C,QAAA,OAAO,SAAA;AAAA,MACT;AACA,MAAA,IAAI,gBAAA,IAAoB,WAAW,aAAA,EAAe;AAChD,QAAA,OAAO,SAAA;AAAA,MACT;AAEA,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,EAAI,GAAI,WAAW,QAAQ,CAAA;AACzD,MAAA,IAAI,OAAA,GAAU,QAAQ,SAAA,EAAW;AAC/B,QAAA,MAAM,IAAI,qBAAA,CAAsB,WAAA,EAAa,SAAS,CAAA;AAAA,MACxD;AAEA,MAAA,MAAM,MAAM,KAAK,CAAA;AACjB,MAAA,QAAA,IAAY,KAAA;AACZ,MAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,aAAA,EAAe,UAAU,CAAA;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,WAAA,CACJ,WAAA,EACA,MAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA;AAAA,MACd,CAAA,yBAAA,EAA4B,WAAW,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA,CAAA;AAAA,MACvD,EAAE,MAAM,MAAA;AAAO,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,WAAA,EACA,MAAA,EACA,IAAA,EAWC;AACD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,gBAAA,EAAmB,WAAW,CAAA,OAAA,EAAU,MAAM,CAAA,UAAA,CAAA;AAAA,MAC9C,EAAE,IAAA;AAAK,KACT;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAAA,EAAkD;AAClE,IAAA,MAAM,IAAA,GAAQ,SAAA,CAAU,aAAA,IAAiB,EAAC;AAC1C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAC1C,IAAA,OAAO;AAAA,MACL,aAAa,SAAA,CAAU,EAAA;AAAA,MACvB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,aAAA,EAAe,UAAU,aAAA,IAAiB,IAAA;AAAA,MAC1C,IAAA,EAAO,UAAuC,IAAA,IAAQ,IAAA;AAAA,MACtD,MAAA,EAAS,UAAyC,MAAA,IAAU,IAAA;AAAA,MAC5D,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,SAAA,EAAW,UAAU,SAAA,IAAa,IAAA;AAAA,MAClC,KAAA;AAAA,MACA,cAAe,SAAA,CAAyC,YAAA;AAAA,MACxD,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,eAAA,EAAiB,oBAAoB,KAAK;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,OAAA,EAC4B;AAC5B,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,aAAa,OAAA,CAAQ,aAAA,IAAiB,EAAE,CAAA;AACjE,IAAA,OAAO;AAAA,MACL,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,MAAA,EAAQ,QAAQ,MAAA,IAAU,MAAA;AAAA,MAC1B,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,KAAA;AAAA,MACA,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,eAAA,EAAiB,oBAAoB,KAAK;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,IAAA,EACkC;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,EAAa;AACxC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AACxB,MAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,KAAK,CAAA;AACpD,MAAA,MAAM,MAAA,GACJ,KAAK,QAAA,IAAY,KAAA,CAAM,QAAQ,GAAA,EAAK,OAAO,CAAA,GACtC,GAAA,CAAK,OAAA,CAAsC,IAAA;AAAA,QAC1C,CAAC,MAAM,CAAA,IAAK,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,OAAO,IAAA,CAAK;AAAA,OACrD,GACA,MAAA;AACN,MAAA,MAAM,OAAA,GACJ,KAAK,SAAA,IAAa,KAAA,CAAM,QAAQ,GAAA,EAAK,QAAQ,CAAA,GACxC,GAAA,CAAK,QAAA,CAAuC,IAAA;AAAA,QAC3C,CAAC,MAAM,CAAA,IAAK,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,OAAO,IAAA,CAAK;AAAA,OACrD,GACA,MAAA;AACN,MAAA,MAAM,OAAA,GACH,OAAO,MAAA,EAAQ,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,OAAA,IAC9C,OAAO,OAAA,EAAS,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,OAAA,IACjD,IAAA;AACF,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,SAAA,EAAW,KAAK,OAAO,CAAA;AACjE,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,UAAA,EAAY,KAAK,OAAA,IAAW,IAAA;AAAA,QAC5B,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAA,GAA8C;AAClD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,YAAA,GAAe,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AAAA,MACnD,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AACF;AAEA,SAAS,oBAAoB,KAAA,EAAwC;AACnE,EAAA,MAAM,MAAM,KAAA,CAAM,SAAA;AAAA,IAChB,CAAC,CAAA,KACC,CAAA,CAAE,MAAA,KAAW,aACb,CAAA,CAAE,MAAA,KAAW,aAAA,IACb,CAAA,CAAE,WAAW,UAAA,IACb,CAAA,CAAE,MAAA,KAAW,SAAA,IACb,EAAE,MAAA,KAAW;AAAA,GACjB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,iBAAA,CACP,OACA,GAAA,EACe;AACf,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,EAAK,OAAO,IAAA;AAC3B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACxB,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA,CAAO,MAAM,CAAC,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG,OAAO,IAAA;AACxD,EAAA,OAAO,CAAA,GAAI,CAAA;AACb;AAEA,SAAS,aAAa,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACnYO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,CAAK,OAAA,GAA6C,EAAC,EAAyB;AAC1E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,gBAAA,EAAkB;AAAA,MAClD,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,WAAA,EACA,OAAA,GAA6C,EAAC,EAC1B;AACpB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAA,EAAI;AAAA,MAC/D,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAE,KACrD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,IAAA,EAAgD;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAgB,kBAAkB,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACnE;AAAA;AAAA,EAGA,MAAA,CAAO,aAAqB,IAAA,EAAgD;AAC1E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAiB,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAA,EAAI;AAAA,MACjE,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,WAAA,EAAuC;AAC5C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAgB,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAE,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,gBAAA,CACE,aACA,IAAA,EACkB;AAClB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,kBAAkB,WAAW,CAAA,iBAAA,CAAA;AAAA,MAC7B,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,WAAA,EAAmD;AAC/D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,kBAAkB,WAAW,CAAA,UAAA;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA,EAGA,gBAAA,CACE,aACA,OAAA,EACiC;AACjC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,eAAA,EAAkB,WAAW,CAAA,WAAA,EAAc,OAAO,CAAA;AAAA,KACpD;AAAA,EACF;AAAA;AAAA,EAGA,mBAAA,CAAoB,aAAqB,OAAA,EAAmC;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,MACf,CAAA,eAAA,EAAkB,WAAW,CAAA,WAAA,EAAc,OAAO,CAAA;AAAA,KACpD;AAAA,EACF;AACF;;;AClCO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,CACE,OAAA,EACA,OAAA,GAAiC,EAAC,EACV;AACxB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,CAAA,YAAA,EAAe,OAAO,CAAA,MAAA,CAAA,EAAU;AAAA,MAClE,KAAA,EAAO;AAAA,QACL,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAA,QACzC,QAAA,EAAU,iBAAA,CAAkB,OAAA,CAAQ,QAAQ;AAAA;AAC9C,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAA,CACE,OAAA,EACA,OAAA,GAAiD,EAAC,EACN;AAC5C,IAAA,OAAO,aAAA,CAAyB,OAAO,MAAA,KAAW;AAChD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,CAAA;AAC9D,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAC;AAAA,QACxB,YAAY,MAAA,CAAO;AAAA,OACrB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,SAAiB,MAAA,EAAwC;AAC3D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA;AAAA,KACxC;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CACE,SACA,IAAA,EAC2B;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAuB,CAAA,YAAA,EAAe,OAAO,CAAA,MAAA,CAAA,EAAU;AAAA,MACtE,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CACE,QAAA,EACA,OAAA,GAAyC,EAAC,EAClB;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,gBAAgB,QAAQ,CAAA,YAAA,CAAA;AAAA,MACxB;AAAA,QACE,KAAA,EAAO;AAAA,UACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS;AAAA;AAC3C;AACF,KACF;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,CACE,QAAA,EACA,OAAA,GAAyD,EAAC,EACd;AAC5C,IAAA,OAAO,aAAA,CAAyB,OAAO,MAAA,KAAW;AAChD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU;AAAA,QAC/C,GAAG,OAAA;AAAA,QACH;AAAA,OACD,CAAA;AACD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAC;AAAA,QACxB,YAAY,MAAA,CAAO;AAAA,OACrB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,UAAA,CACE,SACA,IAAA,EACqC;AACrC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,eAAe,OAAO,CAAA,WAAA,CAAA;AAAA,MACtB,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CACE,OAAA,EACA,MAAA,EACA,IAAA,EACoB;AACpB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAA,MACtC,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CAAO,SAAiB,MAAA,EAA+C;AACrE,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA;AAAA,KACxC;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,CAAU,OAAA,EAAiB,OAAA,GAA8B,EAAC,EAAyB;AACjF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,CAAA,YAAA,EAAe,OAAO,CAAA,YAAA,CAAA,EAAgB;AAAA,MACtE,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA;AAAM,KAC/B,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,cAAc,OAAA,EAAuC;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,CAAA,YAAA,EAAe,OAAO,CAAA,YAAA,CAAc,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,YAAA,CACE,OAAA,EACA,MAAA,EACA,OAAA,GAA+C,EAAC,EACxB;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAA;AAAA,MAC7C,EAAE,OAAO,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO;AAAE,KAC5D;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,CAAgB,SAAiB,UAAA,EAA4C;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,gBAAA,EAAmB,UAAU,CAAA;AAAA,KACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,CACE,OAAA,EACA,KAAA,EACA,OAAA,GAAmD,EAAC,EAC5B;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,eAAe,OAAO,CAAA,aAAA,CAAA;AAAA,MACtB;AAAA,QACE,KAAA,EAAO;AAAA,UACL,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAA,UACzC,QAAA,EAAU,iBAAA,CAAkB,EAAE,MAAA,EAAQ,OAAO;AAAA;AAC/C;AACF,KACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAA,EAA0C;AAC9C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAoB,CAAA,YAAA,EAAe,OAAO,CAAA,YAAA,CAAc,CAAA;AAAA,EAC3E;AAAA;AAAA,EAGA,UAAA,CAAW,SAAiB,MAAA,EAAgD;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,OAAA;AAAA,KACxC;AAAA,EACF;AAAA;AAAA,EAGA,YAAA,CACE,OAAA,EACA,MAAA,EACA,MAAA,EACoB;AACpB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,OAAA,CAAA;AAAA,MACtC,EAAE,IAAA,EAAM,EAAE,MAAA,EAAO;AAAE,KACrB;AAAA,EACF;AAAA;AAAA,EAGA,aAAA,CACE,OAAA,EACA,MAAA,EACA,WAAA,EACoB;AACpB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,CAAA;AAAA,MACtC,EAAE,IAAA,EAAM,EAAE,WAAA,EAAY;AAAE,KAC1B;AAAA,EACF;AAAA;AAAA,EAGA,KAAA,CAAM,SAAiB,MAAA,EAAoC;AACzD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA;AAAA,KACxC;AAAA,EACF;AAAA;AAAA,EAGA,QAAA,CACE,OAAA,EACA,MAAA,EACA,KAAA,EACoB;AACpB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA,CAAA;AAAA,MACtC;AAAA,QACE,IAAA,EAAM;AAAA,UACJ,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,YAAA,EAAc,qBAAA,CAAsB,KAAA,CAAM,YAAY;AAAA;AACxD;AACF,KACF;AAAA,EACF;AACF;AAEA,SAAS,sBACP,KAAA,EACoB;AACpB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACjE;;;ACrRO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAA8C;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,aAAA,EAAe;AAAA,MAC3C,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,SAAiB,OAAA,EAA+D;AAClF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,EAAI;AAAA,MACpD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,IAAA,EAAwC;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAY,eAAe,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAA,CAAO,SAAiB,IAAA,EAAwC;AAC9D,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAAa,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,EAAI,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,OAAO,OAAA,EAAgD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAA6B,CAAA,YAAA,EAAe,OAAO,CAAA,CAAE,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,OAAA,EAAsC;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,CAAA,YAAA,EAAe,OAAO,CAAA,MAAA,CAAQ,CAAA;AAAA,EACjE;AAAA;AAAA,EAGA,SAAS,OAAA,EAAiC;AACxC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAa,CAAA,YAAA,EAAe,OAAO,CAAA,SAAA,CAAW,CAAA;AAAA,EACjE;AAAA;AAAA,EAGA,WAAW,OAAA,EAAiC;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAa,CAAA,YAAA,EAAe,OAAO,CAAA,WAAA,CAAa,CAAA;AAAA,EACnE;AACF;;;AClBA,SAAS,qBAAqB,KAAA,EAA6C;AACzE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,MAA6B,IAAA,KAAS,UAAA;AAE3C;AAEA,SAAS,mBAAmB,KAAA,EAA2C;AACrE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,MAA2B,IAAA,KAAS,QAAA;AAEzC;AAEA,SAAS,mBACP,IAAA,EACc;AACd,EAAA,IAAI,OAAA,IAAW,QAAQ,UAAA,IAAc,IAAA,IAAQ,EAAE,KAAA,IAAS,IAAA,CAAA,IAAS,EAAE,MAAA,IAAU,IAAA,CAAA,EAAO;AAClF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,kBAAA,CAAmB,IAAI,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,mBAAmB,IAAI,CAAA;AAAA,MAC9B,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,MAC9B,GAAI,IAAA,CAAK,UAAA,EAAY,EAAA,GAAK,EAAE,cAAc,IAAA,CAAK,UAAA,CAAW,EAAA,EAAG,GAAI,EAAC;AAAA,MAClE,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU,EAAC;AAAA,MAC1C,GAAI,KAAK,IAAA,GAAO,EAAE,MAAM,IAAA,CAAK,IAAA,KAAS;AAAC,KACzC;AAAA,EACF;AACA,EAAA,IAAK,IAAA,CAAgC,OAAO,MAAA,EAAQ;AAClD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,MAAO,IAAA,CAAgC,GAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,GAAI,GAAA,CAAI,KAAA,IAAS,EAAC;AAAA,IAClB,GAAK,IAAA,CAAgC,KAAA,IAAS;AAAC,GACjD;AACA,EAAA,MAAM,MAAO,IAAA,CAAgC,GAAA;AAC7C,EAAA,OAAO;AAAA,IACL,GAAI,GAAA,GAAM,EAAE,GAAA,KAAQ,EAAC;AAAA,IACrB,KAAA,EAAO,mBAAmB,GAAG,CAAA;AAAA,IAC7B,QAAA,EAAU,gBAAgB,GAAG,CAAA;AAAA,IAC7B,GAAI,GAAA,CAAI,UAAA,EAAY,EAAA,GAAK,EAAE,cAAc,GAAA,CAAI,UAAA,CAAW,EAAA,EAAG,GAAI,EAAC;AAAA,IAChE,GAAI,OAAO,IAAA,CAAK,KAAK,EAAE,MAAA,GAAS,EAAE,KAAA,EAAM,GAAI,EAAC;AAAA,IAC7C,GAAM,IAAA,CAAgC,IAAA,IAAQ,GAAA,CAAI,IAAA,GAC9C,EAAE,IAAA,EAAO,IAAA,CAAgC,IAAA,IAAQ,GAAA,CAAI,IAAA,EAAK,GAC1D;AAAC,GACP;AACF;AAEA,SAAS,uBAAuB,KAAA,EAAuC;AACrE,EAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAC/B,IAAA,IAAI,QAAA,IAAY,KAAA,IAAU,KAAA,CAA8B,MAAA,KAAW,OAAA,EAAS;AAC1E,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,kBAAkB,CAAA;AAAA,MACzC,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM;AAAA,KAC5B;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAQ,CAAC,CAAA,EAAE;AAAA,EACjE;AACA,EAAA,OAAO,KAAA;AACT;AAKO,IAAM,eAAN,MAAmB;AAAA,EACxB,WAAA,CACmB,MACA,UAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnB,MAAM,KAAA,EAAgD;AACpD,IAAA,MAAM,OAAA,GAAU,uBAAuB,KAAK,CAAA;AAC5C,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,EAAO,MAAA,EAAQ;AAC1B,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAsB,WAAA,EAAa;AAAA,MAClD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAA,CACJ,KAAA,EACA,WAAA,EACoB;AACpB,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AACrC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,iBAAA,CAAkB,EAAA,EAAI;AAAA,MAC3C,GAAG,WAAA;AAAA,MACH,SAAA,EAAW;AAAA,QACT,eAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,WAAA,EAAa,SAAA,IAAa;AAAC;AACjC,KACD,CAAA;AAAA,EACH;AACF;;;AC/EO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAwB,iBAAiB,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGA,IAAI,WAAA,EAAyC;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,CAAA,gBAAA,EAAmB,WAAW,CAAA,CAAE,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,CACE,WACA,IAAA,EACgC;AAChC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,4BAA4B,SAAS,CAAA,OAAA,CAAA;AAAA,MACrC,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF;AACF;;;ACjFO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAAqD;AACxD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAoB,YAAA,EAAc;AAAA,MACjD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,QAAgB,OAAA,EAA8D;AAChF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,EAAI;AAAA,MACjD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,OAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,CAAA,YAAA,EAAe,OAAO,CAAA,MAAA,CAAA,EAAU;AAAA,MAC1D,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,MAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAY,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,EAAI;AAAA,MACnD,IAAA,EAAM,IAAA;AAAA,MACN,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,MAAA,EAAsC;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAoB,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QACE,OAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,GAAgD,EAAC,EAClB;AAC/B,IAAA,MAAM,SAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf;AAAA,MACE,IAAIC,kBAAAA,EAAkB;AAAA,MACtB,IAAA,EAAM,MAAA;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,SAAS;AAAA,KACzC,GACA,OAAA;AAEN,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,YAAA,EAAe,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,QAAA,CAAA;AAAA,MACtC,EAAE,IAAA,EAAM,eAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AAAE,KAC9C;AAAA,EACF;AACF;AAEA,SAASA,kBAAAA,GAA4B;AACnC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAA;AAC7B,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,OAAO,UAAU,UAAA,EAAW;AAAA,EAC9B;AACA,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACrE;;;ACxFO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,OAAA,EAAiD;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,gBAAA,EAAkB;AAAA,MACjD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,YACA,OAAA,EACmB;AACnB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAc,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,EAAI;AAAA,MAC7D,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,IAAA,EAA8C;AACnD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAe,kBAAkB,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,MAAA,CAAO,YAAoB,IAAA,EAA8C;AACvE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAgB,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,EAAI;AAAA,MAC/D,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,UAAA,EAAsC;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAgB,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAE,CAAA;AAAA,EACjE;AACF;;;ACnCO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,oBAAoB,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CACE,KAAA,EACA,YAAA,EACA,KAAA,EACkB;AAClB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,mBAAA,EAAsB,KAAK,CAAA,aAAA,EAAgB,YAAY,CAAA,QAAA,CAAA;AAAA,MACvD,EAAE,MAAM,KAAA;AAAM,KAChB;AAAA,EACF;AACF;;;AC7BO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,OAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAqB,wBAAwB,CAAA;AAAA,EAChE;AACF;;;ACwFA,SAAS,qBACP,OAAA,EAC4B;AAC5B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,iBAAiB,OAAO,CAAA;AAAA,IACnC,KAAA,EAAO,oBAAoB,OAAO,CAAA;AAAA,IAClC,GAAI,OAAA,CAAQ,UAAA,EAAY,EAAA,GAAK,EAAE,cAAc,OAAA,CAAQ,UAAA,CAAW,EAAA,EAAG,GAAI,EAAC;AAAA,IACxE,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,IAChD,GAAI,QAAQ,MAAA,EAAQ,MAAA,GAAS,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAA,IAC3D,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,IAC7C,GAAI,QAAQ,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB;AAAC,GACpE;AACF;AAEA,SAAS,SAAS,GAAA,EAAmE;AACnF,EAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,UAAU,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,YAAA,CAAa,MAAA,EAAQ;AACvF,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,GAAA;AAChB,EAAA,OAAO;AAAA,IACL,MAAM,YAAA,CAAa,MAAA;AAAA,IACnB,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAY,EAAA,GAC5B,EAAE,IAAA,EAAM,YAAA,CAAa,UAAA,EAAY,EAAA,EAAI,OAAA,CAAQ,UAAA,CAAW,EAAA,EAAG,GAC3D;AAAA,GACN;AACF;AAEA,SAAS,UAAU,OAAA,EAAqE;AACtF,EAAA,IAAI,MAAA,IAAU,OAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,aAAa,OAAA,EAAS;AAC9D,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAA,GAAc,OAAA;AACpB,EAAA,OAAO;AAAA,IACL,MAAM,YAAA,CAAa,OAAA;AAAA,IACnB,IAAI,WAAA,CAAY,EAAA;AAAA,IAChB,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,UAAA,EAAY,WAAA,CAAY,UAAA,EAAY,EAAA,GAChC,EAAE,IAAA,EAAM,YAAA,CAAa,UAAA,EAAY,EAAA,EAAI,WAAA,CAAY,UAAA,CAAW,EAAA,EAAG,GAC/D,MAAA;AAAA,IACJ,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,QAAQ,WAAA,CAAY,MAAA;AAAA,IACpB,MAAM,WAAA,CAAY,IAAA;AAAA,IAClB,aAAa,WAAA,CAAY;AAAA,GAC3B;AACF;AAEA,SAAS,kBACP,IAAA,EACyB;AACzB,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,eAAA,IAAmB,IAAA,GAAO,IAAA,CAAK,aAAA,GAAgB,MAAA;AAC7D,EAAA,MAAM,iBAAA,GACJ,mBAAA,IAAuB,IAAA,GAAO,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzD,EAAA,OAAO;AAAA,IACL,GAAI,KAAK,GAAA,GAAM,EAAE,KAAK,IAAA,CAAK,GAAA,KAAQ,EAAC;AAAA,IACpC,KAAA,EAAO,mBAAmB,GAAG,CAAA;AAAA,IAC7B,QAAA,EAAU,gBAAgB,GAAG,CAAA;AAAA,IAC7B,YAAA,EAAc,IAAI,UAAA,EAAY,EAAA;AAAA,IAC9B,KAAA,EAAO;AAAA,MACL,GAAI,GAAA,CAAI,KAAA,IAAS,EAAC;AAAA,MAClB,GAAI,IAAA,CAAK,KAAA,IAAS;AAAC,KACrB;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,GAAA,CAAI,IAAA;AAAA,IACvB,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,GAAA,CAAI,WAAA;AAAA,IACrC,GAAI,KAAA,GAAQ,EAAE,aAAA,EAAe,KAAA,KAAU,EAAC;AAAA,IACxC,GAAI,iBAAA,GAAoB,EAAE,iBAAA,KAAsB,EAAC;AAAA,IACjD,GAAI,IAAA,CAAK,KAAA,EAAO,MAAA,GACZ;AAAA,MACE,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC/B,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,GAAI,KAAK,IAAA,GACL,EAAE,MAAM,IAAA,CAAK,IAAA,KACb,EAAC;AAAA,QACL,KAAA,EAAO,KAAK,KAAA,CAAM,GAAA;AAAA,UAAI,CAAC,MAAA,KACrB,iBAAA,CAAkB,MAAmD;AAAA;AACvE,OACF,CAAE;AAAA,QAEJ;AAAC,GACP;AACF;AAEA,SAASC,YACP,OAAA,EAC2D;AAC3D,EAAA,OAAO;AAAA,IACL,GAAI,SAAS,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,KAAiB,EAAC;AAAA,IACtE,GAAI,OAAA,EAAS,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAA,KAAS;AAAC,GAC1C;AACF;AAcO,SAAS,0BAAA,CACd,KACA,OAAA,EAC2B;AAC3B,EAAA,IAAI,QAAA,IAAY,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,OAAA,EAAS;AAC7C,IAAA,OAAO;AAAA,MACL,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAM,GAAA,CAAI,IAAA;AAAA;AAAA,MAEV,WAAA,EAAa,IAAI,WAAA,IAAe,IAAA;AAAA,MAChC,UAAA,EAAY,QAAA;AAAA,MACZ,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,CAAI,OAAO,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,EAAC,EAAE;AAAA,MAClD,GAAGA,YAAW,OAAO;AAAA,KACvB;AAAA,EACF;AACA,EAAA,IAAI,QAAA,IAAY,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,OAAA,EAAS;AAC7C,IAAA,MAAM,IAAA,GAAO,GAAA;AACb,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,WAAA,EAAa,KAAK,WAAA,IAAe,IAAA;AAAA,MACjC,GAAI,IAAA,CAAK,OAAA,GAAU,EAAE,OAAA,EAAS,oBAAA,CAAqB,SAAA,CAAU,IAAA,CAAK,OAAO,CAAC,CAAA,EAAE,GAAI,EAAC;AAAA,MACjF,UAAA,EAAY,QAAA;AAAA,MACZ,KAAA,EAAO,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,MACvD,GAAGA,YAAW,OAAO;AAAA,KACvB;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,GAAA;AACjB,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,aAAa,QAAA,CAAS,WAAA;AAAA,IACtB,UAAU,QAAA,CAAS,QAAA;AAAA,IACnB,GAAI,QAAA,CAAS,OAAA,GAAU,EAAE,OAAA,EAAS,qBAAqB,QAAA,CAAS,OAAO,CAAA,EAAE,GAAI,EAAC;AAAA,IAC9E,UAAA,EAAY,SAAS,UAAA,IAAc,WAAA;AAAA,IACnC,GAAGA,YAAW,OAAO,CAAA;AAAA,IACrB,KAAA,EAAO,SAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAA,CAAkB,IAAI,CAAC;AAAA,GAC7D;AACF;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,WAAA,CACmB,MACA,UAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAInB,KAAK,OAAA,EAAiD;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,gBAAA,EAAkB;AAAA,MACjD,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CACE,YACA,OAAA,EACmB;AACnB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAc,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,EAAI;AAAA,MAC7D,KAAA,EAAO,mBAAmB,OAAO;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,cACE,IAAA,EACyD;AACzD,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,IAAI,CAAC,CAAA,WAAA;AAAA,KACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CACE,MACA,OAAA,EACoE;AACpE,IAAA,MAAM,OAAA,GACJ,UAAU,IAAA,IAAQ,IAAA,CAAK,SAAS,UAAA,GAC5B,0BAAA,CAA2B,IAAA,EAAM,OAAO,CAAA,GACxC,IAAA;AACN,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,uBAAA;AAAA,MACA,EAAE,MAAM,OAAA;AAAQ,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,CACE,YACA,MAAA,EACgC;AAChC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,UAAA,EAAY,MAAM,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CACJ,UAAA,EACA,MAAA,EACA,WAAA,EACoB;AACpB,IAAA,MAAM,EAAE,IAAG,GAAI,MAAM,KAAK,UAAA,CAAW,OAAA,CAAQ,YAAY,MAAM,CAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,iBAAA,CAAkB,EAAA,EAAI,WAAW,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,CACE,YACA,OAAA,EAC8C;AAC9C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,2BAA2B,UAAU,CAAA,CAAA;AAAA,MACrC,EAAE,IAAA,EAAM,OAAA,IAAW,EAAC;AAAE,KACxB;AAAA,EACF;AACF;;;ACzSO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAEf,IAAA;AAAA;AAAA,EAGA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAEA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAEA,QAAA;AAAA,EAET,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,OAAO,CAAA;AAElC,IAAA,IAAA,CAAK,OAAO,IAAI,YAAA,CAAa,KAAK,IAAA,EAAM,IAAA,CAAK,KAAK,UAAU,CAAA;AAC5D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AACtD,IAAA,IAAA,CAAK,aAAa,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAA,EAAM,KAAK,YAAY,CAAA;AACrE,IAAA,IAAA,CAAK,UAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,KAAK,UAAU,CAAA;AAC7D,IAAA,IAAA,CAAK,OAAO,IAAI,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,KAAK,UAAU,CAAA;AACvD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,YAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,KAAK,UAAU,CAAA;AACjE,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAAA,EAChD;AACF;;;ACvFO,SAAS,uBACd,OAAA,EACY;AACZ,EAAA,IAAI,WAAA,GAA6B,SAAS,WAAA,IAAe,IAAA;AACzD,EAAA,IAAI,YAAA,GAA8B,SAAS,YAAA,IAAgB,IAAA;AAE3D,EAAA,OAAO;AAAA,IACL,gBAAgB,MAAM,WAAA;AAAA,IACtB,iBAAiB,MAAM,YAAA;AAAA,IACvB,SAAA,EAAW,CAAC,MAAA,KAAW;AACrB,MAAA,WAAA,GAAc,MAAA,CAAO,WAAA;AACrB,MAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAW;AACrC,QAAA,YAAA,GAAe,MAAA,CAAO,YAAA;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAAA,GACF;AACF;AAoBO,SAAS,4BAAA,CACd,OAAA,GAAyC,EAAC,EAC9B;AACZ,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,aAAA;AACjD,EAAA,MAAM,eAAA,GAAkB,QAAQ,eAAA,IAAmB,cAAA;AACnD,EAAA,MAAM,UACJ,OAAA,CAAQ,OAAA,KACP,OAAO,UAAA,KAAe,WAAA,GAClB,WAA0C,YAAA,GAC3C,MAAA,CAAA;AAEN,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AAAA,IACpD,eAAA,EAAiB,MAAM,OAAA,CAAQ,OAAA,CAAQ,eAAe,CAAA;AAAA,IACtD,SAAA,EAAW,CAAC,MAAA,KAAW;AACrB,MAAA,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,MAAA,CAAO,WAAW,CAAA;AAClD,MAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAW;AACrC,QAAA,OAAA,CAAQ,OAAA,CAAQ,eAAA,EAAiB,MAAA,CAAO,YAAY,CAAA;AAAA,MACtD;AAAA,IACF,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,WAAW,cAAc,CAAA;AACjC,MAAA,OAAA,CAAQ,WAAW,eAAe,CAAA;AAAA,IACpC;AAAA,GACF;AACF;;;ACxDO,SAAS,oBACd,OAAA,EACc;AACd,EAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,UAAA,IAAc,4BAAA,EAA6B;AACrD,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,UAAA;AAAA,IACA,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,IACpC,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AACH;AA2BO,SAAS,mBACd,OAAA,EACc;AACd,EAAA,IAAI,CAAC,QAAQ,MAAA,IAAU,CAAC,QAAQ,WAAA,IAAe,CAAC,QAAQ,UAAA,EAAY;AAClE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AACH","file":"index.js","sourcesContent":["/** Prefix of Lunnoa Automate machine (service-account) API keys. */\nexport const API_KEY_PREFIX = 'lna_';\n\n/** Returns true when running inside a browser (or browser-like) environment. */\nexport function isBrowserEnvironment(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * API keys are operator credentials (CLI, codegen, deploy). Shipping one to a\n * browser exposes the whole workspace the key is scoped to, so the SDK refuses.\n *\n * Apps authenticate end users with a Lunnoa user JWT.\n */\nexport function assertApiKeyAllowedInEnvironment(apiKey: string): void {\n if (isBrowserEnvironment()) {\n throw new Error(\n 'Refusing to use a Lunnoa API key (lna_...) in a browser environment. ' +\n 'API keys are for the CLI and operator scripts, not for app login. ' +\n 'Anyone opening dev tools could read the key and act as the service account across its whole workspace. ' +\n 'Sign the end user in with lunnoa.auth.login and pass their JWT as `accessToken`.',\n );\n }\n if (!apiKey.startsWith(API_KEY_PREFIX)) {\n throw new Error(\n `Invalid Lunnoa API key: expected it to start with \"${API_KEY_PREFIX}\". ` +\n 'If you are passing a user JWT, use the `accessToken` option instead of `apiKey`.',\n );\n }\n}\n","/** Error thrown for every non-2xx response from a Lunnoa Automate deployment. */\nexport class LunnoaApiError extends Error {\n /** HTTP status code of the failed response. */\n readonly status: number;\n /** Parsed JSON error body when the server returned one, otherwise the raw text. */\n readonly body: unknown;\n /** HTTP method of the failed request. */\n readonly method: string;\n /** Path of the failed request (without the base URL). */\n readonly path: string;\n /** Present on definition-sync 409s when the server sends the current revision. */\n readonly currentRevision?: string;\n\n constructor(args: {\n status: number;\n body: unknown;\n method: string;\n path: string;\n }) {\n const detail = extractMessage(args.body);\n const currentRevision = extractCurrentRevision(args.body);\n const shown = [detail, currentRevision ? `currentRevision: ${currentRevision}` : undefined]\n .filter(Boolean)\n .join(' ');\n super(\n `Lunnoa API request failed: ${args.method} ${args.path} → ${args.status}${shown ? ` (${shown})` : ''}`,\n );\n this.name = 'LunnoaApiError';\n this.status = args.status;\n this.body = args.body;\n this.method = args.method;\n this.path = args.path;\n this.currentRevision = currentRevision;\n }\n\n /** True for 401 responses (missing, revoked, or expired credential). */\n get isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n /** True for 403 responses (missing permission or feature not licensed). */\n get isForbidden(): boolean {\n return this.status === 403;\n }\n\n /** True for 404 responses. */\n get isNotFound(): boolean {\n return this.status === 404;\n }\n\n /** True for 429 responses (rate limited). */\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n}\n\nexport function publicApiMessage(error: LunnoaApiError): string {\n const message = extractMessage(error.body) ?? error.message;\n return error.currentRevision\n ? `${message} (currentRevision: ${error.currentRevision})`\n : message;\n}\n\nfunction extractCurrentRevision(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const revision = (body as Record<string, unknown>).currentRevision;\n return typeof revision === 'string' ? revision : undefined;\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === 'object') {\n const record = body as Record<string, unknown>;\n const candidate = record.message ?? record.error;\n if (typeof candidate === 'string') {\n return candidate;\n }\n if (Array.isArray(candidate)) {\n return candidate.filter((m) => typeof m === 'string').join('; ');\n }\n }\n if (typeof body === 'string' && body.length > 0 && body.length < 300) {\n return body;\n }\n return undefined;\n}\n","import { API_KEY_PREFIX, assertApiKeyAllowedInEnvironment } from './auth';\nimport { LunnoaApiError } from './errors';\nimport type { TokenStore } from '../auth/token-store';\n\nexport type FetchLike = (\n input: string | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface LunnoaClientOptions {\n /**\n * Base URL of the Lunnoa Automate deployment, e.g. `https://lunnoa.acme.example`.\n * Paths are appended under `/api/*`.\n */\n baseUrl: string;\n /**\n * Machine credential (`lna_...`) for the CLI and operator scripts, not for app login.\n * Never usable in browsers: the constructor throws if one is supplied while `window` exists.\n */\n apiKey?: string;\n /**\n * User JWT obtained from login / SSO. The supported credential for browser\n * applications. May be a function so refreshed tokens are picked up per request.\n *\n * Prefer {@link tokenStore} so login/refresh can persist tokens\n * and optionally auto-refresh on 401.\n */\n accessToken?: string | (() => string | Promise<string>);\n /**\n * Optional JWT store for a signed-in Lunnoa user. When set, authenticated requests read\n * the access token from the store. Login / refresh helpers write back into it.\n */\n tokenStore?: TokenStore;\n /**\n * When true (default if `tokenStore` is set), a 401 triggers one\n * `POST /api/auth/refresh-token` attempt using the stored refresh token,\n * then retries the original request.\n */\n autoRefresh?: boolean;\n /** Custom fetch implementation (testing, polyfills, interceptors). */\n fetch?: FetchLike;\n /** Extra headers sent with every request. */\n headers?: Record<string, string>;\n}\n\nexport type QueryValue = string | number | boolean | undefined | null;\n\nexport interface RequestOptions {\n query?: Record<string, QueryValue>;\n body?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n /**\n * Return the raw Response instead of parsing JSON. Used by the streaming\n * module and endpoints that may legitimately return 204.\n */\n raw?: boolean;\n /**\n * Skip the Authorization header. Used for public auth endpoints\n * (login, refresh, SSO providers).\n */\n skipAuth?: boolean;\n /** Internal: set after an auto-refresh retry so we do not loop. */\n _retriedAfterRefresh?: boolean;\n}\n\n/**\n * Minimal typed HTTP layer shared by every resource namespace. Handles auth\n * header resolution, query serialisation, JSON parsing, and error mapping.\n */\nexport class HttpClient {\n readonly baseUrl: string;\n readonly tokenStore?: TokenStore;\n /** Underlying fetch (shared with AI SDK transports when needed). */\n readonly fetch: FetchLike;\n private readonly apiKey?: string;\n private readonly accessToken?: string | (() => string | Promise<string>);\n private readonly autoRefresh: boolean;\n private readonly defaultHeaders: Record<string, string>;\n private refreshInFlight: Promise<boolean> | null = null;\n\n constructor(options: LunnoaClientOptions) {\n if (!options.baseUrl) {\n throw new Error('LunnoaClient requires a baseUrl.');\n }\n if (!options.apiKey && !options.accessToken && !options.tokenStore) {\n throw new Error(\n 'LunnoaClient requires an accessToken or tokenStore (Lunnoa user JWT), or an apiKey for operator scripts.',\n );\n }\n if (options.apiKey) {\n assertApiKeyAllowedInEnvironment(options.apiKey);\n }\n if (\n typeof options.accessToken === 'string' &&\n options.accessToken.startsWith(API_KEY_PREFIX)\n ) {\n throw new Error(\n 'The accessToken option received an lna_ API key. API keys must be passed as `apiKey` ' +\n '(and never in a browser); accessToken is for user JWTs only.',\n );\n }\n\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.accessToken = options.accessToken;\n this.tokenStore = options.tokenStore;\n this.autoRefresh =\n options.autoRefresh ?? Boolean(options.tokenStore && !options.apiKey);\n this.fetch =\n options.fetch ?? (globalThis.fetch.bind(globalThis) as FetchLike);\n this.defaultHeaders = options.headers ?? {};\n }\n\n async resolveAuthHeader(): Promise<string> {\n if (this.apiKey) {\n return `Bearer ${this.apiKey}`;\n }\n if (this.tokenStore) {\n const fromStore = await this.tokenStore.getAccessToken();\n if (!fromStore) {\n throw new Error(\n 'No access token in the token store. Call lunnoa.auth.login(...) first, ' +\n 'or seed the store with setTokens / createMemoryTokenStore({ accessToken }).',\n );\n }\n return `Bearer ${fromStore}`;\n }\n const token =\n typeof this.accessToken === 'function'\n ? await this.accessToken()\n : this.accessToken;\n if (!token) {\n throw new Error('accessToken resolved to an empty value.');\n }\n return `Bearer ${token}`;\n }\n\n buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(this.baseUrl + path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions & { raw: true },\n ): Promise<Response>;\n async request<T>(\n method: string,\n path: string,\n options?: RequestOptions,\n ): Promise<T>;\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T | Response> {\n const url = this.buildUrl(path, options.query);\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...options.headers,\n };\n\n if (!options.skipAuth) {\n headers.Authorization = await this.resolveAuthHeader();\n }\n\n const init: RequestInit = { method, headers, signal: options.signal };\n if (options.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n\n const response = await this.fetch(url, init);\n\n if (\n !response.ok &&\n response.status === 401 &&\n !options.skipAuth &&\n !options._retriedAfterRefresh &&\n this.autoRefresh &&\n this.tokenStore &&\n !this.apiKey\n ) {\n const refreshed = await this.tryRefreshAccessToken();\n if (refreshed) {\n return this.request<T>(method, path, {\n ...options,\n _retriedAfterRefresh: true,\n });\n }\n }\n\n if (!response.ok) {\n const body = await parseBodySafely(response);\n throw new LunnoaApiError({\n status: response.status,\n body,\n method,\n path,\n });\n }\n\n if (options.raw) {\n return response;\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await parseBodySafely(response)) as T;\n }\n\n get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, options);\n }\n\n post<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, options);\n }\n\n patch<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, options);\n }\n\n put<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, options);\n }\n\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, options);\n }\n\n /**\n * Single-flight refresh using the token store. Returns false when refresh\n * is impossible or fails (store is cleared on failure).\n */\n async tryRefreshAccessToken(): Promise<boolean> {\n if (!this.tokenStore) {\n return false;\n }\n if (!this.refreshInFlight) {\n this.refreshInFlight = this.performRefresh().finally(() => {\n this.refreshInFlight = null;\n });\n }\n return this.refreshInFlight;\n }\n\n private async performRefresh(): Promise<boolean> {\n const refreshToken = await this.tokenStore!.getRefreshToken();\n if (!refreshToken) {\n return false;\n }\n\n try {\n const url = this.buildUrl('/api/auth/refresh-token');\n const response = await this.fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken }),\n });\n if (!response.ok) {\n await this.tokenStore!.clear();\n return false;\n }\n const body = (await parseBodySafely(response)) as {\n access_token?: string;\n };\n if (!body?.access_token) {\n await this.tokenStore!.clear();\n return false;\n }\n await this.tokenStore!.setTokens({ accessToken: body.access_token });\n return true;\n } catch {\n await this.tokenStore!.clear();\n return false;\n }\n }\n}\n\nasync function parseBodySafely(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) {\n return undefined;\n }\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","/**\n * Minimal Server-Sent Events parser.\n *\n * Takes the byte stream of a `text/event-stream` response and yields the\n * `data:` payload of each event. Comment lines (keep-alive `:` pings sent by\n * the Lunnoa server every 15s) and other fields are ignored. Multi-line\n * `data:` fields are joined with `\\n` per the SSE specification.\n */\nexport async function* parseSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<string, void, undefined> {\n for await (const event of parseSseEvents(stream)) {\n if (event.data !== null) {\n yield event.data;\n }\n }\n}\n\nexport interface SseEvent {\n /** SSE `event:` field, or `\"message\"` when omitted. */\n event: string;\n /** Joined `data:` payload, or null when the frame had no data lines. */\n data: string | null;\n}\n\n/**\n * Like {@link parseSseStream}, but preserves the SSE event name.\n * Used by execution progress streams (`execution.progress`, `loop.progress`, …).\n */\nexport async function* parseSseEvents(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseEvent, void, undefined> {\n const reader = stream.getReader();\n const decoder = new TextDecoder('utf-8', { fatal: false });\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n\n // Events are separated by a blank line. Normalise CRLF first.\n buffer = buffer.replace(/\\r\\n/g, '\\n');\n let boundary = buffer.indexOf('\\n\\n');\n while (boundary !== -1) {\n const rawEvent = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf('\\n\\n');\n\n const parsed = extractEvent(rawEvent);\n if (parsed.data !== null || parsed.event !== 'message') {\n yield parsed;\n }\n }\n }\n\n // Flush a trailing event without a final blank line (lenient).\n const remaining = buffer.trim();\n if (remaining) {\n const parsed = extractEvent(remaining);\n if (parsed.data !== null || parsed.event !== 'message') {\n yield parsed;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractEvent(rawEvent: string): SseEvent {\n const dataLines: string[] = [];\n let eventName = 'message';\n\n for (const line of rawEvent.split('\\n')) {\n if (line.startsWith(':')) {\n continue; // SSE comment (keep-alive)\n }\n if (line.startsWith('event:')) {\n let value = line.slice('event:'.length);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n if (value) {\n eventName = value;\n }\n continue;\n }\n if (line.startsWith('data:')) {\n let value = line.slice('data:'.length);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n dataLines.push(value);\n }\n }\n\n return {\n event: eventName,\n data: dataLines.length === 0 ? null : dataLines.join('\\n'),\n };\n}\n","import type { UIMessage, UIMessageChunk } from 'ai';\n\nimport type { HttpClient } from '../core/http';\nimport { parseSseStream } from './sse';\n\nexport type ChatMode = 'builder' | 'preview';\n\nexport interface StreamMessageOptions {\n /**\n * Agent chat mode. Defaults to `preview` (10 model rounds, a normal agent run).\n * `builder` is the agent-editor interview and stops after 4 rounds.\n */\n chatMode?: ChatMode;\n /** Optional image attachment forwarded with this turn. */\n data?: { imageUrl?: string };\n /**\n * Answer to an ask-before-sending personal-data prompt.\n * Applies to this message only.\n */\n piiResolution?: 'anonymize' | 'fallback';\n /** Abort the stream (closes the HTTP connection; the run keeps going server-side — call `stop` to cancel it). */\n signal?: AbortSignal;\n}\n\nexport interface StopStreamOptions {\n /**\n * Partial assistant message (AI SDK UIMessage) received so far; the server\n * persists it so the partial turn is not lost.\n */\n assistantMessage?: UIMessage;\n}\n\n/**\n * An in-flight agent chat turn, exposed as an async iterable of AI SDK\n * `UIMessageChunk`s (`text-delta`, `tool-*`, `finish`, ...).\n *\n * ```ts\n * const stream = await client.agentChat.streamMessage(agentId, taskId, message);\n * for await (const chunk of stream) {\n * if (chunk.type === 'text-delta') process.stdout.write(chunk.delta);\n * }\n * ```\n *\n * Use {@link AgentChatStream.toUIMessageStream} with the AI SDK's\n * `readUIMessageStream` to consume assembled `UIMessage` snapshots instead of\n * raw chunks.\n */\nexport class AgentChatStream implements AsyncIterable<UIMessageChunk> {\n /**\n * Server run id of this turn (`X-Task-Run-Id` response header), when\n * provided. Useful for diagnostics.\n */\n readonly runId: string | null;\n\n private consumed = false;\n\n constructor(\n private readonly response: Response,\n private readonly options?: { signal?: AbortSignal },\n ) {\n this.runId = response.headers.get('X-Task-Run-Id');\n }\n\n [Symbol.asyncIterator](): AsyncGenerator<UIMessageChunk, void, undefined> {\n return this.chunks();\n }\n\n async *chunks(): AsyncGenerator<UIMessageChunk, void, undefined> {\n if (this.consumed) {\n throw new Error('This AgentChatStream has already been consumed.');\n }\n this.consumed = true;\n\n const body = this.response.body;\n if (!body) {\n return;\n }\n\n for await (const data of parseSseStream(body)) {\n if (this.options?.signal?.aborted) {\n return;\n }\n if (data === '[DONE]') {\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n continue; // Skip malformed events rather than killing the stream.\n }\n if (parsed && typeof parsed === 'object' && 'type' in parsed) {\n yield parsed as UIMessageChunk;\n }\n }\n }\n\n /**\n * The same chunks as a web `ReadableStream`, ready for the AI SDK's\n * `readUIMessageStream({ stream })` to assemble into `UIMessage` snapshots.\n */\n toUIMessageStream(): ReadableStream<UIMessageChunk> {\n const iterator = this.chunks();\n return new ReadableStream<UIMessageChunk>({\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iterator.return();\n },\n });\n }\n\n /** Collects the full text of the turn (concatenated `text-delta` chunks). */\n async text(): Promise<string> {\n let text = '';\n for await (const chunk of this.chunks()) {\n if (chunk.type === 'text-delta' && typeof chunk.delta === 'string') {\n text += chunk.delta;\n }\n }\n return text;\n }\n}\n\n/**\n * Hand-written client for the Agent Runtime SSE endpoints\n * (`POST/GET /api/agents/:agentId/tasks/:taskId/stream-message` and `/stop`).\n * Code generators handle SSE poorly, so this module wraps the wire protocol\n * the bundled UI uses (AI SDK UIMessage chunks, SSE-framed, resumable).\n */\nexport class AgentChatClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Sends a user message to an agent task and streams the assistant turn.\n * Creates the task row when `taskId` does not exist yet (client-generated\n * UUIDs are supported, mirroring the bundled UI).\n *\n * `message` may be a plain string (wrapped into a UIMessage) or a full AI\n * SDK `UIMessage`.\n */\n async streamMessage(\n agentId: string,\n taskId: string,\n message: string | UIMessage,\n options: StreamMessageOptions = {},\n ): Promise<AgentChatStream> {\n const uiMessage: UIMessage =\n typeof message === 'string'\n ? {\n id: generateMessageId(),\n role: 'user',\n parts: [{ type: 'text', text: message }],\n }\n : message;\n\n const response = await this.http.request<Response>(\n 'POST',\n `/api/agents/${agentId}/tasks/${taskId}/stream-message`,\n {\n raw: true,\n signal: options.signal,\n headers: { Accept: 'text/event-stream' },\n body: messageTaskBody(uiMessage, options),\n },\n );\n\n return new AgentChatStream(response, { signal: options.signal });\n }\n\n /**\n * Reattaches to an in-flight agent turn after a disconnect (the resumable\n * stream replays from the beginning of the turn). Returns `null` when\n * there is no active stream to resume (server responds 204).\n */\n async resumeStream(\n agentId: string,\n taskId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<AgentChatStream | null> {\n const response = await this.http.request<Response>(\n 'GET',\n `/api/agents/${agentId}/tasks/${taskId}/stream-message`,\n {\n raw: true,\n signal: options.signal,\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (response.status === 204) {\n return null;\n }\n return new AgentChatStream(response, { signal: options.signal });\n }\n\n /**\n * Requests cancellation of the active agent turn for a task. Idempotent:\n * succeeds even when no stream is active. Optionally persists the partial\n * assistant message received so far.\n */\n async stop(\n agentId: string,\n taskId: string,\n options: StopStreamOptions = {},\n ): Promise<{ ok: boolean }> {\n return this.http.post<{ ok: boolean }>(\n `/api/agents/${agentId}/tasks/${taskId}/stream-message/stop`,\n {\n body: options.assistantMessage\n ? { assistantMessage: options.assistantMessage }\n : {},\n },\n );\n }\n}\n\nexport function messageTaskBody(\n message: UIMessage,\n options: Omit<StreamMessageOptions, 'signal'> = {},\n) {\n return {\n messages: [message],\n chatMode: options.chatMode ?? 'preview',\n ...(options.data ? { data: options.data } : {}),\n ...(options.piiResolution ? { piiResolution: options.piiResolution } : {}),\n };\n}\n\nfunction generateMessageId(): string {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n","import type { HttpClient } from '../core/http';\nimport type { Execution, RunActionResult } from '../types';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface RunActionOptions {\n /** Workflow app id (catalogue slug), e.g. `http`, `gmail`. */\n appId: string;\n /** Action id within the app, e.g. `http_action_send-request`. */\n actionId: string;\n /**\n * Connection instance UUID (`Connection.id`). Required when the action needs\n * a connection and the workspace has more than one for the app. When omitted\n * and exactly one connection exists, the platform uses that connection.\n */\n connectionId?: string;\n /** Action input fields (keys from the action `inputConfig`). */\n input?: Record<string, unknown>;\n /** Optional display name for the ad-hoc Execution. */\n name?: string;\n}\n\nexport class ActionsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /**\n * Run a single catalogue action as a one-step ad-hoc Execution (`source: SDK`).\n *\n * The platform runs the action synchronously and returns the execution id\n * plus status/output/executionPath. You can also poll\n * {@link ExecutionsResource.get} / {@link ExecutionsResource.waitUntilFinished}\n * with the returned id.\n *\n * Discover `appId` / `actionId` / `inputConfig` via `workflowApps.list()`.\n */\n run(options: RunActionOptions): Promise<RunActionResult> {\n return this.http.post<RunActionResult>('/api/actions/run', {\n body: options,\n });\n }\n\n /**\n * Convenience: run the action and wait until the Execution reaches a\n * terminal status (or pauses in `NEEDS_INPUT`). Prefer {@link run} when the\n * synchronous response is enough.\n */\n async runAndWait(\n options: RunActionOptions,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.run(options);\n return this.executions.waitUntilFinished(id, {\n ...waitOptions,\n expansion: [\n 'executionPath',\n 'source',\n ...(waitOptions?.expansion ?? []),\n ],\n });\n }\n\n /**\n * Thin discovery helper: find one action definition from `workflowApps.list()`.\n * Prefer calling `workflowApps.list()` once and caching when looking up many\n * actions.\n */\n async get(\n appId: string,\n actionId: string,\n ): Promise<Record<string, unknown> | undefined> {\n const apps = await this.http.get<\n Array<{\n id?: string;\n actions?: Array<Record<string, unknown>>;\n }>\n >('/api/workflow-apps');\n const app = apps.find((a) => a.id === appId);\n return app?.actions?.find((action) => action.id === actionId);\n }\n}\n","/**\n * On-disk agent and workflow definitions (the pull/push file shape).\n * `$schema` is allowed on input and stripped; the CLI adds it when writing.\n */\n\nexport interface RetrySettings {\n enabled: boolean;\n maxAttempts: number;\n delaySeconds: number;\n}\n\nexport interface ContinueOnFailureSettings {\n enabled: boolean;\n}\n\n/** Every key is present on files the API returns. Hand-written files may omit unset keys. */\nexport interface AgentFileSettings {\n temperature?: number;\n topP?: number;\n maxOutputTokens?: number | null;\n frequencyPenalty?: number;\n presencePenalty?: number;\n seed?: number | null;\n maxRetries?: number;\n maxToolRoundtrips?: number;\n messageLookbackLimit?: number;\n taskNamingInstructions?: string | null;\n enabledBuiltInTools?: string[];\n enabledPlatformTools?: string[];\n enabledToolPolicies?: string[];\n forcedTools?: unknown;\n suggestedPrompts?: string[];\n dynamicActionDiscoveryEnabled?: boolean;\n dynamicMcpDiscoveryEnabled?: boolean;\n dynamicSelfInstructionsEnabled?: boolean;\n memoryEnabled?: boolean;\n memoryScope?: string;\n memoryRetentionDays?: number;\n enablePlanning?: boolean;\n requirePlanApproval?: boolean;\n enableToolResultOffload?: boolean;\n toolResultOffloadThresholdBytes?: number;\n longHorizonMode?: boolean;\n longHorizonMaxSteps?: number | null;\n longHorizonMaxTokensPerRun?: number | null;\n piiRoutingMode?: string;\n piiFallbackConnectionId?: string | null;\n piiFallbackModelId?: string | null;\n webAccess?: boolean | null;\n phoneAccess?: boolean | null;\n}\n\nexport interface AgentFileTool {\n key: string;\n /** Catalogue action id. */\n id: string;\n appId?: string;\n connection?: { id: string };\n name: string;\n description?: string;\n input: Record<string, unknown>;\n}\n\nexport interface AgentLinkBySlug {\n slug: string;\n}\n\nexport interface AgentLinkById {\n id: string;\n}\n\nexport type AgentSlugOrId = AgentLinkBySlug | AgentLinkById;\n\nexport interface AgentFileDefinition {\n kind: 'agent';\n slug: string;\n name: string;\n description?: string;\n model?: string;\n aiConnection?: { id: string };\n /**\n * API and TypeScript use a string. Files on disk point at\n * `<slug>.instructions.md`; only the CLI reads that file.\n */\n instructions: string | { file: string };\n settings: AgentFileSettings;\n tools: AgentFileTool[];\n workflows: AgentSlugOrId[];\n agents: AgentSlugOrId[];\n connections: AgentLinkById[];\n knowledge: AgentLinkById[];\n variables: AgentLinkById[];\n objects: AgentLinkById[];\n objectTypes: AgentLinkById[];\n mcpServers: Array<{ id: string; connectionId?: string }>;\n a2aAgents: AgentLinkById[];\n}\n\n/** Authoring / `JSON.parse` input. Lists and settings may be omitted; pulled files include them. */\nexport type AgentFileInput = Omit<\n AgentFileDefinition,\n | 'kind'\n | 'name'\n | 'instructions'\n | 'settings'\n | 'tools'\n | 'workflows'\n | 'agents'\n | 'connections'\n | 'knowledge'\n | 'variables'\n | 'objects'\n | 'objectTypes'\n | 'mcpServers'\n | 'a2aAgents'\n> & {\n $schema?: string;\n kind?: 'agent';\n name?: string;\n instructions: string | { file: string };\n settings?: Partial<AgentFileSettings>;\n tools?: AgentFileTool[];\n workflows?: AgentSlugOrId[];\n agents?: AgentSlugOrId[];\n connections?: AgentLinkById[];\n knowledge?: AgentLinkById[];\n variables?: AgentLinkById[];\n objects?: AgentLinkById[];\n objectTypes?: AgentLinkById[];\n mcpServers?: Array<{ id: string; connectionId?: string }>;\n a2aAgents?: AgentLinkById[];\n};\n\nexport interface WorkflowUseFile {\n id: string;\n appId?: string;\n connection?: { id: string };\n}\n\nexport interface WorkflowTriggerFile {\n id: string;\n appId?: string;\n connection?: { id: string };\n input?: Record<string, unknown>;\n inputs?: Array<Record<string, unknown>>;\n name: string;\n description?: string;\n}\n\nexport interface WorkflowStepFile {\n key: string;\n name: string;\n description?: string;\n use: WorkflowUseFile;\n input: Record<string, unknown>;\n retrySettings?: RetrySettings;\n continueOnFailure?: ContinueOnFailureSettings;\n paths?: Array<{\n label: string;\n when?: Array<Array<{ field: string; condition: string; value?: string }>>;\n steps: WorkflowStepFile[];\n }>;\n}\n\nexport interface WorkflowStepsFileDefinition {\n kind: 'workflow';\n format: 'steps';\n slug: string;\n name: string;\n description?: string;\n trigger: WorkflowTriggerFile;\n steps: WorkflowStepFile[];\n}\n\nexport type WorkflowStepsFileInput = Omit<WorkflowStepsFileDefinition, 'kind'> & {\n $schema?: string;\n kind?: 'workflow';\n};\n\nexport interface WorkflowGraphNode {\n id?: string;\n key: string;\n nodeType: 'trigger' | 'action';\n appId: string;\n actionId?: string;\n triggerId?: string;\n name: string;\n description?: string;\n value: Record<string, unknown>;\n retrySettings?: Record<string, unknown>;\n continueOnFailure?: Record<string, unknown>;\n [other: string]: unknown;\n}\n\nexport interface WorkflowGraphEdge {\n id?: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n type?: string;\n}\n\nexport interface WorkflowGraphFileDefinition {\n kind: 'workflow';\n format: 'graph';\n slug: string;\n name: string;\n description?: string;\n nodes: WorkflowGraphNode[];\n edges: WorkflowGraphEdge[];\n}\n\nexport type WorkflowGraphFileInput = Omit<WorkflowGraphFileDefinition, 'kind'> & {\n $schema?: string;\n kind?: 'workflow';\n};\n\nexport type WorkflowFileDefinition =\n | WorkflowStepsFileDefinition\n | WorkflowGraphFileDefinition;\n\nconst STEP_KEY_PATTERN = /^[A-Za-z][A-Za-z0-9_-]*$/;\n\nfunction hasFileAgentSignals(record: Record<string, unknown>): boolean {\n if (record.instructions && typeof record.instructions === 'object') return true;\n if (record.settings && typeof record.settings === 'object') return true;\n if (\n 'workflows' in record ||\n 'agents' in record ||\n 'knowledge' in record ||\n 'variables' in record ||\n 'objects' in record ||\n 'objectTypes' in record ||\n 'mcpServers' in record ||\n 'a2aAgents' in record\n ) {\n return true;\n }\n return (\n Array.isArray(record.tools) &&\n record.tools.some(\n (tool) =>\n tool &&\n typeof tool === 'object' &&\n !('kind' in tool) &&\n !('use' in tool),\n )\n );\n}\n\nexport function isAgentFileInput(config: unknown): config is AgentFileInput {\n if (!config || typeof config !== 'object') return false;\n return hasFileAgentSignals(config as Record<string, unknown>);\n}\n\n/** True for a file-shaped agent after `$schema` has been stripped. */\nexport function isAgentFileShape(config: unknown): config is AgentFileDefinition {\n if (!config || typeof config !== 'object') return false;\n return hasFileAgentSignals(config as Record<string, unknown>);\n}\n\nexport function acceptAgentFile(config: AgentFileInput): AgentFileDefinition {\n const slug = config.slug?.trim();\n if (!slug) throw new Error('defineAgent requires slug');\n const instructions = config.instructions;\n const fileRef =\n instructions &&\n typeof instructions === 'object' &&\n typeof instructions.file === 'string' &&\n instructions.file.trim().length > 0;\n if (typeof instructions !== 'string' && !fileRef) {\n throw new Error('defineAgent requires instructions');\n }\n const copy = { ...config } as Record<string, unknown>;\n delete copy.$schema;\n delete copy.kind;\n return { ...copy, kind: 'agent', slug, instructions } as AgentFileDefinition;\n}\n\nfunction assertStepKeys(steps: WorkflowStepFile[], seen: Set<string>): void {\n for (const step of steps ?? []) {\n if (!step?.use?.id?.trim()) {\n throw new Error('workflow step requires use.id');\n }\n if (step.key !== undefined) {\n if (!STEP_KEY_PATTERN.test(step.key) || step.key === 'trigger') {\n throw new Error(\n `Step key \"${step.key}\" must start with a letter, use letters, digits, - or _, and not be \"trigger\".`,\n );\n }\n if (seen.has(step.key)) {\n throw new Error(`Step key \"${step.key}\" is used twice.`);\n }\n seen.add(step.key);\n }\n for (const path of step.paths ?? []) {\n assertStepKeys(path.steps ?? [], seen);\n }\n }\n}\n\nexport function acceptWorkflowStepsFile(\n config: WorkflowStepsFileInput,\n): WorkflowStepsFileDefinition {\n const slug = config.slug?.trim();\n if (!slug) throw new Error('defineWorkflow requires slug');\n if (!config.steps?.length) {\n throw new Error('defineWorkflow requires at least one step');\n }\n if (config.trigger && !config.trigger.id?.trim()) {\n throw new Error('defineWorkflow trigger requires id');\n }\n assertStepKeys(config.steps, new Set());\n const copy = { ...config } as Record<string, unknown>;\n delete copy.$schema;\n delete copy.kind;\n return {\n ...copy,\n kind: 'workflow',\n format: 'steps',\n slug,\n } as WorkflowStepsFileDefinition;\n}\n\nexport function acceptWorkflowGraphFile(\n config: WorkflowGraphFileInput,\n): WorkflowGraphFileDefinition {\n const slug = config.slug?.trim();\n if (!slug) throw new Error('defineWorkflow requires slug');\n if (!Array.isArray(config.nodes) || config.nodes.length === 0) {\n throw new Error('defineWorkflow graph requires nodes');\n }\n const keys = new Set<string>();\n let triggers = 0;\n for (const node of config.nodes) {\n if (!node?.key || typeof node.key !== 'string') {\n throw new Error('graph node requires key');\n }\n if (!STEP_KEY_PATTERN.test(node.key)) {\n throw new Error(\n `Node key \"${node.key}\" must start with a letter, use letters, digits, - or _, and not be empty.`,\n );\n }\n if (keys.has(node.key)) {\n throw new Error(`Node key \"${node.key}\" is used twice.`);\n }\n keys.add(node.key);\n if (node.nodeType === 'trigger') triggers += 1;\n }\n if (triggers !== 1) {\n throw new Error('defineWorkflow graph requires exactly one trigger');\n }\n for (const edge of config.edges ?? []) {\n if (!keys.has(edge?.source) || !keys.has(edge?.target)) {\n throw new Error(\n `Edge from \"${edge?.source ?? ''}\" to \"${edge?.target ?? ''}\" references an unknown key.`,\n );\n }\n }\n const copy = { ...config } as Record<string, unknown>;\n delete copy.$schema;\n delete copy.kind;\n return {\n ...copy,\n kind: 'workflow',\n format: 'graph',\n slug,\n edges: config.edges ?? [],\n } as WorkflowGraphFileDefinition;\n}\n\nexport function isWorkflowGraphInput(config: unknown): config is WorkflowGraphFileInput {\n return (\n !!config &&\n typeof config === 'object' &&\n (config as { format?: string }).format === 'graph'\n );\n}\n\nexport function isWorkflowStepsFile(config: unknown): config is WorkflowStepsFileInput {\n if (!config || typeof config !== 'object') return false;\n const record = config as Record<string, unknown>;\n if (record.format === 'steps') return true;\n if (\n record.trigger &&\n typeof record.trigger === 'object' &&\n (record.trigger as { kind?: string }).kind !== 'trigger' &&\n typeof (record.trigger as { id?: string }).id === 'string'\n ) {\n return true;\n }\n return (\n Array.isArray(record.steps) &&\n record.steps.some(\n (step) =>\n step &&\n typeof step === 'object' &&\n (step as { use?: { kind?: string } }).use &&\n (step as { use?: { kind?: string } }).use?.kind !== 'action',\n )\n );\n}\n","/**\n * Pure typed definition factories for local workflow/agent authoring.\n * These do not call the network. Deploy with the CLI; run ad-hoc with `runs.start`.\n *\n * Not the same as `@lunnoa/toolkit` `createAction` / `createApp` (in-platform apps).\n */\n\nimport {\n acceptAgentFile,\n acceptWorkflowGraphFile,\n acceptWorkflowStepsFile,\n isAgentFileInput,\n isWorkflowGraphInput,\n isWorkflowStepsFile,\n} from './files';\nimport type {\n AgentFileDefinition,\n AgentFileInput,\n WorkflowGraphFileDefinition,\n WorkflowGraphFileInput,\n WorkflowStepsFileDefinition,\n WorkflowStepsFileInput,\n} from './files';\n\nexport const DEFINE_KINDS = {\n connection: 'connection',\n aiConnection: 'aiConnection',\n action: 'action',\n trigger: 'trigger',\n workflow: 'workflow',\n agent: 'agent',\n entityType: 'entityType',\n} as const;\n\nexport type DefineKind = (typeof DEFINE_KINDS)[keyof typeof DEFINE_KINDS];\n\n/** Ref to an existing app Connection (credentials stay on Lunnoa). */\nexport interface ConnectionDefinition {\n kind: typeof DEFINE_KINDS.connection;\n /** Connection instance UUID. Optional when the platform can resolve sole/default. */\n id?: string;\n}\n\n/** Ref to an existing AiProviderConnection. */\nexport interface AiConnectionDefinition {\n kind: typeof DEFINE_KINDS.aiConnection;\n /** AiProviderConnection UUID. Optional when platform AI defaults apply. */\n id?: string;\n}\n\nexport interface ActionDefinition {\n kind: typeof DEFINE_KINDS.action;\n /**\n * Catalogue action id, e.g. `http_action_send-request`.\n * Optionally `appId.actionId` (first segment before `.` used as appId when\n * `appId` is omitted and the id contains a dot that is not part of the\n * usual `_action_` pattern).\n */\n id: string;\n /** Workflow app id. Inferred from `id` when it matches `{app}_action_…`. */\n appId?: string;\n /** Optional Connection ref. Omit to let the platform resolve. */\n connection?: ConnectionDefinition;\n /** Default input merged at run/deploy time. */\n input?: Record<string, unknown>;\n name?: string;\n description?: string;\n}\n\n/** One field on a Manually Run trigger. Stored as `customInputConfig`. */\nexport interface TriggerInputFieldDefinition {\n /** Field id. Callers pass this key to `workflows.execute`. */\n id: string;\n label?: string;\n description?: string;\n /** `text`, `number`, `date`, or `select`. Defaults to `text` on deploy. */\n inputType?: string;\n required?: boolean | { missingMessage?: string; missingStatus?: string };\n defaultValue?: unknown;\n selectOptions?: Array<{ label?: string; value?: string }>;\n}\n\n/** Ref to a catalogue trigger. Credentials stay on the connection, when one is set. */\nexport interface TriggerDefinition {\n kind: typeof DEFINE_KINDS.trigger;\n /**\n * Catalogue trigger id, e.g. `flow-control_trigger_manual`.\n * Discover with `apps get <appId> --json` (`triggers[].triggerId`).\n */\n id: string;\n /** Workflow app id. Inferred from `id` when it matches `{app}_trigger_…`. */\n appId?: string;\n /** Optional Connection ref. Omit to let the platform resolve. */\n connection?: ConnectionDefinition;\n /** Catalogue trigger config (webhook method, schedule, app trigger fields). */\n input?: Record<string, unknown>;\n /** Manual-trigger fields. Stored as `customInputConfig`. */\n inputs?: TriggerInputFieldDefinition[];\n name?: string;\n description?: string;\n}\n\nexport interface WorkflowStepDefinition {\n /**\n * Name later steps use with `ref.step(key, ...)`. Keyed steps keep their\n * node id across deploys. `trigger` is reserved.\n */\n key?: string;\n /** Action definition (or inline action-shaped object). */\n use: ActionDefinition;\n /** Per-step input overrides. Values may contain `ref.trigger` / `ref.step`. */\n input?: Record<string, unknown>;\n name?: string;\n description?: string;\n retrySettings?: {\n enabled: boolean;\n maxAttempts: number;\n delaySeconds: number;\n };\n continueOnFailure?: { enabled: boolean };\n /**\n * Branches after this step. Only on Conditional Paths, Manually Decide Path,\n * or Request Approval (approved path first, then rejected), and only on the\n * last step of a list. Put later steps inside each path.\n */\n paths?: WorkflowPathDefinition[];\n}\n\n/** Conditions Conditional Paths evaluates (same list as the builder). */\nexport const PATH_CONDITIONS = [\n 'contains',\n 'does_not_contain',\n 'equals',\n 'does_not_equal',\n 'exists',\n 'does_not_exist',\n 'starts_with',\n 'ends_with',\n 'is_empty',\n 'is_not_empty',\n 'comes_before',\n 'comes_after',\n 'is_in_the_past',\n 'is_in_the_future',\n 'is_true',\n 'is_false',\n 'is_truthy',\n 'is_falsey',\n 'is_greater_than',\n 'is_less_than',\n 'is_greater_than_or_equal_to',\n 'is_less_than_or_equal_to',\n 'matches_regex',\n 'does_not_match_regex',\n] as const;\n\nexport type PathConditionType = (typeof PATH_CONDITIONS)[number];\n\nexport interface PathCondition {\n /** One reference: `ref.trigger(...)` or `ref.step(...)`. */\n field: string;\n condition: PathConditionType;\n /** Compared as text. Omit for exists / is_empty / is_true and similar. */\n value?: string;\n}\n\nexport interface WorkflowPathDefinition {\n /** Unique on its step. On Request Approval use `Approved` / `Rejected`. */\n label: string;\n /**\n * Conditional Paths only. Groups are OR-ed, conditions in a group AND-ed.\n * Omit to always take this path.\n */\n when?: PathCondition[][];\n steps: WorkflowStepDefinition[];\n}\n\nexport interface WorkflowDefinition {\n kind: typeof DEFINE_KINDS.workflow;\n /** Stable slug, unique in the workspace (upsert key). */\n slug: string;\n name?: string;\n description?: string;\n isActive?: boolean;\n /**\n * Catalogue trigger. Omit for Manually Run with no input fields.\n * `runs.start` ignores this and runs the steps only.\n */\n trigger?: TriggerDefinition;\n /** Steps in order. The last step may branch with `paths`. */\n steps: WorkflowStepDefinition[];\n}\n\nexport type AgentToolDefinition =\n | ActionDefinition\n | WorkflowDefinition\n | { use: ActionDefinition | WorkflowDefinition };\n\nexport interface AgentDefinition {\n kind: typeof DEFINE_KINDS.agent;\n /** Stable slug, unique in the workspace (upsert key). */\n slug: string;\n name?: string;\n description?: string;\n /**\n * Catalogue model id from `ai-connections list` (`models[].id`).\n * Example on Lunnoa LLMs: `deepseek-ai/DeepSeek-V4-Pro`.\n */\n model: string;\n instructions: string;\n aiConnection?: AiConnectionDefinition;\n /** App Connection refs the agent may use for tools. */\n connections?: ConnectionDefinition[];\n /** Action and/or workflow tool refs. */\n tools?: AgentToolDefinition[];\n}\n\nexport function defineConnection(\n config: Omit<ConnectionDefinition, 'kind'> = {},\n): ConnectionDefinition {\n return { kind: DEFINE_KINDS.connection, ...config };\n}\n\nexport function defineAiConnection(\n config: Omit<AiConnectionDefinition, 'kind'> = {},\n): AiConnectionDefinition {\n return { kind: DEFINE_KINDS.aiConnection, ...config };\n}\n\nexport function defineAction(\n config: Omit<ActionDefinition, 'kind'>,\n): ActionDefinition {\n if (!config.id?.trim()) {\n throw new Error('defineAction requires id (catalogue action id)');\n }\n return { kind: DEFINE_KINDS.action, ...config };\n}\n\nfunction assertTriggerConfig(config: Omit<TriggerDefinition, 'kind'>): void {\n if (!config.id?.trim()) {\n throw new Error('defineTrigger requires id (catalogue trigger id)');\n }\n for (const field of config.inputs ?? []) {\n if (!field?.id?.trim()) {\n throw new Error('defineTrigger inputs require id');\n }\n }\n if (config.inputs?.length && config.id.trim() !== MANUAL_TRIGGER_ID) {\n throw new Error(\n 'defineTrigger inputs are only valid on flow-control_trigger_manual',\n );\n }\n}\n\nexport function defineTrigger(\n config: Omit<TriggerDefinition, 'kind'>,\n): TriggerDefinition {\n assertTriggerConfig(config);\n return { kind: DEFINE_KINDS.trigger, ...config };\n}\n\nconst MANUAL_TRIGGER_ID = 'flow-control_trigger_manual';\nconst TRIGGER_KEY = 'trigger';\nconst STEP_KEY_PATTERN = /^[A-Za-z][A-Za-z0-9_-]*$/;\nconst STEP_REF_PATTERN = /={{step:([^}]*)}}/g;\n\nfunction refString(key: string, path: Array<string | number>): string {\n const parts = [key, ...path.map(String)];\n for (const part of parts) {\n if (!part || /[,{}]/.test(part)) {\n throw new Error(`ref path parts must be non-empty and contain no , { or }: \"${part}\"`);\n }\n }\n return `={{step:${parts.join(',')}}}`;\n}\n\n/**\n * References for step inputs. The server swaps them for the real node ids on\n * deploy, and the builder shows them as mapped fields from earlier nodes.\n * They are plain strings, so they also work inside text and nested objects.\n */\nexport const ref = {\n /** A trigger output field, e.g. a Manually Run input id. */\n trigger: (field: string, ...path: Array<string | number>): string =>\n refString(TRIGGER_KEY, [field, ...path]),\n /** An earlier step's output, by its `key`. Array indexes are numbers. */\n step: (key: string, ...path: Array<string | number>): string =>\n refString(key, path),\n};\n\nfunction collectRefs(value: unknown, out: string[][]): void {\n if (typeof value === 'string') {\n for (const match of value.matchAll(STEP_REF_PATTERN)) {\n out.push(match[1].split(',').map((part) => part.trim()));\n }\n } else if (Array.isArray(value)) {\n value.forEach((item) => collectRefs(item, out));\n } else if (value && typeof value === 'object') {\n Object.values(value).forEach((item) => collectRefs(item, out));\n }\n}\n\nconst CONDITIONAL_PATHS_ID = 'flow-control_action_conditional-paths';\nconst APPROVAL_ID = 'flow-control_action_request-approval';\nconst BRANCHING_ACTION_IDS = new Set([\n CONDITIONAL_PATHS_ID,\n 'flow-control_action_manually-decide-paths',\n APPROVAL_ID,\n]);\nconst PATH_CONDITION_SET = new Set<string>(PATH_CONDITIONS);\nconst SINGLE_REF_PATTERN = /^={{step:[^}]*}}$/;\n\nfunction collectKeys(steps: WorkflowStepDefinition[], seen: Set<string>): void {\n for (const step of steps) {\n if (step.key !== undefined) {\n if (!STEP_KEY_PATTERN.test(step.key) || step.key === TRIGGER_KEY) {\n throw new Error(\n `Step key \"${step.key}\" must start with a letter, use letters, digits, - or _, and not be \"${TRIGGER_KEY}\".`,\n );\n }\n if (seen.has(step.key)) {\n throw new Error(`Step key \"${step.key}\" is used twice.`);\n }\n seen.add(step.key);\n }\n for (const path of step.paths ?? []) collectKeys(path.steps ?? [], seen);\n }\n}\n\n/** Same checks the server runs on deploy, so mistakes show up locally. */\nfunction assertStepRefs(config: Omit<WorkflowDefinition, 'kind'>): void {\n const triggerId = config.trigger?.id.trim() ?? MANUAL_TRIGGER_ID;\n const triggerFields =\n triggerId === MANUAL_TRIGGER_ID\n ? new Set((config.trigger?.inputs ?? []).map((f) => f.id.trim()))\n : undefined;\n const allKeys = new Set<string>();\n collectKeys(config.steps, allKeys);\n\n const checkRefs = (value: unknown, earlier: Set<string>, where: string) => {\n const refs: string[][] = [];\n collectRefs(value, refs);\n for (const [key = '', ...path] of refs) {\n const shown = `={{step:${[key, ...path].join(',')}}}`;\n if (!earlier.has(key)) {\n throw new Error(\n allKeys.has(key)\n ? `${where}: ${shown} refers to itself, a later step, or a step on another path. Use the trigger or an earlier step on the same path.`\n : `${where}: ${shown} names unknown key \"${key}\". Use \"trigger\" or an earlier step's key.`,\n );\n }\n if (key === TRIGGER_KEY && triggerFields && !triggerFields.has(path[0] ?? '')) {\n throw new Error(\n `${where}: ${shown} uses trigger field \"${path[0] ?? ''}\", which is not declared in trigger inputs.`,\n );\n }\n }\n };\n\n const checkChain = (steps: WorkflowStepDefinition[], visible: Set<string>) => {\n const earlier = new Set(visible);\n steps.forEach((step, index) => {\n const where = `Step \"${step.key ?? step.name ?? index + 1}\"`;\n checkRefs([step.use?.input, step.input], earlier, where);\n if (step.key) earlier.add(step.key);\n if (!step.paths?.length) return;\n\n const actionId = step.use ? resolveActionId(step.use) : '';\n if (!BRANCHING_ACTION_IDS.has(actionId)) {\n throw new Error(`${where}: paths only work on ${[...BRANCHING_ACTION_IDS].join(', ')}.`);\n }\n if (index !== steps.length - 1) {\n throw new Error(\n `${where}: a step with paths must be the last step in its list. Put later steps inside each path.`,\n );\n }\n if (actionId === APPROVAL_ID && step.paths.length > 2) {\n throw new Error(`${where}: Request Approval takes at most two paths (approved, then rejected).`);\n }\n const labels = new Set<string>();\n for (const path of step.paths) {\n const label = path?.label?.trim();\n if (!label) throw new Error(`${where}: every path needs a label.`);\n if (labels.has(label)) throw new Error(`${where}: path label \"${label}\" is used twice.`);\n labels.add(label);\n if (path.when !== undefined && actionId !== CONDITIONAL_PATHS_ID) {\n throw new Error(`${where}: \"when\" only works on Conditional Paths.`);\n }\n for (const condition of (path.when ?? []).flat()) {\n if (!SINGLE_REF_PATTERN.test(condition?.field?.trim() ?? '')) {\n throw new Error(\n `${where}, path \"${label}\": a condition's field must be one ref.trigger(...) or ref.step(...).`,\n );\n }\n if (!PATH_CONDITION_SET.has(condition.condition)) {\n throw new Error(\n `${where}, path \"${label}\": condition \"${condition.condition}\" is not supported. Use one of: ${PATH_CONDITIONS.join(', ')}.`,\n );\n }\n }\n checkRefs(path.when, earlier, `${where}, path \"${label}\"`);\n if (!path.steps?.length) throw new Error(`${where}: path \"${label}\" needs at least one step.`);\n checkChain(path.steps, earlier);\n }\n });\n };\n\n checkChain(config.steps, new Set([TRIGGER_KEY]));\n}\n\nexport function defineWorkflow(\n config: Omit<WorkflowDefinition, 'kind'>,\n): WorkflowDefinition;\nexport function defineWorkflow(config: WorkflowStepsFileInput): WorkflowStepsFileDefinition;\nexport function defineWorkflow(config: WorkflowGraphFileInput): WorkflowGraphFileDefinition;\nexport function defineWorkflow(\n config:\n | Omit<WorkflowDefinition, 'kind'>\n | WorkflowStepsFileInput\n | WorkflowGraphFileInput,\n): WorkflowDefinition | WorkflowStepsFileDefinition | WorkflowGraphFileDefinition {\n const record = config as { format?: string; nodes?: unknown; steps?: unknown };\n if (\n isWorkflowGraphInput(config) ||\n (Array.isArray(record.nodes) && !Array.isArray(record.steps))\n ) {\n return acceptWorkflowGraphFile(config as WorkflowGraphFileInput);\n }\n if (isWorkflowStepsFile(config)) {\n return acceptWorkflowStepsFile(config);\n }\n const authored = { ...(config as Omit<WorkflowDefinition, 'kind'> & { $schema?: string }) };\n delete authored.$schema;\n if (!authored.slug?.trim()) {\n throw new Error('defineWorkflow requires slug');\n }\n if (!authored.steps?.length) {\n throw new Error('defineWorkflow requires at least one step');\n }\n if (authored.trigger) {\n assertTriggerConfig(authored.trigger);\n }\n assertStepRefs(authored);\n return { kind: DEFINE_KINDS.workflow, ...authored };\n}\n\nexport function defineAgent(config: Omit<AgentDefinition, 'kind'>): AgentDefinition;\nexport function defineAgent(config: AgentFileInput): AgentFileDefinition;\nexport function defineAgent(\n config: Omit<AgentDefinition, 'kind'> | AgentFileInput,\n): AgentDefinition | AgentFileDefinition {\n if (isAgentFileInput(config)) {\n return acceptAgentFile(config);\n }\n const authored = { ...(config as Omit<AgentDefinition, 'kind'> & { $schema?: string }) };\n delete authored.$schema;\n if (!authored.slug?.trim()) {\n throw new Error('defineAgent requires slug');\n }\n if (!authored.model?.trim()) {\n throw new Error('defineAgent requires model');\n }\n if (authored.instructions == null) {\n throw new Error('defineAgent requires instructions');\n }\n return { kind: DEFINE_KINDS.agent, ...authored };\n}\n\nexport interface EntityTypeDefinition {\n kind: typeof DEFINE_KINDS.entityType;\n /** Stable deployment-wide slug (upsert key). Granted to the deployer's workspace when new. */\n slug: string;\n name?: string;\n namePlural?: string;\n description?: string;\n icon?: string;\n color?: string;\n /** Field definitions grouped into sections (same contract as Adminspace). */\n attributeSchema: Record<string, unknown>;\n stateSchema?: Record<string, unknown> | null;\n isEnabled?: boolean;\n /**\n * When false (default), entity writes reject undeclared attribute keys.\n * Reserved key `extensions` is always allowed as a JSON object.\n */\n allowUnknownAttributes?: boolean;\n}\n\nexport function defineEntityType(\n config: Omit<EntityTypeDefinition, 'kind'>,\n): EntityTypeDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineEntityType requires slug');\n }\n if (\n !config.attributeSchema ||\n typeof config.attributeSchema !== 'object' ||\n Array.isArray(config.attributeSchema)\n ) {\n throw new Error('defineEntityType requires attributeSchema object');\n }\n return {\n kind: DEFINE_KINDS.entityType,\n allowUnknownAttributes: false,\n ...config,\n };\n}\n\n/** Infer appId from catalogue action ids like `http_action_send-request`. */\nexport function resolveActionAppId(action: ActionDefinition): string {\n if (action.appId?.trim()) {\n return action.appId.trim();\n }\n const id = action.id.trim();\n const actionMarker = '_action_';\n const markerIndex = id.indexOf(actionMarker);\n if (markerIndex > 0) {\n return id.slice(0, markerIndex);\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(0, dot);\n }\n throw new Error(\n `Cannot infer appId for action \"${id}\". Pass appId explicitly.`,\n );\n}\n\n/** Infer appId from catalogue trigger ids like `flow-control_trigger_manual`. */\nexport function resolveTriggerAppId(trigger: TriggerDefinition): string {\n if (trigger.appId?.trim()) {\n return trigger.appId.trim();\n }\n const id = trigger.id.trim();\n const marker = '_trigger_';\n const markerIndex = id.indexOf(marker);\n if (markerIndex > 0) {\n return id.slice(0, markerIndex);\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(0, dot);\n }\n throw new Error(\n `Cannot infer appId for trigger \"${id}\". Pass appId explicitly.`,\n );\n}\n\nexport function resolveTriggerId(trigger: TriggerDefinition): string {\n const id = trigger.id.trim();\n const appId = trigger.appId?.trim();\n if (appId && id.startsWith(`${appId}.`)) {\n return id.slice(appId.length + 1);\n }\n const marker = '_trigger_';\n if (id.includes(marker)) {\n return id;\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(dot + 1);\n }\n return id;\n}\n\nexport type {\n AgentFileDefinition,\n AgentFileInput,\n AgentFileSettings,\n AgentFileTool,\n AgentLinkById,\n AgentLinkBySlug,\n AgentSlugOrId,\n ContinueOnFailureSettings,\n RetrySettings,\n WorkflowFileDefinition,\n WorkflowGraphEdge,\n WorkflowGraphFileDefinition,\n WorkflowGraphFileInput,\n WorkflowGraphNode,\n WorkflowStepFile,\n WorkflowStepsFileDefinition,\n WorkflowStepsFileInput,\n WorkflowTriggerFile,\n WorkflowUseFile,\n} from './files';\nexport { isAgentFileShape } from './files';\n\nexport function resolveActionId(action: ActionDefinition): string {\n const id = action.id.trim();\n const appId = action.appId?.trim();\n if (appId && id.startsWith(`${appId}.`)) {\n return id.slice(appId.length + 1);\n }\n const marker = '_action_';\n if (id.includes(marker)) {\n return id;\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(dot + 1);\n }\n return id;\n}\n","import type { QueryValue } from '../core/http';\n\n/**\n * Standard list-query conventions shared by most Lunnoa list endpoints:\n *\n * - `expansion` — comma-separated field names to include beyond the defaults\n * - `filterBy` — comma-separated `key:value` pairs\n * - `includeType` — comma-separated inclusion flags (e.g. `all`, `internal`)\n */\nexport interface ListQueryOptions {\n expansion?: string | string[];\n filterBy?: string | Record<string, string>;\n includeType?: string | string[];\n}\n\nexport function serializeListQuery(\n options: ListQueryOptions = {},\n): Record<string, QueryValue> {\n return {\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy(options.filterBy),\n includeType: serializeCsv(options.includeType),\n };\n}\n\nexport function serializeCsv(\n value: string | string[] | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return Array.isArray(value) ? value.join(',') : value;\n}\n\nexport function serializeFilterBy(\n value: string | Record<string, string> | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, filterValue]) => `${key}:${filterValue}`)\n .join(',');\n}\n","import type { HttpClient } from '../core/http';\nimport type { Agent, CodeDefinitionResponse, CodeSource } from '../types';\nimport type {\n ActionDefinition,\n AgentDefinition,\n AgentFileDefinition,\n AgentFileInput,\n AgentFileSettings,\n AgentSlugOrId,\n AgentToolDefinition,\n WorkflowDefinition,\n} from '../define';\nimport {\n DEFINE_KINDS,\n isAgentFileShape,\n resolveActionAppId,\n resolveActionId,\n} from '../define';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport interface UpsertAgentToolInput {\n key?: string;\n appId: string;\n actionId: string;\n connectionId?: string;\n name?: string;\n description?: string;\n input?: Record<string, unknown>;\n}\n\nexport interface UpsertAgentBySlugInput {\n slug: string;\n name?: string;\n /** Null clears a description that was removed from the definition file. */\n description?: string | null;\n instructions: string;\n /** Null clears a model that was removed from the definition file. */\n model?: string | null;\n aiConnectionId?: string;\n connectionIds?: string[];\n workflowIds?: string[];\n tools?: UpsertAgentToolInput[];\n settings?: Partial<AgentFileSettings>;\n workflows?: AgentSlugOrId[];\n agents?: AgentSlugOrId[];\n knowledgeIds?: string[];\n variableIds?: string[];\n objectIds?: string[];\n objectTypeIds?: string[];\n mcpServers?: Array<{ id: string; connectionId?: string }>;\n a2aAgentIds?: string[];\n /** `generated` for TypeScript deploys, `synced` for definition files. */\n codeSource?: Extract<CodeSource, 'synced' | 'generated'>;\n baseRevision?: string;\n force?: boolean;\n}\n\nexport interface AgentUpsertOptions {\n workflowIds?: string[];\n codeSource?: Extract<CodeSource, 'synced' | 'generated'>;\n baseRevision?: string;\n force?: boolean;\n}\n\nfunction unwrapTool(\n tool: AgentToolDefinition,\n): ActionDefinition | WorkflowDefinition {\n if ('use' in tool && tool.use) {\n return tool.use;\n }\n return tool as ActionDefinition | WorkflowDefinition;\n}\n\nfunction syncFields(options?: AgentUpsertOptions): Pick<\n UpsertAgentBySlugInput,\n 'codeSource' | 'baseRevision' | 'force'\n> {\n return {\n ...(options?.baseRevision ? { baseRevision: options.baseRevision } : {}),\n ...(options?.force ? { force: true } : {}),\n };\n}\n\nfunction idsOf(links: Array<{ id: string }> | undefined): string[] | undefined {\n if (!links) return undefined;\n return links.map((link) => link.id);\n}\n\nexport function agentDefinitionToUpsert(\n def: AgentDefinition | AgentFileDefinition | AgentFileInput,\n options?: AgentUpsertOptions,\n): UpsertAgentBySlugInput {\n if (isAgentFileShape(def)) {\n return fileAgentToUpsert(def as AgentFileDefinition, options);\n }\n\n const tools: UpsertAgentToolInput[] = [];\n const workflowIds = [...(options?.workflowIds ?? [])];\n const authored = def as AgentDefinition;\n\n for (const tool of authored.tools ?? []) {\n const unwrapped = unwrapTool(tool);\n if (unwrapped.kind === DEFINE_KINDS.workflow) {\n // Workflow tools are linked via AgentWorkflow (workflowIds), not tools[].\n // Callers should deploy workflows first and pass resolved UUIDs.\n continue;\n }\n if (unwrapped.kind === DEFINE_KINDS.action) {\n tools.push({\n appId: resolveActionAppId(unwrapped),\n actionId: resolveActionId(unwrapped),\n connectionId: unwrapped.connection?.id,\n name: unwrapped.name,\n description: unwrapped.description,\n input: unwrapped.input,\n });\n }\n }\n\n return {\n slug: authored.slug,\n name: authored.name,\n description: authored.description,\n instructions: authored.instructions,\n model: authored.model,\n aiConnectionId: authored.aiConnection?.id,\n connectionIds: authored.connections\n ?.map((c) => c.id)\n .filter((id): id is string => Boolean(id)),\n workflowIds: workflowIds.length ? workflowIds : undefined,\n tools,\n codeSource: options?.codeSource ?? 'generated',\n ...syncFields(options),\n };\n}\n\nfunction fileAgentToUpsert(\n def: AgentFileDefinition,\n options?: AgentUpsertOptions,\n): UpsertAgentBySlugInput {\n if (typeof def.instructions !== 'string') {\n throw new Error(\n 'Agent instructions are still a file reference. The CLI resolves these before push.',\n );\n }\n const tools: UpsertAgentToolInput[] = [];\n for (const tool of def.tools ?? []) {\n const action = {\n kind: DEFINE_KINDS.action,\n id: tool.id,\n appId: tool.appId,\n connection: tool.connection?.id\n ? { kind: DEFINE_KINDS.connection, id: tool.connection.id }\n : undefined,\n } satisfies ActionDefinition;\n tools.push({\n key: tool.key,\n appId: resolveActionAppId(action),\n actionId: resolveActionId(action),\n connectionId: tool.connection?.id,\n name: tool.name,\n description: tool.description,\n input: tool.input,\n });\n }\n return {\n slug: def.slug,\n name: def.name,\n // A file is the whole definition. Omitted description and model are empty.\n description: def.description ?? null,\n instructions: def.instructions,\n model: def.model ?? null,\n aiConnectionId: def.aiConnection?.id,\n ...(def.settings ? { settings: def.settings } : {}),\n ...(def.tools ? { tools } : {}),\n ...(def.workflows ? { workflows: def.workflows } : {}),\n ...(def.agents ? { agents: def.agents } : {}),\n ...(def.connections ? { connectionIds: idsOf(def.connections) } : {}),\n ...(def.knowledge ? { knowledgeIds: idsOf(def.knowledge) } : {}),\n ...(def.variables ? { variableIds: idsOf(def.variables) } : {}),\n ...(def.objects ? { objectIds: idsOf(def.objects) } : {}),\n ...(def.objectTypes ? { objectTypeIds: idsOf(def.objectTypes) } : {}),\n ...(def.mcpServers ? { mcpServers: def.mcpServers } : {}),\n ...(def.a2aAgents ? { a2aAgentIds: idsOf(def.a2aAgents) } : {}),\n codeSource: 'synced',\n ...syncFields(options),\n };\n}\n\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists agents visible to the caller in the current workspace. */\n list(options?: ListQueryOptions): Promise<Agent[]> {\n return this.http.get<Agent[]>('/api/agents', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single agent. */\n get(agentId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Agent> {\n return this.http.get<Agent>(`/api/agents/${agentId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Exported definition for `lunnoa/agents/<slug>.json`. */\n getDefinition(slug: string): Promise<CodeDefinitionResponse<AgentFileDefinition>> {\n return this.http.get<CodeDefinitionResponse<AgentFileDefinition>>(\n `/api/agents/slug/${encodeURIComponent(slug)}/definition`,\n );\n }\n\n /**\n * Upsert an agent by slug inside the workspace on the API key.\n * Prefer the CLI (`npx @lunnoa/client agents deploy`) for happy-path deploy.\n */\n upsertBySlug(\n body: UpsertAgentBySlugInput | AgentDefinition | AgentFileDefinition,\n options?: AgentUpsertOptions,\n ): Promise<Agent & CodeDefinitionResponse<AgentFileDefinition>> {\n const payload =\n 'kind' in body && body.kind === 'agent'\n ? agentDefinitionToUpsert(body, options)\n : body;\n return this.http.post<Agent & CodeDefinitionResponse<AgentFileDefinition>>(\n '/api/agents/upsert',\n { body: payload },\n );\n }\n}\n","/**\n * Tokens returned by login / 2FA / login-with-token.\n * Mapped from the wire format (`access_token` / `refresh_token`).\n */\nexport interface AuthTokens {\n accessToken: string;\n refreshToken: string;\n}\n\n/** Successful password login without 2FA, or after 2FA / token exchange. */\nexport type LoginSuccess = AuthTokens;\n\n/**\n * Password login when the user has 2FA enabled.\n * Call {@link AuthResource.verify2faLogin} with the session token and TOTP/backup code.\n */\nexport interface LoginRequires2FA {\n requires2FA: true;\n sessionToken: string;\n}\n\nexport type LoginResult = LoginSuccess | LoginRequires2FA;\n\nexport function isLoginRequires2FA(\n result: LoginResult,\n): result is LoginRequires2FA {\n return 'requires2FA' in result && result.requires2FA === true;\n}\n\n/** Wire payload from `POST /api/auth/login` (and related). */\nexport type LoginWireResponse =\n | {\n access_token: string;\n refresh_token: string;\n }\n | {\n requires2FA: true;\n sessionToken: string;\n };\n\n/** Wire payload from `POST /api/auth/refresh-token`. */\nexport interface RefreshWireResponse {\n access_token: string;\n refresh_token?: string;\n}\n\n/** Public SSO discovery from `GET /api/auth/sso/providers`. */\nexport interface SsoProvidersResponse {\n providers: SsoProviderSummary[];\n passwordAuthDisabled: boolean;\n googleAuthDisabled: boolean;\n ssoEnforced: boolean;\n}\n\nexport interface SsoProviderSummary {\n id: string;\n name: string;\n buttonLabel: string | null;\n}\n\n/**\n * Current user from `GET /api/users/me`.\n * Password is never returned.\n */\nexport interface CurrentUser {\n id: string;\n email: string;\n name: string | null;\n createdAt?: string;\n updatedAt?: string;\n rootProfileImageUrl?: string | null;\n emailVerifiedAt?: string | null;\n toursCompleted?: unknown;\n hasPassword?: boolean;\n ssoProviders?: string[];\n}\n\nexport function mapWireTokens(wire: {\n access_token: string;\n refresh_token?: string;\n}): { accessToken: string; refreshToken?: string } {\n return {\n accessToken: wire.access_token,\n ...(wire.refresh_token !== undefined\n ? { refreshToken: wire.refresh_token }\n : {}),\n };\n}\n\nexport function mapLoginWire(wire: LoginWireResponse): LoginResult {\n if ('requires2FA' in wire && wire.requires2FA) {\n return {\n requires2FA: true,\n sessionToken: wire.sessionToken,\n };\n }\n const tokens = wire as { access_token: string; refresh_token: string };\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n };\n}\n","import {\n isLoginRequires2FA,\n mapLoginWire,\n mapWireTokens,\n type AuthTokens,\n type CurrentUser,\n type LoginResult,\n type LoginWireResponse,\n type RefreshWireResponse,\n type SsoProvidersResponse,\n} from '../auth/types';\nimport type { TokenStore } from '../auth/token-store';\nimport type { HttpClient } from '../core/http';\n\n/**\n * Login, refresh, SSO discovery, and session helpers for Lunnoa users.\n *\n * Password login, token exchange, refresh, and SSO provider listing are\n * **public** endpoints (no Bearer). `me()` requires a user JWT.\n *\n * There is no server logout endpoint: {@link AuthResource.logout} only clears\n * the configured {@link TokenStore}.\n */\nexport class AuthResource {\n readonly sso: SsoAuthResource;\n\n constructor(\n private readonly http: HttpClient,\n private readonly tokenStore?: TokenStore,\n ) {\n this.sso = new SsoAuthResource(http);\n }\n\n /**\n * `POST /api/auth/login`\n *\n * On success without 2FA, tokens are written to the token store (when set).\n * When 2FA is required, returns `{ requires2FA, sessionToken }` and does not\n * store tokens until {@link verify2faLogin} succeeds.\n */\n async login(input: {\n email: string;\n password: string;\n }): Promise<LoginResult> {\n const wire = await this.http.post<LoginWireResponse>('/api/auth/login', {\n body: { email: input.email, password: input.password },\n skipAuth: true,\n });\n const result = mapLoginWire(wire);\n if (!isLoginRequires2FA(result)) {\n await this.persistTokens(result);\n }\n return result;\n }\n\n /**\n * `POST /api/auth/2fa/verify-login`\n *\n * Completes password login after TOTP or backup-code verification.\n */\n async verify2faLogin(input: {\n sessionToken: string;\n token: string;\n }): Promise<AuthTokens> {\n const wire = await this.http.post<LoginWireResponse>(\n '/api/auth/2fa/verify-login',\n {\n body: {\n sessionToken: input.sessionToken,\n token: input.token,\n },\n skipAuth: true,\n },\n );\n const result = mapLoginWire(wire);\n if (isLoginRequires2FA(result)) {\n throw new Error(\n 'Unexpected 2FA challenge after verify2faLogin; expected access and refresh tokens.',\n );\n }\n await this.persistTokens(result);\n return result;\n }\n\n /**\n * `POST /api/auth/login-with-token`\n *\n * Exchanges a short-lived hidden JWT (SSO callback or email verification)\n * for access and refresh tokens.\n */\n async loginWithToken(input: { token: string }): Promise<AuthTokens> {\n const wire = await this.http.post<{\n access_token: string;\n refresh_token: string;\n }>('/api/auth/login-with-token', {\n body: { token: input.token },\n skipAuth: true,\n });\n const tokens: AuthTokens = {\n accessToken: wire.access_token,\n refreshToken: wire.refresh_token,\n };\n await this.persistTokens(tokens);\n return tokens;\n }\n\n /**\n * `POST /api/auth/refresh-token`\n *\n * Returns a new access token. The refresh token itself is not rotated.\n * When a token store is configured and `refreshToken` is omitted, the\n * stored refresh token is used.\n */\n async refresh(input?: { refreshToken?: string }): Promise<{\n accessToken: string;\n }> {\n const refreshToken =\n input?.refreshToken ?? (await this.tokenStore?.getRefreshToken()) ?? null;\n if (!refreshToken) {\n throw new Error(\n 'auth.refresh requires a refreshToken argument or a token store that holds one.',\n );\n }\n\n const wire = await this.http.post<RefreshWireResponse>(\n '/api/auth/refresh-token',\n {\n body: { refreshToken },\n skipAuth: true,\n },\n );\n const mapped = mapWireTokens(wire);\n if (this.tokenStore) {\n await this.tokenStore.setTokens({\n accessToken: mapped.accessToken,\n // Keep existing refresh token; refresh responses omit it.\n refreshToken: mapped.refreshToken,\n });\n }\n return { accessToken: mapped.accessToken };\n }\n\n /**\n * `GET /api/users/me` — current user profile for the active JWT.\n */\n me(): Promise<CurrentUser> {\n return this.http.get<CurrentUser>('/api/users/me');\n }\n\n /**\n * Clears tokens from the token store.\n * There is no server-side logout endpoint; access tokens remain valid until expiry\n * (or until the user's `tokensValidFrom` watermark invalidates them).\n */\n async logout(): Promise<void> {\n await this.tokenStore?.clear();\n }\n\n /** True when the token store has an access token (sync stores only wait on Promise). */\n async hasSession(): Promise<boolean> {\n const token = await this.tokenStore?.getAccessToken();\n return Boolean(token);\n }\n\n private async persistTokens(tokens: AuthTokens): Promise<void> {\n if (!this.tokenStore) {\n return;\n }\n await this.tokenStore.setTokens({\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken,\n });\n }\n}\n\n/**\n * SSO discovery and login URL helpers.\n *\n * Browser SSO callbacks redirect to the deployment's `CLIENT_URL/verify-token`,\n * not to an arbitrary custom origin. Custom portals typically complete the\n * exchange with {@link AuthResource.loginWithToken} after receiving the hidden\n * token (for example via a BFF that can see the verify-token page, or by\n * setting `CLIENT_URL` to the custom app).\n */\nexport class SsoAuthResource {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/auth/sso/providers` (public). */\n listProviders(): Promise<SsoProvidersResponse> {\n return this.http.get<SsoProvidersResponse>('/api/auth/sso/providers', {\n skipAuth: true,\n });\n }\n\n /**\n * Absolute URL for `GET /api/auth/sso/:providerId/login`.\n * Navigate the browser here to start the OIDC redirect.\n */\n getLoginUrl(providerId: string): string {\n if (!providerId) {\n throw new Error('sso.getLoginUrl requires a providerId.');\n }\n return this.http.buildUrl(\n `/api/auth/sso/${encodeURIComponent(providerId)}/login`,\n );\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport interface AiConnectionModel {\n /** Catalogue id for `defineAgent({ model })`. */\n id: string;\n name: string;\n isDefault: boolean;\n supportsTools: boolean;\n supportsVision: boolean;\n supportsReasoning: boolean;\n}\n\nexport interface AiConnection {\n /** AiProviderConnection UUID for `defineAiConnection({ id })`. */\n id: string;\n name: string;\n /** Provider slug, for example `featherless` or `openai`. */\n provider: string;\n /** True when agent deploy uses this connection if `aiConnection` is omitted. */\n isDefault: boolean;\n models: AiConnectionModel[];\n}\n\nexport class AiConnectionsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Lists AI connections the caller can assign to an agent, with the model\n * ids each connection accepts. Credentials are never included.\n * Requires `agents:create` (the same permission as agent deploy).\n */\n list(): Promise<AiConnection[]> {\n return this.http.get<AiConnection[]>('/api/ai-connections');\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { Connection } from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class ConnectionsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists connections in the workspace. */\n list(options?: ListQueryOptions): Promise<Connection[]> {\n return this.http.get<Connection[]>('/api/connections', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single connection (secrets are never included). */\n get(\n connectionId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Connection> {\n return this.http.get<Connection>(`/api/connections/${connectionId}`, {\n query: serializeListQuery(options),\n });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { EnabledFeatures } from '../types';\n\nexport class DiscoveryResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Returns the deployment's feature flags (storage, vector database, email,\n * SSO, edition gating), letting a custom UI adapt to what is enabled.\n */\n enabledFeatures(): Promise<EnabledFeatures> {\n return this.http.get<EnabledFeatures>('/api/discovery/enabled-features');\n }\n}\n","/** Pagination block returned by page-based list endpoints (entities). */\nexport interface PagePagination {\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\n/** Pagination block returned by offset-based list endpoints (queue items). */\nexport interface OffsetPagination {\n total: number;\n limit: number;\n offset: number;\n hasMore?: boolean;\n}\n\n/**\n * Iterates every item of a page-based (`page`/`pageSize`) paginated endpoint,\n * fetching pages lazily as the consumer advances.\n */\nexport async function* iteratePages<T>(\n fetchPage: (page: number) => Promise<{ data: T[]; pagination: PagePagination }>,\n): AsyncGenerator<T, void, undefined> {\n let page = 1;\n while (true) {\n const { data, pagination } = await fetchPage(page);\n for (const item of data) {\n yield item;\n }\n if (page >= pagination.totalPages || data.length === 0) {\n return;\n }\n page += 1;\n }\n}\n\n/**\n * Iterates every item of an offset-based (`limit`/`offset`) paginated\n * endpoint, fetching batches lazily as the consumer advances.\n */\nexport async function* iterateOffset<T>(\n fetchBatch: (offset: number) => Promise<{ items: T[]; pagination: OffsetPagination }>,\n): AsyncGenerator<T, void, undefined> {\n let offset = 0;\n while (true) {\n const { items, pagination } = await fetchBatch(offset);\n for (const item of items) {\n yield item;\n }\n offset += items.length;\n const exhausted =\n items.length === 0 ||\n (pagination.hasMore !== undefined\n ? !pagination.hasMore\n : offset >= pagination.total);\n if (exhausted) {\n return;\n }\n }\n}\n","import type { HttpClient, QueryValue } from '../core/http';\nimport { iteratePages } from '../core/pagination';\nimport type {\n ChangeEntityStateInput,\n ChangeEntityStateResult,\n CreateEntityInput,\n Entity,\n EntityStateHistoryEntry,\n EntityStateTransitions,\n ImportEntitiesResult,\n ImportTemplate,\n PaginatedEntities,\n UpdateEntityInput,\n} from '../types';\nimport { serializeCsv } from './common';\n\nexport interface ListEntitiesOptions {\n /** Filter by entity type ID. */\n objectTypeId?: string;\n /** Filter by entity type slug (alternative to objectTypeId). */\n objectTypeSlug?: string;\n /** Filter by a single state. */\n state?: string;\n /** Filter by several states (comma-separated server-side). */\n states?: string[];\n /** Free-text search over entity names. */\n search?: string;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n /** 1-based page number. */\n page?: number;\n /** Items per page (max 100). */\n pageSize?: number;\n /** Fields to expand, e.g. `['attributes', 'objectType']`. */\n expansion?: string | string[];\n}\n\nexport interface ImportEntitiesInput {\n entityTypeId: string;\n columnMappings: Array<{\n sourceColumn: string;\n targetFieldId: string;\n transform?: 'none' | 'date' | 'number' | 'boolean';\n }>;\n rows: Array<Record<string, string>>;\n updateExisting?: boolean;\n matchField?: string;\n}\n\nexport interface ExportEntitiesInput {\n entityTypeId: string;\n fieldIds: string[];\n filters?: Array<{ fieldId: string; operator: string; value: unknown }>;\n format?: 'csv' | 'xlsx';\n}\n\n/**\n * Entities (the platform calls them Objects internally): the structured data\n * layer custom UIs query heavily. Attribute values are keyed by field ID as\n * defined on the entity type's `attributeSchema` — run\n * `npx @lunnoa/client codegen` against your deployment for fully typed,\n * per-entity-type accessors.\n */\nexport class EntitiesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Returns one page of entities matching the filter. */\n list(options: ListEntitiesOptions = {}): Promise<PaginatedEntities> {\n return this.http.get<PaginatedEntities>('/api/objects', {\n query: this.serializeListOptions(options),\n });\n }\n\n /**\n * Async-iterates every entity matching the filter, fetching pages lazily.\n *\n * ```ts\n * for await (const invoice of client.entities.iterate({ objectTypeSlug: 'invoice' })) { ... }\n * ```\n */\n iterate(\n options: Omit<ListEntitiesOptions, 'page'> = {},\n ): AsyncGenerator<Entity, void, undefined> {\n return iteratePages<Entity>(async (page) => {\n const result = await this.list({ ...options, page });\n return { data: result.data ?? [], pagination: result.pagination };\n });\n }\n\n /** Returns a single entity. Request `expansion: ['attributes']` for field values. */\n get(\n entityId: string,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.get<Entity>(`/api/objects/${entityId}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Creates an entity. `attributes` are keyed by field ID. */\n create(\n data: CreateEntityInput,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.post<Entity>('/api/objects', {\n body: data,\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Partially updates an entity; supplied attributes are merged. */\n update(\n entityId: string,\n data: UpdateEntityInput,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.patch<Entity>(`/api/objects/${entityId}`, {\n body: data,\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Soft-deletes an entity. */\n delete(entityId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/objects/${entityId}`);\n }\n\n /** Moves an entity to a new state (validated against the type's state machine). */\n changeState(\n entityId: string,\n data: ChangeEntityStateInput,\n ): Promise<ChangeEntityStateResult> {\n return this.http.post<ChangeEntityStateResult>(\n `/api/objects/${entityId}/state`,\n { body: data },\n );\n }\n\n /** Returns the entity's state changes, newest first. */\n getStateHistory(\n entityId: string,\n options: { limit?: number } = {},\n ): Promise<EntityStateHistoryEntry[]> {\n return this.http.get<EntityStateHistoryEntry[]>(\n `/api/objects/${entityId}/state/history`,\n { query: { limit: options.limit } },\n );\n }\n\n /** Returns the current state and the transitions allowed from it. */\n getStateTransitions(entityId: string): Promise<EntityStateTransitions> {\n return this.http.get<EntityStateTransitions>(\n `/api/objects/${entityId}/state/transitions`,\n );\n }\n\n /** Imports pre-parsed rows into an entity type (SuperAdmin only). */\n import(data: ImportEntitiesInput): Promise<ImportEntitiesResult> {\n return this.http.post<ImportEntitiesResult>('/api/objects/import', {\n body: data,\n });\n }\n\n /** Exports entities of a type as flat JSON rows. */\n export(data: ExportEntitiesInput): Promise<Array<Record<string, unknown>>> {\n return this.http.post<Array<Record<string, unknown>>>(\n '/api/objects/export',\n { body: data },\n );\n }\n\n /** Returns the column headers and a sample row for importing (SuperAdmin only). */\n getImportTemplate(entityTypeId: string): Promise<ImportTemplate> {\n return this.http.get<ImportTemplate>(\n `/api/objects/import/template/${entityTypeId}`,\n );\n }\n\n private serializeListOptions(\n options: ListEntitiesOptions,\n ): Record<string, QueryValue> {\n return {\n objectTypeId: options.objectTypeId,\n objectTypeSlug: options.objectTypeSlug,\n state: options.state,\n states: options.states?.join(','),\n search: options.search,\n sortBy: options.sortBy,\n sortOrder: options.sortOrder,\n page: options.page,\n pageSize: options.pageSize,\n expansion: serializeCsv(options.expansion),\n };\n }\n}\n","import type { EntityTypeDefinition as DefineEntityTypeDefinition } from '../define';\nimport type { HttpClient } from '../core/http';\nimport type { EntityType } from '../types';\nimport { serializeCsv } from './common';\n\nexport interface EntityTypeReadOptions {\n /** Fields to expand, e.g. `['attributeSchema', 'stateSchema', 'description']`. */\n expansion?: string | string[];\n}\n\n/** Payload for `POST /api/object-types/upsert`. */\nexport interface UpsertEntityTypeBySlugInput {\n slug: string;\n name?: string;\n namePlural?: string;\n description?: string;\n icon?: string;\n color?: string;\n attributeSchema: Record<string, unknown>;\n stateSchema?: Record<string, unknown> | null;\n isEnabled?: boolean;\n allowUnknownAttributes?: boolean;\n managedByCode?: boolean;\n}\n\nexport function entityTypeDefinitionToUpsert(\n def: DefineEntityTypeDefinition,\n): UpsertEntityTypeBySlugInput {\n return {\n slug: def.slug,\n name: def.name,\n namePlural: def.namePlural,\n description: def.description,\n icon: def.icon,\n color: def.color,\n attributeSchema: def.attributeSchema,\n stateSchema: def.stateSchema,\n isEnabled: def.isEnabled,\n allowUnknownAttributes: def.allowUnknownAttributes ?? false,\n managedByCode: true,\n };\n}\n\nexport class EntityTypesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Lists entity types granted to the API key's workspace. Request\n * `expansion: ['attributeSchema', 'stateSchema']` for the field and state\n * machine definitions the codegen CLI builds types from.\n */\n list(\n options: EntityTypeReadOptions & { includeDisabled?: boolean } = {},\n ): Promise<EntityType[]> {\n return this.http.get<EntityType[]>('/api/object-types', {\n query: {\n includeDisabled: options.includeDisabled,\n expansion: serializeCsv(options.expansion),\n },\n });\n }\n\n /** Returns a single entity type by ID. */\n get(id: string, options: EntityTypeReadOptions = {}): Promise<EntityType> {\n return this.http.get<EntityType>(`/api/object-types/${id}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Returns a single entity type by its URL-safe slug. */\n getBySlug(\n slug: string,\n options: EntityTypeReadOptions = {},\n ): Promise<EntityType> {\n return this.http.get<EntityType>(`/api/object-types/slug/${slug}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /**\n * Creates or updates an entity type by deployment-wide slug.\n * A new slug is granted to the API key's workspace. A slug already shared\n * with another workspace is rejected unless the key belongs to a platform admin.\n * Prefer the CLI (`npx @lunnoa/client entity-types deploy`) for happy-path deploy.\n */\n upsertBySlug(\n definition: DefineEntityTypeDefinition | UpsertEntityTypeBySlugInput,\n ): Promise<EntityType> {\n const payload =\n 'kind' in definition && definition.kind === 'entityType'\n ? entityTypeDefinitionToUpsert(definition)\n : (definition as UpsertEntityTypeBySlugInput);\n\n return this.http.post<EntityType>('/api/object-types/upsert', {\n body: payload,\n query: {\n expansion: 'attributeSchema,stateSchema,description',\n },\n });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { Table, UpsertTableBySlugInput } from '../types';\n\nexport class TablesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists tables in the API key's workspace (without columns and rows). */\n list(): Promise<Table[]> {\n return this.http.get<Table[]>('/api/tables');\n }\n\n /** Returns a single table by ID, including columns and rows. */\n get(id: string): Promise<Table> {\n return this.http.get<Table>(`/api/tables/${id}`);\n }\n\n /** Returns a single table by its workspace slug, including columns and rows. */\n getBySlug(slug: string): Promise<Table> {\n return this.http.get<Table>(`/api/tables/slug/${slug}`);\n }\n\n /**\n * Creates or updates a table by workspace slug. Omitted columns or rows\n * keep their current value. Marks `managedByCode` by default.\n */\n upsertBySlug(input: UpsertTableBySlugInput): Promise<Table> {\n return this.http.post<Table>('/api/tables/upsert', { body: input });\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport type EligibleApprover = {\n workspaceUserId: string;\n email: string;\n name?: string;\n};\n\nexport type ApprovalInboxItem = {\n approvalId: string;\n executionId: string;\n nodeId: string;\n title: string;\n status: string;\n requiredCount: number;\n receivedApprovals: number;\n expiresAt?: string;\n createdAt?: string;\n updatedAt?: string;\n canDecide?: boolean;\n executionNumber?: number;\n workflow?: { id: string; name: string };\n project?: { id: string; name: string };\n myDecision?: {\n decision: string;\n comment?: string;\n decidedAt?: string;\n };\n /** People who can still decide. */\n eligibleApprovers?: EligibleApprover[];\n approval?: Record<string, unknown>;\n};\n\n/**\n * Authenticated Approvals inbox helpers (workspace API; not Public API v1).\n */\nexport class ApprovalsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * @param options.status `pending` (default) for actionable items, or `done` for history.\n */\n async inbox(options?: {\n status?: 'pending' | 'done' | string;\n }): Promise<{ items: ApprovalInboxItem[] }> {\n return this.http.get('/api/approvals/inbox', {\n query: { status: options?.status ?? 'pending' },\n });\n }\n\n async decide(\n approvalId: string,\n body: {\n decision: 'approved' | 'rejected';\n comment?: string;\n },\n ): Promise<{\n executionId: string;\n nodeId: string;\n approvalId?: string;\n terminal: boolean;\n canDecide: boolean;\n approval: Record<string, unknown>;\n }> {\n return this.http.post(`/api/approvals/${approvalId}/decide`, { body });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { LunnoaApiError } from '../core/errors';\nimport { parseSseEvents } from './sse';\nimport type { ExecutionPathStep, ExecutionStatus } from '../types';\n\nexport type ExecutionStreamEventType =\n | 'connected'\n | 'heartbeat'\n | 'execution.progress'\n | 'execution.finished'\n | 'execution.error'\n | 'loop.progress'\n | string;\n\nexport interface ExecutionProgressPayload {\n executionId: string;\n status: ExecutionStatus | string | null;\n statusMessage: string | null;\n name: string | null;\n source: string | null;\n startedAt?: string;\n stoppedAt?: string | null;\n executionPath: ExecutionPathStep[];\n pendingInput?: unknown;\n output?: unknown;\n}\n\nexport interface ExecutionStreamEvent {\n event: ExecutionStreamEventType;\n data: Record<string, unknown>;\n}\n\nexport interface WatchProgressOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Opens `GET /api/executions/:id/stream` and yields typed SSE events.\n * Prefer {@link ExecutionsResource.watchProgress} for timeline UIs.\n */\nexport class ExecutionProgressStream implements AsyncIterable<ExecutionStreamEvent> {\n private consumed = false;\n\n constructor(\n private readonly response: Response,\n private readonly options?: WatchProgressOptions,\n ) {}\n\n [Symbol.asyncIterator](): AsyncGenerator<ExecutionStreamEvent, void, undefined> {\n return this.events();\n }\n\n async *events(): AsyncGenerator<ExecutionStreamEvent, void, undefined> {\n if (this.consumed) {\n throw new Error('This ExecutionProgressStream has already been consumed.');\n }\n this.consumed = true;\n\n const body = this.response.body;\n if (!body) {\n return;\n }\n\n for await (const frame of parseSseEvents(body)) {\n if (this.options?.signal?.aborted) {\n return;\n }\n if (frame.data === null) {\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(frame.data);\n } catch {\n continue;\n }\n if (!parsed || typeof parsed !== 'object') {\n continue;\n }\n yield {\n event: frame.event,\n data: parsed as Record<string, unknown>,\n };\n if (frame.event === 'execution.finished' || frame.event === 'execution.error') {\n return;\n }\n }\n }\n}\n\nexport async function openExecutionStream(\n http: HttpClient,\n executionId: string,\n options?: WatchProgressOptions,\n): Promise<ExecutionProgressStream> {\n const response = await http.request('GET', `/api/executions/${executionId}/stream`, {\n raw: true,\n signal: options?.signal,\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => undefined);\n let parsed: unknown = body;\n try {\n parsed = body ? JSON.parse(body) : undefined;\n } catch {\n // keep text\n }\n throw new LunnoaApiError({\n status: response.status,\n body: parsed,\n method: 'GET',\n path: `/api/executions/${executionId}/stream`,\n });\n }\n\n return new ExecutionProgressStream(response, options);\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n ExecuteWorkflowResult,\n Execution,\n ExecutionPathStep,\n ExecutionStatus,\n WorkflowApp,\n} from '../types';\nimport {\n openExecutionStream,\n type ExecutionProgressPayload,\n type ExecutionProgressStream,\n type WatchProgressOptions,\n} from '../streaming/execution-progress';\nimport { serializeListQuery, type ListQueryOptions } from './common';\nimport type { WorkflowAppsResource } from './workflow-apps';\n\n/** Execution statuses that end an execution. */\nconst TERMINAL_STATUSES: ReadonlySet<string> = new Set([\n 'SUCCESS',\n 'FAILED',\n 'CANCELLED',\n]);\n\nexport interface WaitUntilFinishedOptions {\n /** Give up after this long. Default: 10 minutes. */\n timeoutMs?: number;\n /** First delay between polls. Default: 500ms. */\n initialDelayMs?: number;\n /** Cap on the delay between polls. Default: 5s. */\n maxDelayMs?: number;\n /** Multiplier applied to the delay after each poll. Default: 1.5. */\n backoffFactor?: number;\n /**\n * Also stop waiting when the execution pauses in `NEEDS_INPUT` (so a form\n * can be shown). Default: true.\n */\n stopOnNeedsInput?: boolean;\n /** Extra expansion fields to request with each poll (always includes `status,statusMessage,output`). */\n expansion?: string[];\n signal?: AbortSignal;\n /** Injectable sleep, for tests. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nexport class ExecutionTimeoutError extends Error {\n constructor(\n readonly executionId: string,\n readonly timeoutMs: number,\n ) {\n super(\n `Execution ${executionId} did not finish within ${timeoutMs}ms. It is still running server-side; keep polling executions.get() or increase timeoutMs.`,\n );\n this.name = 'ExecutionTimeoutError';\n }\n}\n\n/** One step in a timeline-ready progress snapshot. */\nexport interface ExecutionProgressStep extends ExecutionPathStep {\n /** App logo URL from the workflow-apps catalogue, when resolvable. */\n appLogoUrl?: string | null;\n /** Action/trigger icon URL from the catalogue, when resolvable. */\n iconUrl?: string | null;\n /** Duration in ms when both startTime and endTime are present. */\n durationMs?: number | null;\n}\n\n/** Timeline-ready progress for a custom UI (status bar / step list). */\nexport interface ExecutionProgress {\n executionId: string;\n status?: ExecutionStatus | string;\n statusMessage?: string | null;\n name?: string | null;\n source?: string | null;\n startedAt?: string;\n stoppedAt?: string | null;\n steps: ExecutionProgressStep[];\n pendingInput?: unknown;\n output?: unknown;\n /** Index of the first non-terminal step, or -1 when all done / unknown. */\n activeStepIndex: number;\n}\n\nexport class ExecutionsResource {\n private catalogCache: WorkflowApp[] | null = null;\n\n constructor(\n private readonly http: HttpClient,\n private readonly workflowApps?: WorkflowAppsResource,\n ) {}\n\n /**\n * Starts a new execution of a workflow. Only the execution ID is returned;\n * use {@link waitUntilFinished} or `get` to track progress.\n */\n execute(\n workflowId: string,\n inputData?: Record<string, unknown>,\n ): Promise<ExecuteWorkflowResult> {\n return this.http.post<ExecuteWorkflowResult>(\n `/api/executions/workflows/${workflowId}/execute`,\n { body: { inputData: inputData ?? {} } },\n );\n }\n\n /** Lists executions in the current workspace, most recently started first. */\n list(options?: ListQueryOptions): Promise<Execution[]> {\n return this.http.get<Execution[]>('/api/executions', {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Returns a single execution. Request `expansion: ['status', 'executionPath']`\n * for the business-readable step list custom UIs render progress from.\n */\n get(\n executionId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Execution> {\n return this.http.get<Execution>(`/api/executions/${executionId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Timeline-ready progress: `executionPath` plus catalogue icons/logos.\n * Use this for a custom status bar / step list (not raw nodes/edges).\n */\n async getProgress(executionId: string): Promise<ExecutionProgress> {\n const execution = await this.get(executionId, {\n expansion: [\n 'status',\n 'statusMessage',\n 'executionPath',\n 'pendingInput',\n 'source',\n 'name',\n 'startedAt',\n 'stoppedAt',\n 'output',\n ],\n });\n return this.#toProgress(execution);\n }\n\n /**\n * Opens the Public API SSE stream (`GET /executions/:id/stream`).\n * Yields `execution.progress`, `loop.progress`, `execution.finished`, etc.\n * For a simple timeline, prefer {@link watchProgress}.\n */\n stream(\n executionId: string,\n options?: WatchProgressOptions,\n ): Promise<ExecutionProgressStream> {\n return openExecutionStream(this.http, executionId, options);\n }\n\n /**\n * Live progress snapshots for a custom timeline UI.\n * Subscribes to SSE `execution.progress` events (and enriches steps with icons).\n * Completes when the execution reaches a terminal status or the signal aborts.\n */\n async *watchProgress(\n executionId: string,\n options?: WatchProgressOptions,\n ): AsyncGenerator<ExecutionProgress, void, undefined> {\n const stream = await this.stream(executionId, options);\n for await (const frame of stream) {\n if (frame.event === 'execution.progress') {\n const payload = frame.data as unknown as ExecutionProgressPayload;\n yield await this.#progressFromPayload(payload);\n } else if (frame.event === 'execution.finished') {\n // Ensure a final enriched snapshot even if the last progress was skipped.\n yield await this.getProgress(executionId);\n return;\n } else if (frame.event === 'execution.error') {\n throw new Error(\n typeof frame.data.message === 'string'\n ? frame.data.message\n : `Execution stream error for ${executionId}`,\n );\n }\n }\n }\n\n /**\n * Polls an execution with exponential backoff until it reaches a terminal\n * status (`SUCCESS`, `FAILED`, `CANCELLED`) — or pauses in `NEEDS_INPUT`\n * (unless `stopOnNeedsInput: false`). Resolves with the final execution\n * including `status`, `statusMessage`, and `output`.\n */\n async waitUntilFinished(\n executionId: string,\n options: WaitUntilFinishedOptions = {},\n ): Promise<Execution> {\n const {\n timeoutMs = 10 * 60 * 1000,\n initialDelayMs = 500,\n maxDelayMs = 5_000,\n backoffFactor = 1.5,\n stopOnNeedsInput = true,\n expansion = [],\n signal,\n sleep = defaultSleep,\n } = options;\n\n const pollExpansion = Array.from(\n new Set(['status', 'statusMessage', 'output', ...expansion]),\n );\n\n const startedAt = Date.now();\n // Accumulated requested sleep time; combined with wall-clock elapsed so the\n // budget holds both in real use and with an injected (instant) sleep.\n let waitedMs = 0;\n let delay = initialDelayMs;\n\n while (true) {\n signal?.throwIfAborted();\n\n const execution = await this.get(executionId, {\n expansion: pollExpansion,\n });\n const status = execution.status as ExecutionStatus | undefined;\n\n if (status && TERMINAL_STATUSES.has(status)) {\n return execution;\n }\n if (stopOnNeedsInput && status === 'NEEDS_INPUT') {\n return execution;\n }\n\n const elapsed = Math.max(Date.now() - startedAt, waitedMs);\n if (elapsed + delay > timeoutMs) {\n throw new ExecutionTimeoutError(executionId, timeoutMs);\n }\n\n await sleep(delay);\n waitedMs += delay;\n delay = Math.min(delay * backoffFactor, maxDelayMs);\n }\n }\n\n /**\n * Resumes an execution paused in `NEEDS_INPUT` by submitting values for the\n * waiting node. Identify the waiting node and its field schema via\n * `expansion: ['pendingInput', 'executionPath']` (prefer `pendingInput` for\n * the form contract; `executionPath` steps with status `NEEDS_INPUT` also\n * carry the `nodeId`). Required fields from the schema must be present.\n * The server acknowledges immediately and resumes asynchronously — follow\n * up with {@link waitUntilFinished}.\n */\n async submitInput(\n executionId: string,\n nodeId: string,\n values: Record<string, unknown>,\n ): Promise<void> {\n await this.http.post<unknown>(\n `/api/webhooks/executions/${executionId}/nodes/${nodeId}/input`,\n { body: values },\n );\n }\n\n /**\n * Submit an approve/reject decision for a Request Approval node.\n * Uses the authenticated Approvals API (not the public input webhook).\n * Partial approvals keep the execution paused; terminal decisions resume it.\n */\n async submitApproval(\n executionId: string,\n nodeId: string,\n body: {\n decision: 'approved' | 'rejected';\n comment?: string;\n },\n ): Promise<{\n executionId: string;\n nodeId: string;\n approvalId?: string;\n terminal: boolean;\n canDecide: boolean;\n approval: Record<string, unknown>;\n }> {\n return this.http.post(\n `/api/executions/${executionId}/nodes/${nodeId}/approvals`,\n { body },\n );\n }\n\n async #toProgress(execution: Execution): Promise<ExecutionProgress> {\n const path = (execution.executionPath ?? []) as ExecutionPathStep[];\n const steps = await this.#enrichSteps(path);\n return {\n executionId: execution.id,\n status: execution.status,\n statusMessage: execution.statusMessage ?? null,\n name: (execution as { name?: string | null }).name ?? null,\n source: (execution as { source?: string | null }).source ?? null,\n startedAt: execution.startedAt,\n stoppedAt: execution.stoppedAt ?? null,\n steps,\n pendingInput: (execution as { pendingInput?: unknown }).pendingInput,\n output: execution.output,\n activeStepIndex: findActiveStepIndex(steps),\n };\n }\n\n async #progressFromPayload(\n payload: ExecutionProgressPayload,\n ): Promise<ExecutionProgress> {\n const steps = await this.#enrichSteps(payload.executionPath ?? []);\n return {\n executionId: payload.executionId,\n status: payload.status ?? undefined,\n statusMessage: payload.statusMessage,\n name: payload.name,\n source: payload.source,\n startedAt: payload.startedAt,\n stoppedAt: payload.stoppedAt,\n steps,\n pendingInput: payload.pendingInput,\n output: payload.output,\n activeStepIndex: findActiveStepIndex(steps),\n };\n }\n\n async #enrichSteps(\n path: ExecutionPathStep[],\n ): Promise<ExecutionProgressStep[]> {\n const catalog = await this.#loadCatalog();\n return path.map((step) => {\n const app = catalog?.find((a) => a.id === step.appId);\n const action =\n step.actionId && Array.isArray(app?.actions)\n ? (app!.actions as Record<string, unknown>[]).find(\n (a) => a && typeof a === 'object' && a.id === step.actionId,\n )\n : undefined;\n const trigger =\n step.triggerId && Array.isArray(app?.triggers)\n ? (app!.triggers as Record<string, unknown>[]).find(\n (t) => t && typeof t === 'object' && t.id === step.triggerId,\n )\n : undefined;\n const iconUrl =\n (typeof action?.iconUrl === 'string' && action.iconUrl) ||\n (typeof trigger?.iconUrl === 'string' && trigger.iconUrl) ||\n null;\n const durationMs = computeDurationMs(step.startTime, step.endTime);\n return {\n ...step,\n appLogoUrl: app?.logoUrl ?? null,\n iconUrl,\n durationMs,\n };\n });\n }\n\n async #loadCatalog(): Promise<WorkflowApp[] | null> {\n if (!this.workflowApps) {\n return null;\n }\n if (!this.catalogCache) {\n try {\n this.catalogCache = await this.workflowApps.list();\n } catch {\n return null;\n }\n }\n return this.catalogCache;\n }\n}\n\nfunction findActiveStepIndex(steps: ExecutionProgressStep[]): number {\n const idx = steps.findIndex(\n (s) =>\n s.status === 'RUNNING' ||\n s.status === 'NEEDS_INPUT' ||\n s.status === 'RETRYING' ||\n s.status === 'WAITING' ||\n s.status === 'SCHEDULED',\n );\n return idx;\n}\n\nfunction computeDurationMs(\n start?: string,\n end?: string,\n): number | null {\n if (!start || !end) return null;\n const a = Date.parse(start);\n const b = Date.parse(end);\n if (Number.isNaN(a) || Number.isNaN(b) || b < a) return null;\n return b - a;\n}\n\nfunction defaultSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateKnowledgeInput,\n Knowledge,\n KnowledgeDocument,\n KnowledgeDocumentGroup,\n SaveUploadedTextInput,\n UpdateKnowledgeInput,\n} from '../types';\nimport { serializeCsv } from './common';\n\nexport class KnowledgeResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists knowledge notebooks in the workspace. */\n list(options: { expansion?: string | string[] } = {}): Promise<Knowledge[]> {\n return this.http.get<Knowledge[]>('/api/knowledge', {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Returns a single knowledge notebook. */\n get(\n knowledgeId: string,\n options: { expansion?: string | string[] } = {},\n ): Promise<Knowledge> {\n return this.http.get<Knowledge>(`/api/knowledge/${knowledgeId}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Creates a knowledge notebook. Subject to the deployment's storage/vector infrastructure. */\n create(data: CreateKnowledgeInput): Promise<Knowledge> {\n return this.http.post<Knowledge>('/api/knowledge', { body: data });\n }\n\n /** Updates a knowledge notebook. */\n update(knowledgeId: string, data: UpdateKnowledgeInput): Promise<Knowledge> {\n return this.http.patch<Knowledge>(`/api/knowledge/${knowledgeId}`, {\n body: data,\n });\n }\n\n /** Deletes a knowledge notebook. */\n delete(knowledgeId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/knowledge/${knowledgeId}`);\n }\n\n /** Saves raw text into the notebook (chunked, embedded, and indexed server-side). */\n saveUploadedText(\n knowledgeId: string,\n data: SaveUploadedTextInput,\n ): Promise<unknown> {\n return this.http.post<unknown>(\n `/api/knowledge/${knowledgeId}/saveUploadedText`,\n { body: data },\n );\n }\n\n /** Lists the documents stored in a notebook. */\n listDocuments(knowledgeId: string): Promise<KnowledgeDocument[]> {\n return this.http.get<KnowledgeDocument[]>(\n `/api/knowledge/${knowledgeId}/documents`,\n );\n }\n\n /** Returns one document group (an uploaded document and its chunks). */\n getDocumentGroup(\n knowledgeId: string,\n groupId: string,\n ): Promise<KnowledgeDocumentGroup> {\n return this.http.get<KnowledgeDocumentGroup>(\n `/api/knowledge/${knowledgeId}/documents/${groupId}`,\n );\n }\n\n /** Deletes one document group from the notebook. */\n deleteDocumentGroup(knowledgeId: string, groupId: string): Promise<boolean> {\n return this.http.delete<boolean>(\n `/api/knowledge/${knowledgeId}/documents/${groupId}`,\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { iterateOffset, type OffsetPagination } from '../core/pagination';\nimport type {\n BulkCreateQueueItemsInput,\n BulkCreateQueueItemsResult,\n CreateQueueItemInput,\n QueueItem,\n QueueItemCreated,\n QueueItemErrorEntry,\n QueueItemFull,\n QueueItemList,\n QueueItemStats,\n UpdateQueueItemInput,\n} from '../types';\n\nexport type QueueItemStatus =\n | 'PENDING'\n | 'PROCESSING'\n | 'SUCCESS'\n | 'FAILED'\n | 'RETRYING';\n\nexport interface AddQueueItemErrorInput {\n /** Error message recorded on the item. */\n error: string;\n /**\n * Extra details. An object is sent as a JSON string, which is what the\n * server validates.\n */\n errorDetails?: string | Record<string, unknown>;\n}\nimport { serializeCsv, serializeFilterBy } from './common';\n\nexport interface ListQueueItemsOptions {\n limit?: number;\n offset?: number;\n expansion?: string | string[];\n /** Supports keys including `status`, `externalId`, `objectId`, `priority`. */\n filterBy?: string | Record<string, string>;\n}\n\nexport interface ListQueueItemsByObjectOptions {\n status?: string;\n limit?: number;\n offset?: number;\n expansion?: string | string[];\n}\n\nexport class QueueItemsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Returns one page of items in a queue (offset-based pagination). */\n list(\n queueId: string,\n options: ListQueueItemsOptions = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(`/api/queues/${queueId}/items`, {\n query: {\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy(options.filterBy),\n },\n });\n }\n\n /** Async-iterates every item in a queue, fetching batches lazily. */\n iterate(\n queueId: string,\n options: Omit<ListQueueItemsOptions, 'offset'> = {},\n ): AsyncGenerator<QueueItem, void, undefined> {\n return iterateOffset<QueueItem>(async (offset) => {\n const result = await this.list(queueId, { ...options, offset });\n return {\n items: result.items ?? [],\n pagination: result.pagination as unknown as OffsetPagination,\n };\n });\n }\n\n /** Returns a single queue item. */\n get(queueId: string, itemId: string): Promise<QueueItemFull> {\n return this.http.get<QueueItemFull>(\n `/api/queues/${queueId}/items/${itemId}`,\n );\n }\n\n /** Adds an item to a queue. Pass `objectId` to link the item to an entity. */\n create(\n queueId: string,\n data: CreateQueueItemInput,\n ): Promise<QueueItemCreated> {\n return this.http.post<QueueItemCreated>(`/api/queues/${queueId}/items`, {\n body: data,\n });\n }\n\n /**\n * Lists queue items linked to an Object across all queues in the workspace.\n * Use for Object detail \"Work\" panels.\n */\n listByObject(\n objectId: string,\n options: ListQueueItemsByObjectOptions = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/objects/${objectId}/queue-items`,\n {\n query: {\n status: options.status,\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n },\n },\n );\n }\n\n /** Async-iterates every queue item linked to an Object. */\n iterateByObject(\n objectId: string,\n options: Omit<ListQueueItemsByObjectOptions, 'offset'> = {},\n ): AsyncGenerator<QueueItem, void, undefined> {\n return iterateOffset<QueueItem>(async (offset) => {\n const result = await this.listByObject(objectId, {\n ...options,\n offset,\n });\n return {\n items: result.items ?? [],\n pagination: result.pagination as unknown as OffsetPagination,\n };\n });\n }\n\n /** Adds many items to a queue in one call. */\n bulkCreate(\n queueId: string,\n data: BulkCreateQueueItemsInput,\n ): Promise<BulkCreateQueueItemsResult> {\n return this.http.post<BulkCreateQueueItemsResult>(\n `/api/queues/${queueId}/items/bulk`,\n { body: data },\n );\n }\n\n /** Updates a queue item. */\n update(\n queueId: string,\n itemId: string,\n data: UpdateQueueItemInput,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}`,\n { body: data },\n );\n }\n\n /** Deletes a queue item. */\n delete(queueId: string, itemId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(\n `/api/queues/${queueId}/items/${itemId}`,\n );\n }\n\n /** Returns items that are ready to be processed. */\n listReady(queueId: string, options: { limit?: number } = {}): Promise<QueueItem[]> {\n return this.http.get<QueueItem[]>(`/api/queues/${queueId}/items/ready`, {\n query: { limit: options.limit },\n });\n }\n\n /** Returns items eligible for retry. */\n listRetryable(queueId: string): Promise<QueueItem[]> {\n return this.http.get<QueueItem[]>(`/api/queues/${queueId}/items/retry`);\n }\n\n /** Returns a page of items with the given status. */\n listByStatus(\n queueId: string,\n status: QueueItemStatus,\n options: { limit?: number; offset?: number } = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/queues/${queueId}/items/status/${status}`,\n { query: { limit: options.limit, offset: options.offset } },\n );\n }\n\n /** Looks an item up by the external ID your system supplied. */\n getByExternalId(queueId: string, externalId: string): Promise<QueueItemFull> {\n return this.http.get<QueueItemFull>(\n `/api/queues/${queueId}/items/external/${externalId}`,\n );\n }\n\n /**\n * Searches items by external id, item data, and metadata.\n * Returns one page, same shape as `list`.\n */\n search(\n queueId: string,\n query: string,\n options: Omit<ListQueueItemsOptions, 'filterBy'> = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/queues/${queueId}/items/search`,\n {\n query: {\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy({ search: query }),\n },\n },\n );\n }\n\n /** Returns per-status and per-priority counts for the queue. */\n stats(queueId: string): Promise<QueueItemStats> {\n return this.http.get<QueueItemStats>(`/api/queues/${queueId}/items/stats`);\n }\n\n /** Returns the recorded processing errors of an item. */\n listErrors(queueId: string, itemId: string): Promise<QueueItemErrorEntry[]> {\n return this.http.get<QueueItemErrorEntry[]>(\n `/api/queues/${queueId}/items/${itemId}/errors`,\n );\n }\n\n /** Updates the processing status of an item. */\n updateStatus(\n queueId: string,\n itemId: string,\n status: string,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/status`,\n { body: { status } },\n );\n }\n\n /** Links an item to the workflow execution that processed it. */\n linkExecution(\n queueId: string,\n itemId: string,\n executionId: string,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/link-execution`,\n { body: { executionId } },\n );\n }\n\n /** Queues the item for another processing attempt. */\n retry(queueId: string, itemId: string): Promise<QueueItem> {\n return this.http.post<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/retry`,\n );\n }\n\n /** Records a processing error on the item. */\n addError(\n queueId: string,\n itemId: string,\n error: AddQueueItemErrorInput,\n ): Promise<QueueItem> {\n return this.http.post<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/error`,\n {\n body: {\n error: error.error,\n errorDetails: serializeErrorDetails(error.errorDetails),\n },\n },\n );\n }\n}\n\nfunction serializeErrorDetails(\n value: string | Record<string, unknown> | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return typeof value === 'string' ? value : JSON.stringify(value);\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateQueueInput,\n Queue,\n QueueStats,\n UpdateQueueInput,\n} from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class QueuesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists queues in the workspace, ordered by priority then creation date. */\n list(options?: ListQueryOptions): Promise<Queue[]> {\n return this.http.get<Queue[]>('/api/queues', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single queue. */\n get(queueId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Queue> {\n return this.http.get<Queue>(`/api/queues/${queueId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a queue. */\n create(data: CreateQueueInput): Promise<Queue> {\n return this.http.post<Queue>('/api/queues', { body: data });\n }\n\n /** Updates a queue. */\n update(queueId: string, data: UpdateQueueInput): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}`, { body: data });\n }\n\n /** Deletes a queue. */\n delete(queueId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/api/queues/${queueId}`);\n }\n\n /** Returns aggregate statistics for a queue. */\n stats(queueId: string): Promise<QueueStats> {\n return this.http.get<QueueStats>(`/api/queues/${queueId}/stats`);\n }\n\n /** Activates a queue. */\n activate(queueId: string): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}/activate`);\n }\n\n /** Deactivates a queue. */\n deactivate(queueId: string): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}/deactivate`);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n ActionDefinition,\n WorkflowDefinition,\n WorkflowStepDefinition,\n} from '../define';\nimport {\n resolveActionAppId,\n resolveActionId,\n} from '../define';\nimport type { Execution, RunActionResult } from '../types';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface StartRunStep {\n /** Name later steps use with `ref.step(key, ...)`. */\n key?: string;\n appId: string;\n actionId: string;\n connectionId?: string;\n input?: Record<string, unknown>;\n name?: string;\n}\n\nexport interface StartRunOptions {\n steps: StartRunStep[];\n name?: string;\n}\n\nexport type StartRunInput =\n | StartRunOptions\n | WorkflowDefinition\n | WorkflowStepDefinition[]\n | StartRunStep[];\n\nfunction isWorkflowDefinition(value: unknown): value is WorkflowDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as WorkflowDefinition).kind === 'workflow'\n );\n}\n\nfunction isActionDefinition(value: unknown): value is ActionDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as ActionDefinition).kind === 'action'\n );\n}\n\nfunction stepFromDefinition(\n step: WorkflowStepDefinition | StartRunStep | ActionDefinition,\n): StartRunStep {\n if ('appId' in step && 'actionId' in step && !('use' in step) && !('kind' in step)) {\n return step as StartRunStep;\n }\n if (isActionDefinition(step)) {\n return {\n appId: resolveActionAppId(step),\n actionId: resolveActionId(step),\n ...(step.connection?.id ? { connectionId: step.connection.id } : {}),\n ...(step.input ? { input: step.input } : {}),\n ...(step.name ? { name: step.name } : {}),\n };\n }\n if ((step as WorkflowStepDefinition).paths?.length) {\n throw new Error(\n 'runs.start runs straight lines only. Deploy workflows with paths, then execute them.',\n );\n }\n const use = (step as WorkflowStepDefinition).use;\n const input = {\n ...(use.input ?? {}),\n ...((step as WorkflowStepDefinition).input ?? {}),\n };\n const key = (step as WorkflowStepDefinition).key;\n return {\n ...(key ? { key } : {}),\n appId: resolveActionAppId(use),\n actionId: resolveActionId(use),\n ...(use.connection?.id ? { connectionId: use.connection.id } : {}),\n ...(Object.keys(input).length ? { input } : {}),\n ...(((step as WorkflowStepDefinition).name ?? use.name)\n ? { name: (step as WorkflowStepDefinition).name ?? use.name }\n : {}),\n };\n}\n\nfunction normalizeStartRunInput(input: StartRunInput): StartRunOptions {\n if (isWorkflowDefinition(input)) {\n if ('format' in input && (input as { format?: string }).format === 'graph') {\n throw new Error(\n 'runs.start runs straight lines only. Push the graph workflow, then execute it.',\n );\n }\n // Ad-hoc runs have no trigger node. `trigger` is for deploy only.\n return {\n steps: input.steps.map(stepFromDefinition),\n name: input.name ?? input.slug,\n };\n }\n if (Array.isArray(input)) {\n return { steps: input.map((s) => stepFromDefinition(s as any)) };\n }\n return input;\n}\n\n/**\n * Multi-step ad-hoc runs (`POST /api/runs`) → one Execution with `source: SDK`.\n */\nexport class RunsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /**\n * Start a linear multi-step ad-hoc Execution.\n *\n * Accepts a `defineWorkflow` result, a step array, or an explicit\n * `{ steps, name? }` payload.\n */\n start(input: StartRunInput): Promise<RunActionResult> {\n const options = normalizeStartRunInput(input);\n if (!options.steps?.length) {\n throw new Error('runs.start requires at least one step');\n }\n return this.http.post<RunActionResult>('/api/runs', {\n body: options,\n });\n }\n\n /** Convenience: start and wait until terminal / NEEDS_INPUT. */\n async startAndWait(\n input: StartRunInput,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.start(input);\n return this.executions.waitUntilFinished(id, {\n ...waitOptions,\n expansion: [\n 'executionPath',\n 'source',\n ...(waitOptions?.expansion ?? []),\n ],\n });\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport type ScorecardMeasureStatus = 'ON_TRACK' | 'AT_RISK' | 'OFF_TRACK' | 'NO_DATA';\n\nexport type ScorecardSummary = {\n id: string;\n name: string;\n periodLabel: string | null;\n description: string | null;\n FK_ownerId: string | null;\n createdAt: string;\n _count: { objectives: number };\n};\n\nexport type ScorecardMeasure = {\n id: string;\n name: string;\n unit: string;\n currency: string | null;\n direction: 'HIGHER_IS_BETTER' | 'LOWER_IS_BETTER';\n kind: 'LEADING' | 'LAGGING';\n cadence: 'DAILY' | 'WEEKLY' | 'MONTHLY';\n sourceType: 'MANUAL' | 'API' | 'WORKFLOW' | 'BUILT_IN';\n builtInKey: string | null;\n target: number;\n atRiskThreshold: number | null;\n latest: { value: number; periodStart: string; createdAt: string } | null;\n previousValue: number | null;\n series: { periodStart: string; value: number }[];\n status: ScorecardMeasureStatus;\n stale: boolean;\n};\n\nexport type ScorecardObjective = {\n id: string;\n perspective: 'FINANCIAL' | 'CUSTOMER' | 'PROCESS' | 'LEARNING';\n name: string;\n description: string | null;\n ownerLabel: string | null;\n drivesIds: string[];\n position: number;\n status: ScorecardMeasureStatus;\n measures: ScorecardMeasure[];\n};\n\nexport type Scorecard = Omit<ScorecardSummary, '_count'> & {\n aiSpendUsdThisMonth: number;\n objectives: ScorecardObjective[];\n};\n\nexport type ScorecardMeasureValue = {\n id: string;\n FK_measureId: string;\n periodStart: string;\n value: number;\n note: string | null;\n sourceType: ScorecardMeasure['sourceType'];\n supersededAt: string | null;\n createdAt: string;\n};\n\nexport type RecordMeasureValueInput = {\n value: number;\n /** Any ISO date inside the target period; defaults to the current period. */\n period?: string;\n note?: string;\n};\n\n/**\n * Balanced Scorecard (workspace API). Pushing values needs `scorecard:record`.\n */\nexport class ScorecardsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists scorecards in the workspace. */\n list(): Promise<ScorecardSummary[]> {\n return this.http.get<ScorecardSummary[]>('/api/scorecards');\n }\n\n /** Returns a scorecard with objectives, measures, latest values and status. */\n get(scorecardId: string): Promise<Scorecard> {\n return this.http.get<Scorecard>(`/api/scorecards/${scorecardId}`);\n }\n\n /**\n * Records a measure value. A value for the same period replaces the current\n * one; the old value is kept as superseded history.\n */\n recordValue(\n measureId: string,\n data: RecordMeasureValueInput,\n ): Promise<ScorecardMeasureValue> {\n return this.http.post<ScorecardMeasureValue>(\n `/api/scorecards/measures/${measureId}/values`,\n { body: data },\n );\n }\n}\n","import type { UIMessage } from 'ai';\n\nimport type { HttpClient } from '../core/http';\nimport type {\n CreateTaskInput,\n DeletedTask,\n Task,\n TaskListItem,\n UpdateTaskInput,\n} from '../types';\nimport {\n messageTaskBody,\n type StreamMessageOptions,\n} from '../streaming/agent-chat';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class TasksResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists tasks (conversation threads) visible to the caller, most recently updated first. */\n list(options?: ListQueryOptions): Promise<TaskListItem[]> {\n return this.http.get<TaskListItem[]>('/api/tasks', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single task. Request `expansion: ['messages']` for the conversation history. */\n get(taskId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Task> {\n return this.http.get<Task>(`/api/tasks/${taskId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a task (conversation thread) for an agent. */\n create(\n agentId: string,\n data: CreateTaskInput,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Task> {\n return this.http.post<Task>(`/api/agents/${agentId}/tasks`, {\n body: data,\n query: serializeListQuery(options),\n });\n }\n\n /** Updates the task name or description. */\n update(\n taskId: string,\n data: UpdateTaskInput,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Task> {\n return this.http.patch<Task>(`/api/tasks/${taskId}`, {\n body: data,\n query: serializeListQuery(options),\n });\n }\n\n /** Permanently deletes a task and its messages. */\n delete(taskId: string): Promise<DeletedTask> {\n return this.http.delete<DeletedTask>(`/api/tasks/${taskId}`);\n }\n\n /**\n * Sends a message to an agent task and waits for the full agent turn to\n * finish (non-streaming). Returns either a plain string or the assistant\n * messages in AI SDK UIMessage format. For token-by-token output use\n * `client.agentChat.streamMessage` instead.\n */\n message(\n agentId: string,\n taskId: string,\n message: string | UIMessage,\n options: Omit<StreamMessageOptions, 'signal'> = {},\n ): Promise<string | UIMessage[]> {\n const uiMessage: UIMessage =\n typeof message === 'string'\n ? {\n id: generateMessageId(),\n role: 'user',\n parts: [{ type: 'text', text: message }],\n }\n : message;\n\n return this.http.post<string | UIMessage[]>(\n `/api/agents/${agentId}/tasks/${taskId}/message`,\n { body: messageTaskBody(uiMessage, options) },\n );\n }\n}\n\nfunction generateMessageId(): string {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateVariableInput,\n UpdateVariableInput,\n Variable,\n} from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class VariablesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists variables in the workspace. */\n list(options?: ListQueryOptions): Promise<Variable[]> {\n return this.http.get<Variable[]>('/api/variables', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single variable. */\n get(\n variableId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Variable> {\n return this.http.get<Variable>(`/api/variables/${variableId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a variable. */\n create(data: CreateVariableInput): Promise<Variable> {\n return this.http.post<Variable>('/api/variables', { body: data });\n }\n\n /** Updates a variable. */\n update(variableId: string, data: UpdateVariableInput): Promise<Variable> {\n return this.http.patch<Variable>(`/api/variables/${variableId}`, {\n body: data,\n });\n }\n\n /** Deletes a variable. */\n delete(variableId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/variables/${variableId}`);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { WorkflowApp } from '../types';\n\n/**\n * Read-only catalog of workflow apps and their actions/triggers. Custom UIs\n * use it to resolve `executionPath` step `appId`/`actionId` pairs to\n * human-readable names and icons, and to read the declarative\n * `ActionUIDefinition` metadata for rendering rich action outputs.\n */\nexport class WorkflowAppsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists all workflow apps installed on the deployment. */\n list(): Promise<WorkflowApp[]> {\n return this.http.get<WorkflowApp[]>('/api/workflow-apps');\n }\n\n /**\n * Creates a connection for an app where the connection type is\n * non-interactive (API key, basic auth). OAuth connections require the\n * browser flow inside the bundled UI and cannot be created here.\n */\n connect(\n appId: string,\n connectionId: string,\n value: Record<string, unknown>,\n ): Promise<unknown> {\n return this.http.post<unknown>(\n `/api/workflow-apps/${appId}/connections/${connectionId}/connect`,\n { body: value },\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { CodeSyncContext } from '../types';\n\nexport class CodeSyncResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Workspace id and whether synced resources are locked in the UI. */\n context(): Promise<CodeSyncContext> {\n return this.http.get<CodeSyncContext>('/api/code-sync/context');\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CodeDefinitionResponse,\n CodeSource,\n ExecuteWorkflowResult,\n Execution,\n Workflow,\n} from '../types';\nimport type {\n ActionDefinition,\n TriggerDefinition,\n WorkflowDefinition,\n WorkflowFileDefinition,\n WorkflowGraphFileDefinition,\n WorkflowPathDefinition,\n WorkflowStepDefinition,\n WorkflowStepFile,\n WorkflowStepsFileDefinition,\n WorkflowTriggerFile,\n} from '../define';\nimport {\n DEFINE_KINDS,\n resolveActionAppId,\n resolveActionId,\n resolveTriggerAppId,\n resolveTriggerId,\n} from '../define';\nimport { serializeListQuery, type ListQueryOptions } from './common';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface UpsertWorkflowStepInput {\n /** Name later steps use in `={{step:<key>,path}}`. Keeps the node id stable. */\n key?: string;\n appId: string;\n actionId: string;\n connectionId?: string;\n input?: Record<string, unknown>;\n name?: string;\n description?: string;\n retrySettings?: {\n enabled: boolean;\n maxAttempts: number;\n delaySeconds: number;\n };\n continueOnFailure?: { enabled: boolean };\n /** Branches after this step (last step of a list only). */\n paths?: UpsertWorkflowPathInput[];\n}\n\nexport interface UpsertWorkflowPathInput {\n label: string;\n when?: WorkflowPathDefinition['when'];\n steps: UpsertWorkflowStepInput[];\n}\n\nexport interface UpsertWorkflowTriggerInput {\n triggerId: string;\n appId?: string;\n connectionId?: string;\n /** Catalogue trigger config. */\n input?: Record<string, unknown>;\n /** Manual-trigger fields. Stored as `customInputConfig`. */\n inputs?: TriggerDefinition['inputs'];\n name?: string;\n description?: string;\n}\n\nexport interface UpsertWorkflowGraphInput {\n nodes: WorkflowGraphFileDefinition['nodes'];\n edges: WorkflowGraphFileDefinition['edges'];\n}\n\nexport interface UpsertWorkflowBySlugInput {\n slug: string;\n name?: string;\n /** Null clears a description that was removed from the definition file. */\n description?: string | null;\n isActive?: boolean;\n /** Omit for Manually Run with no input fields. */\n trigger?: UpsertWorkflowTriggerInput;\n steps?: UpsertWorkflowStepInput[];\n /** Lossless graph. Not sent together with `trigger` / `steps`. */\n graph?: UpsertWorkflowGraphInput;\n /** `generated` for TypeScript deploys, `synced` for definition files. */\n codeSource?: Extract<CodeSource, 'synced' | 'generated'>;\n baseRevision?: string;\n force?: boolean;\n}\n\nexport interface WorkflowUpsertOptions {\n codeSource?: Extract<CodeSource, 'synced' | 'generated'>;\n baseRevision?: string;\n force?: boolean;\n}\n\nfunction triggerToUpsertInput(\n trigger: TriggerDefinition,\n): UpsertWorkflowTriggerInput {\n return {\n triggerId: resolveTriggerId(trigger),\n appId: resolveTriggerAppId(trigger),\n ...(trigger.connection?.id ? { connectionId: trigger.connection.id } : {}),\n ...(trigger.input ? { input: trigger.input } : {}),\n ...(trigger.inputs?.length ? { inputs: trigger.inputs } : {}),\n ...(trigger.name ? { name: trigger.name } : {}),\n ...(trigger.description ? { description: trigger.description } : {}),\n };\n}\n\nfunction asAction(use: ActionDefinition | WorkflowStepFile['use']): ActionDefinition {\n if (use && typeof use === 'object' && 'kind' in use && use.kind === DEFINE_KINDS.action) {\n return use;\n }\n const fileUse = use as WorkflowStepFile['use'];\n return {\n kind: DEFINE_KINDS.action,\n id: fileUse.id,\n appId: fileUse.appId,\n connection: fileUse.connection?.id\n ? { kind: DEFINE_KINDS.connection, id: fileUse.connection.id }\n : undefined,\n };\n}\n\nfunction asTrigger(trigger: TriggerDefinition | WorkflowTriggerFile): TriggerDefinition {\n if ('kind' in trigger && trigger.kind === DEFINE_KINDS.trigger) {\n return trigger;\n }\n const fileTrigger = trigger as WorkflowTriggerFile;\n return {\n kind: DEFINE_KINDS.trigger,\n id: fileTrigger.id,\n appId: fileTrigger.appId,\n connection: fileTrigger.connection?.id\n ? { kind: DEFINE_KINDS.connection, id: fileTrigger.connection.id }\n : undefined,\n input: fileTrigger.input,\n inputs: fileTrigger.inputs as TriggerDefinition['inputs'],\n name: fileTrigger.name,\n description: fileTrigger.description,\n };\n}\n\nfunction stepToUpsertInput(\n step: WorkflowStepDefinition | WorkflowStepFile,\n): UpsertWorkflowStepInput {\n const use = asAction(step.use);\n const retry = 'retrySettings' in step ? step.retrySettings : undefined;\n const continueOnFailure =\n 'continueOnFailure' in step ? step.continueOnFailure : undefined;\n return {\n ...(step.key ? { key: step.key } : {}),\n appId: resolveActionAppId(use),\n actionId: resolveActionId(use),\n connectionId: use.connection?.id,\n input: {\n ...(use.input ?? {}),\n ...(step.input ?? {}),\n },\n name: step.name ?? use.name,\n description: step.description ?? use.description,\n ...(retry ? { retrySettings: retry } : {}),\n ...(continueOnFailure ? { continueOnFailure } : {}),\n ...(step.paths?.length\n ? {\n paths: step.paths.map((path) => ({\n label: path.label,\n ...(path.when\n ? { when: path.when as WorkflowPathDefinition['when'] }\n : {}),\n steps: path.steps.map((nested) =>\n stepToUpsertInput(nested as WorkflowStepDefinition | WorkflowStepFile),\n ),\n })),\n }\n : {}),\n };\n}\n\nfunction syncFields(\n options?: WorkflowUpsertOptions,\n): Pick<UpsertWorkflowBySlugInput, 'baseRevision' | 'force'> {\n return {\n ...(options?.baseRevision ? { baseRevision: options.baseRevision } : {}),\n ...(options?.force ? { force: true } : {}),\n };\n}\n\nexport function workflowDefinitionToUpsert(\n def: WorkflowDefinition,\n options?: WorkflowUpsertOptions,\n): UpsertWorkflowBySlugInput & { steps: UpsertWorkflowStepInput[] };\nexport function workflowDefinitionToUpsert(\n def: WorkflowFileDefinition,\n options?: WorkflowUpsertOptions,\n): UpsertWorkflowBySlugInput;\nexport function workflowDefinitionToUpsert(\n def: WorkflowDefinition | WorkflowFileDefinition,\n options?: WorkflowUpsertOptions,\n): UpsertWorkflowBySlugInput;\nexport function workflowDefinitionToUpsert(\n def: WorkflowDefinition | WorkflowFileDefinition,\n options?: WorkflowUpsertOptions,\n): UpsertWorkflowBySlugInput {\n if ('format' in def && def.format === 'graph') {\n return {\n slug: def.slug,\n name: def.name,\n // A file is the whole definition: an omitted description is empty, not \"leave it\".\n description: def.description ?? null,\n codeSource: 'synced',\n graph: { nodes: def.nodes, edges: def.edges ?? [] },\n ...syncFields(options),\n };\n }\n if ('format' in def && def.format === 'steps') {\n const file = def as WorkflowStepsFileDefinition;\n return {\n slug: file.slug,\n name: file.name,\n description: file.description ?? null,\n ...(file.trigger ? { trigger: triggerToUpsertInput(asTrigger(file.trigger)) } : {}),\n codeSource: 'synced',\n steps: file.steps.map((step) => stepToUpsertInput(step)),\n ...syncFields(options),\n };\n }\n const authored = def as WorkflowDefinition;\n return {\n slug: authored.slug,\n name: authored.name,\n description: authored.description,\n isActive: authored.isActive,\n ...(authored.trigger ? { trigger: triggerToUpsertInput(authored.trigger) } : {}),\n codeSource: options?.codeSource ?? 'generated',\n ...syncFields(options),\n steps: authored.steps.map((step) => stepToUpsertInput(step)),\n };\n}\n\nexport class WorkflowsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /** Lists workflows in the current workspace. */\n list(options?: ListQueryOptions): Promise<Workflow[]> {\n return this.http.get<Workflow[]>('/api/workflows', {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Returns a single workflow. Request `expansion: ['triggerNode']` to read\n * the manual trigger's custom input field definitions.\n */\n get(\n workflowId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Workflow> {\n return this.http.get<Workflow>(`/api/workflows/${workflowId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Exported definition for `lunnoa/workflows/<slug>.json`. */\n getDefinition(\n slug: string,\n ): Promise<CodeDefinitionResponse<WorkflowFileDefinition>> {\n return this.http.get<CodeDefinitionResponse<WorkflowFileDefinition>>(\n `/api/workflows/slug/${encodeURIComponent(slug)}/definition`,\n );\n }\n\n /**\n * Upsert a workflow by slug inside the workspace on the API key.\n * Prefer the CLI (`npx @lunnoa/client workflows deploy`) for happy-path deploy.\n */\n upsertBySlug(\n body: UpsertWorkflowBySlugInput | WorkflowDefinition | WorkflowFileDefinition,\n options?: WorkflowUpsertOptions,\n ): Promise<Workflow & CodeDefinitionResponse<WorkflowFileDefinition>> {\n const payload =\n 'kind' in body && body.kind === 'workflow'\n ? workflowDefinitionToUpsert(body, options)\n : body;\n return this.http.post<Workflow & CodeDefinitionResponse<WorkflowFileDefinition>>(\n '/api/workflows/upsert',\n { body: payload },\n );\n }\n\n /**\n * Starts a new execution of the workflow with the given trigger inputs.\n * Returns immediately with the execution ID.\n */\n execute(\n workflowId: string,\n inputs?: Record<string, unknown>,\n ): Promise<ExecuteWorkflowResult> {\n return this.executions.execute(workflowId, inputs);\n }\n\n /**\n * Convenience: execute the workflow and wait (poll with backoff) until it\n * reaches a terminal status or pauses in `NEEDS_INPUT`.\n */\n async executeAndWait(\n workflowId: string,\n inputs?: Record<string, unknown>,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.executions.execute(workflowId, inputs);\n return this.executions.waitUntilFinished(id, waitOptions);\n }\n\n /**\n * Triggers a workflow through its unauthenticated custom webhook endpoint\n * (`POST /api/webhooks/workflows/:workflowId`). Only works for workflows\n * with a webhook trigger. Returns the synchronous trigger output when the\n * workflow responds synchronously.\n */\n triggerWebhook(\n workflowId: string,\n payload?: Record<string, unknown>,\n ): Promise<Record<string, unknown> | undefined> {\n return this.http.post<Record<string, unknown> | undefined>(\n `/api/webhooks/workflows/${workflowId}`,\n { body: payload ?? {} },\n );\n }\n}\n","import { HttpClient, type LunnoaClientOptions } from './core/http';\nimport { AgentChatClient } from './streaming/agent-chat';\nimport { ActionsResource } from './resources/actions';\nimport { AgentsResource } from './resources/agents';\nimport { AuthResource } from './resources/auth';\nimport { AiConnectionsResource } from './resources/ai-connections';\nimport { ConnectionsResource } from './resources/connections';\nimport { DiscoveryResource } from './resources/discovery';\nimport { EntitiesResource } from './resources/entities';\nimport { EntityTypesResource } from './resources/entity-types';\nimport { TablesResource } from './resources/tables';\nimport { ApprovalsResource } from './resources/approvals';\nimport { ExecutionsResource } from './resources/executions';\nimport { KnowledgeResource } from './resources/knowledge';\nimport { QueueItemsResource } from './resources/queue-items';\nimport { QueuesResource } from './resources/queues';\nimport { RunsResource } from './resources/runs';\nimport { ScorecardsResource } from './resources/scorecards';\nimport { TasksResource } from './resources/tasks';\nimport { VariablesResource } from './resources/variables';\nimport { WorkflowAppsResource } from './resources/workflow-apps';\nimport { CodeSyncResource } from './resources/code-sync';\nimport { WorkflowsResource } from './resources/workflows';\n\n/**\n * Typed client for the Lunnoa Automate Public API.\n *\n * Apps sign people in as Lunnoa users:\n * ```ts\n * import { createBrowserClient } from '@lunnoa/client';\n * const lunnoa = createBrowserClient({ baseUrl: 'https://lunnoa.acme.example' });\n * await lunnoa.auth.login({ email, password });\n * ```\n *\n * `apiKey` (`lna_...`) is for the CLI and operator scripts (codegen, discovery,\n * deploy). It is not an app login. Passing one while `window` exists throws:\n * a leaked key acts as that service account across its whole workspace.\n */\nexport class LunnoaClient {\n /** The underlying HTTP layer, exposed for advanced/escape-hatch requests. */\n readonly http: HttpClient;\n\n /** Login, refresh, SSO discovery, and session helpers for Lunnoa users. */\n readonly auth: AuthResource;\n readonly agents: AgentsResource;\n readonly tasks: TasksResource;\n /** Hand-written SSE streaming client for agent chat (AI SDK UIMessage chunks). */\n readonly agentChat: AgentChatClient;\n readonly workflows: WorkflowsResource;\n readonly executions: ExecutionsResource;\n /** Run catalogue actions as one-step ad-hoc Executions (`source: SDK`). */\n readonly actions: ActionsResource;\n /**\n * Multi-step ad-hoc Executions (`source: SDK`) via `POST /api/runs`.\n * Prefer `defineWorkflow` + `runs.start` for local linear chains.\n */\n readonly runs: RunsResource;\n /** Authenticated Approvals inbox (workspace API). */\n readonly approvals: ApprovalsResource;\n readonly entities: EntitiesResource;\n readonly entityTypes: EntityTypesResource;\n /** Small reference / lookup tables (rows stored inline; use entities for transactional data). */\n readonly tables: TablesResource;\n readonly knowledge: KnowledgeResource;\n readonly queues: QueuesResource;\n readonly queueItems: QueueItemsResource;\n readonly variables: VariablesResource;\n readonly scorecards: ScorecardsResource;\n readonly connections: ConnectionsResource;\n /** AI provider connections and the model ids each one accepts. */\n readonly aiConnections: AiConnectionsResource;\n readonly workflowApps: WorkflowAppsResource;\n readonly discovery: DiscoveryResource;\n /** Workspace id for the definitions lock, and the code-sync lock flag. */\n readonly codeSync: CodeSyncResource;\n\n constructor(options: LunnoaClientOptions) {\n this.http = new HttpClient(options);\n\n this.auth = new AuthResource(this.http, this.http.tokenStore);\n this.agents = new AgentsResource(this.http);\n this.tasks = new TasksResource(this.http);\n this.agentChat = new AgentChatClient(this.http);\n this.workflowApps = new WorkflowAppsResource(this.http);\n this.executions = new ExecutionsResource(this.http, this.workflowApps);\n this.actions = new ActionsResource(this.http, this.executions);\n this.runs = new RunsResource(this.http, this.executions);\n this.approvals = new ApprovalsResource(this.http);\n this.workflows = new WorkflowsResource(this.http, this.executions);\n this.entities = new EntitiesResource(this.http);\n this.entityTypes = new EntityTypesResource(this.http);\n this.tables = new TablesResource(this.http);\n this.knowledge = new KnowledgeResource(this.http);\n this.queues = new QueuesResource(this.http);\n this.queueItems = new QueueItemsResource(this.http);\n this.variables = new VariablesResource(this.http);\n this.scorecards = new ScorecardsResource(this.http);\n this.connections = new ConnectionsResource(this.http);\n this.aiConnections = new AiConnectionsResource(this.http);\n this.discovery = new DiscoveryResource(this.http);\n this.codeSync = new CodeSyncResource(this.http);\n }\n}\n","/**\n * Pluggable storage for Lunnoa user JWTs.\n * The SDK never uses httpOnly cookies: Automate auth is bearer JWT based.\n */\nexport interface TokenStore {\n getAccessToken(): string | null | Promise<string | null>;\n getRefreshToken(): string | null | Promise<string | null>;\n setTokens(tokens: {\n accessToken: string;\n refreshToken?: string;\n }): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\n/** In-memory store (SSR, tests, or short-lived server handlers). */\nexport function createMemoryTokenStore(\n initial?: { accessToken?: string; refreshToken?: string },\n): TokenStore {\n let accessToken: string | null = initial?.accessToken ?? null;\n let refreshToken: string | null = initial?.refreshToken ?? null;\n\n return {\n getAccessToken: () => accessToken,\n getRefreshToken: () => refreshToken,\n setTokens: (tokens) => {\n accessToken = tokens.accessToken;\n if (tokens.refreshToken !== undefined) {\n refreshToken = tokens.refreshToken;\n }\n },\n clear: () => {\n accessToken = null;\n refreshToken = null;\n },\n };\n}\n\nexport interface LocalStorageTokenStoreOptions {\n /**\n * Defaults match the built-in Automate UI (`accessToken` / `refreshToken`)\n * so a custom portal can share a session with the product UI when desired.\n */\n accessTokenKey?: string;\n refreshTokenKey?: string;\n /**\n * Storage backend. Defaults to `globalThis.localStorage`.\n * Pass a mock in tests.\n */\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n}\n\n/**\n * Browser `localStorage` token store.\n * Throws if neither `options.storage` nor `globalThis.localStorage` is available.\n */\nexport function createLocalStorageTokenStore(\n options: LocalStorageTokenStoreOptions = {},\n): TokenStore {\n const accessTokenKey = options.accessTokenKey ?? 'accessToken';\n const refreshTokenKey = options.refreshTokenKey ?? 'refreshToken';\n const storage =\n options.storage ??\n (typeof globalThis !== 'undefined'\n ? (globalThis as { localStorage?: Storage }).localStorage\n : undefined);\n\n if (!storage) {\n throw new Error(\n 'createLocalStorageTokenStore requires localStorage (or a custom storage option). ' +\n 'On the server, use createMemoryTokenStore or pass accessToken / apiKey instead.',\n );\n }\n\n return {\n getAccessToken: () => storage.getItem(accessTokenKey),\n getRefreshToken: () => storage.getItem(refreshTokenKey),\n setTokens: (tokens) => {\n storage.setItem(accessTokenKey, tokens.accessToken);\n if (tokens.refreshToken !== undefined) {\n storage.setItem(refreshTokenKey, tokens.refreshToken);\n }\n },\n clear: () => {\n storage.removeItem(accessTokenKey);\n storage.removeItem(refreshTokenKey);\n },\n };\n}\n","import {\n createLocalStorageTokenStore,\n createMemoryTokenStore,\n type TokenStore,\n} from './token-store';\nimport { LunnoaClient } from '../client';\nimport type { FetchLike } from '../core/http';\n\nexport interface CreateBrowserClientOptions {\n /** Base URL of the Lunnoa Automate deployment. */\n baseUrl: string;\n /**\n * JWT store. Defaults to `localStorage` keys `accessToken` / `refreshToken`\n * (same as the built-in Automate UI).\n */\n tokenStore?: TokenStore;\n /**\n * Retry once after `POST /api/auth/refresh-token` on 401.\n * Defaults to true.\n */\n autoRefresh?: boolean;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n}\n\n/**\n * Browser (or isomorphic) client with JWT storage,\n * `lunnoa.auth.login` / refresh, and optional auto-refresh on 401.\n *\n * Never pass an `lna_` API key here.\n */\nexport function createBrowserClient(\n options: CreateBrowserClientOptions,\n): LunnoaClient {\n const tokenStore =\n options.tokenStore ?? createLocalStorageTokenStore();\n return new LunnoaClient({\n baseUrl: options.baseUrl,\n tokenStore,\n autoRefresh: options.autoRefresh ?? true,\n fetch: options.fetch,\n headers: options.headers,\n });\n}\n\nexport interface CreateServerClientOptions {\n /** Base URL of the Lunnoa Automate deployment. */\n baseUrl: string;\n /**\n * Workspace API key (`lna_...`) for operator scripts and the CLI.\n * Not an app login: people using an app authenticate as Lunnoa users.\n * Mutually exclusive with `accessToken` / `tokenStore`.\n */\n apiKey?: string;\n /**\n * User JWT (or getter) when the server already holds a signed-in Lunnoa user's token.\n */\n accessToken?: string | (() => string | Promise<string>);\n /** Optional store when the server holds both access and refresh tokens. */\n tokenStore?: TokenStore;\n autoRefresh?: boolean;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n}\n\n/**\n * Node helper for a Lunnoa user JWT held on the server, or an `lna_` key for\n * operator scripts. App login uses {@link createBrowserClient}. Throws if\n * used with an API key in a browser.\n */\nexport function createServerClient(\n options: CreateServerClientOptions,\n): LunnoaClient {\n if (!options.apiKey && !options.accessToken && !options.tokenStore) {\n throw new Error(\n 'createServerClient requires apiKey, accessToken, or tokenStore.',\n );\n }\n return new LunnoaClient({\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n accessToken: options.accessToken,\n tokenStore: options.tokenStore,\n autoRefresh: options.autoRefresh,\n fetch: options.fetch,\n headers: options.headers,\n });\n}\n\nexport { createLocalStorageTokenStore, createMemoryTokenStore };\nexport type { TokenStore };\n"]}