@fayz-ai/core 0.8.1 → 0.8.2
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/access/denial.d.ts +21 -0
- package/dist/access/denial.d.ts.map +1 -0
- package/dist/access/engine.d.ts +63 -0
- package/dist/access/engine.d.ts.map +1 -0
- package/dist/access/index.cjs +60 -0
- package/dist/access/index.cjs.map +1 -0
- package/dist/access/index.d.ts +6 -0
- package/dist/access/index.d.ts.map +1 -0
- package/dist/access/index.js +51 -0
- package/dist/access/index.js.map +1 -0
- package/dist/access/limits.d.ts +10 -0
- package/dist/access/limits.d.ts.map +1 -0
- package/dist/address/index.d.ts +52 -0
- package/dist/address/index.d.ts.map +1 -0
- package/dist/{chunk-WKZVSKEU.js → chunk-CU64QI4A.js} +2 -2
- package/dist/chunk-CU64QI4A.js.map +1 -0
- package/dist/{chunk-54SRL7AJ.cjs → chunk-CYAWDW44.cjs} +141 -84
- package/dist/chunk-CYAWDW44.cjs.map +1 -0
- package/dist/{chunk-KNIVT6XZ.js → chunk-JHGXROKV.js} +230 -2
- package/dist/chunk-JHGXROKV.js.map +1 -0
- package/dist/{chunk-QR7U2URY.cjs → chunk-SO3VUKGZ.cjs} +230 -2
- package/dist/chunk-SO3VUKGZ.cjs.map +1 -0
- package/dist/{chunk-2NTHNWEH.cjs → chunk-UKU4RIWM.cjs} +2 -2
- package/dist/chunk-UKU4RIWM.cjs.map +1 -0
- package/dist/{chunk-ZBIWYDAR.js → chunk-XJKW2JRW.js} +140 -85
- package/dist/chunk-XJKW2JRW.js.map +1 -0
- package/dist/{chunk-CHGX6UYR.js → chunk-YH25Y4FW.js} +6 -3
- package/dist/chunk-YH25Y4FW.js.map +1 -0
- package/dist/{chunk-5X2VX3RQ.cjs → chunk-ZOPJB5FN.cjs} +6 -3
- package/dist/chunk-ZOPJB5FN.cjs.map +1 -0
- package/dist/data/count.d.ts +34 -0
- package/dist/data/count.d.ts.map +1 -0
- package/dist/data/index.cjs +18 -10
- package/dist/data/index.d.ts +2 -0
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +1 -1
- package/dist/data/resolve.d.ts.map +1 -1
- package/dist/entity/index.cjs +6 -6
- package/dist/entity/index.js +1 -1
- package/dist/entity/registry.d.ts +9 -0
- package/dist/entity/registry.d.ts.map +1 -1
- package/dist/i18n/index.cjs +10 -10
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/shell-translations.d.ts.map +1 -1
- package/dist/index.cjs +852 -124
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +765 -56
- package/dist/index.js.map +1 -1
- package/dist/manifest/index.d.ts +109 -3
- package/dist/manifest/index.d.ts.map +1 -1
- package/dist/manifest/serialize.d.ts +14 -0
- package/dist/manifest/serialize.d.ts.map +1 -0
- package/dist/plugin/index.cjs +7 -7
- package/dist/plugin/index.js +1 -1
- package/dist/plugin/runtime.d.ts.map +1 -1
- package/dist/types/billing.d.ts +20 -0
- package/dist/types/billing.d.ts.map +1 -1
- package/dist/types/crud.d.ts +47 -1
- package/dist/types/crud.d.ts.map +1 -1
- package/dist/types/entitlements.d.ts +45 -0
- package/dist/types/entitlements.d.ts.map +1 -0
- package/dist/types/index.d.ts +4 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/plugins.d.ts +84 -0
- package/dist/types/plugins.d.ts.map +1 -1
- package/package.json +14 -4
- package/src/access/denial.ts +33 -0
- package/src/access/engine.test.ts +48 -0
- package/src/access/engine.ts +121 -0
- package/src/access/index.ts +13 -0
- package/src/access/limits.ts +18 -0
- package/src/address/index.ts +188 -0
- package/src/data/count.test.ts +152 -0
- package/src/data/count.ts +131 -0
- package/src/data/index.ts +2 -0
- package/src/data/resolve.ts +7 -1
- package/src/entity/registry.ts +7 -0
- package/src/i18n/shell-translations.ts +230 -0
- package/src/index.ts +18 -3
- package/src/manifest/app-manifest.schema.json +618 -45
- package/src/manifest/index.ts +127 -3
- package/src/manifest/serialize.ts +52 -0
- package/src/plugin/runtime.ts +5 -1
- package/src/types/billing.ts +22 -0
- package/src/types/crud.ts +48 -1
- package/src/types/entitlements.ts +45 -0
- package/src/types/index.ts +4 -3
- package/src/types/plugins.ts +79 -0
- package/dist/chunk-2NTHNWEH.cjs.map +0 -1
- package/dist/chunk-54SRL7AJ.cjs.map +0 -1
- package/dist/chunk-5X2VX3RQ.cjs.map +0 -1
- package/dist/chunk-CHGX6UYR.js.map +0 -1
- package/dist/chunk-KNIVT6XZ.js.map +0 -1
- package/dist/chunk-QR7U2URY.cjs.map +0 -1
- package/dist/chunk-WKZVSKEU.js.map +0 -1
- package/dist/chunk-ZBIWYDAR.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data/supabase.ts","../src/lib/cache.ts","../src/tenant/index.ts","../src/data/count.ts","../src/data/cloud.ts","../src/data/platform-api.ts","../src/data/mock.ts","../src/data/archetype.ts","../src/data/cached.ts","../src/data/resolve.ts"],"names":["resolveTenantId","createClient","camelToSnake","snakeToCamel","mapRow"],"mappings":";;;;;AAcA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,OAAO,GAAA,CAAI,QAAQ,QAAA,EAAU,CAAC,MAAM,GAAA,GAAM,CAAA,CAAE,aAAa,CAAA;AAC3D;AAEA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,OAAO,GAAA,CAAI,QAAQ,WAAA,EAAa,CAAC,GAAG,CAAA,KAAc,CAAA,CAAE,aAAa,CAAA;AACnE;AAEA,SAAS,MAAA,CAAU,KAA8B,SAAA,EAAuC;AACtF,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAM,QAAA,GAAW,SAAA,GAAY,GAAG,CAAA,IAAK,aAAa,GAAG,CAAA;AACrD,IAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,SAAA,CAAU,QAAiC,SAAA,EAA6D;AAC/G,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtD,MAAA,UAAA,CAAW,KAAK,CAAA,GAAI,KAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,QAAQ,IAAA,IAAQ,GAAA,KAAQ,eAAe,GAAA,KAAQ,WAAA,IAAe,QAAQ,UAAA,EAAY;AACtF,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAG,CAAA,IAAK,aAAa,GAAG,CAAA;AACpD,IAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA;AACT;AAGA,IAAI,qBAAA,GAAwC,IAAA;AAErC,SAAS,wBAAwB,MAAA,EAAuB;AAC7D,EAAA,qBAAA,GAAwB,MAAA;AAC1B;AAEO,SAAS,yBAAA,GAA4C;AAC1D,EAAA,OAAO,qBAAA;AACT;AAEO,SAAS,sBAAA,CACd,OACA,MAAA,EACiB;AACjB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,QAAA;AACjC,EAAA,MAAM,WAAA,GAAc,QAAQ,cAAA,IAAkB,WAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,MAAA,EAAQ,aAAA,IAAiB,EAAC;AAC7C,EAAA,MAAM,UAAA,GAAa,QAAQ,aAAA,IAAiB,GAAA;AAC5C,EAAA,MAAM,YAAY,MAAA,EAAQ,SAAA;AAE1B,EAAA,SAASA,gBAAAA,GAAsC;AAC7C,IAAA,IAAI,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,MAAA;AAC9B,IAAA,OAAO,OAAO,MAAA,CAAO,QAAA,KAAa,aAAa,MAAA,CAAO,QAAA,KAAa,MAAA,CAAO,QAAA;AAAA,EAC5E;AAEA,EAAA,SAAS,SAAA,GAAY;AACnB,IAAA,MAAM,QAAA,GAAY,QAAQ,cAAA,IAAkB,qBAAA;AAI5C,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,CAAA,wFAAA,CAA0F,CAAA;AACzH,IAAA,OAAO,MAAA,KAAW,QAAA,GAAY,QAAA,GAAiD,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,EACvG;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAA0C;AACnD,MAAA,IAAI,CAAA,GAAK,SAAA,EAAU,CAAE,IAAA,CAAK,KAAK,CAAA,CAC5B,MAAA,CAAO,UAAA,EAAY,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAExC,MAAA,MAAM,WAAWA,gBAAAA,EAAgB;AACjC,MAAA,IAAI,QAAA,EAAU,CAAA,GAAK,CAAA,CAAoD,EAAA,CAAG,aAAa,QAAQ,CAAA;AAE/F,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,KAAA,MAAW,CAAC,KAAK,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AACvD,UAAA,CAAA,GAAK,CAAA,CAAgD,EAAA,CAAG,GAAA,EAAK,GAAG,CAAA;AAAA,QAClE;AAAA,MACF;AAGA,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,KAAA,MAAW,CAAC,KAAK,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACtD,UAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,EAAA,EAAI;AAC/B,UAAA,MAAM,GAAA,GAAM,SAAA,GAAY,GAAG,CAAA,IAAK,aAAa,GAAG,CAAA;AAChD,UAAA,CAAA,GAAK,CAAA,CAAiD,EAAA,CAAG,GAAA,EAAK,GAAG,CAAA;AAAA,QACnE;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,MAAA,IAAU,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACzC,QAAA,MAAM,IAAA,GAAO,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA,CAAA;AAC7B,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,CAAC,QAAQ,CAAA,EAAG,YAAA,CAAa,GAAG,CAAC,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AACvF,QAAA,CAAA,GAAK,CAAA,CAAqC,GAAG,QAAQ,CAAA;AAAA,MACvD;AAEA,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,CAAA,GAAK,CAAA,CACF,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,KAAA,CAAM,OAAA,KAAY,MAAA,EAAQ,CAAA;AAAA,MAC9E,CAAA,MAAO;AACL,QAAA,CAAA,GAAK,EACF,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,OAAO,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,EAAA;AACnC,MAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,CAAA,IAAK,QAAA;AAC1B,MAAA,CAAA,GAAK,CAAA,CAAmD,KAAA,CAAM,IAAA,EAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AAEvF,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,KAAU,MAAM,CAAA;AACrC,MAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,MAAA,OAAO;AAAA,QACL,IAAA,EAAA,CAAO,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAQ,MAAA,CAAU,GAAA,EAAK,SAAS,CAAC,CAAA;AAAA,QACzD,OAAO,KAAA,IAAS;AAAA,OAClB;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,EAAiC,SAAS,CAAA;AAChE,MAAA,MAAM,WAAWA,gBAAAA,EAAgB;AACjC,MAAA,IAAI,QAAA,EAAU,GAAA,CAAI,WAAW,CAAA,GAAI,QAAA;AACjC,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,KAAA,MAAW,CAAC,KAAK,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AACxD,UAAA,IAAI,IAAI,GAAG,CAAA,KAAM,MAAA,EAAW,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA;AAAA,QACzC;AAAA,MACF;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM,GAAK,MAAO,SAAA,EAAU,CAAE,IAAA,CAAK,KAAK,EAE5D,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,GAAS,MAAA,EAAO;AAE/B,MAAA,IAAI,OAAO,MAAM,KAAA;AACjB,MAAA,OAAO,MAAA,CAAU,SAAU,SAAS,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAI,IAAA,EAAM;AACrB,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,EAAiC,SAAS,CAAA;AAChE,MAAA,MAAM,EAAE,MAAM,OAAA,EAAS,KAAA,KAAW,MAAO,SAAA,GAAY,IAAA,CAAK,KAAK,EAE5D,MAAA,CAAO,GAAG,EAAE,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CAAE,MAAA,GAAS,MAAA,EAAO;AAE5C,MAAA,IAAI,OAAO,MAAM,KAAA;AACjB,MAAA,OAAO,MAAA,CAAU,SAAU,SAAS,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAAI;AACf,MAAA,MAAM,EAAE,KAAA,EAAM,GAAK,MAAO,SAAA,EAAU,CAAE,IAAA,CAAK,KAAK,CAAA,CAE7C,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AACvB,MAAA,IAAI,OAAO,MAAM,KAAA;AAAA,IACnB;AAAA,GACF;AACF;;;AC1IA,SAAS,SAAS,KAAA,EAAyB;AACzC,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,UAAa,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAC/E,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,QAAQ,CAAA;AACnD,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA,CAAE,MAAK,EAAG;AACpE,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,QAAA,CAAU,KAAA,CAAkC,CAAC,CAAC,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,OAAO,MAAM,GAAA,CAAI,CAAC,CAAA,KAAO,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAC,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7F;AAMO,SAAS,iBAAiB,MAAA,EAAkC;AACjE,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,GAAA;AACzC,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,GAAA;AACzC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAwB;AAE5C,EAAA,SAAS,QAAA,GAAW;AAClB,IAAA,IAAI,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAEhC,IAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,IAAA,IAAI,YAAA,GAAe,QAAA;AACnB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,MAAA,IAAI,KAAA,CAAM,aAAa,YAAA,EAAc;AACnC,QAAA,YAAA,GAAe,KAAA,CAAM,UAAA;AACrB,QAAA,SAAA,GAAY,GAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO;AAAA,IACL,IAAO,GAAA,EAA4B;AACjC,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,MAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,QAAA,OAAA,CAAQ,OAAO,GAAG,CAAA;AAClB,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,KAAA,CAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,MAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACf,CAAA;AAAA,IAEA,GAAA,CAAO,GAAA,EAAa,IAAA,EAAS,GAAA,EAAoB;AAC/C,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,QACf,IAAA;AAAA,QACA,SAAA,EAAW,OAAO,GAAA,IAAO,UAAA,CAAA;AAAA,QACzB,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,QAAA,EAAS;AAAA,IACX,CAAA;AAAA,IAEA,WAAW,MAAA,EAAsB;AAC/B,MAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAChC,QAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,UAAA,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,KAAA,GAAc;AACZ,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAChB,CAAA;AAAA,IAEA,IAAA,GAAe;AACb,MAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,IACjB;AAAA,GACF;AACF;AAMO,IAAM,cAAc,gBAAA;AAIpB,SAAS,gBAAA,GAAyB;AACvC,EAAA,WAAA,CAAY,KAAA,EAAM;AACpB;;;AC/GA,IAAI,eAAA;AAEG,SAAS,kBAAkB,EAAA,EAA8B;AAC9D,EAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,IAAA,eAAA,GAAkB,EAAA;AAClB,IAAA,gBAAA,EAAiB;AAAA,EACnB;AACF;AAEO,SAAS,iBAAA,GAAwC;AACtD,EAAA,OAAO,eAAA;AACT;;;ACQA,IAAM,MAAA,GAAS,IAAA;AAOf,IAAM,KAAA,uBAAY,GAAA,EAAwB;AAE1C,SAAS,QAAA,CAAS,KAAA,EAAe,QAAA,EAAkB,IAAA,EAA0B,MAAA,EAAwB;AACnG,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,KAAK,KAAK,IAAA,IAAQ,EAAE,KAAK,MAAM,CAAA,CAAA;AACxD;AAEA,SAAS,eAAA,GAA0B;AACjC,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAY,EAAG,IAAI,QAAA,EAAS,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AACpE;AASA,IAAM,gBAAA,GAAmB,GAAA;AAMzB,eAAsB,aAAA,CAAc,KAAA,EAAe,OAAA,GAAgC,EAAC,EAAoB;AACtG,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,iBAAA,EAAkB;AACvD,EAAA,IAAI,CAAC,UAAU,OAAO,CAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,OAAA;AACjC,EAAA,MAAM,MAAM,QAAA,CAAS,KAAA,EAAO,QAAA,EAAU,OAAA,CAAQ,MAAM,MAAM,CAAA;AAE1D,EAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACzB,IAAA,IAAI,OAAO,GAAA,CAAI,OAAA,GAAU,KAAK,GAAA,EAAI,SAAU,GAAA,CAAI,KAAA;AAAA,EAClD;AAEA,EAAA,MAAM,SAAS,yBAAA,EAA0B;AASzC,EAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AAEpB,EAAA,IAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,OAAO,GAAA,EAAK,EAAE,KAAA,EAAO,OAAA,EAAS,MAAM,IAAA,EAAM,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAKnG,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,YAAA,EAAc,eAAA,EAAiB,CAAA;AAAA,EACnD;AAKA,EAAA,IAAI,KAAA;AACJ,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAyD,CAAC,OAAA,KAAY;AACxF,IAAA,KAAA,GAAQ,UAAA,CAAW,MAAM,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,CAAA,EAAG,gBAAgB,CAAA;AAAA,EACvG,CAAC,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,IACjC,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAE7B,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,OAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,CAAA,GAAI,KAAA,IAAS,CAAA;AAInC,EAAA,IAAI,CAAE,QAAgC,QAAA,EAAU;AAC9C,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,EAAE,KAAA,EAAO,SAAS,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,EAAQ,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,KAAA;AACT;AASO,SAAS,gBAAgB,WAAA,EAA4B;AAC1D,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA;AAAA,EACF;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,IAAA,EAAK,EAAG;AAC9B,IAAA,IAAI,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,EACjD;AACF;AChHO,IAAM,cAAA,GAAiB;AACvB,IAAM,0BAAA,GAA6B;AAE1C,IAAI,OAAA,GAA0B,IAAA;AAGvB,SAAS,kBAAA,GAA8B;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS,OAAA,GAAUC,uBAAA,CAAa,gBAAgB,0BAA0B,CAAA;AAC/E,EAAA,OAAO,OAAA;AACT;;;ACFA,SAAS,gBAAgB,MAAA,EAAoD;AAC3E,EAAA,MAAM,WAAW,MAAA,EAAQ,QAAA;AACzB,EAAA,OAAO,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,EAAS,GAAI,QAAA;AACvD;AAEA,eAAe,oBAAoB,MAAA,EAA6D;AAC9F,EAAA,MAAM,eAAe,MAAA,EAAQ,YAAA;AAC7B,EAAA,OAAO,OAAO,YAAA,KAAiB,UAAA,GAAa,YAAA,EAAa,GAAI,YAAA;AAC/D;AAEA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACjC;AAEA,SAAS,WAAA,CACP,KACA,KAAA,EACA,QAAA,EACA,iBAAiB,WAAA,EACjB,aAAA,GAA0B,EAAC,EACrB;AACN,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAC9C,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,aAAA,CAAc,CAAC,CAAA,EAAG;AACpC,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAA,EAAQ,aAAA,CAAc,CAAC,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,EAC1F;AACA,EAAA,IAAI,MAAM,MAAA,EAAQ,GAAA,CAAI,aAAa,GAAA,CAAI,YAAA,EAAc,MAAM,MAAM,CAAA;AACjE,EAAA,IAAI,MAAM,OAAA,EAAS,GAAA,CAAI,aAAa,GAAA,CAAI,eAAA,EAAiB,MAAM,OAAO,CAAA;AACtE,EAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,IAAA,EAAM,GAAA,CAAI,YAAA,CAAa,IAAI,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA;AACvE,EAAA,IAAI,KAAA,CAAM,QAAA,IAAY,IAAA,EAAM,GAAA,CAAI,YAAA,CAAa,IAAI,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChF,EAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAA,EAAQ,gBAAgB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,CAAA;AACtF,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,YAAA,CAAa,IAAI,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AACjF;AAEA,eAAe,cAAiB,QAAA,EAAgC;AAC9D,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACjD,IAAA,MAAM,IAAI,MAAM,CAAA,yCAAA,EAA4C,QAAA,CAAS,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,EAChH;AACA,EAAA,OAAO,SAAS,IAAA,EAAK;AACvB;AAEA,SAAS,iBAAiB,KAAA,EAAgD;AACxE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY;AAAA,IAClC,IAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,CAAE,SAAS,KAAK,CAAA;AAClB;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,iBAAiB,OAAA,EAAyD;AACjF,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,OAAO,MAAA,CAAO,QAAQ,OAAO,CAAA,CAAE,IAAI,CAAC,CAAC,MAAA,EAAQ,GAAG,CAAA,KAAM;AACpD,IAAA,IAAI,SAAS,GAAG,CAAA,IAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACnD,MAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAI,QAAA,EAAU,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,IAC5D;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,OAAO,GAAA,EAAI;AAAA,EAC9C,CAAC,CAAA;AACH;AAEO,SAAS,qBAAA,CACd,aAAA,EACA,MAAA,GAAgC,EAAC,EAChB;AACjB,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,KAAA;AAClC,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA;AACtD,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,aAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,IAAA;AAEpC,EAAA,eAAe,QAAQ,YAAA,EAA6C;AAClE,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAI,MAAA,CAAO,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,KAAY,EAAC;AAAA,MAC/C,GAAI,eAAe,EAAE,aAAA,EAAe,UAAU,YAAY,CAAA,CAAA,KAAO;AAAC,KACpE;AAAA,EACF;AAEA,EAAA,SAAS,YAAA,CAAa,UAAU,KAAA,EAAY;AAC1C,IAAA,MAAM,SAAS,OAAA,KAAY,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,kBAAA,CAAA;AACpF,IAAA,MAAM,gBAAA,GAAmB,kBAAA,CAAmB,SAAA,IAAa,SAAS,CAAA;AAClE,IAAA,MAAM,YAAA,GAAe,mBAAmB,KAAK,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,OAAA,GACV,CAAA,yBAAA,EAA4B,gBAAgB,CAAA,iBAAA,EAAoB,YAAY,CAAA,KAAA,CAAA,GAC5E,CAAA,cAAA,EAAiB,gBAAgB,CAAA,iBAAA,EAAoB,YAAY,CAAA,KAAA,CAAA;AACrE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACjC,IAAA,IAAI,OAAO,MAAA,EAAQ,GAAA,CAAI,aAAa,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC/D,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,SAAS,UAAA,CAAW,IAAA,EAA+B,OAAA,GAAU,KAAA,EAAgC;AAC3F,IAAA,IAAI,SAAS,OAAO,IAAA;AACpB,IAAA,MAAM,QAAA,GAAW,gBAAgB,MAAM,CAAA;AACvC,IAAA,IAAI,CAAC,QAAA,IAAY,MAAA,CAAO,cAAA,KAAmB,OAAO,OAAO,IAAA;AACzD,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,CAAC,OAAO,cAAA,IAAkB,WAAW,GAAG,QAAA,EAAS;AAAA,EACrE;AAEA,EAAA,SAAS,YAAY,EAAA,EAAqC;AACxD,IAAA,OAAO,EAAE,CAAC,QAAQ,GAAG,EAAA,EAAG;AAAA,EAC1B;AAEA,EAAA,eAAe,SAAS,KAAA,EAA0C;AAChE,IAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,CAAoB,MAAM,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,QAAQ,YAAY,CAAA;AACpC,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,WAAA;AAAA,MACE,GAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAW,MAAA,CAAO,cAAA,KAAmB,KAAA,GAAQ,MAAA,GAAY,gBAAgB,MAAM,CAAA;AAAA,MAC/E,OAAO,cAAA,IAAkB,MAAA;AAAA,MACzB,MAAA,CAAO;AAAA,KACT;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAA4C,MAAM,OAAA,CAAQ,GAAA,EAAK,EAAE,OAAA,EAAS,MAAM,OAAA,CAAQ,YAAY,CAAA,EAAG,CAAC,CAAA;AAC7H,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,EAClD;AAEA,EAAA,eAAe,2BAAA,CAA4B,EAAA,EAAY,OAAA,GAAU,KAAA,EAAsB;AACrF,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,MAAM,WAAW,MAAA,CAAO,cAAA,KAAmB,KAAA,GAAQ,MAAA,GAAY,gBAAgB,MAAM,CAAA;AACrF,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,EAAE,SAAS,EAAE,CAAC,QAAQ,GAAG,IAAG,EAAG,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA;AACnF,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,EAAE,CAAA,sCAAA,CAAwC,CAAA;AAAA,IACpF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAA0C;AACnD,MAAA,OAAO,SAAS,KAAK,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,CAAoB,MAAM,CAAA;AACrD,MAAA,MAAM,OAAA,GAAU,QAAQ,YAAY,CAAA;AACpC,MAAA,OAAO,aAAA,CAAiB,MAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,EAAG;AAAA,QAC3D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,MAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,QACnC,MAAM,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,IAAA,EAAiC,OAAO,CAAC;AAAA,OAC1E,CAAC,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAI,IAAA,EAAM;AACrB,MAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,CAAoB,MAAM,CAAA;AACrD,MAAA,MAAM,OAAA,GAAU,QAAQ,YAAY,CAAA;AACpC,MAAA,MAAM,2BAAA,CAA4B,IAAI,OAAO,CAAA;AAC7C,MAAA,OAAO,aAAA,CAAiB,MAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,EAAG;AAAA,QAC3D,MAAA,EAAQ,OAAA;AAAA,QACR,OAAA,EAAS,MAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,QACnC,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,aAAa,WAAA,CAAY,EAAE,CAAA,EAAG,IAAA,EAAM;AAAA,OAC5D,CAAC,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAAI;AACf,MAAA,MAAM,YAAA,GAAe,MAAM,mBAAA,CAAoB,MAAM,CAAA;AACrD,MAAA,MAAM,OAAA,GAAU,QAAQ,YAAY,CAAA;AACpC,MAAA,MAAM,2BAAA,CAA4B,IAAI,OAAO,CAAA;AAC7C,MAAA,MAAM,aAAA,CAAwC,MAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,EAAG;AAAA,QACjF,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS,MAAM,OAAA,CAAQ,YAAY,CAAA;AAAA,QACnC,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,CAAC,WAAA,CAAY,EAAE,CAAC,CAAA,EAAG;AAAA,OACjD,CAAC,CAAA;AAAA,IACJ;AAAA,GACF;AACF;;;ACpMO,SAAS,kBAAA,CACd,qBAAA,EACA,WAAA,GAAmB,EAAC,EACH;AACjB,EAAA,IAAI,KAAA,GAAQ,CAAC,GAAG,WAAW,CAAA;AAE3B,EAAA,MAAM,iBAAiB,KAAA,CAAM,OAAA,CAAQ,qBAAqB,CAAA,GACtD,qBAAA,GACA,sBAAsB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAE7E,EAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,qBAAqB,CAAA,GAAI,SAAY,qBAAA,CAAsB,WAAA;AAC7F,EAAA,MAAM,iBAAiB,KAAA,CAAM,OAAA,CAAQ,qBAAqB,CAAA,GAAI,KAAA,GAAS,sBAAsB,cAAA,IAAkB,KAAA;AAE/G,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAA0C;AACnD,MAAA,IAAI,QAAA,GAAW,CAAC,GAAG,KAAK,CAAA;AAExB,MAAA,IAAI,KAAA,CAAM,MAAA,IAAU,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC7C,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,WAAA,EAAY;AACtC,QAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,UAAO,CAAC,IAAA,KAC1B,cAAA,CAAe,IAAA,CAAK,CAAC,GAAA,KAAQ;AAC3B,YAAA,MAAM,GAAA,GAAM,KAAK,GAAG,CAAA;AACpB,YAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA;AAAA,UACnE,CAAC;AAAA,SACH;AAAA,MACF;AAGA,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,KAAA,MAAW,CAAC,KAAK,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACtD,UAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,EAAA,EAAI;AAC/B,UAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,GAAG,MAAM,GAAG,CAAA;AAAA,QACxD;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,WAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,cAAA;AACjC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,UAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAM,CAAA,IAAK,EAAA;AACxB,UAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAM,CAAA,IAAK,EAAA;AACxB,UAAA,MAAM,GAAA,GAAM,OAAO,EAAA,KAAO,QAAA,IAAY,OAAO,EAAA,KAAO,QAAA,GAChD,EAAA,GAAK,EAAA,GACL,OAAO,EAAE,CAAA,CAAE,aAAA,CAAc,MAAA,CAAO,EAAE,CAAC,CAAA;AACvC,UAAA,OAAO,OAAA,KAAY,MAAA,GAAS,CAAC,GAAA,GAAM,GAAA;AAAA,QACrC,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AACvB,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,EAAA;AACnC,MAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,IAAK,QAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,KAAA,EAAO,QAAQ,QAAQ,CAAA;AACnD,MAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,IACvB,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,GAAG,IAAA;AAAA,QACH,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,QAAA,EAAU,aAAA;AAAA,QACV,SAAA,EAAW,GAAA;AAAA,QACX,SAAA,EAAW;AAAA,OACb;AACA,MAAA,KAAA,CAAM,QAAQ,IAAI,CAAA;AAClB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAI,IAAA,EAAM;AACrB,MAAA,MAAM,MAAM,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC9C,MAAA,IAAI,QAAQ,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,EAAE,CAAA,CAAE,CAAA;AACtF,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI,EAAE,GAAG,MAAM,GAAG,CAAA,EAAG,GAAG,IAAA,EAAM,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,aAAY,EAAE;AAC3E,MAAA,OAAO,MAAM,GAAG,CAAA;AAAA,IAClB,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAAI;AACf,MAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,IACzC;AAAA,GACF;AACF;;;AC9EA,IAAM,QAAA,mBAAW,IAAI,GAAA,CAAqB,CAAC,QAAA,EAAU,YAAY,OAAA,EAAS,aAAA,EAAe,UAAA,EAAY,UAAU,CAAC,CAAA;AAEhH,IAAM,gBAAA,GAAiF;AAAA,EACrF,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,WAAA,EAAY;AAAA,EACjD,QAAA,EAAU,EAAE,KAAA,EAAO,YAAA,EAAc,UAAU,aAAA,EAAc;AAAA,EACzD,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,YAAA,EAAa;AAAA,EACrD,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,YAAA,EAAa;AAAA,EACrD,QAAA,EAAU,EAAE,KAAA,EAAO,WAAA,EAAa,UAAU,aAAA,EAAc;AAAA,EACxD,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,UAAA,EAAW;AAAA,EAC/C,WAAA,EAAa,EAAE,KAAA,EAAO,cAAA,EAAgB,UAAU,gBAAA,EAAiB;AAAA,EAEjE,QAAA,EAAU,EAAE,KAAA,EAAO,WAAA,EAAa,UAAU,aAAA;AAC5C,CAAA;AAEA,IAAM,iBAAA,GAA0D;AAAA,EAC9D,wBAAQ,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAS,iBAAA,EAAmB,YAAA,EAAc,iBAAiB,SAAA,EAAW,MAAA,EAAQ,SAAS,SAAA,EAAW,aAAA,EAAe,QAAQ,WAAA,EAAa,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,EAC5L,QAAA,kBAAU,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,WAAA,EAAa,UAAU,CAAC,CAAA;AAAA,EACvG,yBAAS,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,aAAA,EAAe,OAAO,OAAA,EAAS,MAAA,EAAQ,YAAY,MAAA,EAAQ,WAAA,EAAa,SAAS,WAAA,EAAa,QAAA,EAAU,aAAa,MAAA,EAAQ,UAAA,EAAY,aAAa,CAAC,CAAA;AAAA,EACjL,yBAAS,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,eAAe,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,kBAAA,EAAoB,aAAa,QAAA,EAAU,WAAA,EAAa,MAAA,EAAQ,UAAA,EAAY,aAAa,CAAC,CAAA;AAAA,EAChK,0BAAU,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,SAAS,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,OAAA,EAAS,WAAW,aAAA,EAAe,iBAAA,EAAmB,aAAa,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,EAC/J,uBAAO,IAAI,GAAA,CAAI,CAAC,kBAAA,EAAoB,QAAA,EAAU,YAAY,aAAA,EAAe,aAAA,EAAe,YAAY,UAAA,EAAY,KAAA,EAAO,SAAS,UAAA,EAAY,QAAA,EAAU,gBAAgB,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAC,CAAA;AAAA,EAClM,WAAA,kBAAa,IAAI,GAAA,CAAI,CAAC,YAAY,UAAA,EAAY,QAAA,EAAU,UAAA,EAAY,gBAAA,EAAkB,WAAA,EAAa,QAAA,EAAU,eAAA,EAAiB,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,EAElJ,QAAA,kBAAU,IAAI,GAAA,CAAI,CAAC,aAAA,EAAe,aAAA,EAAe,aAAA,EAAe,eAAA,EAAiB,WAAA,EAAa,SAAA,EAAW,WAAA,EAAa,UAAU,CAAC;AACnI,CAAA;AAEA,SAASC,cAAa,GAAA,EAAqB;AACzC,EAAA,OAAO,GAAA,CAAI,QAAQ,QAAA,EAAU,CAAC,MAAM,GAAA,GAAM,CAAA,CAAE,aAAa,CAAA;AAC3D;AAEA,SAASC,cAAa,GAAA,EAAqB;AACzC,EAAA,OAAO,GAAA,CAAI,QAAQ,WAAA,EAAa,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAC3D;AAEA,SAASC,QAAU,GAAA,EAAiC;AAClD,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAA,CAAOD,aAAAA,CAAa,GAAG,CAAC,CAAA,GAAI,KAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,wBACd,MAAA,EACiB;AACjB,EAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,MAAA,CAAO,SAAS,CAAA;AAC5C,EAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkB,MAAA,CAAO,SAAS,CAAA;AAC3D,EAAA,MAAM,EAAE,UAAS,GAAI,EAAA;AAErB,EAAA,SAAS,SAAA,GAAY;AACnB,IAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC9D,IAAA,OAAO,QAAA;AAAA,EACT;AAKA,EAAA,SAAS,UAAA,GAAa;AACpB,IAAA,OAAO,SAAA,EAAU;AAAA,EACnB;AAEA,EAAA,SAAS,YAAY,IAAA,EAAiH;AACpI,IAAA,MAAM,gBAAyC,EAAC;AAChD,IAAA,MAAM,cAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,IAAI,CAAC,MAAM,WAAA,EAAa,WAAA,EAAa,YAAY,QAAQ,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1E,MAAA,MAAM,QAAA,GAAWD,cAAa,GAAG,CAAA;AACjC,MAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAClC,QAAA,aAAA,CAAc,QAAQ,CAAA,GAAI,KAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,QAAQ,CAAA,GAAI,KAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,OAAO,EAAE,eAAe,WAAA,EAAY;AAAA,EACtC;AAGA,EAAA,MAAM,QAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,WAAA;AAAA,IACT,aAAA,EAAe;AAAA,GACjB;AACA,EAAA,MAAM,WAAW,QAAA,CAAS,MAAA,CAAO,YAAY,CAAA,IAAK,CAAA,EAAA,EAAK,OAAO,YAAY,CAAA,CAAA;AAO1E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,KAAiB,EAAA,CAAG,KAAA;AAE1C,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAA0C;AACnD,MAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAS;AACjC,MAAA,IAAI,CAAC,UAAU,OAAO,EAAE,MAAM,EAAC,EAAG,OAAO,CAAA,EAAE;AAI3C,MAAA,IAAI,CAAA,GAAI,MAAA,GACJ,UAAA,EAAW,CAAE,KAAK,EAAA,CAAG,KAAK,CAAA,CAAE,MAAA,CAAO,GAAA,EAAK,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,GACpF,SAAA,EAAU,CAAE,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,CAAO,GAAA,EAAK,EAAE,OAAO,OAAA,EAAS,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAEvF,MAAA,IAAI,MAAA,IAAU,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5C,QAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,MAAA,EAAQ,MAAA,CAAO,aAAa,CAAA;AAAA,MACvC;AAGA,MAAA,IAAI,MAAM,MAAA,IAAU,MAAA,CAAO,iBAAiB,MAAA,CAAO,aAAA,CAAc,SAAS,CAAA,EAAG;AAC3E,QAAA,MAAM,IAAA,GAAO,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA,CAAA;AAC7B,QAAA,MAAM,YAAY,MAAA,CAAO,aAAA,CACtB,GAAA,CAAI,CAAC,QAAQA,aAAAA,CAAa,GAAG,CAAC,CAAA,CAC9B,IAAI,CAAC,GAAA,KAAQ,GAAG,GAAG,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AACtC,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QAC9B;AAAA,MACF;AAGA,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAMA,aAAAA,CAAa,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,KAAA,CAAM,OAAA,KAAY,MAAA,EAAQ,CAAA;AAAA,MACjF,CAAA,MAAO;AACL,QAAA,CAAA,GAAI,EAAE,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,OAAO,CAAA;AAAA,MAChD;AAGA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,EAAA;AACnC,MAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,CAAA,IAAK,QAAA;AAC1B,MAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AAErC,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,KAAU,MAAM,CAAA;AACrC,MAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,MAAA,MAAM,IAAA,GAAA,CAAQ,QAAQ,EAAC,EAAG,IAAI,CAAC,GAAA,KAAiCE,OAAAA,CAAU,GAAG,CAAC,CAAA;AAC9E,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA,EAAE;AAAA,IACzC,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAS;AACjC,MAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAEnD,MAAA,MAAM,EAAE,aAAA,EAAe,WAAA,EAAY,GAAI,YAAY,IAA+B,CAAA;AAGlF,MAAA,aAAA,CAAc,SAAA,GAAY,QAAA;AAC1B,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAClC,QAAA,aAAA,CAAc,OAAO,MAAA,CAAO,aAAA;AAAA,MAC9B;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,OAAO,cAAA,EAAe,GAAI,MAAM,UAAA,EAAW,CACpE,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,CACb,MAAA,CAAO,aAAa,CAAA,CACpB,MAAA,GACA,MAAA,EAAO;AAEV,MAAA,IAAI,gBAAgB,MAAM,cAAA;AAC1B,MAAA,MAAM,cAAe,YAAA,CAAqB,EAAA;AAI1C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,WAAA,CAAY,QAAQ,CAAA,GAAI,WAAA;AACxB,QAAA,WAAA,CAAY,SAAA,GAAY,QAAA;AAExB,QAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAa,GAAI,MAAM,SAAA,EAAU,CAC7C,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA,CACxB,MAAA,CAAO,WAAW,CAAA;AAErB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,UAAA,EAAW,CAAE,IAAA,CAAK,EAAA,CAAG,KAAK,EAAE,MAAA,EAAO,CAAE,EAAA,CAAG,IAAA,EAAM,WAAW,CAAA;AAC/D,UAAA,MAAM,YAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,IAAI,WAAA,EAAa,GAAG,cAAc,GAAI,MAAA,GAAS,EAAC,GAAI,WAAA,EAAa;AAAA,IAC5E,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAI,IAAA,EAAM;AACrB,MAAA,MAAM,EAAE,aAAA,EAAe,WAAA,EAAY,GAAI,YAAY,IAA+B,CAAA;AAElF,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACzC,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,YAAW,CAChC,IAAA,CAAK,EAAA,CAAG,KAAK,EACb,MAAA,CAAO,aAAa,CAAA,CACpB,EAAA,CAAG,MAAM,EAAE,CAAA;AACd,QAAA,IAAI,OAAO,MAAM,KAAA;AAAA,MACnB;AAEA,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,KAAK,WAAW,CAAA,CAAE,SAAS,CAAA,EAAG;AAClD,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,WAAU,CAC/B,IAAA,CAAK,MAAA,CAAO,YAAY,EACxB,MAAA,CAAO,WAAW,CAAA,CAClB,EAAA,CAAG,UAAU,EAAE,CAAA;AAClB,QAAA,IAAI,OAAO,MAAM,KAAA;AAAA,MACnB;AAGA,MAAA,MAAM,EAAE,IAAA,EAAM,YAAA,KAAiB,MAAM,UAAA,GAAa,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,GAAG,IAAA,EAAM,EAAE,EAAE,MAAA,EAAO;AACjG,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAOA,OAAAA,CAAU,EAAE,GAAG,YAAA,EAAc,IAA+B,CAAA;AAAA,MACrE;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,UAAA,KAAe,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,GAAG,QAAA,EAAU,EAAE,EAAE,MAAA,EAAO;AAE7G,MAAA,MAAM,OAAO,EAAE,GAAG,YAAA,EAAc,GAAG,YAAY,EAAA,EAAG;AAClD,MAAA,OAAQ,KAAa,QAAQ,CAAA;AAC7B,MAAA,OAAOA,QAAU,IAA+B,CAAA;AAAA,IAClD,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAAI;AACf,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,YAAW,CAChC,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,CACb,MAAA,EAAO,CACP,EAAA,CAAG,MAAM,EAAE,CAAA;AACd,MAAA,IAAI,OAAO,MAAM,KAAA;AAAA,IACnB;AAAA,GACF;AACF;;;ACnNO,SAAS,SAAA,CACd,UACA,OAAA,EACiB;AACjB,EAAA,SAAS,MAAA,GAAiB;AACxB,IAAA,OAAO,GAAG,OAAA,CAAQ,QAAA,MAAc,GAAG,CAAA,CAAA,EAAI,QAAQ,KAAK,CAAA,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAA0C;AACnD,MAAA,MAAM,MAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAA,EAAI,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAmB,GAAG,CAAA;AACjD,MAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACxC,MAAA,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,OAAA,CAAQ,GAAG,CAAA;AACxC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AACzC,MAAA,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA;AAC/B,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAI,IAAA,EAAM;AACrB,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,IAAI,IAAI,CAAA;AAC7C,MAAA,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA;AAC/B,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAAI;AACf,MAAA,MAAM,QAAA,CAAS,OAAO,EAAE,CAAA;AACxB,MAAA,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA;AAAA,IACjC;AAAA,GACF;AACF;;;AC9BO,SAAS,mBAAA,CACd,SAAA,EACA,QAAA,EACA,OAAA,GAAsC,EAAC,EACtB;AACjB,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AAExB,EAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAQ;AAChC,IAAA,OAAO,kBAAA,CAAmB,WAAW,QAAQ,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,OAAA,EAAS,aAAa,UAAA,EAAY;AACpC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,EAAM,KAAA,IAAS,SAAA,CAAU,IAAA;AACjD,IAAA,OAAO,sBAAyB,KAAA,EAAO;AAAA,MACrC,GAAG,OAAA,CAAQ,OAAA;AAAA,MACX,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,OAAA,IAAW,OAAA,CAAQ,GAAA;AAAA,MAC7C,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAS,SAAA,IAAa,OAAA,CAAQ,UAAA;AAAA,MACjD,SAAA,EAAW,UAAU,IAAA,IAAQ,KAAA;AAAA,MAC7B,KAAA;AAAA,MACA,MAAA,EAAQ,OAAA,CAAQ,OAAA,EAAS,MAAA,IAAU,UAAU,IAAA,EAAM,MAAA;AAAA,MACnD,UAAU,OAAA,CAAQ,OAAA,EAAS,QAAA,IAAY,SAAA,CAAU,MAAM,SAAA,EAAW,EAAA;AAAA,MAClE,eAAe,OAAA,CAAQ,OAAA,EAAS,iBAAiB,SAAA,CAAU,IAAA,EAAM,iBAAiB,SAAA,CAAU,MAAA,CACzF,OAAO,CAAC,KAAA,KAAU,MAAM,UAAU,CAAA,CAClC,IAAI,CAAC,KAAA,KAAU,MAAM,GAAG,CAAA;AAAA,MAC3B,cAAA,EAAgB,SAAA,CAAU,IAAA,EAAM,YAAA,KAAiB,KAAA,GAC7C,QACA,OAAA,CAAQ,OAAA,EAAS,cAAA,IAAkB,SAAA,CAAU,IAAA,EAAM,cAAA;AAAA,MACvD,QAAA,EAAU,OAAA,CAAQ,OAAA,EAAS,QAAA,KAAa,MAAM,iBAAA,EAAkB;AAAA,KACjE,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAA,EAAS,aAAa,QAAA,EAAU;AAClC,IAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,SAAA,GAAY,OAAA,CAAQ,eAAA,GAAkB,SAAS,CAAA,GAAI,MAAA;AACnE,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,OAAA,EAAS;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,SAAA,IAAa,SAAS,CAAA,oBAAA,CAAsB,CAAA;AAAA,IACvG;AACA,IAAA,OAAO,OAAA,CAAW,WAAW,QAAQ,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,SAAS,yBAAA,EAA0B;AAEzC,EAAA,IAAI,MAAA,IAAU,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO;AACnC,IAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,EAAkB;AAKzC,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,aAAA,GAClB,GAAG,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,SAAA,CAAU,IAAA,CAAK,aAAa,CAAA,CAAA,GACvD,UAAU,IAAA,CAAK,KAAA;AAAA,MACnB,QAAA;AAAA,MACA,GAAA,EAAK,UAAU,IAAA,CAAK;AAAA,KACtB;AAEA,IAAA,IAAI,SAAA,CAAU,KAAK,SAAA,IAAa,SAAA,CAAU,KAAK,aAAA,IAAiB,CAAC,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ;AACtF,MAAA,OAAO,UAAU,uBAAA,CAA2B;AAAA,QAC1C,SAAA,EAAW,UAAU,IAAA,CAAK,SAAA;AAAA,QAC1B,aAAA,EAAe,UAAU,IAAA,CAAK,aAAA;AAAA,QAC9B,YAAA,EAAc,UAAU,IAAA,CAAK,KAAA;AAAA,QAC7B,QAAA;AAAA,QACA,eAAe,SAAA,CAAU,IAAA,CAAK,aAAA,IAAiB,SAAA,CAAU,OACtD,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,UAAU,CAAA,CAClC,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,GAAG;AAAA,OAC5B,GAAG,YAAY,CAAA;AAAA,IAClB;AAEA,IAAA,OAAO,SAAA,CAAU,sBAAA,CAA0B,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO;AAAA,MAC/D,MAAA,EAAQ,UAAU,IAAA,CAAK,MAAA;AAAA,MACvB,QAAA,EAAU,SAAA,CAAU,IAAA,CAAK,YAAA,KAAiB,QAAQ,MAAA,GAAY,QAAA;AAAA,MAC9D,cAAA,EAAgB,UAAU,IAAA,CAAK,cAAA;AAAA,MAC/B,eAAe,SAAA,CAAU,IAAA,CAAK,aAAA,IAAiB,SAAA,CAAU,OACtD,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,UAAU,CAAA,CAClC,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,GAAG,CAAA;AAAA,MAC3B,aAAA,EAAe,UAAU,IAAA,CAAK,aAAA;AAAA,MAC9B,SAAA,EAAW,UAAU,IAAA,CAAK,SAAA;AAAA,MAC1B,OAAA,EAAS,UAAU,IAAA,CAAK,OAAA;AAAA,MACxB,QAAA,EAAU,UAAU,IAAA,CAAK;AAAA,KAC1B,GAAG,YAAY,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,SAAA,CAAU,MAAM,KAAA,EAAO;AACzB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,2DAAA,EAA8D,SAAA,CAAU,IAAI,CAAA,UAAA,EAAa,SAAA,CAAU,KAAK,KAAK,CAAA,mBAAA,EAC1F,MAAA,GAAS,WAAA,GAAc,iBAAiB,CAAA,CAAA;AAAA,KAC7D;AAAA,EACF;AACA,EAAA,OAAO,kBAAA,CAAmB,WAAW,QAAQ,CAAA;AAC/C","file":"chunk-CYAWDW44.cjs","sourcesContent":["import type { DataProvider, CrudQuery, CrudResult } from './types'\n\nexport interface SupabaseProviderConfig {\n schema?: string\n tenantId?: string | (() => string | undefined)\n tenantIdColumn?: string\n searchColumns?: string[]\n selectColumns?: string\n columnMap?: Record<string, string>\n filters?: Record<string, string>\n defaults?: Record<string, unknown>\n supabaseClient?: unknown\n}\n\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\n\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase())\n}\n\nfunction mapRow<T>(row: Record<string, unknown>, columnMap?: Record<string, string>): T {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(row)) {\n const camelKey = columnMap?.[key] ?? snakeToCamel(key)\n result[camelKey] = value\n }\n return result as T\n}\n\nfunction mapEntity(entity: Record<string, unknown>, columnMap?: Record<string, string>): Record<string, unknown> {\n const reverseMap: Record<string, string> = {}\n if (columnMap) {\n for (const [snake, camel] of Object.entries(columnMap)) {\n reverseMap[camel] = snake\n }\n }\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(entity)) {\n if (key === 'id' || key === 'createdAt' || key === 'updatedAt' || key === 'tenantId') continue\n const snakeKey = reverseMap[key] ?? camelToSnake(key)\n result[snakeKey] = value\n }\n return result\n}\n\n// Global Supabase client registry — set once via createFayzApp\nlet _globalSupabaseClient: unknown | null = null\n\nexport function setGlobalSupabaseClient(client: unknown): void {\n _globalSupabaseClient = client\n}\n\nexport function getSupabaseClientOptional(): unknown | null {\n return _globalSupabaseClient\n}\n\nexport function createSupabaseProvider<T extends { id: string }>(\n table: string,\n config?: SupabaseProviderConfig,\n): DataProvider<T> {\n const schema = config?.schema ?? 'public'\n const tenantIdCol = config?.tenantIdColumn ?? 'tenant_id'\n const searchCols = config?.searchColumns ?? []\n const selectCols = config?.selectColumns ?? '*'\n const columnMap = config?.columnMap\n\n function resolveTenantId(): string | undefined {\n if (!config?.tenantId) return undefined\n return typeof config.tenantId === 'function' ? config.tenantId() : config.tenantId\n }\n\n function getClient() {\n const supabase = (config?.supabaseClient ?? _globalSupabaseClient) as {\n schema: (s: string) => unknown\n from: (t: string) => unknown\n } | null\n if (!supabase) throw new Error(`[@fayz-ai/core] Supabase client not available. Call createFayzApp with a provider first.`)\n return schema === 'public' ? (supabase as { from: (t: string) => unknown }) : (supabase.schema(schema) as { from: (t: string) => unknown })\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n let q = (getClient().from(table) as { select: (...args: unknown[]) => unknown })\n .select(selectCols, { count: 'exact' }) as Record<string, unknown>\n\n const tenantId = resolveTenantId()\n if (tenantId) q = (q as { eq: (col: string, val: string) => unknown }).eq(tenantIdCol, tenantId) as Record<string, unknown>\n\n if (config?.filters) {\n for (const [col, val] of Object.entries(config.filters)) {\n q = (q as { eq: (c: string, v: string) => unknown }).eq(col, val) as Record<string, unknown>\n }\n }\n\n // Faceted / dynamic filters from the query (equality, mapped to columns).\n if (query.filters) {\n for (const [key, val] of Object.entries(query.filters)) {\n if (val == null || val === '') continue\n const col = columnMap?.[key] ?? camelToSnake(key)\n q = (q as { eq: (c: string, v: unknown) => unknown }).eq(col, val) as Record<string, unknown>\n }\n }\n\n if (query.search && searchCols.length > 0) {\n const term = `%${query.search}%`\n const orClause = searchCols.map((col) => `${camelToSnake(col)}.ilike.${term}`).join(',')\n q = (q as { or: (c: string) => unknown }).or(orClause) as Record<string, unknown>\n }\n\n if (query.sortBy) {\n q = (q as { order: (col: string, opts: unknown) => unknown })\n .order(camelToSnake(query.sortBy), { ascending: query.sortDir !== 'desc' }) as Record<string, unknown>\n } else {\n q = (q as { order: (col: string, opts: unknown) => unknown })\n .order('created_at', { ascending: false }) as Record<string, unknown>\n }\n\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n const from = (page - 1) * pageSize\n q = (q as { range: (f: number, t: number) => unknown }).range(from, from + pageSize - 1) as Record<string, unknown>\n\n const { data, error, count } = await q as { data: Record<string, unknown>[] | null; error: unknown; count: number | null }\n if (error) throw error\n\n return {\n data: (data ?? []).map((row) => mapRow<T>(row, columnMap)),\n total: count ?? 0,\n }\n },\n\n async create(data) {\n const row = mapEntity(data as Record<string, unknown>, columnMap)\n const tenantId = resolveTenantId()\n if (tenantId) row[tenantIdCol] = tenantId\n if (config?.defaults) {\n for (const [col, val] of Object.entries(config.defaults)) {\n if (row[col] === undefined) row[col] = val\n }\n }\n\n const { data: created, error } = (await (getClient().from(table) as {\n insert: (r: unknown) => { select: () => { single: () => Promise<{ data: unknown; error: unknown }> } }\n }).insert(row).select().single()) as { data: Record<string, unknown> | null; error: unknown }\n\n if (error) throw error\n return mapRow<T>(created!, columnMap)\n },\n\n async update(id, data) {\n const row = mapEntity(data as Record<string, unknown>, columnMap)\n const { data: updated, error } = (await (getClient().from(table) as {\n update: (r: unknown) => { eq: (c: string, v: string) => { select: () => { single: () => Promise<{ data: unknown; error: unknown }> } } }\n }).update(row).eq('id', id).select().single()) as { data: Record<string, unknown> | null; error: unknown }\n\n if (error) throw error\n return mapRow<T>(updated!, columnMap)\n },\n\n async remove(id) {\n const { error } = (await (getClient().from(table) as {\n delete: () => { eq: (c: string, v: string) => Promise<{ error: unknown }> }\n }).delete().eq('id', id)) as { error: unknown }\n if (error) throw error\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface CacheEntry<T = unknown> {\n data: T\n expiresAt: number\n lastAccess: number\n}\n\nexport interface CacheStore {\n get<T>(key: string): T | undefined\n set<T>(key: string, data: T, ttl?: number): void\n /** Clear all entries whose key starts with `prefix` */\n invalidate(prefix: string): void\n clear(): void\n size(): number\n}\n\nexport interface CacheConfig {\n /** Default time-to-live in ms (default: 60 000 — 1 minute) */\n defaultTTL?: number\n /** Maximum cached entries before LRU eviction (default: 500) */\n maxEntries?: number\n}\n\n// ---------------------------------------------------------------------------\n// Stable key helper — deterministic JSON for cache keys\n// ---------------------------------------------------------------------------\n\nfunction sortDeep(value: unknown): unknown {\n if (value === null || value === undefined || typeof value !== 'object') return value\n if (Array.isArray(value)) return value.map(sortDeep)\n const sorted: Record<string, unknown> = {}\n for (const k of Object.keys(value as Record<string, unknown>).sort()) {\n sorted[k] = sortDeep((value as Record<string, unknown>)[k])\n }\n return sorted\n}\n\nexport function stableKey(...parts: unknown[]): string {\n return parts.map((p) => (typeof p === 'string' ? p : JSON.stringify(sortDeep(p)))).join(':')\n}\n\n// ---------------------------------------------------------------------------\n// CacheStore implementation\n// ---------------------------------------------------------------------------\n\nexport function createCacheStore(config?: CacheConfig): CacheStore {\n const defaultTTL = config?.defaultTTL ?? 60_000\n const maxEntries = config?.maxEntries ?? 500\n const entries = new Map<string, CacheEntry>()\n\n function evictLRU() {\n if (entries.size <= maxEntries) return\n // Find the entry with the oldest lastAccess\n let oldestKey: string | null = null\n let oldestAccess = Infinity\n for (const [key, entry] of entries) {\n if (entry.lastAccess < oldestAccess) {\n oldestAccess = entry.lastAccess\n oldestKey = key\n }\n }\n if (oldestKey) entries.delete(oldestKey)\n }\n\n return {\n get<T>(key: string): T | undefined {\n const entry = entries.get(key)\n if (!entry) return undefined\n if (Date.now() > entry.expiresAt) {\n entries.delete(key)\n return undefined\n }\n entry.lastAccess = Date.now()\n return entry.data as T\n },\n\n set<T>(key: string, data: T, ttl?: number): void {\n const now = Date.now()\n entries.set(key, {\n data,\n expiresAt: now + (ttl ?? defaultTTL),\n lastAccess: now,\n })\n evictLRU()\n },\n\n invalidate(prefix: string): void {\n for (const key of entries.keys()) {\n if (key.startsWith(prefix)) {\n entries.delete(key)\n }\n }\n },\n\n clear(): void {\n entries.clear()\n },\n\n size(): number {\n return entries.size\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Global singleton — auto-flushes on tenant/org switch\n// ---------------------------------------------------------------------------\n\nexport const globalCache = createCacheStore()\n\n/** Flush the global cache — called by the tenant accessor when the active\n * tenant changes (replaces the old org-store subscription). */\nexport function clearGlobalCache(): void {\n globalCache.clear()\n}\n","// Active tenant context — a global accessor the data layer reads for tenant\n// scoping and cache keying. The host (saas shell / app) sets it from its org\n// store via setActiveTenantId; the data providers stay decoupled from any\n// specific org-store implementation (runtime DI).\nimport { clearGlobalCache } from '../lib/cache'\n\nlet _activeTenantId: string | undefined\n\nexport function setActiveTenantId(id: string | undefined): void {\n if (id !== _activeTenantId) {\n _activeTenantId = id\n clearGlobalCache()\n }\n}\n\nexport function getActiveTenantId(): string | undefined {\n return _activeTenantId\n}\n","import { getSupabaseClientOptional } from './supabase'\nimport { getActiveTenantId } from '../tenant'\n\n/**\n * Tenant-scoped row counter — the single cheap `count(*)` helper the access\n * engine uses to resolve quantity limits. Uses Supabase's `head:true` count so\n * no rows are transferred. Results are cached briefly per tenant+table+filter to\n * survive the burst of reads a page does (nav badge + gate + list), and can be\n * force-invalidated by creates via {@link invalidateCount}.\n *\n * MOCK MODE NEVER BLOCKS: with no global Supabase client the count is `0`, so\n * limits always read as \"well under cap\" — offline/demo apps stay fully usable.\n */\n\nexport interface CountByTenantOptions {\n /** Optional `kind` column filter for multi-kind tables. */\n kind?: string\n /** `'month'` counts rows created since the 1st of the current month; `'total'` (default) counts all. */\n period?: 'month' | 'total'\n /** Tenant override; defaults to the active tenant (getActiveTenantId). */\n tenantId?: string\n /** Skip the short-lived cache and hit the DB (used by fresh guard checks). */\n fresh?: boolean\n}\n\nconst TTL_MS = 15_000\n\ninterface CacheEntry {\n value: number\n expires: number\n}\n\nconst cache = new Map<string, CacheEntry>()\n\nfunction cacheKey(table: string, tenantId: string, kind: string | undefined, period: string): string {\n return `${tenantId}::${table}::${kind ?? ''}::${period}`\n}\n\nfunction startOfMonthISO(): string {\n const now = new Date()\n return new Date(now.getFullYear(), now.getMonth(), 1).toISOString()\n}\n\n/**\n * How long a usage count may take before we give up on it. Failing OPEN on an\n * error was always the policy (see below); a request that never settles is the\n * same failure with worse symptoms — a caller awaiting this (the create guards)\n * hangs forever, which reads to the user as a dead button. Observed on a cold\n * boot, where the query can be issued before the auth session is ready.\n */\nconst COUNT_TIMEOUT_MS = 5_000\n\n/**\n * Count rows in `table` for the given (or active) tenant.\n * Returns 0 when no Supabase client is registered (mock mode).\n */\nexport async function countByTenant(table: string, options: CountByTenantOptions = {}): Promise<number> {\n const tenantId = options.tenantId ?? getActiveTenantId()\n if (!tenantId) return 0\n\n const period = options.period ?? 'total'\n const key = cacheKey(table, tenantId, options.kind, period)\n\n if (!options.fresh) {\n const hit = cache.get(key)\n if (hit && hit.expires > Date.now()) return hit.value\n }\n\n const client = getSupabaseClientOptional() as {\n from: (t: string) => {\n select: (columns: string, opts: { count: 'exact'; head: true }) => {\n eq: (col: string, val: unknown) => unknown\n }\n }\n } | null\n\n // No client → mock/offline mode: never block.\n if (!client) return 0\n\n let query = client.from(table).select('*', { count: 'exact', head: true }).eq('tenant_id', tenantId) as {\n eq: (col: string, val: unknown) => unknown\n gte: (col: string, val: unknown) => unknown\n }\n\n if (options.kind) {\n query = query.eq('kind', options.kind) as typeof query\n }\n if (period === 'month') {\n query = query.gte('created_at', startOfMonthISO()) as typeof query\n }\n\n // On error OR timeout, fail OPEN (return 0) — a counting failure must never\n // wall a tenant out of their own product, and must never hang the UI awaiting\n // it. Enforcement's source of truth is the DB anyway.\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeout = new Promise<{ count: null; error: unknown; timedOut: true }>((resolve) => {\n timer = setTimeout(() => resolve({ count: null, error: 'timeout', timedOut: true }), COUNT_TIMEOUT_MS)\n })\n const settled = await Promise.race([\n query as unknown as Promise<{ count: number | null; error: unknown }>,\n timeout,\n ])\n if (timer) clearTimeout(timer)\n\n const { count, error } = settled\n const value = error ? 0 : count ?? 0\n\n // A timed-out count is not a fact about the tenant — caching it would make one\n // slow request suppress the guard for the whole TTL.\n if (!(settled as { timedOut?: true }).timedOut) {\n cache.set(key, { value, expires: Date.now() + TTL_MS })\n }\n return value\n}\n\n/**\n * Drop cached counts. Called by create handlers (via invalidateLimit) so the\n * next read reflects the row they just added.\n *\n * @param tenantOrKey Substring matched against cache keys (a tenant id, a table\n * name, or any fragment). Omit to clear the entire cache.\n */\nexport function invalidateCount(tenantOrKey?: string): void {\n if (!tenantOrKey) {\n cache.clear()\n return\n }\n for (const key of cache.keys()) {\n if (key.includes(tenantOrKey)) cache.delete(key)\n }\n}\n","// ---------------------------------------------------------------------------\n// Fayz Cloud — the shared multi-tenant Supabase project (\"FayzApi\") backing\n// Fayz-hosted modules (calendar, shop, …). Stripe-style default: the SDK\n// knows the product endpoint, apps only supply identity (tenantId).\n//\n// (Not to be confused with createFayzApiProvider in ./platform-api, which\n// talks to the fayz.ai builder's runtime CRUD API.)\n//\n// The key here is the PUBLISHABLE (anon) key — public by design: every anon\n// path goes through column-whitelisted views and SECURITY DEFINER RPCs with\n// server-side validation, and RLS isolates tenants. Apps that bring their own\n// backend override via setGlobalSupabaseClient (or a per-plugin dataProvider)\n// and never touch this client.\n// ---------------------------------------------------------------------------\nimport { createClient } from '@supabase/supabase-js'\n\n// TODO: flip to https://api.fayz.ai once the custom-domain SSL validates\n// (pending _acme-challenge TXT record as of 2026-07-14).\nexport const FAYZ_CLOUD_URL = 'https://yfxutrkyhydgltakbqle.supabase.co'\nexport const FAYZ_CLOUD_PUBLISHABLE_KEY = 'sb_publishable_v8rbvLDgnq5IbkVB5B6LxQ_D62mfPZX'\n\nlet _client: unknown | null = null\n\n/** Lazy singleton client for Fayz Cloud (the shared hosted backend). */\nexport function getFayzCloudClient(): unknown {\n if (!_client) _client = createClient(FAYZ_CLOUD_URL, FAYZ_CLOUD_PUBLISHABLE_KEY)\n return _client\n}\n","import type { CrudQuery, CrudResult, DataProvider } from './types'\n\ntype FayzApiFilterOperator = 'eq' | 'neq' | 'gt' | 'lt' | 'gte' | 'lte' | 'like' | 'ilike' | 'is_null' | 'is_not_null'\n\ninterface FayzApiTableFilter {\n column: string\n operator: FayzApiFilterOperator\n value?: unknown\n}\n\nexport interface FayzApiProviderConfig {\n baseUrl?: string\n projectId?: string\n tenantId?: string | (() => string | undefined)\n tenantIdColumn?: string | false\n entityKey?: string\n table?: string\n schema?: string\n idColumn?: string\n searchColumns?: string[]\n runtimeToken?: string | (() => string | undefined | Promise<string | undefined>)\n headers?: () => HeadersInit | Promise<HeadersInit>\n fetcher?: typeof fetch\n}\n\nfunction resolveTenantId(config?: FayzApiProviderConfig): string | undefined {\n const tenantId = config?.tenantId\n return typeof tenantId === 'function' ? tenantId() : tenantId\n}\n\nasync function resolveRuntimeToken(config?: FayzApiProviderConfig): Promise<string | undefined> {\n const runtimeToken = config?.runtimeToken\n return typeof runtimeToken === 'function' ? runtimeToken() : runtimeToken\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, '')\n}\n\nfunction appendQuery(\n url: URL,\n query: CrudQuery,\n tenantId?: string,\n tenantIdColumn = 'tenant_id',\n searchColumns: string[] = [],\n): void {\n const filters = normalizeFilters(query.filters)\n if (query.search && searchColumns[0]) {\n filters.push({ column: searchColumns[0], operator: 'ilike', value: `%${query.search}%` })\n }\n if (query.sortBy) url.searchParams.set('sortColumn', query.sortBy)\n if (query.sortDir) url.searchParams.set('sortDirection', query.sortDir)\n if (query.page != null) url.searchParams.set('page', String(query.page))\n if (query.pageSize != null) url.searchParams.set('limit', String(query.pageSize))\n if (tenantId) filters.push({ column: tenantIdColumn, operator: 'eq', value: tenantId })\n if (filters.length > 0) url.searchParams.set('filters', JSON.stringify(filters))\n}\n\nasync function parseResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const text = await response.text().catch(() => '')\n throw new Error(`[@fayz-ai/core] Fayz API request failed (${response.status}): ${text || response.statusText}`)\n }\n return response.json() as Promise<T>\n}\n\nfunction isFilterOperator(value: unknown): value is FayzApiFilterOperator {\n return typeof value === 'string' && [\n 'eq',\n 'neq',\n 'gt',\n 'lt',\n 'gte',\n 'lte',\n 'like',\n 'ilike',\n 'is_null',\n 'is_not_null',\n ].includes(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction normalizeFilters(filters?: Record<string, unknown>): FayzApiTableFilter[] {\n if (!filters) return []\n return Object.entries(filters).map(([column, raw]) => {\n if (isRecord(raw) && isFilterOperator(raw.operator)) {\n return { column, operator: raw.operator, value: raw.value }\n }\n return { column, operator: 'eq', value: raw }\n })\n}\n\nexport function createFayzApiProvider<T extends { id: string }>(\n entityOrTable: string,\n config: FayzApiProviderConfig = {},\n): DataProvider<T> {\n const fetcher = config.fetcher ?? fetch\n const baseUrl = trimTrailingSlash(config.baseUrl ?? '')\n const projectId = config.projectId\n const table = config.table ?? entityOrTable\n const idColumn = config.idColumn ?? 'id'\n\n async function headers(runtimeToken?: string): Promise<HeadersInit> {\n return {\n 'Content-Type': 'application/json',\n ...(config.headers ? await config.headers() : {}),\n ...(runtimeToken ? { Authorization: `Bearer ${runtimeToken}` } : {}),\n }\n }\n\n function tableRowsUrl(runtime = false): URL {\n const prefix = baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost')\n const encodedProjectId = encodeURIComponent(projectId ?? 'current')\n const encodedTable = encodeURIComponent(table)\n const route = runtime\n ? `/api/v1/runtime/projects/${encodedProjectId}/database/tables/${encodedTable}/rows`\n : `/api/projects/${encodedProjectId}/database/tables/${encodedTable}/rows`\n const url = new URL(route, prefix)\n if (config.schema) url.searchParams.set('schema', config.schema)\n return url\n }\n\n function withTenant(data: Record<string, unknown>, runtime = false): Record<string, unknown> {\n if (runtime) return data\n const tenantId = resolveTenantId(config)\n if (!tenantId || config.tenantIdColumn === false) return data\n return { ...data, [config.tenantIdColumn ?? 'tenant_id']: tenantId }\n }\n\n function primaryKeys(id: string): Record<string, unknown> {\n return { [idColumn]: id }\n }\n\n async function listRows(query: CrudQuery): Promise<CrudResult<T>> {\n const runtimeToken = await resolveRuntimeToken(config)\n const runtime = Boolean(runtimeToken)\n const url = tableRowsUrl(runtime)\n appendQuery(\n url,\n query,\n runtime || config.tenantIdColumn === false ? undefined : resolveTenantId(config),\n config.tenantIdColumn || undefined,\n config.searchColumns,\n )\n const result = await parseResponse<{ rows: T[]; total: number }>(await fetcher(url, { headers: await headers(runtimeToken) }))\n return { data: result.rows, total: result.total }\n }\n\n async function assertTenantScopedRowExists(id: string, runtime = false): Promise<void> {\n if (runtime) return\n const tenantId = config.tenantIdColumn === false ? undefined : resolveTenantId(config)\n if (!tenantId) return\n\n const result = await listRows({ filters: { [idColumn]: id }, page: 1, pageSize: 1 })\n if (result.data.length === 0) {\n throw new Error(`[@fayz-ai/core] Row \"${id}\" was not found for the active tenant.`)\n }\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n return listRows(query)\n },\n\n async create(data) {\n const runtimeToken = await resolveRuntimeToken(config)\n const runtime = Boolean(runtimeToken)\n return parseResponse<T>(await fetcher(tableRowsUrl(runtime), {\n method: 'POST',\n headers: await headers(runtimeToken),\n body: JSON.stringify(withTenant(data as Record<string, unknown>, runtime)),\n }))\n },\n\n async update(id, data) {\n const runtimeToken = await resolveRuntimeToken(config)\n const runtime = Boolean(runtimeToken)\n await assertTenantScopedRowExists(id, runtime)\n return parseResponse<T>(await fetcher(tableRowsUrl(runtime), {\n method: 'PATCH',\n headers: await headers(runtimeToken),\n body: JSON.stringify({ primaryKeys: primaryKeys(id), data }),\n }))\n },\n\n async remove(id) {\n const runtimeToken = await resolveRuntimeToken(config)\n const runtime = Boolean(runtimeToken)\n await assertTenantScopedRowExists(id, runtime)\n await parseResponse<{ deletedCount: number }>(await fetcher(tableRowsUrl(runtime), {\n method: 'DELETE',\n headers: await headers(runtimeToken),\n body: JSON.stringify({ rows: [primaryKeys(id)] }),\n }))\n },\n }\n}\n","import type { DataProvider, CrudQuery, CrudResult } from './types'\nimport type { EntityDef } from '../types/crud'\n\nexport function createMockProvider<T extends { id: string; [key: string]: unknown }>(\n entityDefOrSearchKeys: EntityDef<T> | string[],\n initialData: T[] = [],\n): DataProvider<T> {\n let items = [...initialData]\n\n const searchableKeys = Array.isArray(entityDefOrSearchKeys)\n ? entityDefOrSearchKeys\n : entityDefOrSearchKeys.fields.filter((f) => f.searchable).map((f) => f.key)\n\n const defaultSort = Array.isArray(entityDefOrSearchKeys) ? undefined : entityDefOrSearchKeys.defaultSort\n const defaultSortDir = Array.isArray(entityDefOrSearchKeys) ? 'asc' : (entityDefOrSearchKeys.defaultSortDir ?? 'asc')\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n let filtered = [...items]\n\n if (query.search && searchableKeys.length > 0) {\n const term = query.search.toLowerCase()\n filtered = filtered.filter((item) =>\n searchableKeys.some((key) => {\n const val = item[key]\n return typeof val === 'string' && val.toLowerCase().includes(term)\n }),\n )\n }\n\n // Faceted / dynamic filters (equality match per key).\n if (query.filters) {\n for (const [key, val] of Object.entries(query.filters)) {\n if (val == null || val === '') continue\n filtered = filtered.filter((item) => item[key] === val)\n }\n }\n\n const sortBy = query.sortBy ?? defaultSort\n const sortDir = query.sortDir ?? defaultSortDir\n if (sortBy) {\n filtered.sort((a, b) => {\n const av = a[sortBy] ?? ''\n const bv = b[sortBy] ?? ''\n const cmp = typeof av === 'number' && typeof bv === 'number'\n ? av - bv\n : String(av).localeCompare(String(bv))\n return sortDir === 'desc' ? -cmp : cmp\n })\n }\n\n const total = filtered.length\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n const start = (page - 1) * pageSize\n const data = filtered.slice(start, start + pageSize)\n return { data, total }\n },\n\n async create(data) {\n const now = new Date().toISOString()\n const item = {\n ...data,\n id: crypto.randomUUID(),\n tenantId: 'mock-tenant',\n createdAt: now,\n updatedAt: now,\n } as unknown as T\n items.unshift(item)\n return item\n },\n\n async update(id, data) {\n const idx = items.findIndex((i) => i.id === id)\n if (idx === -1) throw new Error(`[@fayz-ai/core] Mock provider: item not found: ${id}`)\n items[idx] = { ...items[idx], ...data, updatedAt: new Date().toISOString() }\n return items[idx]!\n },\n\n async remove(id) {\n items = items.filter((i) => i.id !== id)\n },\n }\n}\n","import type { DataProvider, CrudQuery, CrudResult } from './types'\nimport { getSupabaseClientOptional } from './supabase'\nimport type { EntityArchetype } from '../types/entities'\n\n// Archetypes that have a `kind` discriminator column\nconst HAS_KIND = new Set<EntityArchetype>(['person', 'category', 'order', 'transaction', 'schedule', 'location'])\n\nconst ARCHETYPE_CONFIG: Record<EntityArchetype, { table: string; fkColumn: string }> = {\n person: { table: 'people', fkColumn: 'person_id' },\n category: { table: 'categories', fkColumn: 'category_id' },\n product: { table: 'products', fkColumn: 'product_id' },\n service: { table: 'services', fkColumn: 'service_id' },\n location: { table: 'locations', fkColumn: 'location_id' },\n order: { table: 'orders', fkColumn: 'order_id' },\n transaction: { table: 'transactions', fkColumn: 'transaction_id' },\n\n schedule: { table: 'schedules', fkColumn: 'schedule_id' },\n}\n\nconst ARCHETYPE_COLUMNS: Record<EntityArchetype, Set<string>> = {\n person: new Set(['name', 'email', 'phone', 'document_number', 'avatar_url', 'date_of_birth', 'address', 'city', 'state', 'country', 'postal_code', 'tags', 'is_active', 'notes', 'metadata']),\n category: new Set(['name', 'slug', 'parent_id', 'icon', 'color', 'sort_order', 'is_active', 'metadata']),\n product: new Set(['name', 'description', 'sku', 'price', 'cost', 'currency', 'unit', 'image_url', 'stock', 'min_stock', 'status', 'is_active', 'tags', 'metadata', 'category_id']),\n service: new Set(['name', 'description', 'price', 'cost', 'currency', 'duration_minutes', 'image_url', 'status', 'is_active', 'tags', 'metadata', 'category_id']),\n location: new Set(['name', 'email', 'phone', 'address', 'city', 'state', 'country', 'postal_code', 'is_headquarters', 'is_active', 'tags', 'notes', 'metadata']),\n order: new Set(['reference_number', 'status', 'party_id', 'assignee_id', 'location_id', 'subtotal', 'discount', 'tax', 'total', 'currency', 'due_at', 'completed_at', 'notes', 'tags', 'metadata']),\n transaction: new Set(['order_id', 'party_id', 'amount', 'currency', 'payment_method', 'reference', 'status', 'transacted_at', 'notes', 'metadata']),\n\n schedule: new Set(['assignee_id', 'location_id', 'day_of_week', 'specific_date', 'starts_at', 'ends_at', 'is_active', 'metadata']),\n}\n\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\n\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction mapRow<T>(row: Record<string, unknown>): T {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(row)) {\n result[snakeToCamel(key)] = value\n }\n return result as T\n}\n\nexport interface ArchetypeProviderConfig {\n archetype: EntityArchetype\n archetypeKind: string\n projectTable: string\n tenantId: () => string | undefined\n searchColumns?: string[]\n}\n\nexport function createArchetypeProvider<T extends { id: string }>(\n config: ArchetypeProviderConfig,\n): DataProvider<T> {\n const ac = ARCHETYPE_CONFIG[config.archetype]\n const archetypeColumns = ARCHETYPE_COLUMNS[config.archetype]\n const { fkColumn } = ac\n\n function getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase client not available')\n return supabase\n }\n\n // Core v1 lives in PUBLIC — the archetype base tables and the public extension\n // tables share one client/schema. `coreClient()` is kept as a thin alias so the\n // core/extension split below still reads clearly at each call site.\n function coreClient() {\n return getClient()\n }\n\n function splitFields(data: Record<string, unknown>): { archetypeData: Record<string, unknown>; projectData: Record<string, unknown> } {\n const archetypeData: Record<string, unknown> = {}\n const projectData: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(data)) {\n if (['id', 'createdAt', 'updatedAt', 'tenantId', fkColumn].includes(key)) continue\n const snakeKey = camelToSnake(key)\n if (archetypeColumns.has(snakeKey)) {\n archetypeData[snakeKey] = value\n } else {\n projectData[snakeKey] = value\n }\n }\n return { archetypeData, projectData }\n }\n\n // View name convention: v_{shortName} — maps project table to its view\n const VIEW_MAP: Record<string, string> = {\n clients: 'v_clients',\n staff_members: 'v_staff',\n }\n const viewName = VIEW_MAP[config.projectTable] ?? `v_${config.projectTable}`\n\n // Pure-archetype entity: the project table IS the archetype base (e.g. a\n // customers list configured with `table: 'people'`, no separate public\n // extension table). Read/write public.<base> directly — there is no public\n // extension row and no v_ view to join. Extension-table entities (clients,\n // staff_members, …) are unaffected.\n const isPure = config.projectTable === ac.table\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n const tenantId = config.tenantId()\n if (!tenantId) return { data: [], total: 0 }\n\n // Pure archetype → read public.<base> directly (filtered by kind);\n // otherwise the v_ view (JOINs public extension with the public archetype).\n let q = isPure\n ? coreClient().from(ac.table).select('*', { count: 'exact' }).eq('tenant_id', tenantId)\n : getClient().from(viewName).select('*', { count: 'exact' }).eq('tenant_id', tenantId)\n\n if (isPure && HAS_KIND.has(config.archetype)) {\n q = q.eq('kind', config.archetypeKind)\n }\n\n // Search\n if (query.search && config.searchColumns && config.searchColumns.length > 0) {\n const term = `%${query.search}%`\n const orClauses = config.searchColumns\n .map((col) => camelToSnake(col))\n .map((col) => `${col}.ilike.${term}`)\n if (orClauses.length > 0) {\n q = q.or(orClauses.join(','))\n }\n }\n\n // Sort\n if (query.sortBy) {\n q = q.order(camelToSnake(query.sortBy), { ascending: query.sortDir !== 'desc' })\n } else {\n q = q.order('created_at', { ascending: false })\n }\n\n // Pagination\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n const from = (page - 1) * pageSize\n q = q.range(from, from + pageSize - 1)\n\n const { data, error, count } = await q\n if (error) throw error\n\n const rows = (data ?? []).map((row: Record<string, unknown>) => mapRow<T>(row))\n return { data: rows, total: count ?? 0 }\n },\n\n async create(data) {\n const tenantId = config.tenantId()\n if (!tenantId) throw new Error('No tenant selected')\n\n const { archetypeData, projectData } = splitFields(data as Record<string, unknown>)\n\n // 1. Insert into archetype table\n archetypeData.tenant_id = tenantId\n if (HAS_KIND.has(config.archetype)) {\n archetypeData.kind = config.archetypeKind\n }\n\n const { data: archetypeRow, error: archetypeError } = await coreClient()\n .from(ac.table)\n .insert(archetypeData)\n .select()\n .single()\n\n if (archetypeError) throw archetypeError\n const archetypeId = (archetypeRow as any).id\n\n // 2. Insert into project table with archetype FK as PK.\n // Pure-archetype entities have no extension table — skip this step.\n if (!isPure) {\n projectData[fkColumn] = archetypeId\n projectData.tenant_id = tenantId\n\n const { error: projectError } = await getClient()\n .from(config.projectTable)\n .insert(projectData)\n\n if (projectError) {\n await coreClient().from(ac.table).delete().eq('id', archetypeId)\n throw projectError\n }\n }\n\n return { id: archetypeId, ...archetypeRow, ...(isPure ? {} : projectData) } as unknown as T\n },\n\n async update(id, data) {\n const { archetypeData, projectData } = splitFields(data as Record<string, unknown>)\n\n if (Object.keys(archetypeData).length > 0) {\n const { error } = await coreClient()\n .from(ac.table)\n .update(archetypeData)\n .eq('id', id)\n if (error) throw error\n }\n\n if (!isPure && Object.keys(projectData).length > 0) {\n const { error } = await getClient()\n .from(config.projectTable)\n .update(projectData)\n .eq(fkColumn, id)\n if (error) throw error\n }\n\n // Re-fetch (archetype only for pure entities; otherwise join the extension)\n const { data: archetypeRow } = await coreClient().from(ac.table).select('*').eq('id', id).single()\n if (isPure) {\n return mapRow<T>({ ...archetypeRow, id } as Record<string, unknown>)\n }\n const { data: projectRow } = await getClient().from(config.projectTable).select('*').eq(fkColumn, id).single()\n\n const flat = { ...archetypeRow, ...projectRow, id }\n delete (flat as any)[fkColumn]\n return mapRow<T>(flat as Record<string, unknown>)\n },\n\n async remove(id) {\n const { error } = await coreClient()\n .from(ac.table)\n .delete()\n .eq('id', id)\n if (error) throw error\n },\n }\n}\n","import type { DataProvider, CrudQuery, CrudResult } from './types'\nimport { globalCache, stableKey } from '../lib/cache'\n\nexport interface ProviderCacheOptions {\n /** Table/entity name — used as cache key namespace */\n table: string\n /** Dynamic tenant ID resolver */\n tenantId: () => string | undefined\n /** Override default TTL for this entity (ms) */\n ttl?: number\n}\n\n/**\n * Wraps a DataProvider with transparent read caching + mutation invalidation.\n *\n * - `list()` results are cached by query params\n * - `create()`, `update()`, `remove()` invalidate all cached entries for the table\n */\nexport function withCache<T extends { id: string }>(\n provider: DataProvider<T>,\n options: ProviderCacheOptions,\n): DataProvider<T> {\n function prefix(): string {\n return `${options.tenantId() ?? '_'}:${options.table}`\n }\n\n return {\n async list(query: CrudQuery): Promise<CrudResult<T>> {\n const key = `${prefix()}:${stableKey(query)}`\n const cached = globalCache.get<CrudResult<T>>(key)\n if (cached) return cached\n\n const result = await provider.list(query)\n globalCache.set(key, result, options.ttl)\n return result\n },\n\n async create(data) {\n const result = await provider.create(data)\n globalCache.invalidate(prefix())\n return result\n },\n\n async update(id, data) {\n const result = await provider.update(id, data)\n globalCache.invalidate(prefix())\n return result\n },\n\n async remove(id) {\n await provider.remove(id)\n globalCache.invalidate(prefix())\n },\n }\n}\n","import type { EntityDef } from '../types/crud'\nimport type { BackendRef } from '../manifest'\nimport type { DataProvider } from './types'\nimport { getSupabaseClientOptional } from './supabase'\nimport { createSupabaseProvider } from './supabase'\nimport { createArchetypeProvider } from './archetype'\nimport { createMockProvider } from './mock'\nimport { createFayzApiProvider, type FayzApiProviderConfig } from './platform-api'\nimport { withCache } from './cached'\nimport { getActiveTenantId } from '../tenant'\n\n/**\n * Resolve the best data provider for an EntityDef.\n * Supabase → Archetype → Mock (in order of preference).\n *\n * Reusable by createCrudPage, PluginRegistryManager, or any component\n * that needs a DataProvider from an EntityDef.\n */\nexport interface ResolveDataProviderOptions {\n backend?: BackendRef\n fayzApi?: Omit<FayzApiProviderConfig, 'entityKey' | 'table'>\n customProviders?: Record<string, <T extends { id: string }>(entityDef: EntityDef<T>, mockData?: T[]) => DataProvider<T>>\n}\n\nexport function resolveDataProvider<T extends { id: string }>(\n entityDef: EntityDef<T>,\n mockData?: T[],\n options: ResolveDataProviderOptions = {},\n): DataProvider<T> {\n const backend = options.backend\n\n if (backend?.provider === 'mock') {\n return createMockProvider(entityDef, mockData)\n }\n\n if (backend?.provider === 'fayz-api') {\n const table = entityDef.data?.table ?? entityDef.name\n return createFayzApiProvider<T>(table, {\n ...options.fayzApi,\n baseUrl: options.fayzApi?.baseUrl ?? backend.url,\n projectId: options.fayzApi?.projectId ?? backend.projectRef,\n entityKey: entityDef.name ?? table,\n table,\n schema: options.fayzApi?.schema ?? entityDef.data?.schema,\n idColumn: options.fayzApi?.idColumn ?? entityDef.data?.columnMap?.id,\n searchColumns: options.fayzApi?.searchColumns ?? entityDef.data?.searchColumns ?? entityDef.fields\n .filter((field) => field.searchable)\n .map((field) => field.key),\n tenantIdColumn: entityDef.data?.tenantScoped === false\n ? false\n : options.fayzApi?.tenantIdColumn ?? entityDef.data?.tenantIdColumn,\n tenantId: options.fayzApi?.tenantId ?? (() => getActiveTenantId()),\n })\n }\n\n if (backend?.provider === 'custom') {\n const adapterId = backend.adapterId\n const factory = adapterId ? options.customProviders?.[adapterId] : undefined\n if (!adapterId || !factory) {\n throw new Error(`[@fayz-ai/core] Custom data provider \"${adapterId ?? 'unknown'}\" is not registered.`)\n }\n return factory<T>(entityDef, mockData)\n }\n\n const client = getSupabaseClientOptional()\n\n if (client && entityDef.data?.table) {\n const tenantId = () => getActiveTenantId()\n // Archetype entities share a physical table (e.g. people) across kinds\n // (student/teacher/staff…). The cache key must carry the kind or the first\n // kind's resultset is served to every sibling entity (teachers page\n // listing students).\n const cacheOptions = {\n table: entityDef.data.archetypeKind\n ? `${entityDef.data.table}#${entityDef.data.archetypeKind}`\n : entityDef.data.table,\n tenantId,\n ttl: entityDef.data.cacheTTL,\n }\n\n if (entityDef.data.archetype && entityDef.data.archetypeKind && !entityDef.data.schema) {\n return withCache(createArchetypeProvider<T>({\n archetype: entityDef.data.archetype,\n archetypeKind: entityDef.data.archetypeKind,\n projectTable: entityDef.data.table,\n tenantId,\n searchColumns: entityDef.data.searchColumns ?? entityDef.fields\n .filter((field) => field.searchable)\n .map((field) => field.key),\n }), cacheOptions)\n }\n\n return withCache(createSupabaseProvider<T>(entityDef.data.table, {\n schema: entityDef.data.schema,\n tenantId: entityDef.data.tenantScoped === false ? undefined : tenantId,\n tenantIdColumn: entityDef.data.tenantIdColumn,\n searchColumns: entityDef.data.searchColumns ?? entityDef.fields\n .filter((field) => field.searchable)\n .map((field) => field.key),\n selectColumns: entityDef.data.selectColumns,\n columnMap: entityDef.data.columnMap,\n filters: entityDef.data.filters,\n defaults: entityDef.data.defaults,\n }), cacheOptions)\n }\n\n if (entityDef.data?.table) {\n console.warn(\n `[fayz/core] resolveDataProvider: falling back to mock for \"${entityDef.name}\" (table: ${entityDef.data.table}). ` +\n `Supabase client ${client ? 'available' : 'NOT initialized'}.`,\n )\n }\n return createMockProvider(entityDef, mockData)\n}\n"]}
|
|
@@ -139,6 +139,7 @@ var shellTranslations = {
|
|
|
139
139
|
"crud.import.rowNumber": "Row {{row}}:",
|
|
140
140
|
"crud.import.toastSuccess": "{{count}} records imported",
|
|
141
141
|
"crud.import.noConnection": "Not connected to the database. Import requires an active connection.",
|
|
142
|
+
"crud.import.limitExceeded": "This import exceeds your plan limit. Upgrade or import fewer rows.",
|
|
142
143
|
"crud.export.action": "Export",
|
|
143
144
|
"crud.export.noData": "No data to export.",
|
|
144
145
|
"crud.export.toastSuccess": "{{count}} records exported",
|
|
@@ -201,6 +202,17 @@ var shellTranslations = {
|
|
|
201
202
|
"billing.title": "Billing",
|
|
202
203
|
"billing.subtitle": "Manage your subscription and billing.",
|
|
203
204
|
"billing.currentPlan": "Current Plan",
|
|
205
|
+
"billing.subscription.title": "Subscription",
|
|
206
|
+
"billing.subscription.subtitle": "Manage your plan and unlock more features.",
|
|
207
|
+
"billing.changeToPlan": "Switch to this plan",
|
|
208
|
+
"billing.featureMatrix": "Feature comparison",
|
|
209
|
+
"billing.changePlanConfirmTitle": "Change plan?",
|
|
210
|
+
"billing.changePlanConfirmBody": "You're switching to the {{plan}} plan.",
|
|
211
|
+
"billing.changePlanConfirm": "Switch plan",
|
|
212
|
+
"billing.planChanged": "You're now on the {{plan}} plan.",
|
|
213
|
+
"billing.planChangeFailed": "Couldn't change your plan. Please try again.",
|
|
214
|
+
"billing.noPlans": "No plans are configured.",
|
|
215
|
+
"billing.pro": "Pro",
|
|
204
216
|
"billing.upgrade": "Upgrade",
|
|
205
217
|
"billing.downgrade": "Downgrade",
|
|
206
218
|
"billing.monthly": "Monthly",
|
|
@@ -261,11 +273,67 @@ var shellTranslations = {
|
|
|
261
273
|
"organization.onboarding.failedCreate": "Failed to create workspace",
|
|
262
274
|
"settings.title": "Settings",
|
|
263
275
|
"settings.subtitle": "Manage your account and organization preferences.",
|
|
276
|
+
"settings.backToHome": "Back to home",
|
|
277
|
+
"settings.navLinks": "Settings links",
|
|
264
278
|
"settings.general": "General",
|
|
265
279
|
"settings.properties": "Properties",
|
|
266
280
|
"settings.profile": "Profile",
|
|
267
281
|
"settings.branding": "Branding",
|
|
268
282
|
"settings.security": "Security",
|
|
283
|
+
"settings.subscription": "Subscription",
|
|
284
|
+
"upgrade.title": "Premium feature",
|
|
285
|
+
"upgrade.description": "This feature is available on a higher plan. Upgrade to unlock it.",
|
|
286
|
+
"upgrade.descriptionFeature": "The {feature} feature is available on a higher plan. Upgrade to unlock it.",
|
|
287
|
+
// ContactPicker — shared "find the person, or create them" flow.
|
|
288
|
+
"contactPicker.search": "Search contact...",
|
|
289
|
+
"contactPicker.newContact": "New contact",
|
|
290
|
+
"contactPicker.name": "Name",
|
|
291
|
+
"contactPicker.phone": "Phone",
|
|
292
|
+
"contactPicker.emailOptional": "Email (optional)",
|
|
293
|
+
"contactPicker.create": "Create",
|
|
294
|
+
"contactPicker.creating": "Creating...",
|
|
295
|
+
"contactPicker.cancel": "Cancel",
|
|
296
|
+
"contactPicker.clear": "Clear contact",
|
|
297
|
+
"contactPicker.createFailed": "Could not create the contact",
|
|
298
|
+
"contactPicker.addField": "Add {label}",
|
|
299
|
+
"upgrade.includes": "Includes {feature}",
|
|
300
|
+
"upgrade.cta": "View plans",
|
|
301
|
+
"upgrade.badgeTooltip": "Available on a higher plan",
|
|
302
|
+
"upgrade.unlock": "Unlock {feature}",
|
|
303
|
+
"upgrade.currentPlan": "Your plan: {plan}",
|
|
304
|
+
"upgrade.recommended": "Recommended",
|
|
305
|
+
"upgrade.ctaUpgrade": "Upgrade",
|
|
306
|
+
"upgrade.ctaUpgradeTo": "Upgrade to {plan}",
|
|
307
|
+
"upgrade.compareAll": "Compare all plans",
|
|
308
|
+
"upgrade.valueGeneric": "Get everything you need to grow \u2014 included in the plans below.",
|
|
309
|
+
"upgrade.value.marketing": "Campaigns, funnel and content to grow your client base.",
|
|
310
|
+
"upgrade.value.reports": "Advanced reports and insights to make sharper decisions.",
|
|
311
|
+
"upgrade.value.fin_reconciliation": "Reconcile payments and keep your cash flow under control.",
|
|
312
|
+
"billing.unlimited": "Unlimited",
|
|
313
|
+
"billing.upTo": "Up to {count}",
|
|
314
|
+
"limit.label.clients": "clients",
|
|
315
|
+
"limit.label.users": "team members",
|
|
316
|
+
"limit.label.locations": "locations",
|
|
317
|
+
"limit.label.bookings_month": "monthly bookings",
|
|
318
|
+
"limit.label.products": "products",
|
|
319
|
+
"limit.label.students": "students",
|
|
320
|
+
"limit.label.courses": "courses",
|
|
321
|
+
"limit.label.contacts": "contacts",
|
|
322
|
+
"limit.label.deals": "deals",
|
|
323
|
+
"limit.label.menu_items": "menu items",
|
|
324
|
+
"limit.label.orders_month": "monthly orders",
|
|
325
|
+
"limit.label.connected_banks": "connected banks",
|
|
326
|
+
"limit.label.movements_month": "monthly movements",
|
|
327
|
+
"limit.label.leads": "leads",
|
|
328
|
+
"limit.label.quotes": "quotes",
|
|
329
|
+
"limit.label.conversations_month": "monthly conversations",
|
|
330
|
+
"limit.label.recipes": "recipes",
|
|
331
|
+
"limit.label.form_templates": "form templates",
|
|
332
|
+
"limit.label.documents_month": "monthly documents",
|
|
333
|
+
"limit.label.content_posts_month": "monthly content posts",
|
|
334
|
+
"limit.label.blog_posts": "blog posts",
|
|
335
|
+
"limit.reached": "Voc\xEA atingiu o limite de {label} do plano {plan}.",
|
|
336
|
+
"banner.overLimit": "Voc\xEA excedeu o limite de {label} do seu plano \u2014 fa\xE7a upgrade para continuar crescendo.",
|
|
269
337
|
"settings.team": "Team",
|
|
270
338
|
"settings.permissions": "Permissions",
|
|
271
339
|
"settings.locations": "Locations",
|
|
@@ -305,6 +373,10 @@ var shellTranslations = {
|
|
|
305
373
|
"app.notFound.goToDashboard": "Go to Dashboard",
|
|
306
374
|
"app.accessDenied.heading": "Access Denied",
|
|
307
375
|
"app.accessDenied.message": "You don't have permission to view this page.",
|
|
376
|
+
"shell.accessDenied.title": "Access restricted",
|
|
377
|
+
"shell.accessDenied.message": "You don't have permission to view this page.",
|
|
378
|
+
"organization.workspaces": "Workspaces",
|
|
379
|
+
"organization.onlyWorkspace": "This is your only workspace.",
|
|
308
380
|
"auth.login.enterCredentials": "Enter your credentials to access your account",
|
|
309
381
|
"auth.login.failedDefault": "Failed to sign in. Please try again.",
|
|
310
382
|
"auth.login.failedWithProvider": "Failed to sign in with {{provider}}.",
|
|
@@ -345,6 +417,17 @@ var shellTranslations = {
|
|
|
345
417
|
"chat.tryAsking": "Try asking",
|
|
346
418
|
"chat.fab.tryIt": "Try it",
|
|
347
419
|
"chat.messagePlaceholder": "Message...",
|
|
420
|
+
"chat.notConfigured": "Assistant not configured \u2014 set chat.apiEndpoint to enable conversations.",
|
|
421
|
+
"chat.confirmAction.title": "Confirm this action?",
|
|
422
|
+
"chat.confirmAction.confirm": "Confirm",
|
|
423
|
+
"chat.confirmAction.cancel": "Cancel",
|
|
424
|
+
"chat.confirmAction.blocked": "Respond to the confirmation above first",
|
|
425
|
+
"chat.signingIn": "One moment \u2014 still confirming your session.",
|
|
426
|
+
"chat.history": "Previous conversations",
|
|
427
|
+
"chat.newConversation": "New conversation",
|
|
428
|
+
"chat.untitledConversation": "Untitled conversation",
|
|
429
|
+
"chat.renameConversation": "Rename",
|
|
430
|
+
"chat.saveTitle": "Save title",
|
|
348
431
|
"chat.toolsAvailable": "{{count}} tools available",
|
|
349
432
|
"chat.suggestion.dashboard.kpi-summary.0": "How is my business doing today?",
|
|
350
433
|
"chat.suggestion.dashboard.kpi-summary.1": "What's my revenue today?",
|
|
@@ -588,6 +671,38 @@ var shellTranslations = {
|
|
|
588
671
|
"crud.archetype.activity.description": "View a chronological log of all actions, changes, and events related to this person.",
|
|
589
672
|
"crud.archetype.documents.title": "Documents",
|
|
590
673
|
"crud.archetype.documents.description": "Attach and manage files, contracts, certifications, and other documents for this person.",
|
|
674
|
+
"crud.archetype.addresses.add": "Add address",
|
|
675
|
+
"crud.archetype.addresses.addTitle": "New address",
|
|
676
|
+
"crud.archetype.addresses.editTitle": "Edit address",
|
|
677
|
+
"crud.archetype.addresses.formDescription": "Postal code, street and city are required; everything else is optional.",
|
|
678
|
+
"crud.archetype.addresses.emptyTitle": "No address on file",
|
|
679
|
+
"crud.archetype.addresses.emptyDescription": "Add where this person is delivered to, collected from, or billed at.",
|
|
680
|
+
"crud.archetype.addresses.fallbackLabel": "Address",
|
|
681
|
+
"crud.archetype.addresses.labelPlaceholder": "Home, Work\u2026",
|
|
682
|
+
"crud.archetype.addresses.default": "Default",
|
|
683
|
+
"crud.archetype.addresses.setDefault": "Use as the default address",
|
|
684
|
+
"crud.archetype.addresses.kind.both": "Shipping and billing",
|
|
685
|
+
"crud.archetype.addresses.kind.shipping": "Shipping",
|
|
686
|
+
"crud.archetype.addresses.kind.billing": "Billing",
|
|
687
|
+
"crud.archetype.addresses.field.label": "Label",
|
|
688
|
+
"crud.archetype.addresses.field.kind": "Use",
|
|
689
|
+
"crud.archetype.addresses.field.postalCode": "Postal code",
|
|
690
|
+
"crud.archetype.addresses.field.street": "Street",
|
|
691
|
+
"crud.archetype.addresses.field.number": "Number",
|
|
692
|
+
"crud.archetype.addresses.field.complement": "Complement",
|
|
693
|
+
"crud.archetype.addresses.field.district": "District",
|
|
694
|
+
"crud.archetype.addresses.field.city": "City",
|
|
695
|
+
"crud.archetype.addresses.field.state": "State",
|
|
696
|
+
"crud.archetype.addresses.field.recipient": "Recipient",
|
|
697
|
+
"crud.archetype.addresses.field.phone": "Phone",
|
|
698
|
+
"crud.archetype.addresses.created": "Address added",
|
|
699
|
+
"crud.archetype.addresses.updated": "Address updated",
|
|
700
|
+
"crud.archetype.addresses.deleted": "Address removed",
|
|
701
|
+
"crud.archetype.addresses.deleteTitle": "Remove this address?",
|
|
702
|
+
"crud.archetype.addresses.loadFailed": "Could not load the addresses.",
|
|
703
|
+
"crud.archetype.addresses.saveFailed": "Could not save the address.",
|
|
704
|
+
"crud.archetype.addresses.deleteFailed": "Could not remove the address.",
|
|
705
|
+
"crud.archetype.addresses.noTenant": "No active organization \u2014 reload the page and try again.",
|
|
591
706
|
"crud.archetype.schedule.title": "Schedule",
|
|
592
707
|
"crud.archetype.schedule.description": "View and manage appointments, shifts, and availability for this person.",
|
|
593
708
|
"crud.archetype.inventory.title": "Inventory & Stock",
|
|
@@ -860,6 +975,17 @@ var shellTranslations = {
|
|
|
860
975
|
"billing.title": "Faturamento",
|
|
861
976
|
"billing.subtitle": "Gerencie sua assinatura e faturamento.",
|
|
862
977
|
"billing.currentPlan": "Plano Atual",
|
|
978
|
+
"billing.subscription.title": "Assinatura",
|
|
979
|
+
"billing.subscription.subtitle": "Gerencie seu plano e desbloqueie mais recursos.",
|
|
980
|
+
"billing.changeToPlan": "Mudar para este plano",
|
|
981
|
+
"billing.featureMatrix": "Comparativo de recursos",
|
|
982
|
+
"billing.changePlanConfirmTitle": "Mudar de plano?",
|
|
983
|
+
"billing.changePlanConfirmBody": "Voc\xEA est\xE1 mudando para o plano {{plan}}.",
|
|
984
|
+
"billing.changePlanConfirm": "Mudar de plano",
|
|
985
|
+
"billing.planChanged": "Agora voc\xEA est\xE1 no plano {{plan}}.",
|
|
986
|
+
"billing.planChangeFailed": "N\xE3o foi poss\xEDvel mudar seu plano. Tente novamente.",
|
|
987
|
+
"billing.noPlans": "Nenhum plano configurado.",
|
|
988
|
+
"billing.pro": "Pro",
|
|
863
989
|
"billing.upgrade": "Fazer Upgrade",
|
|
864
990
|
"billing.downgrade": "Fazer Downgrade",
|
|
865
991
|
"billing.monthly": "Mensal",
|
|
@@ -917,11 +1043,65 @@ var shellTranslations = {
|
|
|
917
1043
|
"organization.onboarding.createWorkspace": "Criar Espa\xE7o de Trabalho",
|
|
918
1044
|
"settings.title": "Configura\xE7\xF5es",
|
|
919
1045
|
"settings.subtitle": "Gerencie sua conta e prefer\xEAncias da organiza\xE7\xE3o.",
|
|
1046
|
+
"settings.backToHome": "Voltar para o in\xEDcio",
|
|
1047
|
+
"settings.navLinks": "Links de configura\xE7\xE3o",
|
|
920
1048
|
"settings.general": "Geral",
|
|
921
1049
|
"settings.properties": "Propriedades",
|
|
922
1050
|
"settings.profile": "Perfil",
|
|
923
1051
|
"settings.branding": "Marca",
|
|
924
1052
|
"settings.security": "Seguran\xE7a",
|
|
1053
|
+
"settings.subscription": "Assinatura",
|
|
1054
|
+
"upgrade.title": "Recurso premium",
|
|
1055
|
+
"upgrade.description": "Este recurso est\xE1 dispon\xEDvel em um plano superior. Fa\xE7a upgrade para liber\xE1-lo.",
|
|
1056
|
+
"upgrade.descriptionFeature": "O recurso {feature} est\xE1 dispon\xEDvel em um plano superior. Fa\xE7a upgrade para liber\xE1-lo.",
|
|
1057
|
+
// ContactPicker — busca-ou-cadastra compartilhado.
|
|
1058
|
+
"contactPicker.search": "Buscar contato...",
|
|
1059
|
+
"contactPicker.newContact": "Novo contato",
|
|
1060
|
+
"contactPicker.name": "Nome",
|
|
1061
|
+
"contactPicker.phone": "Telefone",
|
|
1062
|
+
"contactPicker.emailOptional": "E-mail (opcional)",
|
|
1063
|
+
"contactPicker.create": "Cadastrar",
|
|
1064
|
+
"contactPicker.creating": "Cadastrando...",
|
|
1065
|
+
"contactPicker.cancel": "Cancelar",
|
|
1066
|
+
"contactPicker.clear": "Remover contato",
|
|
1067
|
+
"contactPicker.createFailed": "N\xE3o foi poss\xEDvel cadastrar o contato",
|
|
1068
|
+
"contactPicker.addField": "Adicionar {label}",
|
|
1069
|
+
"upgrade.includes": "Inclui {feature}",
|
|
1070
|
+
"upgrade.cta": "Ver planos",
|
|
1071
|
+
"upgrade.badgeTooltip": "Dispon\xEDvel em um plano superior",
|
|
1072
|
+
"upgrade.unlock": "Desbloqueie {feature}",
|
|
1073
|
+
"upgrade.currentPlan": "Seu plano: {plan}",
|
|
1074
|
+
"upgrade.recommended": "Recomendado",
|
|
1075
|
+
"upgrade.ctaUpgrade": "Fazer upgrade",
|
|
1076
|
+
"upgrade.ctaUpgradeTo": "Fazer upgrade para {plan}",
|
|
1077
|
+
"upgrade.compareAll": "Comparar todos os planos",
|
|
1078
|
+
"upgrade.valueGeneric": "Tudo o que voc\xEA precisa para crescer \u2014 incluso nos planos abaixo.",
|
|
1079
|
+
"upgrade.value.marketing": "Campanhas, funil e conte\xFAdo para crescer sua base de clientes.",
|
|
1080
|
+
"upgrade.value.reports": "Relat\xF3rios avan\xE7ados e insights para decidir com mais precis\xE3o.",
|
|
1081
|
+
"upgrade.value.fin_reconciliation": "Concilie pagamentos e mantenha seu fluxo de caixa sob controle.",
|
|
1082
|
+
"billing.unlimited": "Ilimitado",
|
|
1083
|
+
"billing.upTo": "At\xE9 {count}",
|
|
1084
|
+
"limit.label.clients": "clientes",
|
|
1085
|
+
"limit.label.users": "membros da equipe",
|
|
1086
|
+
"limit.label.locations": "locais",
|
|
1087
|
+
"limit.label.bookings_month": "agendamentos mensais",
|
|
1088
|
+
"limit.label.leads": "leads",
|
|
1089
|
+
"limit.label.quotes": "or\xE7amentos",
|
|
1090
|
+
"limit.label.conversations_month": "conversas mensais",
|
|
1091
|
+
"limit.label.recipes": "receitas",
|
|
1092
|
+
"limit.label.form_templates": "modelos de formul\xE1rio",
|
|
1093
|
+
"limit.label.documents_month": "documentos mensais",
|
|
1094
|
+
"limit.label.content_posts_month": "posts de conte\xFAdo mensais",
|
|
1095
|
+
"limit.label.blog_posts": "posts de blog",
|
|
1096
|
+
"limit.label.products": "produtos",
|
|
1097
|
+
"limit.label.students": "alunos",
|
|
1098
|
+
"limit.label.courses": "cursos",
|
|
1099
|
+
"limit.label.contacts": "contatos",
|
|
1100
|
+
"limit.label.deals": "neg\xF3cios",
|
|
1101
|
+
"limit.label.menu_items": "itens do card\xE1pio",
|
|
1102
|
+
"limit.label.orders_month": "pedidos mensais",
|
|
1103
|
+
"limit.label.connected_banks": "bancos conectados",
|
|
1104
|
+
"limit.label.movements_month": "movimenta\xE7\xF5es mensais",
|
|
925
1105
|
"settings.team": "Equipe",
|
|
926
1106
|
"settings.permissions": "Permiss\xF5es",
|
|
927
1107
|
"settings.locations": "Locais",
|
|
@@ -954,6 +1134,10 @@ var shellTranslations = {
|
|
|
954
1134
|
"app.notFound.goToDashboard": "Ir para o Painel",
|
|
955
1135
|
"app.accessDenied.heading": "Acesso Negado",
|
|
956
1136
|
"app.accessDenied.message": "Voc\xEA n\xE3o tem permiss\xE3o para acessar esta p\xE1gina.",
|
|
1137
|
+
"shell.accessDenied.title": "Acesso restrito",
|
|
1138
|
+
"shell.accessDenied.message": "Voc\xEA n\xE3o tem permiss\xE3o para acessar esta p\xE1gina.",
|
|
1139
|
+
"organization.workspaces": "\xC1reas de trabalho",
|
|
1140
|
+
"organization.onlyWorkspace": "Esta \xE9 a sua \xFAnica \xE1rea de trabalho.",
|
|
957
1141
|
"crud.form.requiredIndicator": "*",
|
|
958
1142
|
"crud.form.createDescription": "Criar um(a) novo(a) {{entity}}.",
|
|
959
1143
|
"crud.form.editDescription": "Atualizar detalhes de {{entity}}.",
|
|
@@ -995,6 +1179,7 @@ var shellTranslations = {
|
|
|
995
1179
|
"crud.import.rowNumber": "Linha {{row}}:",
|
|
996
1180
|
"crud.import.toastSuccess": "{{count}} registros importados",
|
|
997
1181
|
"crud.import.noConnection": "Sem conex\xE3o com o banco de dados. A importa\xE7\xE3o requer uma conex\xE3o ativa.",
|
|
1182
|
+
"crud.import.limitExceeded": "Esta importa\xE7\xE3o excede o limite do seu plano. Fa\xE7a upgrade ou importe menos linhas.",
|
|
998
1183
|
"crud.export.action": "Exportar",
|
|
999
1184
|
"crud.export.noData": "Sem dados para exportar.",
|
|
1000
1185
|
"crud.export.toastSuccess": "{{count}} registros exportados",
|
|
@@ -1089,6 +1274,17 @@ var shellTranslations = {
|
|
|
1089
1274
|
"chat.tryAsking": "Experimente perguntar",
|
|
1090
1275
|
"chat.fab.tryIt": "Experimente",
|
|
1091
1276
|
"chat.messagePlaceholder": "Mensagem...",
|
|
1277
|
+
"chat.notConfigured": "Assistente n\xE3o configurado \u2014 defina chat.apiEndpoint para habilitar conversas.",
|
|
1278
|
+
"chat.confirmAction.title": "Confirmar esta a\xE7\xE3o?",
|
|
1279
|
+
"chat.confirmAction.confirm": "Confirmar",
|
|
1280
|
+
"chat.confirmAction.cancel": "Cancelar",
|
|
1281
|
+
"chat.confirmAction.blocked": "Responda a confirma\xE7\xE3o acima primeiro",
|
|
1282
|
+
"chat.signingIn": "Um instante \u2014 ainda estou confirmando sua sess\xE3o.",
|
|
1283
|
+
"chat.history": "Conversas anteriores",
|
|
1284
|
+
"chat.newConversation": "Nova conversa",
|
|
1285
|
+
"chat.untitledConversation": "Conversa sem t\xEDtulo",
|
|
1286
|
+
"chat.renameConversation": "Renomear",
|
|
1287
|
+
"chat.saveTitle": "Salvar t\xEDtulo",
|
|
1092
1288
|
"chat.toolsAvailable": "{{count}} ferramentas dispon\xEDveis",
|
|
1093
1289
|
"chat.suggestion.dashboard.kpi-summary.0": "Como est\xE1 meu neg\xF3cio hoje?",
|
|
1094
1290
|
"chat.suggestion.dashboard.kpi-summary.1": "Qual o faturamento de hoje?",
|
|
@@ -1288,6 +1484,38 @@ var shellTranslations = {
|
|
|
1288
1484
|
"crud.archetype.activity.description": "Veja um registro cronol\xF3gico de todas as a\xE7\xF5es, altera\xE7\xF5es e eventos relacionados a esta pessoa.",
|
|
1289
1485
|
"crud.archetype.documents.title": "Documentos",
|
|
1290
1486
|
"crud.archetype.documents.description": "Anexe e gerencie arquivos, contratos, certifica\xE7\xF5es e outros documentos desta pessoa.",
|
|
1487
|
+
"crud.archetype.addresses.add": "Adicionar endere\xE7o",
|
|
1488
|
+
"crud.archetype.addresses.addTitle": "Novo endere\xE7o",
|
|
1489
|
+
"crud.archetype.addresses.editTitle": "Editar endere\xE7o",
|
|
1490
|
+
"crud.archetype.addresses.formDescription": "CEP, rua e cidade s\xE3o obrigat\xF3rios; o resto \xE9 opcional.",
|
|
1491
|
+
"crud.archetype.addresses.emptyTitle": "Nenhum endere\xE7o cadastrado",
|
|
1492
|
+
"crud.archetype.addresses.emptyDescription": "Cadastre onde esta pessoa recebe entregas, \xE9 coletada ou \xE9 cobrada.",
|
|
1493
|
+
"crud.archetype.addresses.fallbackLabel": "Endere\xE7o",
|
|
1494
|
+
"crud.archetype.addresses.labelPlaceholder": "Casa, Trabalho\u2026",
|
|
1495
|
+
"crud.archetype.addresses.default": "Padr\xE3o",
|
|
1496
|
+
"crud.archetype.addresses.setDefault": "Usar como endere\xE7o padr\xE3o",
|
|
1497
|
+
"crud.archetype.addresses.kind.both": "Entrega e cobran\xE7a",
|
|
1498
|
+
"crud.archetype.addresses.kind.shipping": "Entrega",
|
|
1499
|
+
"crud.archetype.addresses.kind.billing": "Cobran\xE7a",
|
|
1500
|
+
"crud.archetype.addresses.field.label": "Identifica\xE7\xE3o",
|
|
1501
|
+
"crud.archetype.addresses.field.kind": "Uso",
|
|
1502
|
+
"crud.archetype.addresses.field.postalCode": "CEP",
|
|
1503
|
+
"crud.archetype.addresses.field.street": "Rua",
|
|
1504
|
+
"crud.archetype.addresses.field.number": "N\xFAmero",
|
|
1505
|
+
"crud.archetype.addresses.field.complement": "Complemento",
|
|
1506
|
+
"crud.archetype.addresses.field.district": "Bairro",
|
|
1507
|
+
"crud.archetype.addresses.field.city": "Cidade",
|
|
1508
|
+
"crud.archetype.addresses.field.state": "UF",
|
|
1509
|
+
"crud.archetype.addresses.field.recipient": "Quem recebe",
|
|
1510
|
+
"crud.archetype.addresses.field.phone": "Telefone",
|
|
1511
|
+
"crud.archetype.addresses.created": "Endere\xE7o adicionado",
|
|
1512
|
+
"crud.archetype.addresses.updated": "Endere\xE7o atualizado",
|
|
1513
|
+
"crud.archetype.addresses.deleted": "Endere\xE7o removido",
|
|
1514
|
+
"crud.archetype.addresses.deleteTitle": "Remover este endere\xE7o?",
|
|
1515
|
+
"crud.archetype.addresses.loadFailed": "N\xE3o foi poss\xEDvel carregar os endere\xE7os.",
|
|
1516
|
+
"crud.archetype.addresses.saveFailed": "N\xE3o foi poss\xEDvel salvar o endere\xE7o.",
|
|
1517
|
+
"crud.archetype.addresses.deleteFailed": "N\xE3o foi poss\xEDvel remover o endere\xE7o.",
|
|
1518
|
+
"crud.archetype.addresses.noTenant": "Nenhuma organiza\xE7\xE3o ativa \u2014 recarregue a p\xE1gina e tente de novo.",
|
|
1291
1519
|
"crud.archetype.schedule.title": "Agenda",
|
|
1292
1520
|
"crud.archetype.schedule.description": "Visualize e gerencie compromissos, turnos e disponibilidade desta pessoa.",
|
|
1293
1521
|
"crud.archetype.inventory.title": "Estoque",
|
|
@@ -1643,5 +1871,5 @@ registerTranslations(coreTranslations);
|
|
|
1643
1871
|
registerTranslations(shellTranslations);
|
|
1644
1872
|
|
|
1645
1873
|
export { I18nProvider, coreTranslations, getCurrentLocale, mergeTranslations, registerTranslations, setCurrentLocale, setLocaleStore, useI18nConfig, useTranslation };
|
|
1646
|
-
//# sourceMappingURL=chunk-
|
|
1647
|
-
//# sourceMappingURL=chunk-
|
|
1874
|
+
//# sourceMappingURL=chunk-JHGXROKV.js.map
|
|
1875
|
+
//# sourceMappingURL=chunk-JHGXROKV.js.map
|