@dmitryvim/form-builder 0.2.23 → 0.2.24
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/browser/formbuilder.min.js +103 -103
- package/dist/browser/{formbuilder.v0.2.23.min.js → formbuilder.v0.2.24.min.js} +103 -103
- package/dist/cjs/index.cjs +92 -24
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.js +85 -24
- package/dist/esm/index.js.map +1 -1
- package/dist/form-builder.js +103 -103
- package/dist/types/types/schema.d.ts +8 -1
- package/dist/types/types/state.d.ts +1 -0
- package/dist/types/utils/helpers.d.ts +14 -0
- package/package.json +1 -1
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/translation.ts","../../src/utils/validation.ts","../../src/utils/helpers.ts","../../src/utils/enable-conditions.ts","../../src/components/text.ts","../../src/components/textarea.ts","../../src/components/number.ts","../../src/components/select.ts","../../src/components/switcher.ts","../../src/components/file.ts","../../src/components/colour.ts","../../src/components/slider.ts","../../src/components/container.ts","../../src/components/group.ts","../../src/components/table.ts","../../src/components/richinput.ts","../../src/components/index.ts","../../src/instance/state.ts","../../src/styles/theme.ts","../../src/utils/styles.ts","../../src/components/registry.ts","../../src/instance/FormBuilderInstance.ts","../../src/index.ts"],"names":["value","key","element","gridContainer","hintText","updateFilesList","range","applyAutoExpand","t","renderElement","validateElement"],"mappings":";AAeO,SAAS,CAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,IAAA;AACtC,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AAC3D,EAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,MAAA,CAAO,YAAA,CAAa,EAAA;AAGvD,EAAA,IAAI,OACD,kBAAA,GAAgD,GAAG,CAAA,IACnD,oBAAA,GAAkD,GAAG,CAAA,IACtD,GAAA;AAGF,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3D,MAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,QAAQ,CAAA,GAAA,CAAA,EAAO,GAAG,CAAA,EAAG,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,IAC9E;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;AC/BA,SAAS,aAAA,CAAc,OAAA,EAAc,KAAA,EAAiB,KAAA,EAAoB;AACxE,EAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,IAAA,IAAQ,OAAA,CAAQ,aAAa,IAAA,EAAM;AAC1D,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,IAAA,IAAQ,OAAA,CAAQ,aAAa,IAAA,EAAM;AAC1D,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,CAAE,mBAAmB,KAAA,EAAO;AAAA,UAC1B,KAAK,OAAA,CAAQ,SAAA;AAAA,UACb,KAAK,OAAA,CAAQ;AAAA,SACd;AAAA,OACH;AAAA,IACF,CAAA,MAAA,IAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,EAAM;AACpC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,eAAA,EAAiB,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAAA,IAClE,CAAA,MAAA,IAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,EAAM;AACpC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,eAAA,EAAiB,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AACF;AAEA,SAAS,YAAA,CAAa,OAAA,EAAc,KAAA,EAAiB,KAAA,EAAoB;AACvE,EAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,IAAA,IAAQ,OAAA,CAAQ,OAAO,IAAA,EAAM;AAC9C,IAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,IAAA,IAAQ,OAAA,CAAQ,OAAO,IAAA,EAAM;AAC9C,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,CAAE,gBAAA,EAAkB,KAAA,EAAO,EAAE,GAAA,EAAK,QAAQ,GAAA,EAAK,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK;AAAA,OACnE;AAAA,IACF,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,IAAO,IAAA,EAAM;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,cAAA,EAAgB,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAAA,IAC3D,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,IAAO,IAAA,EAAM;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,cAAA,EAAgB,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,SAAS,eAAA,CAAgB,OAAA,EAAc,KAAA,EAAiB,KAAA,EAAoB;AAC1E,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,aAAA,EAAe,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAAA,EACjE;AACF;AAEA,SAAS,aAAA,CAAc,OAAA,EAAc,KAAA,EAAiB,KAAA,EAAoB;AACxE,EAAA,IAAI,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAC9B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAE,eAAe,KAAA,EAAO;AAAA,QACtB,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,UAAA,CACrB,GAAA,CAAI,CAAC,GAAA,KAAgB,GAAA,CAAI,WAAA,EAAa,CAAA,CACtC,IAAA,CAAK,GAAG;AAAA,OACZ;AAAA,KACH;AAAA,EACF;AACF;AAEA,SAAS,cAAA,CAAe,OAAA,EAAc,KAAA,EAAiB,KAAA,EAAoB;AACzE,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,aAAA,EAAe,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA;AAAA,EAClE;AACF;AAEO,SAAS,aAAA,CAAc,SAAc,KAAA,EAAsB;AAChE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,aAAA,CAAc,OAAA,EAAS,OAAO,KAAK,CAAA;AAEnC,EAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,IAAA,YAAA,CAAa,OAAA,EAAS,OAAO,KAAK,CAAA;AAAA,EACpC;AACA,EAAA,eAAA,CAAgB,OAAA,EAAS,OAAO,KAAK,CAAA;AACrC,EAAA,aAAA,CAAc,OAAA,EAAS,OAAO,KAAK,CAAA;AACnC,EAAA,cAAA,CAAe,OAAA,EAAS,OAAO,KAAK,CAAA;AAEpC,EAAA,OAAO,KAAA,CAAM,KAAK,UAAK,CAAA;AACzB;AAEO,SAAS,eAAe,MAAA,EAAuB;AACpD,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,IAAA,MAAA,CAAO,KAAK,0BAA0B,CAAA;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAOA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AACnC,IAAA,MAAA,CAAO,KAAK,+BAA+B,CAAA;AAC3C,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,IAAa,MAAA,IAAU,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW;AACvD,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAChC,IAAA,IAAI,CAAC,OAAO,SAAA,CAAU,OAAO,KAAK,CAAC,YAAA,CAAa,QAAA,CAAS,OAAiB,CAAA,EAAG;AAC3E,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,0CAAA,EAA6C,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IACrE;AAAA,EACF;AAGA,EAAA,IAAI,cAAA,IAAkB,MAAA,IAAU,MAAA,CAAO,YAAA,EAAc;AACnD,IAAA,MAAM,eAAe,MAAA,CAAO,YAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/B,MAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,IAAA,EAAW,SAAA,KAAsB;AACrD,QAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AACjD,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,uBAAuB,SAAS,CAAA,6CAAA;AAAA,WAClC;AAAA,QACF;AACA,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AACnD,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,uBAAuB,SAAS,CAAA,8CAAA;AAAA,WAClC;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,KAAA,MAAW,QAAA,IAAY,KAAK,MAAA,EAAQ;AAClC,YAAA,MAAM,WAAA,GAAc,OAAO,QAAA,CAAS,IAAA;AAAA,cAClC,CAAC,OAAA,KAAqB,OAAA,CAAQ,GAAA,KAAQ;AAAA,aACxC;AACA,YAAA,IAAI,CAAC,WAAA,EAAa;AAChB,cAAA,MAAA,CAAO,IAAA;AAAA,gBACL,CAAA,oBAAA,EAAuB,SAAS,CAAA,iCAAA,EAAoC,QAAQ,CAAA,CAAA;AAAA,eAC9E;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAOA,EAAA,SAAS,yBAAA,CAA0B,UAAqB,SAAA,EAAyB;AAC/E,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAEtC,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAI,EAAA,CAAG,IAAA,KAAS,WAAA,IAAgB,EAAA,CAAW,UAAA,EAAY;AACrD,QAAA,MAAM,MAAA,GAAS,EAAA;AACf,QAAA,MAAM,OAAA,GAAkB,OAAO,OAAA,IAAW,MAAA;AAC1C,QAAA,MAAM,QAAA,GAAmB,OAAO,QAAA,IAAY,OAAA;AAG5C,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAI,YAAY,EAAA,EAAI;AACpB,UAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC3B,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,CAAA,EAAG,SAAS,CAAA,aAAA,EAAgB,EAAA,CAAG,GAAG,CAAA,sBAAA,EAAyB,OAAO,CAAA,6BAAA,EAAgC,OAAA,CAAQ,GAAG,CAAA,CAAA;AAAA,aAC/G;AAAA,UACF;AACA,UAAA,IAAI,OAAA,CAAQ,QAAQ,QAAA,EAAU;AAC5B,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,CAAA,EAAG,SAAS,CAAA,aAAA,EAAgB,EAAA,CAAG,GAAG,CAAA,uBAAA,EAA0B,QAAQ,CAAA,6BAAA,EAAgC,OAAA,CAAQ,GAAG,CAAA,CAAA;AAAA,aACjH;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9B,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,GAAG,SAAS,CAAA,aAAA,EAAgB,EAAA,CAAG,GAAG,yBAAyB,OAAO,CAAA,sCAAA;AAAA,WACpE;AAAA,QACF;AACA,QAAA,IAAI,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/B,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,GAAG,SAAS,CAAA,aAAA,EAAgB,EAAA,CAAG,GAAG,0BAA0B,QAAQ,CAAA,sCAAA;AAAA,WACtE;AAAA,QACF;AACA,QAAA,aAAA,CAAc,IAAI,OAAO,CAAA;AACzB,QAAA,aAAA,CAAc,IAAI,QAAQ,CAAA;AAAA,MAC5B,CAAA,MAAO;AAEL,QAAA,IAAI,aAAA,CAAc,GAAA,CAAI,EAAA,CAAG,GAAG,CAAA,EAAG;AAC7B,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,CAAA,EAAG,SAAS,CAAA,eAAA,EAAkB,EAAA,CAAG,GAAG,CAAA,0CAAA;AAAA,WACtC;AAAA,QACF;AACA,QAAA,aAAA,CAAc,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,gBAAA,CAAiB,UAAqB,IAAA,EAAoB;AACjE,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,KAAA,KAAU;AACnC,MAAA,MAAM,WAAA,GAAc,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAEpC,MAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,cAAA,CAAgB,CAAA;AAAA,MAC5C;AAEA,MAAA,IAAI,CAAC,QAAQ,GAAA,EAAK;AAChB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,aAAA,CAAe,CAAA;AAAA,MAC3C;AAGA,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AAEzB,QAAA,IAAI,CAAC,QAAA,CAAS,GAAA,IAAO,OAAO,QAAA,CAAS,QAAQ,QAAA,EAAU;AACrD,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,GAAG,WAAW,CAAA,oDAAA;AAAA,WAChB;AAAA,QACF;AAGA,QAAA,MAAM,cAAc,QAAA,IAAY,QAAA;AAGhC,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,GAAG,WAAW,CAAA,yDAAA;AAAA,WAChB;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IACE,QAAQ,IAAA,KAAS,OAAA,IACjB,UAAA,IAAc,OAAA,IACd,QAAQ,QAAA,EACR;AACA,QAAA,gBAAA,CAAiB,OAAA,CAAQ,QAAA,EAAU,CAAA,EAAG,WAAW,CAAA,SAAA,CAAW,CAAA;AAAA,MAC9D;AAEA,MAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,WAAA,IAAe,OAAA,CAAQ,QAAA,EAAU;AAEpD,QAAA,IAAI,SAAA,IAAa,OAAA,IAAW,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW;AACzD,UAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,UAAA,MAAM,YAAA,GAAe,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAChC,UAAA,IACE,CAAC,OAAO,SAAA,CAAU,OAAO,KACzB,CAAC,YAAA,CAAa,QAAA,CAAS,OAAiB,CAAA,EACxC;AACA,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,CAAA,EAAG,WAAW,CAAA,qCAAA,EAAwC,OAAO,CAAA,CAAA;AAAA,aAC/D;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,cAAA,IAAkB,OAAA,IAAW,OAAA,CAAQ,YAAA,EAAc;AACrD,UAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/B,YAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,IAAA,EAAM,SAAA,KAAc;AACxC,cAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AACjD,gBAAA,MAAA,CAAO,IAAA;AAAA,kBACL,CAAA,EAAG,WAAW,CAAA,eAAA,EAAkB,SAAS,CAAA,6CAAA;AAAA,iBAC3C;AAAA,cACF;AACA,cAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AACnD,gBAAA,MAAA,CAAO,IAAA;AAAA,kBACL,CAAA,EAAG,WAAW,CAAA,eAAA,EAAkB,SAAS,CAAA,8CAAA;AAAA,iBAC3C;AAAA,cACF,CAAA,MAAO;AAEL,gBAAA,KAAA,MAAW,QAAA,IAAY,KAAK,MAAA,EAAQ;AAClC,kBAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,IAAA;AAAA,oBACnC,CAAC,YAAA,KAAiB,YAAA,CAAa,GAAA,KAAQ;AAAA,mBACzC;AACA,kBAAA,IAAI,CAAC,WAAA,EAAa;AAChB,oBAAA,MAAA,CAAO,IAAA;AAAA,sBACL,cAAc,OAAA,CAAQ,GAAG,CAAA,gBAAA,EAAmB,SAAS,oCAAoC,QAAQ,CAAA,CAAA;AAAA,qBACnG;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,gBAAA,CAAiB,OAAA,CAAQ,QAAA,EAAU,CAAA,EAAG,WAAW,CAAA,SAAA,CAAW,CAAA;AAC5D,QAAA,yBAAA,CAA0B,OAAA,CAAQ,QAAA,EAAU,CAAA,EAAG,WAAW,CAAA,SAAA,CAAW,CAAA;AAAA,MACvE;AAEA,MAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,OAAA,EAAS;AAChD,QAAA,MAAM,eAAe,OAAA,CAAQ,OAAA;AAC7B,QAAA,IACE,YAAA,KAAiB,MAAA,IACjB,YAAA,KAAiB,IAAA,IACjB,iBAAiB,EAAA,EACjB;AACA,UAAA,MAAM,iBAAA,GAAoB,QAAQ,OAAA,CAAQ,IAAA;AAAA,YACxC,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAA,KAAU;AAAA,WACzB;AACA,UAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,CAAA,EAAG,WAAW,CAAA,WAAA,EAAc,YAAY,CAAA,gBAAA;AAAA,aAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAClC,IAAA,gBAAA,CAAiB,MAAA,CAAO,UAAU,UAAU,CAAA;AAC5C,IAAA,yBAAA,CAA0B,MAAA,CAAO,UAAU,UAAU,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,MAAA;AACT;;;AC/SO,SAAS,cAAc,GAAA,EAAsC;AAClE,EAAA,OAAO,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,WAAA,KAAgB,MAAA;AAC/D;AAMO,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,EAAA,OAAO,GAAA,CAAI,SAAA;AACb;AAEO,SAAS,QAAA,CAAS,MAAc,GAAA,EAAqB;AAC1D,EAAA,OAAO,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AACnC;AAMO,SAAS,MAAM,IAAA,EAAyB;AAC7C,EAAA,OAAO,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAC1D;AAMO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5D,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C;;;ACxBO,SAAS,cAAA,CAAe,MAAW,IAAA,EAAmB;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAKA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AAE/C,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACpD,MAAA,MAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA,EAAG,EAAE,GAAG,EAAE,CAAA;AAC/C,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA,EAAG;AAC3C,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,OAAA,GAAU,QAAQ,KAAK,CAAA;AAAA,IACzB,CAAA,MAAO;AAEL,MAAA,OAAA,GAAU,QAAQ,OAAO,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AASO,SAAS,uBAAA,CACd,SAAA,EACA,QAAA,EACA,aAAA,EACS;AACT,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,GAAA,EAAK;AAEhC,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AAGA,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,IAAS,UAAA;AAGjC,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,UAAU,UAAA,EAAY;AAExB,IAAA,UAAA,GAAa,aAAA,IAAiB,QAAA;AAAA,EAChC,CAAA,MAAA,IAAW,UAAU,UAAA,EAAY;AAE/B,IAAA,UAAA,GAAa,QAAA;AAAA,EACf,CAAA,MAAO;AAEL,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,kEAAkE,KAAK,CAAA,EAAA;AAAA,KACzE;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,UAAA,EAAY,SAAA,CAAU,GAAG,CAAA;AAG5D,EAAA,IAAI,YAAY,SAAA,EAAW;AAEzB,IAAA,OAAO,SAAA,CAAU,WAAA,EAAa,SAAA,CAAU,MAAM,CAAA;AAAA,EAChD;AAYA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,iEAAA;AAAA,GACF;AACF;AAOA,SAAS,SAAA,CAAU,GAAQ,CAAA,EAAiB;AAE1C,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AAGpB,EAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,SAAa,CAAA,KAAM,CAAA;AAGzC,EAAA,IAAI,OAAO,CAAA,KAAM,OAAO,CAAA,EAAG,OAAO,KAAA;AAGlC,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,MAAM,QAAA,EAAU;AAClD,IAAA,IAAI;AACF,MAAA,OAAO,KAAK,SAAA,CAAU,CAAC,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAC/C,SAAS,CAAA,EAAG;AAEV,MAAA,IACE,CAAA,YAAa,SAAA,KACX,CAAA,CAAgB,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IAC1C,CAAA,CAAgB,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,CAAA,EAC5C;AACA,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAO,CAAA,KAAM,CAAA;AAAA,MACf;AAEA,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAGA,EAAA,OAAO,CAAA,KAAM,CAAA;AACf;;;ACvIO,SAAS,iBAAA,CACd,OAAA,EACA,KAAA,EACA,UAAA,GAAsB,KAAA,EACT;AACb,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,EAAA,OAAA,CAAQ,SAAA,GAAY,cAAA;AACpB,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA,IAAA,EAEpB,UAAA,GAAa,gBAAgB,uCAAuC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AASxE,EAAA,MAAM,gBAAgB,MAAY;AAChC,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA;AACxB,IAAA,MAAM,MAAM,OAAA,CAAQ,SAAA;AACpB,IAAA,MAAM,MAAM,OAAA,CAAQ,SAAA;AAGpB,IAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,IAAO,IAAA,EAAM;AAC9B,MAAA,OAAA,CAAQ,WAAA,GAAc,EAAA;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,KAAQ,CAAA,IAAM,GAAA,IAAO,IAAA,IAAQ,MAAM,GAAA,EAAM;AAE3C,MAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,IAAO,IAAA,EAAM;AAC9B,QAAA,OAAA,CAAQ,WAAA,GAAc,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,MACrC,CAAA,MAAA,IAAW,OAAO,IAAA,EAAM;AACtB,QAAA,OAAA,CAAQ,WAAA,GAAc,SAAI,GAAG,CAAA,CAAA;AAAA,MAC/B,CAAA,MAAA,IAAW,OAAO,IAAA,EAAM;AACtB,QAAA,OAAA,CAAQ,WAAA,GAAc,SAAI,GAAG,CAAA,CAAA;AAAA,MAC/B;AACA,MAAA,OAAA,CAAQ,MAAM,KAAA,GAAQ,gCAAA;AAAA,IACxB,CAAA,MAAA,IAAW,GAAA,IAAO,IAAA,IAAQ,GAAA,GAAM,GAAA,EAAK;AAEnC,MAAA,OAAA,CAAQ,WAAA,GAAc,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACnC,MAAA,OAAA,CAAQ,MAAM,KAAA,GAAQ,uBAAA;AAAA,IACxB,CAAA,MAAO;AAEL,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,OAAA,CAAQ,WAAA,GAAc,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,WAAA,GAAc,GAAG,GAAG,CAAA,CAAA;AAAA,MAC9B;AACA,MAAA,OAAA,CAAQ,MAAM,KAAA,GAAQ,gCAAA;AAAA,IACxB;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,aAAa,CAAA;AAC7C,EAAA,aAAA,EAAc;AAEd,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,iBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAGlB,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,EAAA,YAAA,CAAa,MAAM,OAAA,GAAU,qBAAA;AAE7B,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAChD,EAAA,SAAA,CAAU,IAAA,GAAO,MAAA;AACjB,EAAA,SAAA,CAAU,SAAA,GAAY,mBAAA;AACtB,EAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAKJ,KAAA,CAAM,MAAA,CAAO,QAAA,GAAW,qCAAA,GAAwC,4BAA4B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAQlH,EAAA,SAAA,CAAU,IAAA,GAAO,OAAA;AACjB,EAAA,SAAA,CAAU,WAAA,GAAc,QAAQ,WAAA,IAAe,2EAAA;AAC/C,EAAA,SAAA,CAAU,QACP,GAAA,CAAI,OAAA,CAAQ,QAAQ,GAAG,CAAA,IAAgB,QAAQ,OAAA,IAAW,EAAA;AAC7D,EAAA,SAAA,CAAU,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAGlC,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,MAAM;AACxC,MAAA,SAAA,CAAU,MAAM,WAAA,GAAc,8BAAA;AAC9B,MAAA,SAAA,CAAU,MAAM,OAAA,GAAU,CAAA,2DAAA,CAAA;AAC1B,MAAA,SAAA,CAAU,MAAM,aAAA,GAAgB,GAAA;AAAA,IAClC,CAAC,CAAA;AACD,IAAA,SAAA,CAAU,gBAAA,CAAiB,QAAQ,MAAM;AACvC,MAAA,SAAA,CAAU,MAAM,WAAA,GAAc,wBAAA;AAC9B,MAAA,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAAA,IAC5B,CAAC,CAAA;AACD,IAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,MAAA,IAAI,QAAA,CAAS,kBAAkB,SAAA,EAAW;AACxC,QAAA,SAAA,CAAU,MAAM,WAAA,GAAc,8BAAA;AAAA,MAChC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,MAAA,IAAI,QAAA,CAAS,kBAAkB,SAAA,EAAW;AACxC,QAAA,SAAA,CAAU,MAAM,WAAA,GAAc,wBAAA;AAAA,MAChC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,IAAI,QAAA,EAAU;AAC1C,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,KAAU,EAAA,GAAK,OAAO,SAAA,CAAU,KAAA;AACxD,MAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA;AAAA,IAC7C,CAAA;AACA,IAAA,SAAA,CAAU,gBAAA,CAAiB,QAAQ,YAAY,CAAA;AAC/C,IAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAAA,EAClD;AAEA,EAAA,YAAA,CAAa,YAAY,SAAS,CAAA;AAGlC,EAAA,IAAI,CAAC,MAAM,MAAA,CAAO,QAAA,KAAa,QAAQ,SAAA,IAAa,IAAA,IAAQ,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAA,EAAO;AACtF,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,OAAA,EAAS,SAAA,EAAW,KAAK,CAAA;AAC3D,IAAA,YAAA,CAAa,YAAY,OAAO,CAAA;AAAA,EAClC;AAEA,EAAA,OAAA,CAAQ,YAAY,YAAY,CAAA;AAClC;AAEO,SAAS,yBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,gBAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAK,EAAC;AACnD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAa,IAAI,CAAC,GAAG,aAAa,CAAA,GAAI,EAAC;AAGpE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AAErC,EAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,WAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAE7B,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,qBAAqB,CAAA;AAC9D,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AACxC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,WAAA,CAAY,KAAA,GAAgB,EAAA,EAAI,KAAA,GAAgB,EAAA,EAAiB;AACxE,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,SAAA,GAAY,4CAAA;AAGxB,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,IAAA,cAAA,CAAe,MAAM,OAAA,GAAU,8BAAA;AAE/B,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAChD,IAAA,SAAA,CAAU,IAAA,GAAO,MAAA;AACjB,IAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAKJ,KAAA,CAAM,MAAA,CAAO,QAAA,GAAW,qCAAA,GAAwC,4BAA4B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAQlH,IAAA,SAAA,CAAU,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,CAAA,CAAE,mBAAmB,KAAK,CAAA;AACzE,IAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAClB,IAAA,SAAA,CAAU,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAGlC,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,MAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,MAAM;AACxC,QAAA,SAAA,CAAU,MAAM,WAAA,GAAc,8BAAA;AAC9B,QAAA,SAAA,CAAU,MAAM,OAAA,GAAU,CAAA,2DAAA,CAAA;AAC1B,QAAA,SAAA,CAAU,MAAM,aAAA,GAAgB,GAAA;AAAA,MAClC,CAAC,CAAA;AACD,MAAA,SAAA,CAAU,gBAAA,CAAiB,QAAQ,MAAM;AACvC,QAAA,SAAA,CAAU,MAAM,WAAA,GAAc,wBAAA;AAC9B,QAAA,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAAA,MAC5B,CAAC,CAAA;AACD,MAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,QAAA,IAAI,QAAA,CAAS,kBAAkB,SAAA,EAAW;AACxC,UAAA,SAAA,CAAU,MAAM,WAAA,GAAc,8BAAA;AAAA,QAChC;AAAA,MACF,CAAC,CAAA;AACD,MAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,QAAA,IAAI,QAAA,CAAS,kBAAkB,SAAA,EAAW;AACxC,UAAA,SAAA,CAAU,MAAM,WAAA,GAAc,wBAAA;AAAA,QAChC;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,IAAI,QAAA,EAAU;AAC1C,MAAA,MAAM,eAAe,MAAM;AACzB,QAAA,MAAMA,MAAAA,GAAQ,SAAA,CAAU,KAAA,KAAU,EAAA,GAAK,OAAO,SAAA,CAAU,KAAA;AACxD,QAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,IAAA,EAAMA,MAAK,CAAA;AAAA,MACpD,CAAA;AACA,MAAA,SAAA,CAAU,gBAAA,CAAiB,QAAQ,YAAY,CAAA;AAC/C,MAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAAA,IAClD;AAEA,IAAA,cAAA,CAAe,YAAY,SAAS,CAAA;AAGpC,IAAA,IAAI,CAAC,MAAM,MAAA,CAAO,QAAA,KAAa,QAAQ,SAAA,IAAa,IAAA,IAAQ,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAA,EAAO;AACtF,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,OAAA,EAAS,SAAA,EAAW,KAAK,CAAA;AAC3D,MAAA,cAAA,CAAe,YAAY,OAAO,CAAA;AAAA,IACpC;AAEA,IAAA,WAAA,CAAY,YAAY,cAAc,CAAA;AAItC,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,SAAA,CAAU,YAAY,WAAW,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,YAAA,CAAa,WAAA,EAAa,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,aAAA,EAAc;AACd,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,SAAS,mBAAA,GAA4B;AACnC,IAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAC3B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,qBAAqB,CAAA;AAC9D,IAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAC3B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,YAAY,IAAA,CAAK,aAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,SAAA,GAAY,QAAA,CAAS,cAAc,QAAQ,CAAA;AAC3C,QAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,QAAA,SAAA,CAAU,SAAA,GAAY,mCAAA;AACtB,QAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAK1B,QAAA,SAAA,CAAU,SAAA,GAAY,QAAA;AACtB,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAA,SAAA,CAAU,MAAM,eAAA,GAAkB,kCAAA;AAAA,QACpC,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAA,SAAA,CAAU,MAAM,eAAA,GAAkB,aAAA;AAAA,QACpC,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,UAAU,MAAM;AACxB,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA;AAAA,YAClD;AAAA,WACF;AACA,UAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAA,GAAS,QAAA,EAAU;AACxC,YAAA,MAAA,CAAO,MAAA,CAAO,cAAc,CAAC,CAAA;AAC7B,YAAA,IAAA,CAAK,MAAA,EAAO;AACZ,YAAA,aAAA,EAAc;AACd,YAAA,eAAA,EAAgB;AAChB,YAAA,mBAAA,EAAoB;AAAA,UACtB;AAAA,QACF,CAAA;AACA,QAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,WAAW,YAAA,IAAgB,QAAA;AACjC,MAAA,SAAA,CAAU,QAAA,GAAW,QAAA;AACrB,MAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC7C,MAAA,SAAA,CAAU,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,YAAA,GAAuC,IAAA;AAE3C,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAA,GAAS,QAAA,CAAS,cAAc,KAAK,CAAA;AACrC,IAAA,MAAA,CAAO,SAAA,GAAY,8BAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,SAAA,GAAY,gCAAA;AACnB,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOvB,IAAA,MAAA,CAAO,WAAA,GAAc,GAAA;AACrB,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,kCAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,aAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AACjC,MAAA,WAAA,CAAY,OAAA,CAAQ,WAAW,EAAE,CAAA;AACjC,MAAA,eAAA,EAAgB;AAChB,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAEA,IAAA,YAAA,GAAe,QAAA,CAAS,cAAc,MAAM,CAAA;AAC5C,IAAA,YAAA,CAAa,SAAA,GAAY,uBAAA;AAEzB,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAC/B,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc;AAE9B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAAc,eAAe,CAAA;AACnD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,IAAU,QAAA;AAClC,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,MAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC1C,MAAA,MAAA,CAAO,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACnD;AAEA,IAAA,YAAA,CAAa,WAAA,GAAc,GAAG,MAAA,CAAO,MAAM,IAAI,QAAA,KAAa,QAAA,GAAW,WAAM,QAAQ,CAAA,CAAA;AAAA,EACvF;AAGA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,WAAA,CAAY,KAAe,CAAC,CAAA;AACtD,EAAA,eAAA,EAAgB;AAChB,EAAA,mBAAA,EAAoB;AACtB;AASO,SAAS,mBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,OAAA;AAGtC,EAAA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,YAAA,KACS;AACT,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAC9F,IAAA,IAAI,YAAA,GAAe,QAAA,CAAS,cAAA,CAAe,OAAO,CAAA;AAElD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,CAAM,SAAA,CAAU,IAAI,SAAS,CAAA;AAC7B,MAAA,KAAA,CAAM,KAAA,GAAQ,YAAA;AAEd,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,YAAA,GAAe,QAAA,CAAS,cAAc,KAAK,CAAA;AAC3C,QAAA,YAAA,CAAa,EAAA,GAAK,OAAA;AAClB,QAAA,YAAA,CAAa,SAAA,GAAY,eAAA;AACzB,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAM7B,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,UAAA,EAAY,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,WAAW,CAAA;AAAA,QAChE,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,UAAA,EAAY,YAAY,YAAY,CAAA;AAAA,QAC5C;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,WAAA,GAAc,YAAA;AAC3B,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU,OAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAEd,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,MAAA,EAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,iBAAA,GAAoB,CACxB,KAAA,EACA,GAAA,EACA,QAAA,KACS;AACT,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAElB,IAAA,IAAI,CAAC,kBAAkB,GAAA,EAAK;AAC1B,MAAA,IACE,OAAA,CAAQ,cAAc,MAAA,IACtB,OAAA,CAAQ,cAAc,IAAA,IACtB,GAAA,CAAI,MAAA,GAAS,OAAA,CAAQ,SAAA,EACrB;AACA,QAAA,MAAM,GAAA,GAAM,EAAE,WAAA,EAAa,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,WAAW,CAAA;AAC5D,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,QAAA,GAAW,IAAA;AAAA,MACb,CAAA,MAAA,IACE,OAAA,CAAQ,SAAA,KAAc,MAAA,IACtB,OAAA,CAAQ,cAAc,IAAA,IACtB,GAAA,CAAI,MAAA,GAAS,OAAA,CAAQ,SAAA,EACrB;AACA,QAAA,MAAM,GAAA,GAAM,EAAE,WAAA,EAAa,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,WAAW,CAAA;AAC5D,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,QAAA,GAAW,IAAA;AAAA,MACb,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AACrC,UAAA,IAAI,CAAC,EAAA,CAAG,IAAA,CAAK,GAAG,CAAA,EAAG;AACjB,YAAA,MAAM,GAAA,GAAM,CAAA,CAAE,iBAAA,EAAmB,KAAK,CAAA;AACtC,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,YAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,YAAA,QAAA,GAAW,IAAA;AAAA,UACb;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,MAAM,GAAA,GAAM,CAAA,CAAE,gBAAA,EAAkB,KAAK,CAAA;AACrC,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,UAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,UAAA,QAAA,GAAW,IAAA;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,gBAAA,CAEvB,CAAA,QAAA,EAAW,GAAG,CAAA,GAAA,CAAK,CAAA;AACrB,IAAA,MAAM,SAA+B,EAAC;AACtC,IAAA,MAAM,YAAsB,EAAC;AAE7B,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,MAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAC5B,MAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,IAAA,GAAO,GAAG,CAAA;AACnC,MAAA,iBAAA,CAAkB,OAAO,GAAA,EAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAClD,CAAC,CAAA;AAGD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AACrC,MAAA,MAAM,cAAA,GAAiB,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,OAAW,EAAE,CAAA;AAE9D,MAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MAClE;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,aAAA,CAEtB,CAAA,QAAA,EAAW,GAAG,CAAA,EAAA,CAAI,CAAA;AACpB,IAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAE5B,IAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,IAAY,QAAQ,EAAA,EAAI;AACrD,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC5B,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,iBAAA,CAAkB,KAAA,EAAO,KAAK,GAAG,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,KAAQ,EAAA,GAAK,IAAA,GAAO,KAAK,MAAA,EAAO;AAAA,EAClD;AACF;AAKO,SAAS,eAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AAEtB,EAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,oDAAA,EAAuD,SAAS,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA;AAAA,OACxF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,gBAAA,CAEvB,CAAA,QAAA,EAAW,SAAS,CAAA,GAAA,CAAK,CAAA;AAE3B,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,MAAA,IAAI,KAAA,GAAQ,MAAM,MAAA,EAAQ;AACxB,QAAA,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAK,CAAA,IAAK,OAAO,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA,GAAI,EAAA;AAC5D,QAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,QAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAAA,MAChB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,CAAO,MAAA,EAAQ;AAClC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,oCAAoC,SAAS,CAAA,MAAA,EAAS,OAAO,MAAM,CAAA,qBAAA,EAAwB,MAAM,MAAM,CAAA,8CAAA;AAAA,OACzG;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,aAAA,CAEtB,CAAA,OAAA,EAAU,SAAS,CAAA,EAAA,CAAI,CAAA;AACzB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,KAAA,GAAQ,KAAA,IAAS,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA,GAAI,EAAA;AAC9C,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAAA,IAChB;AAAA,EACF;AACF;;;ACrjBA,SAAS,gBAAgB,QAAA,EAAqC;AAC5D,EAAA,QAAA,CAAS,MAAM,QAAA,GAAW,QAAA;AAC1B,EAAA,QAAA,CAAS,MAAM,MAAA,GAAS,MAAA;AAGxB,EAAA,MAAM,SAAA,GAAA,CAAa,SAAS,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,IAAK,IAAI,MAAA,GAAS,CAAA;AAC/D,EAAA,QAAA,CAAS,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAErC,EAAA,MAAM,SAAS,MAAY;AAEzB,IAAA,IAAI,CAAC,SAAS,WAAA,EAAa;AAC3B,IAAA,QAAA,CAAS,MAAM,MAAA,GAAS,GAAA;AACxB,IAAA,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,YAAY,CAAA,EAAA,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM,CAAA;AAGzC,EAAA,UAAA,CAAW,MAAM;AACf,IAAA,IAAI,QAAA,CAAS,aAAa,MAAA,EAAO;AAAA,EACnC,GAAG,CAAC,CAAA;AACN;AAEO,SAAS,qBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAGlB,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACpD,EAAA,eAAA,CAAgB,MAAM,OAAA,GAAU,qBAAA;AAEhC,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AACvD,EAAA,aAAA,CAAc,SAAA,GACZ,uHAAA;AACF,EAAA,aAAA,CAAc,MAAM,OAAA,GAAU,uBAAA;AAC9B,EAAA,aAAA,CAAc,IAAA,GAAO,OAAA;AACrB,EAAA,aAAA,CAAc,WAAA,GAAc,QAAQ,WAAA,IAAe,2EAAA;AACnD,EAAA,aAAA,CAAc,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AACrC,EAAA,aAAA,CAAc,QACX,GAAA,CAAI,OAAA,CAAQ,QAAQ,GAAG,CAAA,IAAgB,QAAQ,OAAA,IAAW,EAAA;AAC7D,EAAA,aAAA,CAAc,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAGtC,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,IAAI,QAAA,EAAU;AAC1C,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,KAAU,EAAA,GAAK,OAAO,aAAA,CAAc,KAAA;AAChE,MAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA;AAAA,IAC7C,CAAA;AACA,IAAA,aAAA,CAAc,gBAAA,CAAiB,QAAQ,YAAY,CAAA;AACnD,IAAA,aAAA,CAAc,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAAA,EACtD;AAGA,EAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC/C,IAAA,eAAA,CAAgB,aAAa,CAAA;AAAA,EAC/B;AAEA,EAAA,eAAA,CAAgB,YAAY,aAAa,CAAA;AAGzC,EAAA,IAAI,CAAC,MAAM,MAAA,CAAO,QAAA,KAAa,QAAQ,SAAA,IAAa,IAAA,IAAQ,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAA,EAAO;AACtF,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,OAAA,EAAgB,aAAA,EAAe,IAAI,CAAA;AACrE,IAAA,eAAA,CAAgB,YAAY,OAAO,CAAA;AAAA,EACrC;AAEA,EAAA,OAAA,CAAQ,YAAY,eAAe,CAAA;AACrC;AAEO,SAAS,6BAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,gBAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAK,EAAC;AACnD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAa,IAAI,CAAC,GAAG,aAAa,CAAA,GAAI,EAAC;AAGpE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AAErC,EAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,WAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAE7B,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,yBAAyB,CAAA;AAClE,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,UAAU,CAAA;AAC9C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACrC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,eAAA,CACP,KAAA,GAAgB,EAAA,EAChB,KAAA,GAAgB,EAAA,EACH;AACb,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,SAAA,GAAY,wBAAA;AAGxB,IAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtD,IAAA,iBAAA,CAAkB,MAAM,OAAA,GAAU,qBAAA;AAElC,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AACvD,IAAA,aAAA,CAAc,SAAA,GACZ,uHAAA;AACF,IAAA,aAAA,CAAc,MAAM,OAAA,GAAU,uBAAA;AAC9B,IAAA,aAAA,CAAc,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,CAAA,CAAE,mBAAmB,KAAK,CAAA;AAC7E,IAAA,aAAA,CAAc,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AACrC,IAAA,aAAA,CAAc,KAAA,GAAQ,KAAA;AACtB,IAAA,aAAA,CAAc,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAGtC,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,IAAI,QAAA,EAAU;AAC1C,MAAA,MAAM,eAAe,MAAM;AACzB,QAAA,MAAMA,MAAAA,GACJ,aAAA,CAAc,KAAA,KAAU,EAAA,GAAK,OAAO,aAAA,CAAc,KAAA;AACpD,QAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,aAAA,CAAc,IAAA,EAAMA,MAAK,CAAA;AAAA,MACxD,CAAA;AACA,MAAA,aAAA,CAAc,gBAAA,CAAiB,QAAQ,YAAY,CAAA;AACnD,MAAA,aAAA,CAAc,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC/C,MAAA,eAAA,CAAgB,aAAa,CAAA;AAAA,IAC/B;AAEA,IAAA,iBAAA,CAAkB,YAAY,aAAa,CAAA;AAG3C,IAAA,IAAI,CAAC,MAAM,MAAA,CAAO,QAAA,KAAa,QAAQ,SAAA,IAAa,IAAA,IAAQ,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAA,EAAO;AACtF,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,OAAA,EAAgB,aAAA,EAAe,IAAI,CAAA;AACrE,MAAA,iBAAA,CAAkB,YAAY,OAAO,CAAA;AAAA,IACvC;AAEA,IAAA,WAAA,CAAY,YAAY,iBAAiB,CAAA;AAIzC,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,SAAA,CAAU,YAAY,WAAW,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,YAAA,CAAa,WAAA,EAAa,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,aAAA,EAAc;AACd,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,SAAS,mBAAA,GAA4B;AACnC,IAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAC3B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,yBAAyB,CAAA;AAClE,IAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAC3B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,YAAY,IAAA,CAAK,aAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,SAAA,GAAY,QAAA,CAAS,cAAc,QAAQ,CAAA;AAC3C,QAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,QAAA,SAAA,CAAU,SAAA,GACR,6EAAA;AACF,QAAA,SAAA,CAAU,SAAA,GAAY,QAAA;AACtB,QAAA,SAAA,CAAU,UAAU,MAAM;AACxB,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA;AAAA,YAClD;AAAA,WACF;AACA,UAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAA,GAAS,QAAA,EAAU;AACxC,YAAA,MAAA,CAAO,MAAA,CAAO,cAAc,CAAC,CAAA;AAC7B,YAAA,IAAA,CAAK,MAAA,EAAO;AACZ,YAAA,aAAA,EAAc;AACd,YAAA,eAAA,EAAgB;AAChB,YAAA,mBAAA,EAAoB;AAAA,UACtB;AAAA,QACF,CAAA;AACA,QAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,WAAW,YAAA,IAAgB,QAAA;AACjC,MAAA,SAAA,CAAU,QAAA,GAAW,QAAA;AACrB,MAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC7C,MAAA,SAAA,CAAU,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,YAAA,GAAuC,IAAA;AAE3C,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAA,GAAS,QAAA,CAAS,cAAc,KAAK,CAAA;AACrC,IAAA,MAAA,CAAO,SAAA,GAAY,8BAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,SAAA,GAAY,oCAAA;AACnB,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOvB,IAAA,MAAA,CAAO,WAAA,GAAc,GAAA;AACrB,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,kCAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,aAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AACjC,MAAA,eAAA,CAAgB,OAAA,CAAQ,WAAW,EAAE,CAAA;AACrC,MAAA,eAAA,EAAgB;AAChB,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAEA,IAAA,YAAA,GAAe,QAAA,CAAS,cAAc,MAAM,CAAA;AAC5C,IAAA,YAAA,CAAa,SAAA,GAAY,uBAAA;AAEzB,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAC/B,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc;AAE9B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAAc,mBAAmB,CAAA;AACvD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,IAAU,QAAA;AAClC,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,MAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC1C,MAAA,MAAA,CAAO,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACnD;AAEA,IAAA,YAAA,CAAa,WAAA,GAAc,GAAG,MAAA,CAAO,MAAM,IAAI,QAAA,KAAa,QAAA,GAAW,WAAM,QAAQ,CAAA,CAAA;AAAA,EACvF;AAGA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAe,CAAC,CAAA;AAC1D,EAAA,eAAA,EAAgB;AAChB,EAAA,mBAAA,EAAoB;AACtB;AASO,SAAS,uBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAElB,EAAA,OAAO,mBAAA,CAAoB,OAAA,EAAgB,GAAA,EAAK,OAAO,CAAA;AACzD;AAMO,SAAS,mBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AAEN,EAAA,eAAA,CAAgB,OAAA,EAAgB,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AAIzD,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAM,GAAI,OAAA;AAC7B,EAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,UAAA,IAAc,KAAA,CAAM,MAAA,CAAO,QAAA;AAC5D,EAAA,IAAI,CAAC,gBAAA,EAAkB;AAEvB,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAM,YAAY,SAAA,CAAU,gBAAA;AAAA,MAC1B,mBAAmB,SAAS,CAAA,GAAA;AAAA,KAC9B;AACA,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC9B,MAAA,QAAA,CAAS,aAAA,CAAc,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IAC3C,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,MAAM,WAAW,SAAA,CAAU,aAAA;AAAA,MACzB,kBAAkB,SAAS,CAAA,EAAA;AAAA,KAC7B;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,aAAA,CAAc,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACvTA,SAAS,qBAAA,CACP,SACA,KAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,EAAA,IAAA,CAAK,SAAA,GAAY,mBAAA;AACjB,EAAA,IAAA,CAAK,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAYrB,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AAGpB,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,IAAO,IAAA,EAAM;AAC9B,IAAA,SAAA,GAAY,CAAA,EAAG,GAAG,CAAA,QAAA,EAAM,GAAG,CAAA,CAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,OAAO,IAAA,EAAM;AACtB,IAAA,SAAA,GAAY,SAAI,GAAG,CAAA,CAAA;AAAA,EACrB,CAAA,MAAA,IAAW,OAAO,IAAA,EAAM;AACtB,IAAA,SAAA,GAAY,SAAI,GAAG,CAAA,CAAA;AAAA,EACrB;AAEA,EAAA,IAAA,CAAK,WAAA,GAAc,SAAA;AAGnB,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,MAAM,MAAM,KAAA,CAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AACpD,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,MAAM,QAAA,GAAW,GAAA,IAAO,IAAA,IAAQ,GAAA,GAAM,GAAA;AACtC,MAAA,MAAM,QAAA,GAAW,GAAA,IAAO,IAAA,IAAQ,GAAA,GAAM,GAAA;AACtC,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,QAAA,IAAY,QAAA,GAC3B,uBAAA,GACA,gCAAA;AAAA,IACN,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAM,KAAA,GAAQ,gCAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC3C,EAAA,WAAA,EAAY;AAEZ,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,mBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAGlB,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,EAAA,YAAA,CAAa,MAAM,OAAA,GAAU,qBAAA;AAE7B,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,EAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,EAAA,WAAA,CAAY,SAAA,GACV,2GAAA;AACF,EAAA,WAAA,CAAY,MAAM,OAAA,GAAU,2DAAA;AAC5B,EAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AACnB,EAAA,WAAA,CAAY,WAAA,GAAc,QAAQ,WAAA,IAAe,GAAA;AACjD,EAAA,IAAI,QAAQ,GAAA,KAAQ,MAAA,cAAuB,GAAA,GAAM,OAAA,CAAQ,IAAI,QAAA,EAAS;AACtE,EAAA,IAAI,QAAQ,GAAA,KAAQ,MAAA,cAAuB,GAAA,GAAM,OAAA,CAAQ,IAAI,QAAA,EAAS;AACtE,EAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,cAAuB,IAAA,GAAO,OAAA,CAAQ,KAAK,QAAA,EAAS;AACzE,EAAA,WAAA,CAAY,QACT,GAAA,CAAI,OAAA,CAAQ,QAAQ,GAAG,CAAA,IAAgB,QAAQ,OAAA,IAAW,EAAA;AAC7D,EAAA,WAAA,CAAY,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAGpC,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,IAAI,QAAA,EAAU;AAC1C,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,MAAM,QAAQ,WAAA,CAAY,KAAA,GAAQ,UAAA,CAAW,WAAA,CAAY,KAAK,CAAA,GAAI,IAAA;AAClE,MAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA;AAAA,IAC7C,CAAA;AACA,IAAA,WAAA,CAAY,gBAAA,CAAiB,QAAQ,YAAY,CAAA;AACjD,IAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAAA,EACpD;AAEA,EAAA,YAAA,CAAa,YAAY,WAAW,CAAA;AAGpC,EAAA,IAAI,CAAC,MAAM,MAAA,CAAO,QAAA,KAAa,QAAQ,GAAA,IAAO,IAAA,IAAQ,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAA,EAAO;AAC1E,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,OAAA,EAAS,WAAW,CAAA;AAC1D,IAAA,YAAA,CAAa,YAAY,OAAO,CAAA;AAAA,EAClC;AAEA,EAAA,OAAA,CAAQ,YAAY,YAAY,CAAA;AAClC;AAEO,SAAS,2BAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,gBAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAK,EAAC;AACnD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAa,IAAI,CAAC,GAAG,aAAa,CAAA,GAAI,EAAC;AAGpE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AAErC,EAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,WAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAE7B,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,uBAAuB,CAAA;AAChE,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AACxC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,aAAA,CACP,KAAA,GAAyB,EAAA,EACzB,KAAA,GAAgB,EAAA,EACH;AACb,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,SAAA,GAAY,8CAAA;AAGxB,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,IAAA,cAAA,CAAe,MAAM,OAAA,GAAU,8BAAA;AAE/B,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,IAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,IAAA,WAAA,CAAY,SAAA,GACV,2GAAA;AACF,IAAA,WAAA,CAAY,MAAM,OAAA,GAAU,2DAAA;AAC5B,IAAA,WAAA,CAAY,WAAA,GAAc,QAAQ,WAAA,IAAe,GAAA;AACjD,IAAA,IAAI,QAAQ,GAAA,KAAQ,MAAA,cAAuB,GAAA,GAAM,OAAA,CAAQ,IAAI,QAAA,EAAS;AACtE,IAAA,IAAI,QAAQ,GAAA,KAAQ,MAAA,cAAuB,GAAA,GAAM,OAAA,CAAQ,IAAI,QAAA,EAAS;AACtE,IAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,cAAuB,IAAA,GAAO,OAAA,CAAQ,KAAK,QAAA,EAAS;AACzE,IAAA,WAAA,CAAY,KAAA,GAAQ,MAAM,QAAA,EAAS;AACnC,IAAA,WAAA,CAAY,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAGpC,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,IAAI,QAAA,EAAU;AAC1C,MAAA,MAAM,eAAe,MAAM;AACzB,QAAA,MAAM,MAAM,WAAA,CAAY,KAAA,GAAQ,UAAA,CAAW,WAAA,CAAY,KAAK,CAAA,GAAI,IAAA;AAChE,QAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,WAAA,CAAY,IAAA,EAAM,GAAG,CAAA;AAAA,MACpD,CAAA;AACA,MAAA,WAAA,CAAY,gBAAA,CAAiB,QAAQ,YAAY,CAAA;AACjD,MAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAAA,IACpD;AAEA,IAAA,cAAA,CAAe,YAAY,WAAW,CAAA;AAGtC,IAAA,IAAI,CAAC,MAAM,MAAA,CAAO,QAAA,KAAa,QAAQ,GAAA,IAAO,IAAA,IAAQ,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAA,EAAO;AAC1E,MAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,OAAA,EAAS,WAAW,CAAA;AAC1D,MAAA,cAAA,CAAe,YAAY,OAAO,CAAA;AAAA,IACpC;AAEA,IAAA,WAAA,CAAY,YAAY,cAAc,CAAA;AAItC,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,SAAA,CAAU,YAAY,WAAW,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,YAAA,CAAa,WAAA,EAAa,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,aAAA,EAAc;AACd,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,SAAS,mBAAA,GAA4B;AACnC,IAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAC3B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,uBAAuB,CAAA;AAChE,IAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAC3B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,YAAY,IAAA,CAAK,aAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,SAAA,GAAY,QAAA,CAAS,cAAc,QAAQ,CAAA;AAC3C,QAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,QAAA,SAAA,CAAU,SAAA,GACR,gEAAA;AACF,QAAA,SAAA,CAAU,SAAA,GAAY,QAAA;AACtB,QAAA,SAAA,CAAU,UAAU,MAAM;AACxB,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA;AAAA,YAClD;AAAA,WACF;AACA,UAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAA,GAAS,QAAA,EAAU;AACxC,YAAA,MAAA,CAAO,MAAA,CAAO,cAAc,CAAC,CAAA;AAC7B,YAAA,IAAA,CAAK,MAAA,EAAO;AACZ,YAAA,aAAA,EAAc;AACd,YAAA,eAAA,EAAgB;AAChB,YAAA,mBAAA,EAAoB;AAAA,UACtB;AAAA,QACF,CAAA;AACA,QAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,WAAW,YAAA,IAAgB,QAAA;AACjC,MAAA,SAAA,CAAU,QAAA,GAAW,QAAA;AACrB,MAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC7C,MAAA,SAAA,CAAU,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,YAAA,GAAuC,IAAA;AAE3C,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAA,GAAS,QAAA,CAAS,cAAc,KAAK,CAAA;AACrC,IAAA,MAAA,CAAO,SAAA,GAAY,8BAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,SAAA,GAAY,kCAAA;AACnB,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOvB,IAAA,MAAA,CAAO,WAAA,GAAc,GAAA;AACrB,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,kCAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,aAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AACjC,MAAA,aAAA,CAAc,OAAA,CAAQ,WAAW,EAAE,CAAA;AACnC,MAAA,eAAA,EAAgB;AAChB,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAEA,IAAA,YAAA,GAAe,QAAA,CAAS,cAAc,MAAM,CAAA;AAC5C,IAAA,YAAA,CAAa,SAAA,GAAY,uBAAA;AAEzB,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAC/B,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc;AAE9B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAAc,iBAAiB,CAAA;AACrD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,IAAU,QAAA;AAClC,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,MAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC1C,MAAA,MAAA,CAAO,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACnD;AAEA,IAAA,YAAA,CAAa,WAAA,GAAc,GAAG,MAAA,CAAO,MAAM,IAAI,QAAA,KAAa,QAAA,GAAW,WAAM,QAAQ,CAAA,CAAA;AAAA,EACvF;AAGA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,aAAA,CAAc,KAAwB,CAAC,CAAA;AACjE,EAAA,eAAA,EAAgB;AAChB,EAAA,mBAAA,EAAoB;AACtB;AASO,SAAS,qBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,OAAA;AAGtC,EAAA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,YAAA,KACS;AACT,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAC9F,IAAA,IAAI,YAAA,GAAe,QAAA,CAAS,cAAA,CAAe,OAAO,CAAA;AAElD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,CAAM,SAAA,CAAU,IAAI,SAAS,CAAA;AAC7B,MAAA,KAAA,CAAM,KAAA,GAAQ,YAAA;AAEd,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,YAAA,GAAe,QAAA,CAAS,cAAc,KAAK,CAAA;AAC3C,QAAA,YAAA,CAAa,EAAA,GAAK,OAAA;AAClB,QAAA,YAAA,CAAa,SAAA,GAAY,eAAA;AACzB,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAM7B,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,UAAA,EAAY,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,WAAW,CAAA;AAAA,QAChE,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,UAAA,EAAY,YAAY,YAAY,CAAA;AAAA,QAC5C;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,WAAA,GAAc,YAAA;AAC3B,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU,OAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAEd,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,MAAA,EAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,mBAAA,GAAsB,CAC1B,KAAA,EACA,CAAA,EACA,QAAA,KACS;AACT,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAElB,IAAA,IACE,CAAC,cAAA,IACD,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAChB,QAAQ,GAAA,KAAQ,IAAA,IAChB,CAAA,GAAI,OAAA,CAAQ,GAAA,EACZ;AACA,MAAA,MAAM,GAAA,GAAM,EAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,KAAK,CAAA;AACrD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,MAAA,QAAA,GAAW,IAAA;AAAA,IACb,CAAA,MAAA,IACE,CAAC,cAAA,IACD,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAChB,OAAA,CAAQ,GAAA,KAAQ,IAAA,IAChB,CAAA,GAAI,OAAA,CAAQ,GAAA,EACZ;AACA,MAAA,MAAM,GAAA,GAAM,EAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,KAAK,CAAA;AACrD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,IAAA,MAAM,SAAS,SAAA,CAAU,gBAAA;AAAA,MACvB,WAAW,GAAG,CAAA,GAAA;AAAA,KAChB;AACA,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,MAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAC5B,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,QAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AACxB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,CAAA,GAAI,WAAW,GAAG,CAAA;AACxB,MAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AAC1C,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,YAAA,EAAc,OAAA,CAAQ,KAAK,CAAA;AACzC,QAAA,MAAA,CAAO,KAAK,CAAA,EAAG,GAAG,IAAI,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAE,CAAA;AACtC,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,mBAAA,CAAoB,OAAO,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAChD,MAAA,MAAM,CAAA,GAAI,OAAO,SAAA,CAAU,OAAA,CAAQ,YAAY,CAAC,CAAA,GAC3C,OAAA,CAAQ,QAAA,IAAY,CAAA,GACrB,CAAA;AACJ,MAAA,MAAA,CAAO,KAAK,MAAA,CAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAAA,IAClC,CAAC,CAAA;AAGD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AACrC,MAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AAEtD,MAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MAClE;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,aAAA,CAAgC,CAAA,QAAA,EAAW,GAAG,CAAA,EAAA,CAAI,CAAA;AAC1E,IAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAC5B,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAElB,IAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,IAAY,QAAQ,EAAA,EAAI;AACrD,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,KAAK,CAAA;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC5B,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B;AAEA,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AACxB,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B;AAEA,IAAA,MAAM,CAAA,GAAI,WAAW,GAAG,CAAA;AACxB,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AAC1C,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,YAAA,EAAc,KAAK,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC5B,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B;AAEA,IAAA,mBAAA,CAAoB,KAAA,EAAQ,GAAG,GAAG,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,OAAO,SAAA,CAAU,OAAA,CAAQ,YAAY,CAAC,CAAA,GAC3C,OAAA,CAAQ,QAAA,IAAY,CAAA,GACrB,CAAA;AACJ,IAAA,OAAO,EAAE,OAAO,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAG,MAAA,EAAO;AAAA,EAC/C;AACF;AAKO,SAAS,iBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AAEtB,EAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,sDAAA,EAAyD,SAAS,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA;AAAA,OAC1F;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,SAAA,CAAU,gBAAA;AAAA,MACvB,WAAW,SAAS,CAAA,GAAA;AAAA,KACtB;AAEA,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,MAAA,IAAI,KAAA,GAAQ,MAAM,MAAA,EAAQ;AACxB,QAAA,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAK,CAAA,IAAK,OAAO,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA,GAAI,EAAA;AAC5D,QAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,QAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAAA,MAChB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,CAAO,MAAA,EAAQ;AAClC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,sCAAsC,SAAS,CAAA,MAAA,EAAS,OAAO,MAAM,CAAA,qBAAA,EAAwB,MAAM,MAAM,CAAA,8CAAA;AAAA,OAC3G;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,QAAQ,SAAA,CAAU,aAAA;AAAA,MACtB,UAAU,SAAS,CAAA,EAAA;AAAA,KACrB;AACA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,KAAA,GAAQ,KAAA,IAAS,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA,GAAI,EAAA;AAC9C,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAAA,IAChB;AAAA,EACF;AACF;;;AC3fO,SAAS,mBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACnD,EAAA,WAAA,CAAY,SAAA,GACV,2GAAA;AACF,EAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AACnB,EAAA,WAAA,CAAY,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAEpC,EAAA,CAAC,QAAQ,OAAA,IAAW,EAAC,EAAG,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC1C,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,IAAA,QAAA,CAAS,QAAQ,MAAA,CAAO,KAAA;AACxB,IAAA,QAAA,CAAS,cAAc,MAAA,CAAO,KAAA;AAC9B,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,OAAA,CAAQ,GAAG,KAAK,OAAA,CAAQ,OAAA,MAAa,OAAO,KAAA,EAAO;AAClE,MAAA,QAAA,CAAS,QAAA,GAAW,IAAA;AAAA,IACtB;AACA,IAAA,WAAA,CAAY,YAAY,QAAQ,CAAA;AAAA,EAClC,CAAC,CAAA;AAGD,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,IAAI,QAAA,EAAU;AAC1C,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,WAAA,CAAY,KAAK,CAAA;AAAA,IACzD,CAAA;AACA,IAAA,WAAA,CAAY,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAAA,EACrD;AAEA,EAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAG/B,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC7C,IAAA,UAAA,CAAW,SAAA,GAAY,4BAAA;AACvB,IAAA,UAAA,CAAW,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AACrD,IAAA,OAAA,CAAQ,YAAY,UAAU,CAAA;AAAA,EAChC;AACF;AAEO,SAAS,2BAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,gBAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAK,EAAC;AACnD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAa,IAAI,CAAC,GAAG,aAAa,CAAA,GAAI,EAAC;AAGpE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AAErC,EAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,OAAA,IAAW,OAAA,CAAQ,UAAU,CAAC,CAAA,EAAG,SAAS,EAAE,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,WAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAE7B,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,uBAAuB,CAAA;AAChE,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAC1C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACnC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,aAAA,CAAc,KAAA,GAAgB,EAAA,EAAI,KAAA,GAAgB,EAAA,EAAiB;AAC1E,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,SAAA,GAAY,8CAAA;AAExB,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACnD,IAAA,WAAA,CAAY,SAAA,GACV,2GAAA;AACF,IAAA,WAAA,CAAY,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAGpC,IAAA,CAAC,QAAQ,OAAA,IAAW,EAAC,EAAG,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC1C,MAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACrD,MAAA,aAAA,CAAc,QAAQ,MAAA,CAAO,KAAA;AAC7B,MAAA,aAAA,CAAc,cAAc,MAAA,CAAO,KAAA;AACnC,MAAA,IAAI,KAAA,KAAU,OAAO,KAAA,EAAO;AAC1B,QAAA,aAAA,CAAc,QAAA,GAAW,IAAA;AAAA,MAC3B;AACA,MAAA,WAAA,CAAY,YAAY,aAAa,CAAA;AAAA,IACvC,CAAC,CAAA;AAGD,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,IAAI,QAAA,EAAU;AAC1C,MAAA,MAAM,eAAe,MAAM;AACzB,QAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,WAAA,CAAY,IAAA,EAAM,YAAY,KAAK,CAAA;AAAA,MAClE,CAAA;AACA,MAAA,WAAA,CAAY,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAAA,IACrD;AAEA,IAAA,WAAA,CAAY,YAAY,WAAW,CAAA;AAInC,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,SAAA,CAAU,YAAY,WAAW,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,YAAA,CAAa,WAAA,EAAa,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,aAAA,EAAc;AACd,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,SAAS,mBAAA,GAA4B;AACnC,IAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAC3B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,uBAAuB,CAAA;AAChE,IAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAC3B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,YAAY,IAAA,CAAK,aAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,SAAA,GAAY,QAAA,CAAS,cAAc,QAAQ,CAAA;AAC3C,QAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,QAAA,SAAA,CAAU,SAAA,GACR,gEAAA;AACF,QAAA,SAAA,CAAU,SAAA,GAAY,QAAA;AACtB,QAAA,SAAA,CAAU,UAAU,MAAM;AACxB,UAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,UAAU,QAAQ,CAAA,CAAE,QAAQ,IAAI,CAAA;AAChE,UAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAA,GAAS,QAAA,EAAU;AACxC,YAAA,MAAA,CAAO,MAAA,CAAO,cAAc,CAAC,CAAA;AAC7B,YAAA,IAAA,CAAK,MAAA,EAAO;AACZ,YAAA,aAAA,EAAc;AACd,YAAA,eAAA,EAAgB;AAChB,YAAA,mBAAA,EAAoB;AAAA,UACtB;AAAA,QACF,CAAA;AACA,QAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,WAAW,YAAA,IAAgB,QAAA;AACjC,MAAA,SAAA,CAAU,QAAA,GAAW,QAAA;AACrB,MAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC7C,MAAA,SAAA,CAAU,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,YAAA,GAAuC,IAAA;AAE3C,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAA,GAAS,QAAA,CAAS,cAAc,KAAK,CAAA;AACrC,IAAA,MAAA,CAAO,SAAA,GAAY,8BAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,SAAA,GAAY,kCAAA;AACnB,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOvB,IAAA,MAAA,CAAO,WAAA,GAAc,GAAA;AACrB,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,kCAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,aAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,MAAM,eACJ,OAAA,CAAQ,OAAA,IAAW,QAAQ,OAAA,GAAU,CAAC,GAAG,KAAA,IAAS,EAAA;AACpD,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AACxB,MAAA,aAAA,CAAc,YAAY,CAAA;AAC1B,MAAA,eAAA,EAAgB;AAChB,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAEA,IAAA,YAAA,GAAe,QAAA,CAAS,cAAc,MAAM,CAAA;AAC5C,IAAA,YAAA,CAAa,SAAA,GAAY,uBAAA;AAEzB,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAC/B,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc;AAE9B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAAc,iBAAiB,CAAA;AACrD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,IAAU,QAAA;AAClC,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,MAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC1C,MAAA,MAAA,CAAO,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACnD;AAEA,IAAA,YAAA,CAAa,WAAA,GAAc,GAAG,MAAA,CAAO,MAAM,IAAI,QAAA,KAAa,QAAA,GAAW,WAAM,QAAQ,CAAA,CAAA;AAAA,EACvF;AAGA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,aAAA,CAAc,KAAe,CAAC,CAAA;AACxD,EAAA,eAAA,EAAgB;AAChB,EAAA,mBAAA,EAAoB;AAGpB,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,4BAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAC/C,IAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,EAC1B;AACF;AASO,SAAS,qBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,OAAA;AAGtC,EAAA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,YAAA,KACS;AACT,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAC9F,IAAA,IAAI,YAAA,GAAe,QAAA,CAAS,cAAA,CAAe,OAAO,CAAA;AAElD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,CAAM,SAAA,CAAU,IAAI,SAAS,CAAA;AAC7B,MAAA,KAAA,CAAM,KAAA,GAAQ,YAAA;AAEd,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,YAAA,GAAe,QAAA,CAAS,cAAc,KAAK,CAAA;AAC3C,QAAA,YAAA,CAAa,EAAA,GAAK,OAAA;AAClB,QAAA,YAAA,CAAa,SAAA,GAAY,eAAA;AACzB,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAM7B,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,UAAA,EAAY,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,WAAW,CAAA;AAAA,QAChE,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,UAAA,EAAY,YAAY,YAAY,CAAA;AAAA,QAC5C;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,WAAA,GAAc,YAAA;AAC3B,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU,OAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAEd,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,MAAA,EAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,qBAAA,GAAwB,CAC5BC,IAAAA,EACA,MAAA,EACAC,UACA,QAAA,KACS;AACT,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAElB,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,UAAA,IAAcA,QAAAA,GAAWA,QAAAA,CAAQ,YAAY,CAAA,GAAK,CAAA;AACnE,IAAA,MAAM,QAAA,GACJ,UAAA,IAAcA,QAAAA,GAAWA,QAAAA,CAAQ,YAAY,QAAA,GAAY,QAAA;AAE3D,IAAA,IAAIA,QAAAA,CAAQ,QAAA,IAAY,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AACnD,MAAA,MAAA,CAAO,IAAA,CAAK,GAAGD,IAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAGA,IAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAGA,IAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,UAAA,IAAc,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAE7C,IAAA,MAAM,SAAS,SAAA,CAAU,gBAAA;AAAA,MACvB,WAAW,GAAG,CAAA,GAAA;AAAA,KAChB;AACA,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAC5B,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACf,MAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,qBAAA,CAAsB,KAAK,MAAA,EAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,MAAM,EAAE,CAAA;AAC3D,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,MAAM,QAAQ,SAAA,CAAU,aAAA;AAAA,MACtB,WAAW,GAAG,CAAA,EAAA;AAAA,KAChB;AACA,IAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAE5B,IAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,IAAY,QAAQ,EAAA,EAAI;AACrD,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC5B,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,KAAQ,EAAA,GAAK,IAAA,GAAO,KAAK,MAAA,EAAO;AAAA,EAClD;AACF;AAKO,SAAS,iBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AAEtB,EAAA,IAAI,UAAA,IAAc,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAE7C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,sDAAA,EAAyD,SAAS,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA;AAAA,OAC1F;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,SAAA,CAAU,gBAAA;AAAA,MACxB,WAAW,SAAS,CAAA,GAAA;AAAA,KACtB;AAEA,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AACjC,MAAA,IAAI,KAAA,GAAQ,MAAM,MAAA,EAAQ;AACxB,QAAA,MAAA,CAAO,KAAA,GAAQ,MAAM,KAAK,CAAA,IAAK,OAAO,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA,GAAI,EAAA;AAG7D,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,gBAAA,CAAiB,QAAQ,CAAA;AAChD,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC1B,UAAA,MAAA,CAAO,WAAW,MAAA,CAAO,KAAA,KAAU,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,QACxD,CAAC,CAAA;AAED,QAAA,MAAA,CAAO,SAAA,CAAU,OAAO,SAAS,CAAA;AACjC,QAAA,MAAA,CAAO,KAAA,GAAQ,EAAA;AAAA,MACjB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AACnC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,sCAAsC,SAAS,CAAA,MAAA,EAAS,QAAQ,MAAM,CAAA,sBAAA,EAAyB,MAAM,MAAM,CAAA,8CAAA;AAAA,OAC7G;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,SAAS,SAAA,CAAU,aAAA;AAAA,MACvB,UAAU,SAAS,CAAA,EAAA;AAAA,KACrB;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,KAAA,GAAQ,KAAA,IAAS,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA,GAAI,EAAA;AAG/C,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,gBAAA,CAAiB,QAAQ,CAAA;AAChD,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC1B,QAAA,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAAA,MACjD,CAAC,CAAA;AAED,MAAA,MAAA,CAAO,SAAA,CAAU,OAAO,SAAS,CAAA;AACjC,MAAA,MAAA,CAAO,KAAA,GAAQ,EAAA;AAAA,IACjB;AAAA,EACF;AACF;;;ACzYA,SAAS,mBAAmB,GAAA,EAA8B;AACxD,EAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,yBAAA;AAC5B,EAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,SAAA;AAClB,EAAA,GAAA,CAAI,MAAM,WAAA,GAAc,yBAAA;AAC1B;AAKA,SAAS,qBAAqB,GAAA,EAA8B;AAC1D,EAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,aAAA;AAC5B,EAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,sBAAA;AAClB,EAAA,GAAA,CAAI,MAAM,WAAA,GAAc,wBAAA;AAC1B;AAYA,SAAS,mBAAA,CACP,OAAA,EACA,YAAA,EACA,WAAA,EACA,UACA,QAAA,EACgB;AAChB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,EAAC;AAEpC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,EAAA,KAAA,CAAM,SAAA,GAAY,mBAAA;AAClB,EAAA,KAAA,CAAM,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAMtB,EAAA,MAAM,UAA+B,EAAC;AAEtC,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AACjC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAChB,IAAA,GAAA,CAAI,OAAA,CAAQ,QAAQ,MAAA,CAAO,KAAA;AAC3B,IAAA,GAAA,CAAI,cAAc,MAAA,CAAO,KAAA;AAGzB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAKR,QAAA,GAAW,YAAY,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAQ5C,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,GAAA,CAAI,MAAM,YAAA,GAAe,yBAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,UAAU,CAAA,EAAG;AACtB,MAAA,GAAA,CAAI,MAAM,YAAA,GACR,qDAAA;AACF,MAAA,GAAA,CAAI,MAAM,gBAAA,GAAmB,GAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,KAAA,KAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,GAAA,CAAI,MAAM,YAAA,GACR,qDAAA;AAAA,IACJ,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,MAAM,YAAA,GAAe,GAAA;AACzB,MAAA,GAAA,CAAI,MAAM,gBAAA,GAAmB,GAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,MAAA,CAAO,UAAU,YAAA,EAAc;AACjC,MAAA,kBAAA,CAAmB,GAAG,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,oBAAA,CAAqB,GAAG,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAElC,QAAA,WAAA,CAAY,QAAQ,MAAA,CAAO,KAAA;AAG3B,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM;AACrB,UAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,KAAU,MAAA,CAAO,KAAA,EAAO;AACpC,YAAA,kBAAA,CAAmB,CAAC,CAAA;AAAA,UACtB,CAAA,MAAO;AACL,YAAA,oBAAA,CAAqB,CAAC,CAAA;AAAA,UACxB;AAAA,QACF,CAAC,CAAA;AAED,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,QACvB;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,QAAA,IAAI,WAAA,CAAY,KAAA,KAAU,MAAA,CAAO,KAAA,EAAO;AACtC,UAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,kCAAA;AAAA,QAC9B;AAAA,MACF,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,QAAA,IAAI,WAAA,CAAY,KAAA,KAAU,MAAA,CAAO,KAAA,EAAO;AACtC,UAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,aAAA;AAAA,QAC9B;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAChB,IAAA,KAAA,CAAM,YAAY,GAAG,CAAA;AAAA,EACvB,CAAC,CAAA;AAED,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,qBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,YAAA,GACJ,OAAO,GAAA,CAAI,OAAA,CAAQ,QAAQ,GAAG,CAAA,IAAK,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAG1D,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,EAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,EAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AACnB,EAAA,WAAA,CAAY,KAAA,GAAQ,YAAA;AAEpB,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAE9B,EAAA,MAAM,WACJ,CAAC,QAAA,IAAY,GAAA,CAAI,QAAA,GACb,CAAC,KAAA,KAAkB;AACjB,IAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA;AAAA,EAC7C,CAAA,GACA,IAAA;AAEN,EAAA,MAAM,KAAA,GAAQ,mBAAA;AAAA,IACZ,OAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAC/B,EAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AAGzB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,4BAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAC/C,IAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,EAC1B;AACF;AAMO,SAAS,6BAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,gBAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAK,EAAC;AACnD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAa,IAAI,CAAC,GAAG,aAAa,CAAA,GAAI,EAAC;AAEpE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AAGrC,EAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,OAAA,IAAW,OAAA,CAAQ,UAAU,CAAC,CAAA,EAAG,SAAS,EAAE,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAE9B,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,WAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAE7B,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,yBAAyB,CAAA;AAClE,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAgC,oBAAoB,CAAA;AACvE,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,eAAA,CAAgB,KAAA,GAAgB,EAAA,EAAI,KAAA,GAAgB,EAAA,EAAiB;AAC5E,IAAA,MAAM,YAAA,GACJ,KAAA,KAAU,EAAA,GAAK,SAAA,CAAU,SAAS,MAAA,GAAS,KAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAA;AAE9C,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,SAAA,GAAY,gDAAA;AAExB,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,IAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,IAAA,WAAA,CAAY,IAAA,GAAO,WAAA;AACnB,IAAA,WAAA,CAAY,KAAA,GAAQ,KAAA;AACpB,IAAA,WAAA,CAAY,YAAY,WAAW,CAAA;AAEnC,IAAA,MAAM,WACJ,CAAC,QAAA,IAAY,GAAA,CAAI,QAAA,GACb,CAAC,GAAA,KAAgB;AACf,MAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,WAAA,CAAY,IAAA,EAAM,GAAG,CAAA;AAAA,IACpD,CAAA,GACA,IAAA;AAEN,IAAA,MAAM,KAAA,GAAQ,mBAAA;AAAA,MACZ,OAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,WAAA,CAAY,YAAY,KAAK,CAAA;AAE7B,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,SAAA,CAAU,YAAY,WAAW,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,YAAA,CAAa,WAAA,EAAa,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,aAAA,EAAc;AACd,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,SAAS,mBAAA,GAA4B;AACnC,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,yBAAyB,CAAA;AAClE,IAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAC3B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,YAAY,IAAA,CAAK,aAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,SAAA,GAAY,QAAA,CAAS,cAAc,QAAQ,CAAA;AAC3C,QAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,QAAA,SAAA,CAAU,SAAA,GAAY,mCAAA;AACtB,QAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAK1B,QAAA,SAAA,CAAU,SAAA,GAAY,QAAA;AACtB,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAC,SAAA,CAAgC,MAAM,eAAA,GACrC,kCAAA;AAAA,QACJ,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAC,SAAA,CAAgC,MAAM,eAAA,GAAkB,aAAA;AAAA,QAC3D,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,UAAU,MAAM;AACxB,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA;AAAA,YAClD;AAAA,WACF;AACA,UAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAA,GAAS,QAAA,EAAU;AACxC,YAAA,MAAA,CAAO,MAAA,CAAO,cAAc,CAAC,CAAA;AAC7B,YAAA,IAAA,CAAK,MAAA,EAAO;AACZ,YAAA,aAAA,EAAc;AACd,YAAA,eAAA,EAAgB;AAChB,YAAA,mBAAA,EAAoB;AAAA,UACtB;AAAA,QACF,CAAA;AACA,QAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,WAAW,YAAA,IAAgB,QAAA;AACjC,MAAA,SAAA,CAAU,QAAA,GAAW,QAAA;AACrB,MAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC7C,MAAA,SAAA,CAAU,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,MAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,YAAA,GAAuC,IAAA;AAE3C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAA,GAAS,QAAA,CAAS,cAAc,KAAK,CAAA;AACrC,IAAA,MAAA,CAAO,SAAA,GAAY,8BAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,SAAA,GAAY,oCAAA;AACnB,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOvB,IAAA,MAAA,CAAO,WAAA,GAAc,GAAA;AACrB,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,kCAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,aAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,MAAM,eACJ,OAAA,CAAQ,OAAA,IAAW,QAAQ,OAAA,GAAU,CAAC,GAAG,KAAA,IAAS,EAAA;AACpD,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AACxB,MAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,MAAA,eAAA,EAAgB;AAChB,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAEA,IAAA,YAAA,GAAe,QAAA,CAAS,cAAc,MAAM,CAAA;AAC5C,IAAA,YAAA,CAAa,SAAA,GAAY,uBAAA;AAEzB,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAC/B,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc;AAE9B,IAAA,MAAM,SAAS,MAAA,CAAO,aAAA;AAAA,MACpB;AAAA,KACF;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,IAAU,QAAA;AAClC,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,MAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC1C,MAAA,MAAA,CAAO,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACnD;AAEA,IAAA,YAAA,CAAa,WAAA,GAAc,GAAG,MAAA,CAAO,MAAM,IAAI,QAAA,KAAa,QAAA,GAAW,WAAM,QAAQ,CAAA,CAAA;AAAA,EACvF;AAGA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAe,CAAC,CAAA;AAC1D,EAAA,eAAA,EAAgB;AAChB,EAAA,mBAAA,EAAoB;AAGpB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,4BAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAC/C,IAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,EAC1B;AACF;AAUO,SAAS,uBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,OAAA;AAEtC,EAAA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,YAAA,KACS;AACT,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAC9F,IAAA,IAAI,YAAA,GAAe,QAAA,CAAS,cAAA,CAAe,OAAO,CAAA;AAElD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,CAAM,SAAA,CAAU,IAAI,SAAS,CAAA;AAC7B,MAAA,KAAA,CAAM,KAAA,GAAQ,YAAA;AAEd,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,YAAA,GAAe,QAAA,CAAS,cAAc,KAAK,CAAA;AAC3C,QAAA,YAAA,CAAa,EAAA,GAAK,OAAA;AAClB,QAAA,YAAA,CAAa,SAAA,GAAY,eAAA;AACzB,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAM7B,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,UAAA,EAAY,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,WAAW,CAAA;AAAA,QAChE,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,UAAA,EAAY,YAAY,YAAY,CAAA;AAAA,QAC5C;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,WAAA,GAAc,YAAA;AAC3B,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU,OAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAEd,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,MAAA,EAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAC5B,QAAA,EACA,MAAA,EACA,IACA,QAAA,KACS;AACT,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAElB,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,UAAA,IAAc,EAAA,GAAM,EAAA,CAAG,YAAY,CAAA,GAAK,CAAA;AACzD,IAAA,MAAM,QAAA,GACJ,UAAA,IAAc,EAAA,GAAM,EAAA,CAAG,YAAY,QAAA,GAAY,QAAA;AAEjD,IAAA,IAAI,EAAA,CAAG,QAAA,IAAY,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,QAAQ,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IACvE;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAoB,IAAI,GAAA;AAAA,IAC5B,SAAA,IAAa,OAAA,GACR,OAAA,CAA4B,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,GACvD;AAAC,GACP;AAEA,EAAA,IAAI,UAAA,IAAc,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAE7C,IAAA,MAAM,SAAS,SAAA,CAAU,gBAAA;AAAA,MACvB,+BAA+B,GAAG,CAAA,GAAA;AAAA,KACpC;AACA,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAC5B,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAEf,MAAA,IAAI,CAAC,kBAAkB,GAAA,KAAQ,EAAA,IAAM,CAAC,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA,EAAG;AAChE,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,eAAA,EAAiB,OAAA,CAAQ,KAAK,CAAA;AAC5C,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF,CAAC,CAAA;AAED,IAAA,qBAAA,CAAsB,KAAK,MAAA,EAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,MAAM,EAAE,CAAA;AAC3D,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,MAAM,QAAQ,SAAA,CAAU,aAAA;AAAA,MACtB,+BAA+B,GAAG,CAAA,EAAA;AAAA,KACpC;AACA,IAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAE5B,IAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,IAAY,QAAQ,EAAA,EAAI;AACrD,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC5B,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B;AAEA,IAAA,IAAI,CAAC,kBAAkB,GAAA,KAAQ,EAAA,IAAM,CAAC,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA,EAAG;AAChE,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,eAAA,EAAiB,OAAA,CAAQ,KAAK,CAAA;AAC5C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC5B,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B;AAEA,IAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AACxB,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,KAAQ,EAAA,GAAK,IAAA,GAAO,KAAK,MAAA,EAAO;AAAA,EAClD;AACF;AAUO,SAAS,mBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AAEtB,EAAA,IAAI,UAAA,IAAc,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAC7C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,wDAAA,EAA2D,SAAS,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA;AAAA,OAC5F;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,SAAA,CAAU,gBAAA;AAAA,MACvB,+BAA+B,SAAS,CAAA,GAAA;AAAA,KAC1C;AAEA,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,MAAA,IAAI,KAAA,GAAQ,MAAM,MAAA,EAAQ;AACxB,QAAA,MAAM,MAAA,GAAS,MAAM,KAAK,CAAA,IAAK,OAAO,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA,GAAI,EAAA;AAC7D,QAAA,KAAA,CAAM,KAAA,GAAQ,MAAA;AAGd,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,EAAe,aAAA,CAAc,oBAAoB,CAAA;AACrE,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,KAAA,CACG,gBAAA,CAAoC,kBAAkB,CAAA,CACtD,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAChB,YAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,EAAQ;AAChC,cAAA,kBAAA,CAAmB,GAAG,CAAA;AAAA,YACxB,CAAA,MAAO;AACL,cAAA,oBAAA,CAAqB,GAAG,CAAA;AAAA,YAC1B;AAAA,UACF,CAAC,CAAA;AAAA,QACL;AAEA,QAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,QAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAAA,MAChB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,CAAO,MAAA,EAAQ;AAClC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,wCAAwC,SAAS,CAAA,MAAA,EAAS,OAAO,MAAM,CAAA,qBAAA,EAAwB,MAAM,MAAM,CAAA,8CAAA;AAAA,OAC7G;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,QAAQ,SAAA,CAAU,aAAA;AAAA,MACtB,8BAA8B,SAAS,CAAA,EAAA;AAAA,KACzC;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,MAAA,GAAS,KAAA,IAAS,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA,GAAI,EAAA;AAC/C,MAAA,KAAA,CAAM,KAAA,GAAQ,MAAA;AAGd,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,EAAe,aAAA,CAAc,oBAAoB,CAAA;AACrE,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CACG,gBAAA,CAAoC,kBAAkB,CAAA,CACtD,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAChB,UAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,EAAQ;AAChC,YAAA,kBAAA,CAAmB,GAAG,CAAA;AAAA,UACxB,CAAA,MAAO;AACL,YAAA,oBAAA,CAAqB,GAAG,CAAA;AAAA,UAC1B;AAAA,QACF,CAAC,CAAA;AAAA,MACL;AAEA,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAAA,IAChB;AAAA,EACF;AACF;;;ACnkBO,SAAS,qBACd,MAAA,EACU;AACV,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAM,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAClE,IAAA,OAAO,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,aAAa,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,MAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,EAAC;AACV;AAGO,SAAS,sBAAA,CACd,UACA,iBAAA,EACS;AACT,EAAA,IAAI,iBAAA,CAAkB,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,EAAG,aAAY,IAAK,EAAA;AACxD,EAAA,OAAO,iBAAA,CAAkB,SAAS,GAAG,CAAA;AACvC;AAGO,SAAS,iBAAA,CAAkB,MAAY,SAAA,EAA4B;AACxE,EAAA,IAAI,SAAA,KAAc,UAAU,OAAO,IAAA;AACnC,EAAA,OAAO,IAAA,CAAK,IAAA,IAAQ,SAAA,GAAY,IAAA,GAAO,IAAA;AACzC;AAGA,SAAS,uBAAA,CACP,SAAA,EACA,IAAA,EACA,QAAA,EACA,KAAA,EACM;AACN,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,SAAA,GAAY,8BAAA;AAChB,EAAA,GAAA,CAAI,GAAA,GAAM,QAAA,IAAY,CAAA,CAAE,YAAA,EAAc,KAAK,CAAA;AAE3C,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,EAAA,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,KAAM;AACrB,IAAA,GAAA,CAAI,GAAA,GAAO,CAAA,CAAE,MAAA,EAAQ,MAAA,IAAqB,EAAA;AAAA,EAC5C,CAAA;AACA,EAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AACzB,EAAA,SAAA,CAAU,YAAY,GAAG,CAAA;AAC3B;AAGA,SAAS,wBACP,SAAA,EACA,IAAA,EACA,SAAA,EACA,UAAA,EACA,OACA,IAAA,EACa;AACb,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAGzC,EAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAGpB,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,SAAA,CAAU,KAAK,CAAA;AAC9C,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,SAAA,CAAU,UAAA,CAAW,YAAA,CAAa,YAAA,EAAc,SAAS,CAAA;AAAA,EAC3D;AAEA,EAAA,YAAA,CAAa,SAAA,GAAY;AAAA;AAAA,qFAAA,EAE4D,QAAQ,CAAA;AAAA,QAAA,EACrF,UAAA,CAAW,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,UAAA,EAIvC,UAAA,CAAW,CAAA,CAAE,eAAA,EAAiB,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA,UAAA,EAGrC,UAAA,CAAW,CAAA,CAAE,cAAA,EAAgB,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAM9C,EAAA,yBAAA,CAA0B,YAAA,EAAc,UAAA,EAAY,KAAA,EAAO,IAAI,CAAA;AAC/D,EAAA,OAAO,YAAA;AACT;AAGA,SAAS,yBAAA,CACP,SAAA,EACA,UAAA,EACA,KAAA,EACA,IAAA,EACM;AACN,EAAA,MAAM,YAAY,SAAA,CAAU,aAAA;AAAA,IAC1B;AAAA,GACF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,SAAA,CAAU,OAAA,GAAU,CAAC,CAAA,KAAM;AACzB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,SAAA,CAAU,aAAA;AAAA,IAC1B;AAAA,GACF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,SAAA,CAAU,OAAA,GAAU,CAAC,CAAA,KAAM;AACzB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,iBAAA,CAAkB,SAAA,EAAW,UAAA,EAAY,KAAA,EAAO,IAAI,CAAA;AAAA,IACtD,CAAA;AAAA,EACF;AACF;AAGA,SAAS,iBAAA,CACP,SAAA,EACA,UAAA,EACA,KAAA,EACA,IAAA,EACM;AACN,EAAA,KAAA,CAAM,aAAA,CAAc,OAAO,UAAU,CAAA;AAErC,EAAA,MAAM,WAAA,GAAc,UAAU,aAAA,EAAe,aAAA;AAAA,IAC3C;AAAA,GACF;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,WAAA,CAAY,KAAA,GAAQ,EAAA;AAAA,EACtB;AAEA,EAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,IAAA,SAAA,CAAU,UAAU,IAAA,CAAK,iBAAA;AAAA,EAC3B;AACA,EAAA,IAAI,MAAM,WAAA,EAAa;AACrB,IAAA,gBAAA,CAAiB,SAAA,EAAW,KAAK,WAAW,CAAA;AAAA,EAC9C;AAEA,EAAA,SAAA,CAAU,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,uCAAA,EAKiB,UAAA,CAAW,CAAA,CAAE,eAAA,EAAiB,KAAK,CAAC,CAAC,CAAA;AAAA;AAAA,EAAA,CAAA;AAG9E;AAGA,SAAS,0BAAA,CACP,SAAA,EACA,YAAA,EACA,UAAA,EACA,KAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,SAAA,GAAY,8BAAA;AAClB,EAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,EAAA,KAAA,CAAM,OAAA,GAAU,UAAA;AAChB,EAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,EAAA,KAAA,CAAM,GAAA,GAAM,YAAA;AAEZ,EAAA,KAAA,CAAM,WAAA;AAAA,IACJ,QAAA,CAAS,cAAA,CAAe,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAC;AAAA,GACvD;AACA,EAAA,SAAA,CAAU,YAAY,KAAK,CAAA;AAC7B;AAGA,SAAS,kBAAA,CACP,SAAA,EACA,UAAA,EACA,KAAA,EACM;AACN,EAAA,eAAA,CAAgB,SAAA,EAAW,OAAO,MAAM;AACtC,IAAA,KAAA,CAAM,aAAA,CAAc,OAAO,UAAU,CAAA;AAErC,IAAA,MAAM,WAAA,GAAc,UAAU,aAAA,EAAe,aAAA;AAAA,MAC3C;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,CAAY,KAAA,GAAQ,EAAA;AAAA,IACtB;AAEA,IAAA,SAAA,CAAU,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,EAKiB,UAAA,CAAW,CAAA,CAAE,eAAA,EAAiB,KAAK,CAAC,CAAC,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAG9E,CAAC,CAAA;AACH;AAGA,eAAe,uBACb,SAAA,EACA,IAAA,EACA,UACA,UAAA,EACA,UAAA,EACA,OACA,IAAA,EACe;AACf,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,EAAE,IAAA,CAAK,gBAAgB,IAAA,CAAA,EAAO;AAC9C,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,KAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC/C,IAAA,uBAAA,CAAwB,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,QAAA,EAAU,KAAK,CAAA;AAAA,EAC/D,WAAW,IAAA,CAAK,IAAA,IAAQ,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AACtD,IAAA,MAAM,YAAA,GAAe,uBAAA;AAAA,MACnB,SAAA;AAAA,MACA,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,SAAA,GAAY,YAAA;AAAA,EACd,CAAA,MAAO;AACL,IAAA,SAAA,CAAU,SAAA,GAAY,CAAA,2IAAA,EAAuI,UAAA,CAAW,QAAQ,CAAC,CAAA,YAAA,CAAA;AAAA,EACnL;AAGA,EAAA,IAAI,CAAC,cAAc,EAAE,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CAAA,EAAI;AACjE,IAAA,kBAAA,CAAmB,SAAA,EAAW,YAAY,KAAK,CAAA;AAAA,EACjD;AACF;AAGA,eAAe,yBAAA,CACb,SAAA,EACA,UAAA,EACA,QAAA,EACA,MACA,KAAA,EACe;AACf,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,YAAA,EAAc;AAC9B,IAAA,qBAAA,CAAsB,WAAW,KAAK,CAAA;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAM,KAAA,CAAM,MAAA,CAAO,aAAa,UAAU,CAAA;AAE/D,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,CAAM,SAAS,CAAA;AAEf,MAAA,IAAI,QAAQ,IAAA,CAAK,IAAA,IAAQ,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AACvD,QAAA,0BAAA,CAA2B,SAAA,EAAW,YAAA,EAAc,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,MACtE,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,QAAA,GAAA,CAAI,SAAA,GAAY,8BAAA;AAChB,QAAA,GAAA,CAAI,GAAA,GAAM,QAAA,IAAY,CAAA,CAAE,YAAA,EAAc,KAAK,CAAA;AAC3C,QAAA,GAAA,CAAI,GAAA,GAAM,YAAA;AACV,QAAA,SAAA,CAAU,YAAY,GAAG,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,qBAAA,CAAsB,WAAW,KAAK,CAAA;AAAA,IACxC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,SAAA,CAAU,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,EAKiB,WAAW,QAAA,IAAY,CAAA,CAAE,oBAAA,EAAsB,KAAK,CAAC,CAAC,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAG/F;AACF;AAGA,eAAsB,kBACpB,SAAA,EACA,UAAA,EACA,KAAA,EACA,OAAA,GAII,EAAC,EACU;AACf,EAAA,MAAM,EAAE,QAAA,GAAW,EAAA,EAAI,aAAa,KAAA,EAAO,IAAA,GAAO,MAAK,GAAI,OAAA;AAG3D,EAAA,IACE,CAAC,UAAA,IACD,IAAA,KACC,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,iBAAA,IAAqB,CAAC,IAAA,CAAK,WAAA,CAAA,EAClD;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,SAAS,CAAA;AAEf,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,SAAA,CAAU,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA;AAE/C,EAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAClD,IAAA,MAAM,sBAAA;AAAA,MACJ,SAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,yBAAA;AAAA,MACJ,SAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAGA,eAAsB,yBAAA,CACpB,UAAA,EACA,KAAA,EACA,QAAA,EACsB;AACtB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA;AAC/C,EAAA,MAAM,cAAA,GACQ,IAAA,EAAM,IAAA,IAAQ,WAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,MAAA;AAG3D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,WAAA,EAAY,CAAE,MAAM,QAAQ,CAAA;AAGzD,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,EAAA,UAAA,CAAW,SAAA,GAAY,QAAQ,WAAA,GAAc,WAAA;AAG7C,EAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACrD,EAAA,IAAI,KAAA,EAAO;AAET,IAAA,gBAAA,CAAiB,SAAA,GACf,0HAAA;AAAA,EACJ,CAAA,MAAO;AAEL,IAAA,gBAAA,CAAiB,SAAA,GACf,2FAAA;AAAA,EACJ;AAGA,EAAA,MAAM,OAAA,GACJ,CAAC,KAAA,KACA,IAAA,EAAM,IAAA,EAAM,UAAA,CAAW,QAAQ,CAAA,IAC9B,cAAA,CAAe,WAAA,EAAY,CAAE,KAAA,CAAM,4BAA4B,CAAA,CAAA;AAGnE,EAAA,MAAM,OAAA,GACJ,IAAA,EAAM,IAAA,EAAM,UAAA,CAAW,QAAQ,KAC/B,cAAA,CAAe,WAAA,EAAY,CAAE,KAAA,CAAM,uBAAuB,CAAA;AAE5D,EAAA,IAAI,OAAA,EAAS;AAEX,IAAA,IAAI,KAAA,CAAM,OAAO,YAAA,EAAc;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAM,KAAA,CAAM,MAAA,CAAO,aAAa,UAAU,CAAA;AAC/D,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,gBAAA,CAAiB,YAAY,CAAA,UAAA,EAAa,YAAY,CAAA,OAAA,EAAU,UAAA,CAAW,cAAc,CAAC,CAAA,wBAAA,CAAA;AAAA,QAC5F,CAAA,MAAO;AAEL,UAAA,gBAAA,CAAiB,SAAA,GAAY,CAAA,uKAAA,EAA8J,UAAA,CAAW,cAAc,CAAC,CAAA,kBAAA,CAAA;AAAA,QACvN;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,yBAAA,EAA2B,UAAA,EAAY,KAAK,CAAA;AACzD,QAAA,gBAAA,CAAiB,SAAA,GAAY,CAAA,uKAAA,EAA8J,UAAA,CAAW,cAAc,CAAC,CAAA,kBAAA,CAAA;AAAA,MACvN;AAAA,IACF,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,SAAA,GAAY,CAAA,uKAAA,EAA8J,UAAA,CAAW,cAAc,CAAC,CAAA,kBAAA,CAAA;AAAA,IACvN;AAAA,EACF,WAAW,OAAA,EAAS;AAElB,IAAA,IAAI,KAAA,CAAM,OAAO,YAAA,EAAc;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,aAAa,UAAU,CAAA;AAC3D,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,gBAAA,CAAiB,SAAA,GAAY;AAAA;AAAA,8EAAA,EAEyC,QAAQ,CAAA;AAAA,gBAAA,EACtE,UAAA,CAAW,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,QAWnD,CAAA,MAAO;AACL,UAAA,gBAAA,CAAiB,SAAA,GAAY,CAAA,iKAAA,EAA6J,UAAA,CAAW,cAAc,CAAC,CAAA,kBAAA,CAAA;AAAA,QACtN;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,+BAAA,EAAiC,UAAA,EAAY,KAAK,CAAA;AAC/D,QAAA,gBAAA,CAAiB,SAAA,GAAY,CAAA,iKAAA,EAA6J,UAAA,CAAW,cAAc,CAAC,CAAA,kBAAA,CAAA;AAAA,MACtN;AAAA,IACF,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,SAAA,GAAY,CAAA,iKAAA,EAA6J,UAAA,CAAW,cAAc,CAAC,CAAA,kBAAA,CAAA;AAAA,IACtN;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,GAAO,WAAA;AAChC,IAAA,MAAM,eAAA,GAAkB,QAAQ,UAAA,GAAa,UAAA;AAE7C,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,gBAAA,CAAiB,SAAA,GAAY;AAAA;AAAA,8CAAA,EAEa,QAAQ,CAAA;AAAA;AAAA,oEAAA,EAEc,UAAA,CAAW,cAAc,CAAC,CAAA;AAAA,+CAAA,EAC/C,eAAe,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAI5D,CAAA,MAAO;AAEL,MAAA,gBAAA,CAAiB,SAAA,GAAY,gIAAgI,QAAQ,CAAA,2BAAA,EAA8B,WAAW,cAAc,CAAC,iDAAiD,eAAe,CAAA,kBAAA,CAAA;AAAA,IAC/R;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAClD,EAAA,eAAA,CAAgB,SAAA,GAAY,QACxB,QAAA,GACA,+CAAA;AACJ,EAAA,eAAA,CAAgB,WAAA,GAAc,cAAA;AAG9B,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACtD,EAAA,cAAA,CAAe,SAAA,GACb,gGAAA;AACF,EAAA,cAAA,CAAe,WAAA,GAAc,CAAA,CAAE,gBAAA,EAAkB,KAAK,CAAA;AACtD,EAAA,cAAA,CAAe,OAAA,GAAU,CAAC,CAAA,KAAM;AAC9B,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAI,KAAA,CAAM,OAAO,YAAA,EAAc;AAC7B,MAAA,KAAA,CAAM,MAAA,CAAO,YAAA,CAAa,UAAA,EAAY,cAAc,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,UAAA,EAAY,gBAAgB,KAAK,CAAA;AAAA,IACjD;AAAA,EACF,CAAA;AAEA,EAAA,UAAA,CAAW,YAAY,gBAAgB,CAAA;AACvC,EAAA,UAAA,CAAW,YAAY,eAAe,CAAA;AACtC,EAAA,UAAA,CAAW,YAAY,cAAc,CAAA;AAErC,EAAA,OAAO,UAAA;AACT;AAGO,SAAS,oBACd,SAAA,EACA,IAAA,EACA,KAAA,EACA,QAAA,EACA,MACA,SAAA,EACM;AACN,EAAA,KAAA,CAAM,SAAS,CAAA;AAGf,EAAA,MAAM,gBAAgB,MAAc;AAClC,IAAA,MAAM,KAAA,GAAkB,CAAC,CAAA,CAAE,uBAAA,EAAyB,KAAK,CAAC,CAAA;AAC1D,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACzB,IAAA,IAAI,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACnC,IAAA,OAAO,KAAA,CAAM,KAAK,UAAK,CAAA;AAAA,EACzB,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,SAAA,CAAU,SAAA,CAAU,SAAS,MAAM,CAAA;AAE5D,EAAA,IAAA,CAAK,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,MAAM,eAAA,EAAiB;AAEnD,IAAA,MAAME,cAAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,IAAAA,eAAc,SAAA,GAAY,6BAAA;AAG1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,MAAA,IAAA,CAAK,SAAA,GACH,kKAAA;AAEF,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,eAAA,CAAgB,4BAAA,EAA8B,KAAK,CAAA;AACxE,MAAA,GAAA,CAAI,YAAA,CAAa,SAAS,yBAAyB,CAAA;AACnD,MAAA,GAAA,CAAI,YAAA,CAAa,QAAQ,cAAc,CAAA;AACvC,MAAA,GAAA,CAAI,YAAA,CAAa,WAAW,WAAW,CAAA;AAEvC,MAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AAAA,QACpB,4BAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,CAAK,YAAA;AAAA,QACH,GAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,GAAA,CAAI,YAAY,IAAI,CAAA;AACpB,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAGpB,MAAA,IAAA,CAAK,UAAU,MAAM;AAEnB,QAAA,IAAI,eAAe,SAAA,CAAU,aAAA;AAC7B,QAAA,OAAO,gBAAgB,CAAC,YAAA,CAAa,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,EAAG;AACpE,UAAA,YAAA,GAAe,YAAA,CAAa,aAAA;AAAA,QAC9B;AACA,QAAA,IAAI,CAAC,YAAA,IAAgB,SAAA,CAAU,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,EAAG;AAC9D,UAAA,YAAA,GAAe,SAAA;AAAA,QACjB;AACA,QAAA,MAAM,YAAY,YAAA,EAAc,aAAA;AAAA,UAC9B;AAAA,SACF;AACA,QAAA,IAAI,SAAA,YAAqB,KAAA,EAAM;AAAA,MACjC,CAAA;AAEA,MAAAA,cAAAA,CAAc,YAAY,IAAI,CAAA;AAAA,IAChC;AAGA,IAAA,MAAMC,SAAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAAA,UAAS,SAAA,GAAY,wCAAA;AACrB,IAAAA,SAAAA,CAAS,cAAc,aAAA,EAAc;AAErC,IAAA,SAAA,CAAU,YAAYD,cAAa,CAAA;AACnC,IAAA,SAAA,CAAU,YAAYC,SAAQ,CAAA;AAC9B,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,EAAA,aAAA,CAAc,SAAA,GAAY,mCAAA;AAG1B,EAAA,MAAM,kBAAA,GAAqB,IAAA,GAAO,IAAA,CAAK,MAAA,GAAS,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,kBAAA,GAAqB,CAAC,CAAA,GAAI,CAAA;AACxD,EAAA,MAAM,cAAc,UAAA,GAAa,CAAA;AAGjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAEzC,IAAA,IAAI,IAAA,IAAQ,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ;AAE3B,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,MAAA,IAAA,CAAK,SAAA,GACH,0GAAA;AACF,MAAA,IAAA,CAAK,QAAQ,UAAA,GAAa,GAAA;AAG1B,MAAA,0BAAA,CAA2B,MAAM,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAChE,QAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,GAAG,CAAA;AAChD,QAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA;AAAA,+BAAA,EAEQ,UAAA,CAAW,CAAA,CAAE,cAAA,EAAgB,KAAK,CAAC,CAAC,CAAA;AAAA,cAAA,CAAA;AAAA,MAE/D,CAAC,CAAA;AAGD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,QAAA,OAAA,CAAQ,SAAA,GACN,+HAAA;AAEF,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,QAAA,SAAA,CAAU,SAAA,GAAY,iDAAA;AACtB,QAAA,SAAA,CAAU,WAAA,GAAc,CAAA,CAAE,eAAA,EAAiB,KAAK,CAAA;AAChD,QAAA,SAAA,CAAU,OAAA,GAAU,CAAC,CAAA,KAAM;AACzB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,CAAS,GAAG,CAAA;AAAA,QACd,CAAA;AAEA,QAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAC7B,QAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,SAAA,GACH,qKAAA;AACF,MAAA,IAAA,CAAK,SAAA,GACH,yNAAA;AACF,MAAA,IAAA,CAAK,UAAU,MAAM;AACnB,QAAA,IAAI,eAAe,SAAA,CAAU,aAAA;AAC7B,QAAA,OAAO,gBAAgB,CAAC,YAAA,CAAa,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,EAAG;AACpE,UAAA,YAAA,GAAe,YAAA,CAAa,aAAA;AAAA,QAC9B;AACA,QAAA,IAAI,CAAC,YAAA,IAAgB,SAAA,CAAU,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,EAAG;AAC9D,UAAA,YAAA,GAAe,SAAA;AAAA,QACjB;AACA,QAAA,MAAM,YAAY,YAAA,EAAc,aAAA;AAAA,UAC9B;AAAA,SACF;AACA,QAAA,IAAI,SAAA,YAAqB,KAAA,EAAM;AAAA,MACjC,CAAA;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,YAAY,IAAI,CAAA;AAAA,EAChC;AAEA,EAAA,SAAA,CAAU,YAAY,aAAa,CAAA;AAGnC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,EAAA,QAAA,CAAS,SAAA,GAAY,wCAAA;AACrB,EAAA,QAAA,CAAS,cAAc,aAAA,EAAc;AACrC,EAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAChC;AAGA,SAAS,oBAAA,CACP,IAAA,EACA,KAAA,EACA,QAAA,GAAmB,WAAA,EACb;AACN,EAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA,gBAAA,EACD,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA,2CAAA,EAGO,UAAA,CAAW,CAAA,CAAE,cAAA,EAAgB,KAAK,CAAC,CAAC,CAAA;AAAA,QAAA,CAAA;AAEjF;AAGA,eAAe,0BAAA,CACb,IAAA,EACA,GAAA,EACA,IAAA,EACA,KAAA,EACe;AAEf,EAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3C,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,YAAgB,IAAA,EAAM;AAC1C,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,GAAA,CAAI,SAAA,GAAY,8BAAA;AAChB,MAAA,GAAA,CAAI,MAAM,IAAA,CAAK,IAAA;AAEf,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,MAAA,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,KAAM;AACrB,QAAA,GAAA,CAAI,GAAA,GAAO,CAAA,CAAE,MAAA,EAAQ,MAAA,IAAqB,EAAA;AAAA,MAC5C,CAAA;AACA,MAAA,MAAA,CAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAC9B,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IACtB,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,YAAA,EAAc;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,CAAO,aAAa,GAAG,CAAA;AAC/C,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,UAAA,GAAA,CAAI,SAAA,GAAY,8BAAA;AAChB,UAAA,GAAA,CAAI,MAAM,IAAA,CAAK,IAAA;AACf,UAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AACV,UAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,QACtB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,CAAA;AAAA,QAKnB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,QAAA,IAAI,KAAA,CAAM,OAAO,gBAAA,EAAkB;AACjC,UAAA,KAAA,CAAM,MAAA,CAAO,gBAAA,CAAiB,GAAA,EAAK,GAAG,CAAA;AAAA,QACxC;AAEA,QAAA,oBAAA,CAAqB,MAAM,KAAK,CAAA;AAAA,MAClC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,IAKnB;AAAA,EACF,WAAW,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAClD,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,YAAgB,IAAA,EAAM;AAC1C,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC9C,MAAA,IAAA,CAAK,SAAA,GAAY;AAAA;AAAA,oFAAA,EAE+D,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAW1F,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,YAAA,EAAc;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,aAAa,GAAG,CAAA;AACpD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,SAAA,GAAY;AAAA;AAAA,wFAAA,EAE+D,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,QAW1F,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,EAIa,UAAA,CAAW,IAAA,EAAM,IAAA,IAAQ,OAAO,CAAC,CAAA;AAAA,gBAAA,CAAA;AAAA,QAEjE;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,QAAA,IAAI,KAAA,CAAM,OAAO,gBAAA,EAAkB;AACjC,UAAA,KAAA,CAAM,MAAA,CAAO,gBAAA,CAAiB,GAAA,EAAK,GAAG,CAAA;AAAA,QACxC;AAEA,QAAA,oBAAA,CAAqB,IAAA,EAAM,OAAO,SAAS,CAAA;AAAA,MAC7C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAIa,UAAA,CAAW,IAAA,EAAM,IAAA,IAAQ,OAAO,CAAC,CAAA;AAAA,YAAA,CAAA;AAAA,IAEjE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA;AAAA,2BAAA,EAEQ,UAAA,CAAW,IAAA,EAAM,IAAA,IAAQ,MAAM,CAAC,CAAA;AAAA,UAAA,CAAA;AAAA,EAE3D;AACF;AAGA,SAAS,qBAAA,CACP,aAAA,EACA,KAAA,EACA,IAAA,EACM;AACN,EAAA,MAAM,WAAW,IAAA,GACb,CAAA,wCAAA,EAA2C,UAAA,CAAW,IAAI,CAAC,CAAA,MAAA,CAAA,GAC3D,EAAA;AACJ,EAAA,aAAA,CAAc,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,uCAAA,EAKa,UAAA,CAAW,CAAA,CAAE,eAAA,EAAiB,KAAK,CAAC,CAAC,CAAA;AAAA,MAAA,EACtE,QAAQ;AAAA;AAAA,EAAA,CAAA;AAGhB;AAEA,SAAS,aAAA,CACP,WACA,OAAA,EACM;AAEN,EAAA,MAAM,WAAW,SAAA,CACd,OAAA,CAAQ,YAAY,CAAA,EACnB,cAAc,qBAAqB,CAAA;AACvC,EAAA,IAAI,QAAA,WAAmB,MAAA,EAAO;AAE9B,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,kCAAA;AACpB,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAKxB,EAAA,OAAA,CAAQ,WAAA,GAAc,OAAA;AACtB,EAAA,SAAA,CAAU,OAAA,CAAQ,YAAY,CAAA,EAAG,WAAA,CAAY,OAAO,CAAA;AACtD;AAEA,SAAS,eAAe,SAAA,EAA8B;AACpD,EAAA,MAAM,WAAW,SAAA,CACd,OAAA,CAAQ,YAAY,CAAA,EACnB,cAAc,qBAAqB,CAAA;AACvC,EAAA,IAAI,QAAA,WAAmB,MAAA,EAAO;AAChC;AAEA,eAAe,gBAAA,CACb,IAAA,EACA,SAAA,EACA,SAAA,EACA,KAAA,EACA,IAAA,GAAwB,IAAA,EACxB,QAAA,EACA,iBAAA,GAA8B,EAAC,EAC/B,SAAA,GAAoB,QAAA,EACL;AACf,EAAA,IAAI,CAAC,sBAAA,CAAuB,IAAA,CAAK,IAAA,EAAM,iBAAiB,CAAA,EAAG;AACzD,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,aAAA;AAAA,MACE,SAAA;AAAA,MACA,CAAA,CAAE,wBAAwB,KAAA,EAAO,EAAE,MAAM,IAAA,CAAK,IAAA,EAAM,SAAS;AAAA,KAC/D;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA,EAAG;AACvC,IAAA,aAAA;AAAA,MACE,SAAA;AAAA,MACA,CAAA,CAAE,gBAAgB,KAAA,EAAO,EAAE,MAAM,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW;AAAA,KAClE;AACA,IAAA;AAAA,EACF;AAEA,EAAA,cAAA,CAAe,SAAS,CAAA;AAExB,EAAA,IAAI,GAAA;AAGJ,EAAA,IAAI,KAAA,CAAM,OAAO,UAAA,EAAY;AAC3B,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACxC,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,MACnE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,MAAA,IAAI,KAAA,CAAM,OAAO,aAAA,EAAe;AAC9B,QAAA,KAAA,CAAM,MAAA,CAAO,aAAA,CAAc,GAAA,EAAK,IAAI,CAAA;AAAA,MACtC;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,aAAA,CAAc,IAAI,GAAA,EAAK;AAAA,IAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAA,sBAAgB,IAAA,EAAK;AAAA,IACrB;AAAA;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,WAAA,GAAc,UAAU,aAAA,EAAe,aAAA;AAAA,IACzC;AAAA,GACF;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,WAAA,GAAc,QAAA,CAAS,cAAc,OAAO,CAAA;AAC5C,IAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,IAAA,WAAA,CAAY,IAAA,GAAO,SAAA;AACnB,IAAA,SAAA,CAAU,aAAA,EAAe,YAAY,WAAW,CAAA;AAAA,EAClD;AACA,EAAA,WAAA,CAAY,KAAA,GAAQ,GAAA;AAEpB,EAAA,iBAAA,CAAkB,SAAA,EAAW,KAAK,KAAA,EAAO;AAAA,IACvC,UAAU,IAAA,CAAK,IAAA;AAAA,IACf,UAAA,EAAY,KAAA;AAAA,IACZ;AAAA,GACD,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAGtB,EAAA,IAAI,QAAA,IAAY,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AACtC,IAAA,QAAA,CAAS,eAAA,CAAgB,WAAW,GAAG,CAAA;AAAA,EACzC;AACF;AAEA,SAAS,gBAAA,CACP,SACA,WAAA,EACM;AACN,EAAA,OAAA,CAAQ,gBAAA,CAAiB,UAAA,EAAY,CAAC,CAAA,KAAM;AAC1C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,iBAAA,EAAmB,YAAY,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,iBAAA,EAAmB,YAAY,CAAA;AAAA,EAC1D,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,gBAAA,CAAiB,MAAA,EAAQ,CAAC,CAAA,KAAM;AACtC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,iBAAA,EAAmB,YAAY,CAAA;AACxD,IAAA,IAAI,CAAA,CAAE,cAAc,KAAA,EAAO;AACzB,MAAA,WAAA,CAAY,CAAA,CAAE,aAAa,KAAK,CAAA;AAAA,IAClC;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,eAAA,CACP,SAAA,EACA,KAAA,EACA,QAAA,EACM;AAEN,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,aAAA,CAAc,iBAAiB,CAAA;AACjE,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,eAAA,CAAgB,MAAA,EAAO;AAAA,EACzB;AAGA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GACN,8IAAA;AAEF,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,EAAA,SAAA,CAAU,SAAA,GACR,oFAAA;AACF,EAAA,SAAA,CAAU,WAAA,GAAc,CAAA,CAAE,eAAA,EAAiB,KAAK,CAAA;AAChD,EAAA,SAAA,CAAU,OAAA,GAAU,CAAC,CAAA,KAAM;AACzB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,QAAA,EAAS;AAAA,EACX,CAAA;AAEA,EAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAC7B,EAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAC/B;AAEA,eAAe,gBAAA,CAAiB,MAAY,KAAA,EAA+B;AACzE,EAAA,IAAI,KAAA,CAAM,OAAO,UAAA,EAAY;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,CAAO,WAAW,IAAI,CAAA;AAC9C,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,MACnE;AACA,MAAA,OAAO,GAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,MAAA,IAAI,KAAA,CAAM,OAAO,aAAA,EAAe;AAC9B,QAAA,KAAA,CAAM,MAAA,CAAO,aAAA,CAAc,GAAA,EAAK,IAAI,CAAA;AAAA,MACtC;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAEA,eAAe,aAAA,CACb,UAAA,EACA,QAAA,EACA,KAAA,EACe;AACf,EAAA,IAAI;AAEF,IAAA,IAAI,OAAA,GAAyB,IAAA;AAE7B,IAAA,IAAI,KAAA,CAAM,OAAO,cAAA,EAAgB;AAC/B,MAAA,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,cAAA,CAAe,UAAU,CAAA;AAAA,IAClD,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,YAAA,EAAc;AACpC,MAAA,OAAA,GAAU,MAAM,KAAA,CAAM,MAAA,CAAO,YAAA,CAAa,UAAU,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,GACtC,OAAA,GACA,IAAI,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAE,IAAA;AAE3C,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAQ,CAAA;AACrC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC1D;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,YAAA,CAAa,MAAM,QAAQ,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,IAAA,IAAI,KAAA,CAAM,OAAO,eAAA,EAAiB;AAChC,MAAA,KAAA,CAAM,MAAA,CAAO,eAAA,CAAgB,GAAA,EAAK,UAAA,EAAY,QAAQ,CAAA;AAAA,IACxD;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAC1D,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,SAAS,YAAA,CAAa,MAAY,QAAA,EAAwB;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AAErB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAE9B,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,GAAA,CAAI,gBAAgB,OAAO,CAAA;AAAA,IAC7B,GAAG,GAAG,CAAA;AAAA,EACR,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAA0B,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,EACrE;AACF;AAEA,SAAS,sBAAA,CAAuB,cAAwB,KAAA,EAAoB;AAC1E,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,UAAA,KAAe;AACnC,MAAA,IAAI,CAAC,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA,EAAG;AACxC,QAAA,MAAM,WAAW,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAChD,QAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AACzD,QAAA,IAAI,QAAA,GAAW,0BAAA;AAEf,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAM,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7D,YAAA,QAAA,GAAW,CAAA,MAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,SAAS,CAAA,CAAA;AAAA,UAC9D,CAAA,MAAA,IAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAK,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5D,YAAA,QAAA,GAAW,CAAA,MAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,WAAA,GAAc,SAAS,CAAA,CAAA;AAAA,UACnE;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,aAAA,CAAc,IAAI,UAAA,EAAY;AAAA,UAClC,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,CAAA;AAAA,UACN,UAAA,sBAAgB,IAAA,EAAK;AAAA,UACrB,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;AAEA,SAAS,sBACP,OAAA,EACA,aAAA,EACA,OAAA,EACA,WAAA,EACA,OACA,IAAA,EACM;AAEN,EAAA,IAAI,CAAC,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,WAAW,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAC7C,IAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AACzD,IAAA,IAAI,QAAA,GAAW,0BAAA;AAEf,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAM,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7D,QAAA,QAAA,GAAW,CAAA,MAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,SAAS,CAAA,CAAA;AAAA,MAC9D,CAAA,MAAA,IAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAK,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5D,QAAA,QAAA,GAAW,CAAA,MAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,WAAA,GAAc,SAAS,CAAA,CAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,aAAA,CAAc,IAAI,OAAA,EAAS;AAAA,MAC/B,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,UAAA,sBAAgB,IAAA,EAAK;AAAA,MACrB,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,iBAAA,CAAkB,aAAA,EAAe,SAAS,KAAA,EAAO;AAAA,IAC/C,QAAA,EAAU,OAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ;AAAA,GACD,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAGtB,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,EAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,EAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AACnB,EAAA,WAAA,CAAY,KAAA,GAAQ,OAAA;AACpB,EAAA,WAAA,CAAY,YAAY,WAAW,CAAA;AACrC;AAEA,SAAS,sBACP,cAAA,EACA,YAAA,EACA,OACA,cAAA,EACA,WAAA,EACA,SACA,QAAA,EACM;AACN,EAAA,gBAAA,CAAiB,cAAA,EAAgB,OAAO,KAAA,KAAU;AAChD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAGjC,IAAA,MAAM,sBAAsB,QAAA,CAAS,MAAA;AAAA,MACnC,CAAC,CAAA,KAAM,CAAC,uBAAuB,CAAA,CAAE,IAAA,EAAM,YAAY,iBAAiB;AAAA,KACtE;AACA,IAAA,MAAM,iBAAiB,QAAA,CAAS,MAAA;AAAA,MAAO,CAAC,CAAA,KACtC,sBAAA,CAAuB,CAAA,CAAE,IAAA,EAAM,YAAY,iBAAiB;AAAA,KAC9D;AAGA,IAAA,MAAM,iBAAiB,cAAA,CAAe,MAAA;AAAA,MACpC,CAAC,CAAA,KAAM,CAAC,iBAAA,CAAkB,CAAA,EAAG,YAAY,OAAO;AAAA,KAClD;AACA,IAAA,MAAM,aAAa,cAAA,CAAe,MAAA;AAAA,MAAO,CAAC,CAAA,KACxC,iBAAA,CAAkB,CAAA,EAAG,YAAY,OAAO;AAAA,KAC1C;AAGA,IAAA,MAAM,SAAA,GACJ,WAAA,CAAY,QAAA,KAAa,QAAA,GACrB,UAAA,CAAW,MAAA,GACX,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,CAAY,QAAA,GAAW,YAAA,CAAa,MAAM,CAAA;AAC5D,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACzC,IAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,MAAA,GAAS,GAAA,CAAI,MAAA;AAG/C,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACvD,MAAA,MAAM,KAAA,GAAQ,oBAAoB,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC9D,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,EAAE,sBAAA,EAAwB,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS;AAAA,OAC3D;AAAA,IACF;AACA,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,KAAA,GAAQ,eAAe,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzD,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,CAAA,CAAE,gBAAgB,KAAA,EAAO,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,WAAA,CAAY,OAAA,EAAS;AAAA,OACxE;AAAA,IACF;AACA,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,CAAA,CAAE,sBAAsB,KAAA,EAAO;AAAA,UAC7B,OAAA,EAAS,cAAA;AAAA,UACT,KAAK,WAAA,CAAY;AAAA,SAClB;AAAA,OACH;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,aAAA,CAAc,cAAA,EAAgB,UAAA,CAAW,IAAA,CAAK,UAAK,CAAC,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,cAAc,CAAA;AAAA,IAC/B;AAEA,IAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,MAAA,MAAM,GAAA,GAAM,MAAM,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AAC9C,MAAA,KAAA,CAAM,aAAA,CAAc,IAAI,GAAA,EAAK;AAAA,QAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAA,sBAAgB,IAAA,EAAK;AAAA,QACrB,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,cAAA,EAAe;AAGf,IAAA,IAAI,QAAA,IAAY,OAAA,IAAW,CAAC,KAAA,CAAM,OAAO,QAAA,EAAU;AACjD,MAAA,QAAA,CAAS,eAAA,CAAgB,SAAS,YAAY,CAAA;AAAA,IAChD;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,wBACP,WAAA,EACA,YAAA,EACA,OACA,cAAA,EACA,WAAA,EACA,SACA,QAAA,EACM;AACN,EAAA,WAAA,CAAY,WAAW,YAAY;AACjC,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAG7C,MAAA,MAAM,sBAAsB,QAAA,CAAS,MAAA;AAAA,QACnC,CAAC,CAAA,KAAM,CAAC,uBAAuB,CAAA,CAAE,IAAA,EAAM,YAAY,iBAAiB;AAAA,OACtE;AACA,MAAA,MAAM,iBAAiB,QAAA,CAAS,MAAA;AAAA,QAAO,CAAC,CAAA,KACtC,sBAAA,CAAuB,CAAA,CAAE,IAAA,EAAM,YAAY,iBAAiB;AAAA,OAC9D;AAGA,MAAA,MAAM,iBAAiB,cAAA,CAAe,MAAA;AAAA,QACpC,CAAC,CAAA,KAAM,CAAC,iBAAA,CAAkB,CAAA,EAAG,YAAY,OAAO;AAAA,OAClD;AACA,MAAA,MAAM,aAAa,cAAA,CAAe,MAAA;AAAA,QAAO,CAAC,CAAA,KACxC,iBAAA,CAAkB,CAAA,EAAG,YAAY,OAAO;AAAA,OAC1C;AAGA,MAAA,MAAM,SAAA,GACJ,WAAA,CAAY,QAAA,KAAa,QAAA,GACrB,UAAA,CAAW,MAAA,GACX,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,CAAY,QAAA,GAAW,YAAA,CAAa,MAAM,CAAA;AAC5D,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACzC,MAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,MAAA,GAAS,GAAA,CAAI,MAAA;AAG/C,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,QAAA,MAAM,OAAA,GAAU,WAAA,CAAY,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACvD,QAAA,MAAM,KAAA,GAAQ,oBAAoB,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC9D,QAAA,UAAA,CAAW,IAAA;AAAA,UACT,EAAE,sBAAA,EAAwB,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS;AAAA,SAC3D;AAAA,MACF;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,MAAM,KAAA,GAAQ,eAAe,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzD,QAAA,UAAA,CAAW,IAAA;AAAA,UACT,CAAA,CAAE,gBAAgB,KAAA,EAAO;AAAA,YACvB,IAAA,EAAM,KAAA;AAAA,YACN,SAAS,WAAA,CAAY;AAAA,WACtB;AAAA,SACH;AAAA,MACF;AACA,MAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,QAAA,UAAA,CAAW,IAAA;AAAA,UACT,CAAA,CAAE,sBAAsB,KAAA,EAAO;AAAA,YAC7B,OAAA,EAAS,cAAA;AAAA,YACT,KAAK,WAAA,CAAY;AAAA,WAClB;AAAA,SACH;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GACJ,WAAA,CAAY,OAAA,CAAQ,YAAY,KAAK,WAAA,CAAY,aAAA;AACnD,MAAA,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,OAAA,EAAS;AACpC,QAAA,aAAA,CAAc,OAAA,EAAwB,UAAA,CAAW,IAAA,CAAK,UAAK,CAAC,CAAA;AAAA,MAC9D,WAAW,OAAA,EAAS;AAClB,QAAA,cAAA,CAAe,OAAsB,CAAA;AAAA,MACvC;AAEA,MAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,QAAA,MAAM,GAAA,GAAM,MAAM,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AAC9C,QAAA,KAAA,CAAM,aAAA,CAAc,IAAI,GAAA,EAAK;AAAA,UAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,UAAA,sBAAgB,IAAA,EAAK;AAAA,UACrB,IAAA,EAAM;AAAA,SACP,CAAA;AACD,QAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,cAAA,EAAe;AACf,IAAA,WAAA,CAAY,KAAA,GAAQ,EAAA;AAGpB,IAAA,IAAI,QAAA,IAAY,OAAA,IAAW,CAAC,KAAA,CAAM,OAAO,QAAA,EAAU;AACjD,MAAA,QAAA,CAAS,eAAA,CAAgB,SAAS,YAAY,CAAA;AAAA,IAChD;AAAA,EACF,CAAA;AACF;AAGO,SAAS,iBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAEzB,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,yBAAA,CAA0B,OAAA,EAAmB,KAAK,CAAA,CAC/C,IAAA,CAAK,CAAC,WAAA,KAAgB;AACrB,QAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAAA,MACjC,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,GAAG,CAAA;AACnD,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,QAAA,UAAA,CAAW,SAAA,GACT,oFAAA;AACF,QAAA,UAAA,CAAW,YAAY,CAAA,yBAAA,EAA4B,UAAA,CAAW,EAAE,oBAAA,EAAsB,KAAK,CAAC,CAAC,CAAA,MAAA,CAAA;AAC7F,QAAA,OAAA,CAAQ,YAAY,UAAU,CAAA;AAAA,MAChC,CAAC,CAAA;AAAA,IACL,CAAA,MAAO;AACL,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,MAAA,UAAA,CAAW,SAAA,GACT,oFAAA;AACF,MAAA,UAAA,CAAW,YAAY,CAAA,yBAAA,EAA4B,UAAA,CAAW,EAAE,gBAAA,EAAkB,KAAK,CAAC,CAAC,CAAA,MAAA,CAAA;AACzF,MAAA,OAAA,CAAQ,YAAY,UAAU,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,SAAA,GAAY,WAAA;AAExB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC7C,IAAA,MAAA,CAAO,IAAA,GAAO,MAAA;AACd,IAAA,MAAA,CAAO,IAAA,GAAO,OAAA;AACd,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AACvB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAA,CAAO,SACL,OAAO,OAAA,CAAQ,WAAW,QAAA,GACtB,OAAA,CAAQ,SACR,OAAA,CAAQ,MAAA,CAAO,YAAY,GAAA,CAAI,CAAC,QAAQ,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,EAAA;AAAA,IACxE;AAEA,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,IAAA,aAAA,CAAc,SAAA,GACZ,2HAAA;AAEF,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,OAAA,CAAQ,MAAM,CAAA;AACvD,IAAA,MAAM,SAAA,GAAY,QAAQ,OAAA,IAAW,QAAA;AAGrC,IAAA,MAAM,iBAAA,GAAoB,MAAM,MAAA,CAAO,KAAA,EAAM;AAC7C,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAoB;AACvC,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,MAAM,IAAA,GAAO,EAAE,MAAA,EAAQ,iBAAA,EAAmB,WAAA,EAAY;AACtD,QAAA,gBAAA;AAAA,UACE,MAAM,CAAC,CAAA;AAAA,UACP,aAAA;AAAA,UACA,OAAA;AAAA,UACA,KAAA;AAAA,UACA,IAAA;AAAA,UACA,GAAA,CAAI,QAAA;AAAA,UACJ,WAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA;AAGA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,qBAAA;AAAA,QACE,OAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,UACE,MAAA;AAAA,UACA,iBAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AACzC,MAAA,qBAAA,CAAsB,aAAA,EAAe,OAAO,IAAI,CAAA;AAAA,IAClD;AAEA,IAAA,aAAA,CAAc,OAAA,GAAU,iBAAA;AACxB,IAAA,gBAAA,CAAiB,eAAe,WAAW,CAAA;AAE3C,IAAA,MAAA,CAAO,WAAW,MAAM;AACtB,MAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC3C,QAAA,MAAM,IAAA,GAAO,EAAE,MAAA,EAAQ,iBAAA,EAAmB,WAAA,EAAY;AACtD,QAAA,gBAAA;AAAA,UACE,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,UACd,aAAA;AAAA,UACA,OAAA;AAAA,UACA,KAAA;AAAA,UACA,IAAA;AAAA,UACA,GAAA,CAAI,QAAA;AAAA,UACJ,WAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,WAAA,CAAY,YAAY,aAAa,CAAA;AACrC,IAAA,WAAA,CAAY,YAAY,MAAM,CAAA;AAE9B,IAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAAA,EACjC;AACF;AAEO,SAAS,kBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAEzB,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,IAAA,cAAA,CAAe,SAAA,GAAY,WAAA;AAE3B,IAAA,MAAM,eAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAkB,EAAC;AAEhE,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,UAAA,KAAe;AACnC,QAAA,yBAAA,CAA0B,UAAA,EAAY,KAAK,CAAA,CACxC,IAAA,CAAK,CAAC,WAAA,KAAgB;AACrB,UAAA,cAAA,CAAe,YAAY,WAAW,CAAA;AAAA,QACxC,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,GAAG,CAAA;AAAA,QACrD,CAAC,CAAA;AAAA,MACL,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,YAAY,CAAA,yHAAA,EAA4H,UAAA,CAAW,EAAE,iBAAA,EAAmB,KAAK,CAAC,CAAC,CAAA,YAAA,CAAA;AAAA,IAChM;AAEA,IAAA,OAAA,CAAQ,YAAY,cAAc,CAAA;AAAA,EACpC,CAAA,MAAO;AAoCL,IAAA,IAASC,mBAAT,WAAiC;AAC/B,MAAA,mBAAA;AAAA,QACE,IAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA;AAAA,QACA,CAAC,WAAA,KAAgB;AACf,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAC9C,UAAA,IAAI,QAAQ,EAAA,EAAI;AACd,YAAA,YAAA,CAAa,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,UAC9B;AACA,UAAAA,gBAAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAhDA,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,IAAA,YAAA,CAAa,SAAA,GAAY,WAAA;AAEzB,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,IAAA,WAAA,CAAY,IAAA,GAAO,MAAA;AACnB,IAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AACnB,IAAA,WAAA,CAAY,QAAA,GAAW,IAAA;AACvB,IAAA,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AAC5B,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,WAAA,CAAY,SACV,OAAO,OAAA,CAAQ,WAAW,QAAA,GACtB,OAAA,CAAQ,SACR,OAAA,CAAQ,MAAA,CAAO,YAAY,GAAA,CAAI,CAAC,QAAQ,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,EAAA;AAAA,IACxE;AAEA,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,IAAA,cAAA,CAAe,SAAA,GACb,+FAAA;AAEF,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,YAAA;AAEjB,IAAA,MAAM,eAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAkB,EAAC;AAGhE,IAAA,sBAAA,CAAuB,cAAc,KAAK,CAAA;AAE1C,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AACnD,IAAA,MAAM,gBAAA,GAA0C;AAAA,MAC9C,QAAA,EAAU,QAAA;AAAA,MACV,iBAAA,EAAmB,oBAAA,CAAqB,OAAA,CAAQ,MAAM,CAAA;AAAA,MACtD,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC9B;AAmBA,IAAAA,gBAAAA,EAAgB;AAEhB,IAAA,qBAAA;AAAA,MACE,cAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACAA,gBAAAA;AAAA,MACA,gBAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA,CAAI;AAAA,KACN;AACA,IAAA,uBAAA;AAAA,MACE,WAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACAA,gBAAAA;AAAA,MACA,gBAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA,CAAI;AAAA,KACN;AAEA,IAAA,cAAA,CAAe,YAAY,IAAI,CAAA;AAC/B,IAAA,YAAA,CAAa,YAAY,cAAc,CAAA;AACvC,IAAA,YAAA,CAAa,YAAY,WAAW,CAAA;AAEpC,IAAA,OAAA,CAAQ,YAAY,YAAY,CAAA;AAAA,EAClC;AACF;AAEO,SAAS,yBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AAErC,EAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAEzB,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,IAAA,cAAA,CAAe,SAAA,GAAY,WAAA;AAE3B,IAAA,MAAM,eAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAkB,EAAC;AAEhE,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,UAAA,KAAe;AACnC,QAAA,yBAAA,CAA0B,UAAA,EAAY,KAAK,CAAA,CACxC,IAAA,CAAK,CAAC,WAAA,KAAgB;AACrB,UAAA,cAAA,CAAe,YAAY,WAAW,CAAA;AAAA,QACxC,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,GAAG,CAAA;AAAA,QACrD,CAAC,CAAA;AAAA,MACL,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,YAAY,CAAA,yHAAA,EAA4H,UAAA,CAAW,EAAE,iBAAA,EAAmB,KAAK,CAAC,CAAC,CAAA,YAAA,CAAA;AAAA,IAChM;AAEA,IAAA,OAAA,CAAQ,YAAY,cAAc,CAAA;AAAA,EACpC,CAAA,MAAO;AAEL,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,IAAA,YAAA,CAAa,SAAA,GAAY,WAAA;AAEzB,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,IAAA,WAAA,CAAY,IAAA,GAAO,MAAA;AACnB,IAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AACnB,IAAA,WAAA,CAAY,QAAA,GAAW,IAAA;AACvB,IAAA,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AAC5B,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,WAAA,CAAY,SACV,OAAO,OAAA,CAAQ,WAAW,QAAA,GACtB,OAAA,CAAQ,SACR,OAAA,CAAQ,MAAA,CAAO,YAAY,GAAA,CAAI,CAAC,QAAQ,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,EAAA;AAAA,IACxE;AAEA,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,IAAA,cAAA,CAAe,SAAA,GAAY,sBAAA;AAE3B,IAAA,YAAA,CAAa,YAAY,WAAW,CAAA;AACpC,IAAA,YAAA,CAAa,YAAY,cAAc,CAAA;AAEvC,IAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,QAAQ,GAAG,CAAC,CAAA,GACvD,CAAC,GAAI,GAAA,CAAI,OAAA,CAAQ,QAAQ,GAAG,CAAc,IAC1C,EAAC;AAGL,IAAA,sBAAA,CAAuB,cAAc,KAAK,CAAA;AAE1C,IAAA,MAAM,iBAAA,GAAoB,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AACtD,IAAA,MAAM,mBAAA,GAA6C;AAAA,MACjD,QAAA,EAAU,QAAA;AAAA,MACV,iBAAA,EAAmB,oBAAA,CAAqB,OAAA,CAAQ,MAAM,CAAA;AAAA,MACtD,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC9B;AAGA,IAAA,MAAM,iBAAiB,MAAc;AACnC,MAAA,MAAM,SAAA,GACJ,aAAa,MAAA,KAAW,CAAA,GACpB,EAAE,iBAAA,EAAmB,KAAA,EAAO,EAAE,KAAA,EAAO,YAAA,CAAa,QAAQ,CAAA,GAC1D,EAAE,iBAAA,EAAmB,KAAA,EAAO,EAAE,KAAA,EAAO,YAAA,CAAa,QAAQ,CAAA;AAChE,MAAA,MAAM,aACJ,QAAA,GAAW,CAAA,IAAK,QAAA,GAAW,QAAA,GACvB,IAAI,CAAA,CAAE,gBAAA,EAAkB,KAAA,EAAO,EAAE,KAAK,QAAA,EAAU,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAA,GAChE,EAAA;AACN,MAAA,OAAO,SAAA,GAAY,UAAA;AAAA,IACrB,CAAA;AAEA,IAAA,MAAM,qBAAqB,MAAY;AACrC,MAAA,mBAAA;AAAA,QACE,cAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA;AAAA,QACA,CAAC,KAAA,KAAU;AACT,UAAA,YAAA,CAAa,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,GAAG,CAAC,CAAA;AAClD,UAAA,kBAAA,EAAmB;AAAA,QACrB,CAAA;AAAA,QACA,iBAAA;AAAA,QACA,cAAA;AAAe,OACjB;AAAA,IACF,CAAA;AAGA,IAAA,qBAAA;AAAA,MACE,cAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA,CAAI;AAAA,KACN;AAGA,IAAA,uBAAA;AAAA,MACE,WAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA,CAAI;AAAA,KACN;AAGA,IAAA,kBAAA,EAAmB;AAEnB,IAAA,OAAA,CAAQ,YAAY,YAAY,CAAA;AAAA,EAClC;AACF;AASO,SAAS,mBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAgB,IAAA,EAAK,GAAI,OAAA;AAE5C,EAAA,MAAM,eAAA,GACJ,QAAQ,IAAA,KAAS,OAAA,IAChB,cAAc,OAAA,IAAW,OAAA,CAAS,QAAwB,QAAQ,CAAA;AAGrE,EAAA,MAAM,iBAAA,GAAoB,CACxBJ,IAAAA,EACA,WAAA,EACAC,QAAAA,KACS;AACT,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAElB,IAAA,MAAM,QAAA,GAAW,UAAA,IAAcA,QAAAA,GAAWA,QAAAA,CAAQ,YAAY,CAAA,GAAK,CAAA;AACnE,IAAA,MAAM,QAAA,GACJ,UAAA,IAAcA,QAAAA,GAAWA,QAAAA,CAAQ,YAAY,QAAA,GAAY,QAAA;AAE3D,IAAA,IAAIA,QAAAA,CAAQ,QAAA,IAAY,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAChD,MAAA,MAAA,CAAO,IAAA,CAAK,GAAGD,IAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,QAAA,EAAU;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAGA,IAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,QAAA,EAAU;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAGA,IAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,sBAAA,GAAyB,CAC7BA,IAAAA,EACA,WAAA,EACAC,QAAAA,KACS;AACT,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,IAAA,MAAM,WAAA,GACJ,QAAA,IAAYA,QAAAA,GAAWA,QAAAA,CAAwB,MAAA,GAAS,MAAA;AAC1D,IAAA,MAAM,iBAAA,GAAoB,qBAAqB,WAAW,CAAA;AAC1D,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AACpC,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,IAAQ,GAAA;AAC/B,MAAA,IAAI,CAAC,sBAAA,CAAuB,QAAA,EAAU,iBAAiB,CAAA,EAAG;AACxD,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,EAAGD,IAAG,CAAA,EAAA,EAAK,CAAA,CAAE,sBAAA,EAAwB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,CAAC,CAAA;AAAA,SAC1E;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,iBAAA,GAAoB,CACxBA,IAAAA,EACA,WAAA,EACAC,QAAAA,KACS;AACT,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,IAAA,MAAM,SAAA,GACJ,SAAA,IAAaA,QAAAA,GAAYA,QAAAA,CAAwB,WAAW,QAAA,GAAY,QAAA;AAC1E,IAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAI,IAAA,CAAK,IAAA,GAAO,SAAA,GAAY,IAAA,GAAO,IAAA,EAAM;AACvC,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,EAAGD,IAAG,CAAA,EAAA,EAAK,CAAA,CAAE,cAAA,EAAgB,KAAA,EAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,CAAC,CAAA;AAAA,SAC9E;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,eAAA,EAAiB;AAEnB,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AAClC,IAAA,MAAM,cAAc,SAAA,CAAU,aAAA;AAAA,MAC5B,4BAA4B,OAAO,CAAA,EAAA;AAAA,KACrC;AACA,IAAA,MAAM,YAAA,GAAe,WAAA,EAAa,OAAA,CAAQ,YAAY,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,YAAA,EAAc,aAAA,CAAc,aAAa,CAAA,IAAK,IAAA;AAEhE,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAA8B,gBAAgB,CAAA;AACtE,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,UAAA;AAChC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,WAAA,CAAY,KAAK,UAAU,CAAA;AAAA,QAC7B;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,iBAAA,CAAkB,GAAA,EAAK,aAAa,OAAO,CAAA;AAC3C,IAAA,sBAAA,CAAuB,GAAA,EAAK,aAAa,OAAO,CAAA;AAChD,IAAA,iBAAA,CAAkB,GAAA,EAAK,aAAa,OAAO,CAAA;AAC3C,IAAA,OAAO,EAAE,KAAA,EAAO,WAAA,EAAa,MAAA,EAAO;AAAA,EACtC,CAAA,MAAO;AAEL,IAAA,MAAM,QAAQ,SAAA,CAAU,aAAA;AAAA,MACtB,gBAAgB,GAAG,CAAA,iBAAA;AAAA,KACrB;AACA,IAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAE5B,IAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,IAAY,QAAQ,EAAA,EAAI;AACrD,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAE,CAAA;AACrD,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B;AAEA,IAAA,IAAI,CAAC,cAAA,IAAkB,GAAA,KAAQ,EAAA,EAAI;AACjC,MAAA,sBAAA,CAAuB,GAAA,EAAK,CAAC,GAAG,CAAA,EAAG,OAAO,CAAA;AAC1C,MAAA,iBAAA,CAAkB,GAAA,EAAK,CAAC,GAAG,CAAA,EAAG,OAAO,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,IAAO,IAAA,EAAM,MAAA,EAAO;AAAA,EACtC;AACF;AAKO,SAAS,eAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAM,GAAI,OAAA;AAE7B,EAAA,IAAI,UAAA,IAAc,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAE7C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,yDAAA,EAA4D,SAAS,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA;AAAA,OAC7F;AACA,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,UAAA,KAAe;AAC5B,MAAA,IAAI,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AAChD,QAAA,IAAI,CAAC,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA,EAAG;AACxC,UAAA,MAAM,WAAW,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAChD,UAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AACzD,UAAA,IAAI,QAAA,GAAW,0BAAA;AAEf,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAM,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7D,cAAA,QAAA,GAAW,CAAA,MAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,SAAS,CAAA,CAAA;AAAA,YAC9D,CAAA,MAAA,IAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAK,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5D,cAAA,QAAA,GAAW,CAAA,MAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,WAAA,GAAc,SAAS,CAAA,CAAA;AAAA,YACnE;AAAA,UACF;AAEA,UAAA,KAAA,CAAM,aAAA,CAAc,IAAI,UAAA,EAAY;AAAA,YAClC,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAA;AAAA,YACN,UAAA,sBAAgB,IAAA,EAAK;AAAA,YACrB,IAAA,EAAM;AAAA,WACP,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,yCAAyC,SAAS,CAAA,6CAAA;AAAA,KACpD;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,cAAc,SAAA,CAAU,aAAA;AAAA,MAC5B,eAAe,SAAS,CAAA,iBAAA;AAAA,KAC1B;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,2DAA2D,SAAS,CAAA,CAAA;AAAA,OACtE;AACA,MAAA;AAAA,IACF;AAGA,IAAA,WAAA,CAAY,KAAA,GAAQ,KAAA,IAAS,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA,GAAI,EAAA;AAGpD,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,MAAA,IAAI,CAAC,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAEnC,QAAA,MAAM,WAAW,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAC3C,QAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AACzD,QAAA,IAAI,QAAA,GAAW,0BAAA;AAEf,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAM,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7D,YAAA,QAAA,GAAW,CAAA,MAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,SAAS,CAAA,CAAA;AAAA,UAC9D,CAAA,MAAA,IAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAK,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5D,YAAA,QAAA,GAAW,CAAA,MAAA,EAAS,SAAA,KAAc,KAAA,GAAQ,WAAA,GAAc,SAAS,CAAA,CAAA;AAAA,UACnE;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,aAAA,CAAc,IAAI,KAAA,EAAO;AAAA,UAC7B,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,CAAA;AAAA,UACN,UAAA,sBAAgB,IAAA,EAAK;AAAA,UACrB,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAIA,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,gCAAgC,SAAS,CAAA,6CAAA;AAAA,OAC3C;AAAA,IACF;AAAA,EACF;AACF;;;ACx1DA,SAAS,qBAAqB,KAAA,EAAuB;AACnD,EAAA,IAAI,CAAC,OAAO,OAAO,SAAA;AACnB,EAAA,OAAO,MAAM,WAAA,EAAY;AAC3B;AAKA,SAAS,iBAAiB,KAAA,EAAwB;AAChD,EAAA,OAAO,kBAAkB,IAAA,CAAK,KAAK,CAAA,IAAK,iBAAA,CAAkB,KAAK,KAAK,CAAA;AACtE;AAKA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,EAAG;AACjC,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,GAAG,WAAA,EAAY;AAAA,EACjD;AACA,EAAA,OAAO,MAAM,WAAA,EAAY;AAC3B;AAMA,SAAS,uBAAuB,KAAA,EAA+B;AAC7D,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,yBAAA;AAEtB,EAAA,MAAM,eAAA,GAAkB,qBAAqB,KAAK,CAAA;AAElD,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAKD,eAAe,CAAA;AAAA,EAAA,CAAA;AAGrC,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAKxB,EAAA,OAAA,CAAQ,WAAA,GAAc,eAAA;AAEtB,EAAA,SAAA,CAAU,YAAY,MAAM,CAAA;AAC5B,EAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAE7B,EAAA,OAAO,SAAA;AACT;AAMA,SAAS,kBAAA,CACP,KAAA,EACA,OAAA,EACA,GAAA,EACgB;AAChB,EAAA,MAAM,eAAA,GAAkB,qBAAqB,KAAK,CAAA;AAElD,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,EAAA,aAAA,CAAc,SAAA,GAAY,uBAAA;AAC1B,EAAA,aAAA,CAAc,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAO9B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,SAAA,GAAY,eAAA;AACnB,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAKD,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAOrC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC/C,EAAA,QAAA,CAAS,IAAA,GAAO,MAAA;AAChB,EAAA,QAAA,CAAS,SAAA,GAAY,kBAAA;AACrB,EAAA,QAAA,CAAS,IAAA,GAAO,OAAA;AAChB,EAAA,QAAA,CAAS,KAAA,GAAQ,eAAA;AACjB,EAAA,QAAA,CAAS,WAAA,GAAc,SAAA;AACvB,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAazB,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,EAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AACnB,EAAA,WAAA,CAAY,SAAA,GAAY,sBAAA;AACxB,EAAA,WAAA,CAAY,KAAA,GAAQ,gBAAgB,WAAA,EAAY;AAChD,EAAA,WAAA,CAAY,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAO5B,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,IAAA,EAAK;AACvC,IAAA,IAAI,gBAAA,CAAiB,UAAU,CAAA,EAAG;AAChC,MAAA,MAAM,QAAA,GAAW,gBAAgB,UAAU,CAAA;AAC3C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,QAAA;AAC/B,MAAA,WAAA,CAAY,KAAA,GAAQ,SAAS,WAAA,EAAY;AACzC,MAAA,QAAA,CAAS,SAAA,CAAU,OAAO,SAAS,CAAA;AAEnC,MAAA,IAAI,IAAI,QAAA,EAAU;AAChB,QAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA;AAAA,MAChD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,SAAA,CAAU,IAAI,SAAS,CAAA;AAAA,IAClC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,QAAA,CAAS,gBAAA,CAAiB,QAAQ,MAAM;AACtC,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,IAAA,EAAK;AACvC,IAAA,IAAI,gBAAA,CAAiB,UAAU,CAAA,EAAG;AAChC,MAAA,MAAM,QAAA,GAAW,gBAAgB,UAAU,CAAA;AAC3C,MAAA,QAAA,CAAS,KAAA,GAAQ,QAAA;AACjB,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,QAAA;AAC/B,MAAA,WAAA,CAAY,KAAA,GAAQ,SAAS,WAAA,EAAY;AACzC,MAAA,QAAA,CAAS,SAAA,CAAU,OAAO,SAAS,CAAA;AAAA,IACrC;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,WAAA,CAAY,gBAAA,CAAiB,UAAU,MAAM;AAC3C,IAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,WAAA,CAAY,KAAK,CAAA;AACzD,IAAA,QAAA,CAAS,KAAA,GAAQ,UAAA;AACjB,IAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,UAAA;AAE/B,IAAA,IAAI,IAAI,QAAA,EAAU;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,UAAU,CAAA;AAAA,IAClD;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,IAAA,WAAA,CAAY,KAAA,EAAM;AAAA,EACpB,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,IAAA,MAAA,CAAO,MAAM,WAAA,GAAc,8BAAA;AAAA,EAC7B,CAAC,CAAA;AACD,EAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,IAAA,MAAA,CAAO,MAAM,WAAA,GAAc,wBAAA;AAAA,EAC7B,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,QAAA,CAAS,MAAM,WAAA,GAAc,8BAAA;AAC7B,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,CAAA,2DAAA,CAAA;AACzB,IAAA,QAAA,CAAS,MAAM,aAAA,GAAgB,GAAA;AAAA,EACjC,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,QAAQ,MAAM;AACtC,IAAA,QAAA,CAAS,MAAM,WAAA,GAAc,wBAAA;AAC7B,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAAA,EAC3B,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAC5C,IAAA,IAAI,QAAA,CAAS,kBAAkB,QAAA,EAAU;AACvC,MAAA,QAAA,CAAS,MAAM,WAAA,GAAc,8BAAA;AAAA,IAC/B;AAAA,EACF,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAC5C,IAAA,IAAI,QAAA,CAAS,kBAAkB,QAAA,EAAU;AACvC,MAAA,QAAA,CAAS,MAAM,WAAA,GAAc,wBAAA;AAAA,IAC/B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,aAAA,CAAc,YAAY,MAAM,CAAA;AAChC,EAAA,aAAA,CAAc,YAAY,QAAQ,CAAA;AAClC,EAAA,aAAA,CAAc,YAAY,WAAW,CAAA;AAErC,EAAA,OAAO,aAAA;AACT;AAEO,SAAS,mBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,eACH,GAAA,CAAI,OAAA,CAAQ,QAAQ,GAAG,CAAA,IAAgB,QAAQ,OAAA,IAAW,SAAA;AAE7D,EAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAEzB,IAAA,MAAM,UAAA,GAAa,uBAAuB,YAAY,CAAA;AACtD,IAAA,OAAA,CAAQ,YAAY,UAAU,CAAA;AAAA,EAChC,CAAA,MAAO;AAEL,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,YAAA,EAAc,OAAA,EAAS,GAAG,CAAA;AAC5D,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC7C,IAAA,UAAA,CAAW,SAAA,GAAY,MAAA;AACvB,IAAA,UAAA,CAAW,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA,IAAA,CAAA;AAI3B,IAAA,UAAA,CAAW,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AACrD,IAAA,OAAA,CAAQ,YAAY,UAAU,CAAA;AAAA,EAChC;AACF;AAEO,SAAS,2BAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,gBAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAK,EAAC;AACnD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAa,IAAI,CAAC,GAAG,aAAa,CAAA,GAAI,EAAC;AAGpE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AAErC,EAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,SAAS,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,WAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAE7B,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,uBAAuB,CAAA;AAChE,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AACxC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,aAAA,CACP,KAAA,GAAgB,SAAA,EAChB,KAAA,GAAgB,EAAA,EACH;AACb,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,SAAA,GAAY,8CAAA;AAExB,IAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAEzB,MAAA,MAAM,UAAA,GAAa,uBAAuB,KAAK,CAAA;AAE/C,MAAA,OAAO,WAAW,UAAA,EAAY;AAC5B,QAAA,WAAA,CAAY,WAAA,CAAY,WAAW,UAAU,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA,MAAO;AAGL,MAAA,MAAM,cAAc,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAA,CAAU,SAAS,MAAM,CAAA,CAAA,CAAA;AAC3D,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,KAAA,EAAO,WAAA,EAAa,GAAG,CAAA;AAEzD,MAAA,MAAA,CAAO,MAAM,IAAA,GAAO,GAAA;AACpB,MAAA,WAAA,CAAY,YAAY,MAAM,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,SAAA,CAAU,YAAY,WAAW,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,YAAA,CAAa,WAAA,EAAa,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,aAAA,EAAc;AACd,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,SAAS,mBAAA,GAA4B;AACnC,IAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAC3B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,uBAAuB,CAAA;AAChE,IAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAC3B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,YAAY,IAAA,CAAK,aAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,SAAA,GAAY,QAAA,CAAS,cAAc,QAAQ,CAAA;AAC3C,QAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,QAAA,SAAA,CAAU,SAAA,GAAY,mCAAA;AACtB,QAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAK1B,QAAA,SAAA,CAAU,SAAA,GAAY,QAAA;AACtB,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAA,SAAA,CAAU,MAAM,eAAA,GAAkB,kCAAA;AAAA,QACpC,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAA,SAAA,CAAU,MAAM,eAAA,GAAkB,aAAA;AAAA,QACpC,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,UAAU,MAAM;AACxB,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA;AAAA,YAClD;AAAA,WACF;AACA,UAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAA,GAAS,QAAA,EAAU;AACxC,YAAA,MAAA,CAAO,MAAA,CAAO,cAAc,CAAC,CAAA;AAC7B,YAAA,IAAA,CAAK,MAAA,EAAO;AACZ,YAAA,aAAA,EAAc;AACd,YAAA,eAAA,EAAgB;AAChB,YAAA,mBAAA,EAAoB;AAAA,UACtB;AAAA,QACF,CAAA;AACA,QAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,WAAW,YAAA,IAAgB,QAAA;AACjC,MAAA,SAAA,CAAU,QAAA,GAAW,QAAA;AACrB,MAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC7C,MAAA,SAAA,CAAU,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,YAAA,GAAuC,IAAA;AAE3C,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAA,GAAS,QAAA,CAAS,cAAc,KAAK,CAAA;AACrC,IAAA,MAAA,CAAO,SAAA,GAAY,8BAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,SAAA,GAAY,kCAAA;AACnB,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOvB,IAAA,MAAA,CAAO,WAAA,GAAc,GAAA;AACrB,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,kCAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,aAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,MAAM,aAAA,GAAgB,QAAQ,OAAA,IAAW,SAAA;AACzC,MAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AACzB,MAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,MAAA,eAAA,EAAgB;AAChB,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAEA,IAAA,YAAA,GAAe,QAAA,CAAS,cAAc,MAAM,CAAA;AAC5C,IAAA,YAAA,CAAa,SAAA,GAAY,uBAAA;AAEzB,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAC/B,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc;AAE9B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAAc,iBAAiB,CAAA;AACrD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,IAAU,QAAA;AAClC,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,MAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC1C,MAAA,MAAA,CAAO,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACnD;AAEA,IAAA,YAAA,CAAa,WAAA,GAAc,GAAG,MAAA,CAAO,MAAM,IAAI,QAAA,KAAa,QAAA,GAAW,WAAM,QAAQ,CAAA,CAAA;AAAA,EACvF;AAGA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,aAAA,CAAc,KAAe,CAAC,CAAA;AACxD,EAAA,eAAA,EAAgB;AAChB,EAAA,mBAAA,EAAoB;AAGpB,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA,IAAA,CAAA;AAIrB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAC/C,IAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,EAC1B;AACF;AASO,SAAS,qBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,OAAA;AAGtC,EAAA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,YAAA,KACS;AACT,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAC9F,IAAA,IAAI,YAAA,GAAe,QAAA,CAAS,cAAA,CAAe,OAAO,CAAA;AAElD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,CAAM,SAAA,CAAU,IAAI,SAAS,CAAA;AAC7B,MAAA,KAAA,CAAM,KAAA,GAAQ,YAAA;AAEd,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,YAAA,GAAe,QAAA,CAAS,cAAc,KAAK,CAAA;AAC3C,QAAA,YAAA,CAAa,EAAA,GAAK,OAAA;AAClB,QAAA,YAAA,CAAa,SAAA,GAAY,eAAA;AACzB,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAM7B,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,UAAA,EAAY,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,WAAW,CAAA;AAAA,QAChE,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,UAAA,EAAY,YAAY,YAAY,CAAA;AAAA,QAC5C;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,WAAA,GAAc,YAAA;AAC3B,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU,OAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAEd,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,MAAA,EAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,mBAAA,GAAsB,CAC1B,KAAA,EACA,GAAA,EACA,QAAA,KACW;AACX,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,EAAU;AACvC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,KAAK,CAAA;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,QAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,QAAA,OAAO,EAAA;AAAA,MACT;AACA,MAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AACxB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,qBAAqB,GAAG,CAAA;AAC3C,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,gBAAA,CAAiB,UAAU,CAAA,EAAG;AACpD,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,kBAAA,EAAoB,KAAK,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,YAAA,CAAa,OAAO,IAAI,CAAA;AACxB,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AAGpB,IAAA,MAAM,SAAA,GACJ,SAAA,CAAU,gBAAA,CAAmC,CAAA,QAAA,EAAW,GAAG,CAAA,oBAAA,CAAsB,CAAA;AACnF,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAClC,MAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAC5B,MAAA,MAAM,SAAA,GAAY,oBAAoB,KAAA,EAAO,GAAA,EAAK,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AACpE,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,IACvB,CAAC,CAAA;AAGD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AACrC,MAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,EAAE,CAAA;AAEpD,MAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MAClE;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO;AAAA,EACjC,CAAA,MAAO;AAGL,IAAA,MAAM,WAAW,SAAA,CAAU,aAAA;AAAA,MACzB,UAAU,GAAG,CAAA,mBAAA;AAAA,KACf;AACA,IAAA,MAAM,GAAA,GAAM,UAAU,KAAA,IAAS,EAAA;AAE/B,IAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,IAAY,QAAQ,EAAA,EAAI;AACrD,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC5B,MAAA,YAAA,CAAa,UAAU,GAAG,CAAA;AAC1B,MAAA,OAAO,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAO;AAAA,IAC7B;AAEA,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,QAAA,EAAW,GAAA,EAAK,GAAG,CAAA;AACzD,IAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,MAAA,EAAO;AAAA,EACpC;AACF;AAKO,SAAS,iBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AAEtB,EAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,sDAAA,EAAyD,SAAS,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA;AAAA,OAC1F;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GACJ,SAAA,CAAU,gBAAA,CAAmC,CAAA,QAAA,EAAW,SAAS,CAAA,oBAAA,CAAsB,CAAA;AAEzF,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,EAAU,KAAA,KAAU;AACrC,MAAA,IAAI,KAAA,GAAQ,MAAM,MAAA,EAAQ;AACxB,QAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,KAAA,CAAM,KAAK,CAAC,CAAA;AACpD,QAAA,QAAA,CAAS,KAAA,GAAQ,UAAA;AACjB,QAAA,QAAA,CAAS,SAAA,CAAU,OAAO,SAAS,CAAA;AACnC,QAAA,QAAA,CAAS,KAAA,GAAQ,EAAA;AAGjB,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,wBAAwB,CAAA;AACzD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,aAAA,CAA2B,gBAAgB,CAAA;AAClE,UAAA,MAAM,cAAc,OAAA,CAAQ,aAAA;AAAA,YAC1B;AAAA,WACF;AACA,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,UAAA;AAAA,UACjC;AACA,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,WAAA,CAAY,KAAA,GAAQ,WAAW,WAAA,EAAY;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ;AACrC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,sCAAsC,SAAS,CAAA,MAAA,EAAS,UAAU,MAAM,CAAA,qBAAA,EAAwB,MAAM,MAAM,CAAA,8CAAA;AAAA,OAC9G;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,WAAW,SAAA,CAAU,aAAA;AAAA,MACzB,UAAU,SAAS,CAAA,mBAAA;AAAA,KACrB;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,UAAA,GAAa,qBAAqB,KAAK,CAAA;AAC7C,MAAA,QAAA,CAAS,KAAA,GAAQ,UAAA;AACjB,MAAA,QAAA,CAAS,SAAA,CAAU,OAAO,SAAS,CAAA;AACnC,MAAA,QAAA,CAAS,KAAA,GAAQ,EAAA;AAGjB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,wBAAwB,CAAA;AACzD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,aAAA,CAA2B,gBAAgB,CAAA;AAClE,QAAA,MAAM,cAAc,OAAA,CAAQ,aAAA;AAAA,UAC1B;AAAA,SACF;AACA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,UAAA;AAAA,QACjC;AACA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,WAAA,CAAY,KAAA,GAAQ,WAAW,WAAA,EAAY;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACtoBA,SAAS,qBAAA,CACP,QAAA,EACA,GAAA,EACA,GAAA,EACQ;AACR,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,QAAA,IAAY,SAAS,MAAA,CAAO,CAAA;AACvD;AAKA,SAAS,qBAAA,CACP,KAAA,EACA,GAAA,EACA,GAAA,EACQ;AACR,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC/B,EAAA,OAAA,CAAQ,QAAA,GAAW,WAAW,MAAA,GAAS,MAAA,CAAA;AACzC;AAKA,SAAS,WAAA,CAAY,OAAe,IAAA,EAAsB;AACxD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,IAAI,CAAA,GAAI,IAAA;AACpC;AAKA,SAAS,cAAA,CACP,KAAA,EACA,OAAA,EACA,OAAA,EACA,KACA,QAAA,EACgB;AAChB,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,kBAAA;AAGtB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,wBAAA;AAGpB,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,EAAA,aAAA,CAAc,SAAA,GAAY,QAAA;AAG1B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC7C,EAAA,MAAA,CAAO,IAAA,GAAO,OAAA;AACd,EAAA,MAAA,CAAO,IAAA,GAAO,OAAA;AACd,EAAA,MAAA,CAAO,SAAA,GAAY,qBAAA;AACnB,EAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAGlB,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,QAAA;AAC/B,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAE7B,EAAA,IAAI,UAAU,aAAA,EAAe;AAE3B,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,QAAA,EAAW,OAAA,CAAQ,GAAG,CAAA,2CAAA,EAA8C,GAAG,CAAA,CAAA;AAAA,OACzE;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,GAAA,GAAM,GAAA;AACb,IAAA,MAAA,CAAO,GAAA,GAAM,MAAA;AACb,IAAA,MAAA,CAAO,IAAA,GAAO,GAAA;AACd,IAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,KAAA,EAAO,GAAA,EAAK,GAAG,CAAA;AACtD,IAAA,MAAA,CAAO,KAAA,GAAA,CAAS,QAAA,GAAW,GAAA,EAAM,QAAA,EAAS;AAAA,EAC5C,CAAA,MAAO;AAEL,IAAA,MAAA,CAAO,GAAA,GAAM,IAAI,QAAA,EAAS;AAC1B,IAAA,MAAA,CAAO,GAAA,GAAM,IAAI,QAAA,EAAS;AAC1B,IAAA,MAAA,CAAO,IAAA,GAAO,KAAK,QAAA,EAAS;AAC5B,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAM,QAAA,EAAS;AAAA,EAChC;AAGA,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAAA,CAMS,KAAA,GAAQ,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAA,GAAQ,GAAG,CAAA;AAAA,6BAAA,EAAA,CAClC,KAAA,GAAQ,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAA,GAAQ,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAKpD,QAAA,GAAW,gBAAgB,SAAS,CAAA;AAAA,aAAA,EACnC,QAAA,GAAW,QAAQ,GAAG,CAAA;AAAA,EAAA,CAAA;AAInC,EAAA,aAAA,CAAc,YAAY,MAAM,CAAA;AAGhC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,sBAAA;AACtB,EAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAM1B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,EAAA,QAAA,CAAS,WAAA,GAAc,IAAI,QAAA,EAAS;AACpC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,EAAA,QAAA,CAAS,WAAA,GAAc,IAAI,QAAA,EAAS;AAEpC,EAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAC9B,EAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAC9B,EAAA,aAAA,CAAc,YAAY,SAAS,CAAA;AAGnC,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAClD,EAAA,YAAA,CAAa,SAAA,GAAY,cAAA;AACzB,EAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAS7B,EAAA,YAAA,CAAa,cAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,GAAO,CAAA,GAAI,IAAI,CAAC,CAAA;AAEzD,EAAA,OAAA,CAAQ,YAAY,aAAa,CAAA;AACjC,EAAA,OAAA,CAAQ,YAAY,YAAY,CAAA;AAChC,EAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAG7B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,IAAI,YAAA;AAEJ,MAAA,IAAI,UAAU,aAAA,EAAe;AAC3B,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA,GAAI,GAAA;AAC5C,QAAA,YAAA,GAAe,qBAAA,CAAsB,QAAA,EAAU,GAAA,EAAK,GAAG,CAAA;AACvD,QAAA,YAAA,GAAe,WAAA,CAAY,cAAc,IAAI,CAAA;AAE7C,QAAA,YAAA,GAAe,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,YAAY,CAAC,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,UAAA,CAAW,OAAO,KAAK,CAAA;AACtC,QAAA,YAAA,GAAe,WAAA,CAAY,cAAc,IAAI,CAAA;AAAA,MAC/C;AAEA,MAAA,YAAA,CAAa,cAAc,YAAA,CAAa,OAAA,CAAQ,IAAA,GAAO,CAAA,GAAI,IAAI,CAAC,CAAA;AAGhE,MAAA,MAAM,UAAA,GAAA,CAAe,YAAA,GAAe,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAA,GAAQ,GAAA;AAC1D,MAAA,MAAA,CAAO,MAAM,UAAA,GAAa,CAAA;AAAA;AAAA;AAAA,gCAAA,EAGE,UAAU,CAAA;AAAA,+BAAA,EACX,UAAU,CAAA;AAAA;AAAA,OAAA,CAAA;AAKrC,MAAA,IAAI,IAAI,QAAA,EAAU;AAChB,QAAA,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,YAAY,CAAA;AAAA,MACpD;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,WAAW,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,mBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AAEN,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAAa,OAAA,CAAQ,QAAQ,IAAA,EAAM;AACrD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,GAAG,CAAA,yBAAA,CAA2B,CAAA;AAAA,EACzE;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAAa,OAAA,CAAQ,QAAQ,IAAA,EAAM;AACrD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,GAAG,CAAA,yBAAA,CAA2B,CAAA;AAAA,EACzE;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAK;AAC9B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,cAAA,EAAiB,QAAQ,GAAG,CAAA,QAAA,EAAW,QAAQ,GAAG,CAAA,yBAAA,EAA4B,QAAQ,GAAG,CAAA,CAAA;AAAA,KAC3F;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,YAAA,GACJ,QAAQ,OAAA,KAAY,MAAA,GAChB,QAAQ,OAAA,GAAA,CACP,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,CAAA;AACpC,EAAA,MAAM,YAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA,IAAgB,YAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,cAAA;AAAA,IACf,YAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAM,MAAA,CAAO;AAAA,GACf;AACA,EAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAG5B,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA,IAAA,CAAA;AAIrB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAC/C,IAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,EAC1B;AACF;AAEO,SAAS,2BAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AAEN,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAAa,OAAA,CAAQ,QAAQ,IAAA,EAAM;AACrD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,GAAG,CAAA,yBAAA,CAA2B,CAAA;AAAA,EACzE;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAAa,OAAA,CAAQ,QAAQ,IAAA,EAAM;AACrD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,GAAG,CAAA,yBAAA,CAA2B,CAAA;AAAA,EACzE;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAK;AAC9B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,cAAA,EAAiB,QAAQ,GAAG,CAAA,QAAA,EAAW,QAAQ,GAAG,CAAA,yBAAA,EAA4B,QAAQ,GAAG,CAAA,CAAA;AAAA,KAC3F;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,gBAAgB,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAK,EAAC;AACnD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAa,IAAI,CAAC,GAAG,aAAa,CAAA,GAAI,EAAC;AAGpE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AAErC,EAAA,MAAM,YAAA,GACJ,QAAQ,OAAA,KAAY,MAAA,GAChB,QAAQ,OAAA,GAAA,CACP,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,CAAA;AAEpC,EAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,WAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAE7B,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,uBAAuB,CAAA;AAChE,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,mBAAmB,CAAA;AACrD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,aAAa,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MACpD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,aAAA,CACP,KAAA,GAAgB,YAAA,EAChB,KAAA,GAAgB,EAAA,EACH;AACb,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,SAAA,GAAY,6CAAA;AAGxB,IAAA,MAAM,cAAc,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAA,CAAU,SAAS,MAAM,CAAA,CAAA,CAAA;AAC3D,IAAA,MAAM,QAAA,GAAW,cAAA;AAAA,MACf,KAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAM,MAAA,CAAO;AAAA,KACf;AACA,IAAA,QAAA,CAAS,MAAM,IAAA,GAAO,GAAA;AACtB,IAAA,WAAA,CAAY,YAAY,QAAQ,CAAA;AAEhC,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,SAAA,CAAU,YAAY,WAAW,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,YAAA,CAAa,WAAA,EAAa,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,aAAA,EAAc;AACd,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,SAAS,mBAAA,GAA4B;AACnC,IAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AAC3B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,gBAAA,CAAiB,uBAAuB,CAAA;AAChE,IAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAC3B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,YAAY,IAAA,CAAK,aAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,SAAA,GAAY,QAAA,CAAS,cAAc,QAAQ,CAAA;AAC3C,QAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,QAAA,SAAA,CAAU,SAAA,GAAY,mCAAA;AACtB,QAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAM1B,QAAA,SAAA,CAAU,SAAA,GAAY,QAAA;AACtB,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAA,SAAA,CAAU,MAAM,eAAA,GAAkB,kCAAA;AAAA,QACpC,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAA,SAAA,CAAU,MAAM,eAAA,GAAkB,aAAA;AAAA,QACpC,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,UAAU,MAAM;AACxB,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA;AAAA,YAClD;AAAA,WACF;AACA,UAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAA,GAAS,QAAA,EAAU;AACxC,YAAA,MAAA,CAAO,MAAA,CAAO,cAAc,CAAC,CAAA;AAC7B,YAAA,IAAA,CAAK,MAAA,EAAO;AACZ,YAAA,aAAA,EAAc;AACd,YAAA,eAAA,EAAgB;AAChB,YAAA,mBAAA,EAAoB;AAAA,UACtB;AAAA,QACF,CAAA;AACA,QAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,WAAW,YAAA,IAAgB,QAAA;AACjC,MAAA,SAAA,CAAU,QAAA,GAAW,QAAA;AACrB,MAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC7C,MAAA,SAAA,CAAU,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,YAAA,GAAuC,IAAA;AAE3C,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAA,GAAS,QAAA,CAAS,cAAc,KAAK,CAAA;AACrC,IAAA,MAAA,CAAO,SAAA,GAAY,8BAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,SAAA,GAAY,kCAAA;AACnB,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOvB,IAAA,MAAA,CAAO,WAAA,GAAc,GAAA;AACrB,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,kCAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,aAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,UAAU,MAAM;AACrB,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AACxB,MAAA,aAAA,CAAc,YAAY,CAAA;AAC1B,MAAA,eAAA,EAAgB;AAChB,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAEA,IAAA,YAAA,GAAe,QAAA,CAAS,cAAc,MAAM,CAAA;AAC5C,IAAA,YAAA,CAAa,SAAA,GAAY,uBAAA;AAEzB,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAC/B,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc;AAE9B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAAc,iBAAiB,CAAA;AACrD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,IAAU,QAAA;AAClC,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,MAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,KAAA,GAAQ,GAAA;AAC1C,MAAA,MAAA,CAAO,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,IACnD;AAEA,IAAA,YAAA,CAAa,WAAA,GAAc,GAAG,MAAA,CAAO,MAAM,IAAI,QAAA,KAAa,QAAA,GAAW,WAAM,QAAQ,CAAA,CAAA;AAAA,EACvF;AAGA,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,aAAA,CAAc,KAAe,CAAC,CAAA;AACxD,EAAA,eAAA,EAAgB;AAChB,EAAA,mBAAA,EAAoB;AAGpB,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA,IAAA,CAAA;AAIrB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAC/C,IAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,EAC1B;AACF;AASO,SAAS,qBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,OAAA;AAGtC,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAAa,OAAA,CAAQ,QAAQ,IAAA,EAAM;AACrD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,6BAA6B,GAAG,CAAA,yBAAA;AAAA,KAClC;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAAa,OAAA,CAAQ,QAAQ,IAAA,EAAM;AACrD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,6BAA6B,GAAG,CAAA,yBAAA;AAAA,KAClC;AAAA,EACF;AAEA,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,QAAA;AAG/B,EAAA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,YAAA,KACS;AACT,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAC9F,IAAA,IAAI,YAAA,GAAe,QAAA,CAAS,cAAA,CAAe,OAAO,CAAA;AAElD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,CAAM,SAAA,CAAU,IAAI,SAAS,CAAA;AAC7B,MAAA,KAAA,CAAM,KAAA,GAAQ,YAAA;AAEd,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,YAAA,GAAe,QAAA,CAAS,cAAc,KAAK,CAAA;AAC3C,QAAA,YAAA,CAAa,EAAA,GAAK,OAAA;AAClB,QAAA,YAAA,CAAa,SAAA,GAAY,eAAA;AACzB,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAO7B,QAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,OAAA,CAAQ,mBAAmB,CAAA;AACzD,QAAA,IAAI,eAAA,IAAmB,gBAAgB,WAAA,EAAa;AAClD,UAAA,eAAA,CAAgB,UAAA,EAAY,YAAA;AAAA,YAC1B,YAAA;AAAA,YACA,eAAA,CAAgB;AAAA,WAClB;AAAA,QACF,WAAW,eAAA,EAAiB;AAC1B,UAAA,eAAA,CAAgB,UAAA,EAAY,YAAY,YAAY,CAAA;AAAA,QACtD;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,WAAA,GAAc,YAAA;AAC3B,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU,OAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,SAAS,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AAEd,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,MAAA,EAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,mBAAA,GAAsB,CAC1B,MAAA,EACA,QAAA,KACkB;AAClB,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,IAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AACxB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,EAAU;AACvC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,KAAK,CAAA;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,QAAA,YAAA,CAAa,QAAQ,GAAG,CAAA;AACxB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,YAAA,CAAa,QAAQ,IAAI,CAAA;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA;AAEJ,IAAA,IAAI,UAAU,aAAA,EAAe;AAC3B,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,QAAQ,CAAA,GAAI,GAAA;AACxC,MAAA,KAAA,GAAQ,qBAAA,CAAsB,QAAA,EAAU,GAAA,EAAK,GAAG,CAAA;AAChD,MAAA,KAAA,GAAQ,WAAA,CAAY,OAAO,IAAI,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,WAAW,QAAQ,CAAA;AAC3B,MAAA,KAAA,GAAQ,WAAA,CAAY,OAAO,IAAI,CAAA;AAAA,IACjC;AAGA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,MAAM,MAAM,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,KAAK,CAAA;AACxC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,QAAA,YAAA,CAAa,QAAQ,GAAG,CAAA;AACxB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,MAAM,MAAM,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,KAAK,CAAA;AACxC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AACjC,QAAA,YAAA,CAAa,QAAQ,GAAG,CAAA;AACxB,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,QAAQ,IAAI,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,IAAA,MAAM,UAAU,SAAA,CAAU,gBAAA;AAAA,MACxB,8BAA8B,GAAG,CAAA,GAAA;AAAA,KACnC;AACA,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AACjC,MAAA,MAAM,QAAQ,mBAAA,CAAoB,MAAA,EAAQ,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAC5D,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAC,CAAA;AAGD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAClB,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AACrC,MAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AAEtD,MAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MAClE;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,QAAA,EAAU;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,MAAM,SAAS,SAAA,CAAU,aAAA;AAAA,MACvB,6BAA6B,GAAG,CAAA,EAAA;AAAA,KAClC;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,EAAU;AACvC,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MACvD;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B;AAEA,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,MAAA,EAAQ,GAAG,CAAA;AAC7C,IAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,EACzB;AACF;AAKO,SAAS,iBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AAEtB,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,QAAA;AAE/B,EAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,sDAAA,EAAyD,SAAS,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA;AAAA,OAC1F;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,SAAA,CAAU,gBAAA;AAAA,MACxB,8BAA8B,SAAS,CAAA,GAAA;AAAA,KACzC;AAEA,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AACjC,MAAA,IAAI,QAAQ,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAK,MAAM,IAAA,EAAM;AACjD,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAEpC,QAAA,IAAI,UAAU,aAAA,EAAe;AAC3B,UAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,QAAA,EAAU,GAAA,EAAK,GAAG,CAAA;AACzD,UAAA,MAAA,CAAO,KAAA,GAAA,CAAS,QAAA,GAAW,GAAA,EAAM,QAAA,EAAS;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,KAAA,GAAQ,SAAS,QAAA,EAAS;AAAA,QACnC;AAGA,QAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,CAAQ,mBAAmB,CAAA;AAC1D,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,aAAA,CAAc,eAAe,CAAA;AAClE,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,YAAA,CAAa,cAAc,QAAA,CAAS,OAAA,CAAQ,IAAA,GAAO,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,UAC9D;AAGA,UAAA,MAAM,UAAA,GAAA,CAAe,QAAA,GAAW,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAA,GAAQ,GAAA;AACtD,UAAA,MAAA,CAAO,MAAM,UAAA,GAAa,CAAA;AAAA;AAAA;AAAA,oCAAA,EAGE,UAAU,CAAA;AAAA,mCAAA,EACX,UAAU,CAAA;AAAA;AAAA,WAAA,CAAA;AAAA,QAGvC;AAEA,QAAA,MAAA,CAAO,SAAA,CAAU,OAAO,SAAS,CAAA;AACjC,QAAA,MAAA,CAAO,KAAA,GAAQ,EAAA;AAAA,MACjB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AACnC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,sCAAsC,SAAS,CAAA,MAAA,EAAS,QAAQ,MAAM,CAAA,sBAAA,EAAyB,MAAM,MAAM,CAAA,8CAAA;AAAA,OAC7G;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,SAAS,SAAA,CAAU,aAAA;AAAA,MACvB,6BAA6B,SAAS,CAAA,EAAA;AAAA,KACxC;AAEA,IAAA,IAAI,MAAA,IAAU,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACnD,MAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAE7B,MAAA,IAAI,UAAU,aAAA,EAAe;AAC3B,QAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,QAAA,EAAU,GAAA,EAAK,GAAG,CAAA;AACzD,QAAA,MAAA,CAAO,KAAA,GAAA,CAAS,QAAA,GAAW,GAAA,EAAM,QAAA,EAAS;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAA,GAAQ,SAAS,QAAA,EAAS;AAAA,MACnC;AAGA,MAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,CAAQ,mBAAmB,CAAA;AAC1D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,aAAA,CAAc,eAAe,CAAA;AAClE,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,YAAA,CAAa,cAAc,QAAA,CAAS,OAAA,CAAQ,IAAA,GAAO,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,QAC9D;AAGA,QAAA,MAAM,UAAA,GAAA,CAAe,QAAA,GAAW,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAA,GAAQ,GAAA;AACtD,QAAA,MAAA,CAAO,MAAM,UAAA,GAAa,CAAA;AAAA;AAAA;AAAA,kCAAA,EAGE,UAAU,CAAA;AAAA,iCAAA,EACX,UAAU,CAAA;AAAA;AAAA,SAAA,CAAA;AAAA,MAGvC;AAEA,MAAA,MAAA,CAAO,SAAA,CAAU,OAAO,SAAS,CAAA;AACjC,MAAA,MAAA,CAAO,KAAA,GAAQ,EAAA;AAAA,IACjB;AAAA,EACF;AACF;;;AC9sBA,SAAS,qBAAqB,QAAA,EAA0C;AACtE,EAAA,MAAM,WAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI,SAAA,IAAa,KAAA,IAAS,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW;AACrD,MAAA,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAM,OAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,iBAAA,CACP,SACA,QAAA,EACqB;AACrB,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,OAAA,EAAQ;AACnC;AAGA,SAAS,oBAAoB,QAAA,EAA4C;AACvE,EAAA,MAAM,OAA4B,EAAC;AAGnC,EAAA,MAAM,SAAS,QAAA,CAAS,gBAAA;AAAA,IACtB;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,QAAQ,CAAA,KAAA,KAAS;AACtB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAC3C,IAAA,IAAI,SAAA,IAAa,CAAC,SAAA,CAAU,QAAA,CAAS,GAAG,KAAK,CAAC,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,EAAG;AAErE,MAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,QAAA,IAAA,CAAK,SAAS,IAAI,KAAA,CAAM,KAAA;AAAA,MAC1B,CAAA,MAAA,IAAW,iBAAiB,gBAAA,EAAkB;AAC5C,QAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,UAAA,IAAA,CAAK,SAAS,IAAI,KAAA,CAAM,OAAA;AAAA,QAC1B,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,IAAA,CAAK,SAAS,IAAI,KAAA,CAAM,KAAA;AAAA,UAC1B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,SAAS,IAAI,KAAA,CAAM,KAAA;AAAA,QAC1B;AAAA,MACF,CAAA,MAAA,IAAW,iBAAiB,mBAAA,EAAqB;AAC/C,QAAA,IAAA,CAAK,SAAS,IAAI,KAAA,CAAM,KAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,IAAA;AACT;AAIA,IAAI,iBAAA,GAEO,IAAA;AAGJ,SAAS,iBACd,EAAA,EACM;AACN,EAAA,iBAAA,GAAoB,EAAA;AACtB;AAEA,SAAS,aAAA,CAAc,SAAc,GAAA,EAAiC;AACpE,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,iBAAA,CAAkB,SAAS,GAAG,CAAA;AACvC;AAMA,SAAS,kBAAA,CACP,SACA,OAAA,EACoB;AACpB,EAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,YAAA,CAAa,WAAW,CAAA,EAAG;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,EAAA,cAAA,CAAe,SAAA,GAAY,4CAAA;AAE3B,EAAA,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC5C,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,UAAA,CAAW,IAAA,GAAO,QAAA;AAClB,IAAA,UAAA,CAAW,SAAA,GAAY,iBAAA;AACvB,IAAA,UAAA,CAAW,cAAc,IAAA,CAAK,KAAA;AAG9B,IAAA,UAAA,CAAW,aAAa,kBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAC,CAAA;AACvE,IAAA,UAAA,CAAW,YAAA,CAAa,sBAAsB,OAAO,CAAA;AACrD,IAAA,UAAA,CAAW,YAAA,CAAa,iBAAA,EAAmB,MAAA,CAAO,KAAK,CAAC,CAAA;AAExD,IAAA,cAAA,CAAe,YAAY,UAAU,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,OAAO,cAAA;AACT;AAEO,SAAS,4BAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AAEN,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,EAAA,aAAA,CAAc,SAAA,GAAY,kDAAA;AAC1B,EAAA,aAAA,CAAc,YAAA,CAAa,kBAAkB,OAAO,CAAA;AAEpD,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AACnC,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,SAAA,CAAU,SAAA,GAAY,WAAA;AAAA,EACxB,CAAA,MAAO;AACL,IAAA,SAAA,CAAU,SAAA,GAAY,kBAAkB,OAAO,CAAA,MAAA,CAAA;AAAA,EACjD;AAGA,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC9B,IAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,OAAA,EAAS,OAAO,CAAA;AACxD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,aAAA,CAAc,YAAY,YAAY,CAAA;AAAA,IACxC;AAAA,EACF;AAIA,EAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,OAAA,CAAQ,QAAQ,CAAA;AAC3D,EAAA,MAAM,mBAAoB,GAAA,CAAI,OAAA,GAAU,OAAA,CAAQ,GAAG,KAA6B,EAAC;AACjF,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,gBAAA,EAAkB,aAAa,CAAA;AAEvE,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,IAAA,EAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,QAAQ,GAAG,CAAA;AAAA,IACpC,OAAA,EAAS,aAAA;AAAA;AAAA,IACT,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,OAAA;AAAA;AAAA,IAC9B,OAAO,GAAA,CAAI;AAAA,GACb;AACA,EAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAU;AAElC,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,SAAA,CAAU,WAAA,CAAY,aAAA,CAAc,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IACpD;AAAA,EACF,CAAC,CAAA;AACD,EAAA,aAAA,CAAc,YAAY,SAAS,CAAA;AAEnC,EAAA,OAAA,CAAQ,YAAY,aAAa,CAAA;AACnC;AAEO,SAAS,8BAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,QAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAElB,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,EAAA,aAAA,CAAc,SAAA,GAAY,kDAAA;AAG1B,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAClD,EAAA,YAAA,CAAa,SAAA,GAAY,uBAAA;AAEzB,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,WAAA;AAGtB,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC9B,IAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,OAAA,EAAS,OAAA,CAAQ,GAAG,CAAA;AAC5D,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,aAAA,CAAc,YAAY,YAAY,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,QAAQ,QAAA,IAAY,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,QAAA,IAAY,QAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,GAAU,OAAA,CAAQ,GAAG,CAAC,CAAA,GAC/C,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA,GACxB,IAAA;AAGJ,EAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,OAAA,CAAQ,QAAQ,CAAA;AAE3D,EAAA,MAAM,UAAA,GAAa,MACjB,SAAA,CAAU,gBAAA,CAAiB,yBAAyB,CAAA,CAAE,MAAA;AAExD,EAAA,MAAM,kBAAkB,MAAyB;AAC/C,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,qCAAA;AAChB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOpB,IAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,MAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,kCAAA;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,MAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,aAAA;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,UAAU,MAAM;AAClB,MAAA,IAAI,UAAA,KAAe,GAAA,EAAK;AACtB,QAAA,MAAM,MAAM,UAAA,EAAW;AAEvB,QAAA,MAAM,kBAAkB,KAAA,CAAM,QAAA,GAAW,oBAAoB,KAAA,CAAM,QAAQ,IAAI,EAAC;AAChF,QAAA,MAAM,MAAA,GAAwB;AAAA,UAC5B,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,IAAA,EAAM,SAAS,GAAA,CAAI,IAAA,EAAM,GAAG,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,UACjD,OAAA,EAAS,aAAA;AAAA;AAAA,UACT,QAAA,EAAU;AAAA;AAAA,SACZ;AACA,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,QAAA,IAAA,CAAK,SAAA,GACH,8DAAA;AACF,QAAA,IAAA,CAAK,aAAa,qBAAA,EAAuB,CAAA,EAAG,QAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AAGjE,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,QAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AACnC,QAAA,IAAI,YAAY,CAAA,EAAG;AACjB,UAAA,YAAA,CAAa,SAAA,GAAY,WAAA;AAAA,QAC3B,CAAA,MAAO;AACL,UAAA,YAAA,CAAa,SAAA,GAAY,kBAAkB,OAAO,CAAA,MAAA,CAAA;AAAA,QACpD;AAEA,QAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAU;AAElC,UAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,YAAA,YAAA,CAAa,WAAA,CAAY,aAAA,CAAc,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,UACvD;AAAA,QACF,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,YAAY,YAAY,CAAA;AAG7B,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,UAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,UAAA,GAAA,CAAI,SAAA,GAAY,0CAAA;AAChB,UAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAKpB,UAAA,GAAA,CAAI,WAAA,GAAc,QAAA;AAClB,UAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,YAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,kCAAA;AAAA,UAC9B,CAAC,CAAA;AACD,UAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,YAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,aAAA;AAAA,UAC9B,CAAC,CAAA;AACD,UAAA,GAAA,CAAI,OAAA,GAAU,MAAM,gBAAA,CAAiB,IAAI,CAAA;AACzC,UAAA,IAAA,CAAK,MAAM,QAAA,GAAW,UAAA;AACtB,UAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,QACtB;AAEA,QAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAC1B,QAAA,eAAA,EAAgB;AAAA,MAClB;AAAA,IACF,CAAA;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAY;AAClC,IAAA,MAAM,eAAe,UAAA,EAAW;AAChC,IAAA,MAAM,iBAAiB,aAAA,CAAc,aAAA;AAAA,MACnC;AAAA,KACF;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,cAAA,CAAe,WAAW,YAAA,IAAgB,GAAA;AAC1C,MAAA,cAAA,CAAe,KAAA,CAAM,OAAA,GAAU,YAAA,IAAgB,GAAA,GAAM,KAAA,GAAQ,GAAA;AAC7D,MAAA,cAAA,CAAe,KAAA,CAAM,aAAA,GACnB,YAAA,IAAgB,GAAA,GAAM,MAAA,GAAS,MAAA;AAAA,IACnC;AACA,IAAA,YAAA,CAAa,cAAc,CAAA,EAAG,YAAY,IAAI,GAAA,KAAQ,QAAA,GAAW,WAAM,GAAG,CAAA,CAAA;AAAA,EAC5E,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAA4B;AACpD,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,eAAA,EAAgB;AAAA,EAClB,CAAA;AAGA,EAAA,IAAI,GAAA,IAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7B,IAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,UAAA,EAAY,GAAA,KAAQ;AAE/B,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,UAAA,IAAc,IAAI,aAAa,CAAA;AACvE,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,IAAA,EAAM,SAAS,GAAA,CAAI,IAAA,EAAM,GAAG,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,QACjD,OAAA,EAAS,aAAA;AAAA;AAAA,QACT,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI;AAAA;AAAA,OAChC;AACA,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,MAAA,IAAA,CAAK,SAAA,GACH,8DAAA;AACF,MAAA,IAAA,CAAK,aAAa,qBAAA,EAAuB,CAAA,EAAG,QAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AAGjE,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,MAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AACnC,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,YAAA,CAAa,SAAA,GAAY,WAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,SAAA,GAAY,kBAAkB,OAAO,CAAA,MAAA,CAAA;AAAA,MACpD;AAEA,MAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAU;AAElC,QAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,UAAA,YAAA,CAAa,WAAA,CAAY,aAAA,CAAc,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,QACvD;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,YAAY,YAAY,CAAA;AAG7B,MAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,QAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,QAAA,GAAA,CAAI,SAAA,GAAY,0CAAA;AAChB,QAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAKpB,QAAA,GAAA,CAAI,WAAA,GAAc,QAAA;AAClB,QAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,UAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,kCAAA;AAAA,QAC9B,CAAC,CAAA;AACD,QAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,UAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,aAAA;AAAA,QAC9B,CAAC,CAAA;AACD,QAAA,GAAA,CAAI,OAAA,GAAU,MAAM,gBAAA,CAAiB,IAAI,CAAA;AACzC,QAAA,IAAA,CAAK,MAAM,QAAA,GAAW,UAAA;AACtB,QAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,MACtB;AAEA,MAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,OAAO,UAAA,KAAe,GAAA,EAAK;AACzB,MAAA,MAAM,MAAM,UAAA,EAAW;AACvB,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,IAAA,EAAM,SAAS,GAAA,CAAI,IAAA,EAAM,GAAG,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,QACjD,OAAA,EAAS,aAAA;AAAA;AAAA,QACT,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI;AAAA;AAAA,OAChC;AACA,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,MAAA,IAAA,CAAK,SAAA,GACH,8DAAA;AACF,MAAA,IAAA,CAAK,aAAa,qBAAA,EAAuB,CAAA,EAAG,QAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AAGjE,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,MAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AACnC,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,YAAA,CAAa,SAAA,GAAY,WAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,SAAA,GAAY,kBAAkB,OAAO,CAAA,MAAA,CAAA;AAAA,MACpD;AAEA,MAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAU;AAElC,QAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,UAAA,YAAA,CAAa,WAAA,CAAY,aAAA,CAAc,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,QACvD;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,YAAY,YAAY,CAAA;AAG7B,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,MAAA,GAAA,CAAI,SAAA,GAAY,0CAAA;AAChB,MAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAKpB,MAAA,GAAA,CAAI,WAAA,GAAc,QAAA;AAClB,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,QAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,kCAAA;AAAA,MAC9B,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,QAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,aAAA;AAAA,MAC9B,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,UAAU,MAAM;AAClB,QAAA,IAAI,UAAA,KAAe,GAAA,EAAK;AACtB,UAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,QACvB;AAAA,MACF,CAAA;AACA,MAAA,IAAA,CAAK,MAAM,QAAA,GAAW,UAAA;AACtB,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAEpB,MAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,aAAA,CAAc,YAAY,SAAS,CAAA;AAGnC,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,SAAA,GAAY,8BAAA;AACnB,IAAA,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAA;AACpC,IAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAC/B,IAAA,aAAA,CAAc,YAAY,MAAM,CAAA;AAAA,EAClC;AAEA,EAAA,eAAA,EAAgB;AAEhB,EAAA,OAAA,CAAQ,YAAY,aAAa,CAAA;AACnC;AAOA,IAAI,mBAAA,GAMO,IAAA;AAGJ,SAAS,mBACd,EAAA,EAKM;AACN,EAAA,mBAAA,GAAsB,EAAA;AACxB;AAEA,SAAS,eAAA,CACP,OAAA,EACA,GAAA,EACA,eAAA,EACiC;AACjC,EAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,mBAAA,CAAoB,OAAA,EAAS,GAAA,EAAK,eAAe,CAAA;AAC1D;AAKO,SAAS,wBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAgB,IAAA,EAAK,GAAI,OAAA;AAE5C,EAAA,IAAI,EAAE,cAAc,OAAA,CAAA,EAAU;AAC5B,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,EAC/B;AAGA,EAAA,MAAM,sBAAA,GAAyB,CAC7BA,IAAAA,EACA,KAAA,EACAC,QAAAA,KACS;AACT,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAElB,IAAA,MAAM,QAAA,GAAW,UAAA,IAAcA,QAAAA,GAAWA,QAAAA,CAAQ,YAAY,CAAA,GAAK,CAAA;AACnE,IAAA,MAAM,QAAA,GACJ,UAAA,IAAcA,QAAAA,GAAWA,QAAAA,CAAQ,YAAY,QAAA,GAAY,QAAA;AAE3D,IAAA,IAAIA,QAAAA,CAAQ,QAAA,IAAY,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,GAAGD,IAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAGA,IAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAGA,IAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,UAAA,IAAc,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAE7C,IAAA,MAAM,QAAe,EAAC;AACtB,IAAA,MAAM,uBAAuB,SAAA,CAAU,gBAAA;AAAA,MACrC;AAAA,KACF;AACA,IAAA,MAAM,oBAAoB,KAAA,CAAM,IAAA,CAAK,oBAAoB,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO;AACxE,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,qBAAqB,CAAA,IAAK,EAAA;AACvD,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,GAAG,CAAA,CAAA,CAAG,GAAG,OAAO,KAAA;AAExC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AACpC,MAAA,OAAO,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IAChC,CAAC,CAAA;AACD,IAAA,iBAAA,CAAkB,OAAA,CAAQ,CAAC,aAAA,KAAkB;AAC3C,MAAA,MAAM,WAAgC,EAAC;AAEvC,MAAA,MAAM,aAAA,GACJ,aAAA,CAAc,YAAA,CAAa,qBAAqB,CAAA,IAAK,EAAA;AACvD,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,KAAA,CAAM,YAAY,CAAA;AACnD,MAAA,MAAM,WAAW,UAAA,GAAa,QAAA,CAAS,WAAW,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAE5D,MAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAe;AAEvC,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,IAAI;AACF,YAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAS,CAAE,QAAA,GAC9C,mBAAA,CAAoB,OAAA,CAAQ,QAAA,CAAS,QAAA,EAAS,CAAE,QAAS,IACzD,EAAC;AACL,YAAA,MAAM,YAAA,GAAe,uBAAA;AAAA,cACnB,KAAA,CAAM,QAAA;AAAA,cACN,YAAA;AAAA;AAAA,cACA;AAAA;AAAA,aACF;AACA,YAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,cAAA;AAAA,YACF;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,wCAAwC,KAAA,CAAM,GAAG,CAAA,gBAAA,EAAmB,GAAG,IAAI,QAAQ,CAAA,GAAA,CAAA;AAAA,cACnF;AAAA,aACF;AAAA,UAEF;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAC3C,UAAA,QAAA,CAAS,MAAM,GAAG,CAAA,GAChB,MAAM,OAAA,KAAY,MAAA,GAAY,MAAM,OAAA,GAAU,IAAA;AAAA,QAClD,CAAA,MAAO;AACL,UAAA,MAAM,WAAW,CAAA,EAAG,GAAG,IAAI,QAAQ,CAAA,EAAA,EAAK,MAAM,GAAG,CAAA,CAAA;AACjD,UAAA,MAAM,WAAA,GAAc,eAAA;AAAA,YAClB,EAAE,GAAG,KAAA,EAAO,GAAA,EAAK,QAAA,EAAS;AAAA,YAC1B,EAAE,IAAA,EAAK;AAAA,YACP;AAAA,WACF;AACA,UAAA,IAAI,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,KAAU,QAAQ,OAAO,WAAA,CAAY,UAAU,QAAA,EAAU;AAC7F,YAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,WAAA,CAAY,KAAK,CAAA;AAAA,UAC3C,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,GAAI,WAAA,CAAY,KAAA;AAAA,UACpC;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IACrB,CAAC,CAAA;AAED,IAAA,sBAAA,CAAuB,GAAA,EAAK,OAAO,OAAO,CAAA;AAC1C,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAO;AAAA,EAChC,CAAA,MAAO;AAEL,IAAA,MAAM,gBAAqC,EAAC;AAC5C,IAAA,MAAM,qBACJ,SAAA,CAAU,aAAA,CAA2B,CAAA,iBAAA,EAAoB,GAAG,IAAI,CAAA,IAChE,SAAA;AAEF,IAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,KAAe;AAEvC,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAS,CAAE,QAAA,GAC9C,mBAAA,CAAoB,OAAA,CAAQ,QAAA,CAAS,QAAA,EAAS,CAAE,QAAS,IACzD,EAAC;AACL,UAAA,MAAM,YAAA,GAAe,uBAAA;AAAA,YACnB,KAAA,CAAM,QAAA;AAAA,YACN,YAAA;AAAA;AAAA,YACA;AAAA;AAAA,WACF;AACA,UAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,YAAA;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,qCAAA,EAAwC,KAAA,CAAM,GAAG,CAAA,gBAAA,EAAmB,GAAG,CAAA,EAAA,CAAA;AAAA,YACvE;AAAA,WACF;AAAA,QAEF;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAC3C,QAAA,aAAA,CAAc,MAAM,GAAG,CAAA,GACrB,MAAM,OAAA,KAAY,MAAA,GAAY,MAAM,OAAA,GAAU,IAAA;AAAA,MAClD,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAM,GAAG,CAAA,CAAA;AACpC,QAAA,MAAM,WAAA,GAAc,eAAA;AAAA,UAClB,EAAE,GAAG,KAAA,EAAO,GAAA,EAAK,QAAA,EAAS;AAAA,UAC1B,EAAE,IAAA,EAAK;AAAA,UACP;AAAA,SACF;AACA,QAAA,IAAI,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,KAAU,QAAQ,OAAO,WAAA,CAAY,UAAU,QAAA,EAAU;AAC7F,UAAA,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe,WAAA,CAAY,KAAK,CAAA;AAAA,QAChD,CAAA,MAAO;AACL,UAAA,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA,GAAI,WAAA,CAAY,KAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,MAAA,EAAO;AAAA,EACxC;AACF;AAKO,SAAS,oBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,OAAA;AAEhC,EAAA,IAAI,EAAE,cAAc,OAAA,CAAA,EAAU;AAC5B,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,IAAc,OAAA,IAAW,OAAA,CAAQ,QAAA,EAAU;AAE7C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,mEAAA,EAAsE,SAAS,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA;AAAA,OACvG;AACA,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AAClC,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,YAAA,KAAiB;AACzC,UAAA,MAAM,YAAY,CAAA,EAAG,SAAS,IAAI,KAAK,CAAA,EAAA,EAAK,aAAa,GAAG,CAAA,CAAA;AAG5D,UAAA,IAAI,YAAA,CAAa,IAAA,KAAS,WAAA,IAAgB,YAAA,CAAqB,UAAA,EAAY;AACzE,YAAA,MAAM,SAAA,GAAY,YAAA;AAClB,YAAA,MAAM,OAAA,GAAkB,UAAU,OAAA,IAAW,MAAA;AAC7C,YAAA,MAAM,QAAA,GAAmB,UAAU,QAAA,IAAY,OAAA;AAC/C,YAAA,MAAM,cAAA,GAAiB,SAAA;AACvB,YAAA,MAAM,iBAAsC,EAAC;AAC7C,YAAA,IAAI,WAAW,cAAA,EAAgB,cAAA,CAAe,OAAO,CAAA,GAAI,eAAe,OAAO,CAAA;AAC/E,YAAA,IAAI,YAAY,cAAA,EAAgB,cAAA,CAAe,QAAQ,CAAA,GAAI,eAAe,QAAQ,CAAA;AAClF,YAAA,IAAI,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,cAAA,QAAA,CAAS,WAAA,CAAY,WAAW,cAAc,CAAA;AAAA,YAChD;AAAA,UACF,CAAA,MAAO;AACL,YAAA,MAAM,UAAA,GAAc,SAAA,CAAkC,YAAA,CAAa,GAAG,CAAA;AACtE,YAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,cAAA,QAAA,CAAS,WAAA,CAAY,WAAW,UAAU,CAAA;AAAA,YAC5C;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,qBAAqB,SAAA,CAAU,gBAAA;AAAA,MACnC,0BAA0B,SAAS,CAAA,GAAA;AAAA,KACrC;AACA,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,kBAAA,CAAmB,MAAA,EAAQ;AAC9C,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,mDAAmD,SAAS,CAAA,4DAAA;AAAA,OAC9D;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,2DAAA,EAA8D,SAAS,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA;AAAA,OAC/F;AACA,MAAA;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,YAAA,KAAiB;AACzC,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,aAAa,GAAG,CAAA,CAAA;AAGlD,MAAA,IAAI,YAAA,CAAa,IAAA,KAAS,WAAA,IAAgB,YAAA,CAAqB,UAAA,EAAY;AACzE,QAAA,MAAM,SAAA,GAAY,YAAA;AAClB,QAAA,MAAM,OAAA,GAAkB,UAAU,OAAA,IAAW,MAAA;AAC7C,QAAA,MAAM,QAAA,GAAmB,UAAU,QAAA,IAAY,OAAA;AAC/C,QAAA,MAAM,cAAA,GAAiB,KAAA;AACvB,QAAA,MAAM,iBAAsC,EAAC;AAC7C,QAAA,IAAI,WAAW,cAAA,EAAgB,cAAA,CAAe,OAAO,CAAA,GAAI,eAAe,OAAO,CAAA;AAC/E,QAAA,IAAI,YAAY,cAAA,EAAgB,cAAA,CAAe,QAAQ,CAAA,GAAI,eAAe,QAAQ,CAAA;AAClF,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,UAAA,QAAA,CAAS,WAAA,CAAY,WAAW,cAAc,CAAA;AAAA,QAChD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,UAAA,GAAc,KAAA,CAA8B,YAAA,CAAa,GAAG,CAAA;AAClE,QAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,UAAA,QAAA,CAAS,WAAA,CAAY,WAAW,UAAU,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;ACjsBO,SAAS,kBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AAEN,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,IAAA,EAAM;AAClD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,mKAAA,EAEiB,QAAQ,GAAG,CAAA,CAAA;AAAA,KAC9B;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAqC;AAAA,IAEzC,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,UAAU,OAAA,CAAQ,QAAA;AAAA;AAAA,IAElB,UAAU,CAAC,EAAE,QAAQ,MAAA,IAAU,aAAA,CAAc,QAAQ,MAAM,CAAA,CAAA;AAAA,IAC3D,QAAA,EAAU,QAAQ,MAAA,EAAQ,GAAA;AAAA,IAC1B,QAAA,EAAU,QAAQ,MAAA,EAAQ;AAAA,GAC5B;AAGA,EAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,IAAA,8BAAA,CAA+B,gBAAA,EAAkB,GAAA,EAAK,OAAgB,CAAA;AAAA,EACxE,CAAA,MAAO;AACL,IAAA,4BAAA,CAA6B,gBAAA,EAAkB,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,EACtE;AACF;AAaA,SAAS,0BAA0B,OAAA,EAAoC;AACrE,EAAA,MAAM,YAAA,GAAe,OAAA;AACrB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,KAAK,YAAA,CAAa,GAAA;AAAA,IAClB,OAAO,YAAA,CAAa,KAAA;AAAA,IACpB,aAAa,YAAA,CAAa,WAAA;AAAA,IAC1B,MAAM,YAAA,CAAa,IAAA;AAAA,IACnB,UAAU,YAAA,CAAa,QAAA;AAAA,IACvB,QAAQ,YAAA,CAAa,MAAA;AAAA,IACrB,SAAS,YAAA,CAAa,OAAA;AAAA,IACtB,SAAS,YAAA,CAAa,OAAA;AAAA,IACtB,UAAU,YAAA,CAAa,QAAA;AAAA;AAAA,IAEvB,UAAU,CAAC,EAAE,aAAa,MAAA,IAAU,aAAA,CAAc,aAAa,MAAM,CAAA,CAAA;AAAA,IACrE,QAAA,EAAU,aAAa,MAAA,EAAQ,GAAA;AAAA,IAC/B,QAAA,EAAU,aAAa,MAAA,EAAQ;AAAA,GACjC;AACF;AAMO,SAAS,oBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAElB,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,IAAA,EAAM;AAClD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,0GACuD,GAAG,CAAA,CAAA;AAAA,KAC5D;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB,0BAA0B,OAAO,CAAA;AAC1D,EAAA,OAAO,wBAAA,CAAyB,gBAAA,EAAkB,GAAA,EAAK,OAAO,CAAA;AAChE;AAMO,SAAS,gBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AAEN,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,IAAA,EAAM;AAClD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,2GACwD,SAAS,CAAA,CAAA;AAAA,KACnE;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB,0BAA0B,OAAO,CAAA;AAC1D,EAAA,OAAO,oBAAA,CAAqB,gBAAA,EAAkB,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AACzE;;;AChIA,SAAS,cAAc,CAAA,EAA8B;AACnD,EAAA,OACE,CAAA,KAAM,IAAA,IACN,OAAO,CAAA,KAAM,QAAA,IACb,KAAA,IAAU,CAAA,IACV,KAAA,IAAU,CAAA,IACV,SAAA,IAAc,CAAA,IACd,SAAA,IAAc,CAAA;AAElB;AAEA,SAAS,kBAAkB,CAAA,EAA6B;AACtD,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,OAAO,CAAA,KAAM,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,CAAA,GAAI,CAAA;AACV,EAAA,OACE,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,IACjB,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAClB,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,IACpB,OAAO,EAAE,KAAA,KAAU,QAAA;AAEvB;AAEA,SAAS,aAAa,CAAA,EAA+B;AACnD,EAAA,IAAI,aAAA,CAAc,CAAC,CAAA,EAAG;AACpB,IAAA,OAAO;AAAA,MACL,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,MAAM,CAAA,CAAE,GAAA;AAAA,MACR,MAAA,EAAQ,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,OAAA,GAAU,CAAA;AAAA,MAC5B,KAAA,EAAO,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,OAAA,GAAU;AAAA,KAC7B;AAAA,EACF;AACA,EAAA,IAAI,iBAAA,CAAkB,CAAC,CAAA,EAAG,OAAO,CAAA;AACjC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,MAAA,EAAiC;AACtD,EAAA,OAAO,MAAA,CAAO,IAAI,YAAY,CAAA,CAAE,OAAO,CAAC,CAAA,KAAuB,MAAM,IAAI,CAAA;AAC3E;AAMA,SAAS,gBAAA,CAAiB,MAAc,IAAA,EAA0B;AAChE,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,QAAQ,IAAA,EAAK;AAAA,IAAG,MAClC,MAAM,IAAA,CAAK,EAAE,QAAQ,IAAA,EAAK,EAAG,MAAM,EAAE;AAAA,GACvC;AACF;AAMA,SAAS,cAAA,CACP,MAAA,EACA,IAAA,EACA,IAAA,EACe;AACf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,IACE,EAAE,GAAA,GAAM,CAAA,IACR,EAAE,IAAA,GAAO,CAAA,IACT,EAAE,MAAA,IAAU,IAAA,IACZ,CAAA,CAAE,KAAA,IAAS,QACX,CAAA,CAAE,GAAA,GAAM,EAAE,MAAA,IACV,CAAA,CAAE,OAAO,CAAA,CAAE,KAAA;AAEX,MAAA,OAAO,SAAS,CAAC,CAAA,cAAA,CAAA;AACnB,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,IACE,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,MAAA,IACX,EAAE,MAAA,IAAU,CAAA,CAAE,GAAA,IACd,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,KAAA,IACZ,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA;AAEb,QAAA,OAAO,CAAA,OAAA,EAAU,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,QAAA,CAAA;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,iBAAA,CACP,GAAA,EACA,GAAA,EACA,MAAA,EACmB;AACnB,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,SAAS,GAAA,EAAK;AACnC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IACE,GAAA,IAAO,CAAA,CAAE,GAAA,IACT,GAAA,IAAO,CAAA,CAAE,MAAA,IACT,GAAA,IAAO,CAAA,CAAE,IAAA,IACT,GAAA,IAAO,CAAA,CAAE,KAAA,EACT;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,UAAA,CACP,GAAA,EACA,GAAA,EACA,MAAA,EACmB;AACnB,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,GAAA,IAAO,CAAA,CAAE,IAAA,KAAS,GAAG,CAAA,IAAK,IAAA;AAChE;AAYA,SAAS,eACP,GAAA,EAC2D;AAC3D,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,MAAA;AAC/B,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,MAAA,CAAO,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,IACtC,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,MAAA,CAAO,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,IACtC,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,MAAA,CAAO,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,IACtC,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,MAAA,CAAO,GAAA,EAAK,MAAM,GAAG;AAAA,GACxC;AACF;AAeA,SAAS,qBAAqB,IAAA,EAA+C;AAC3E,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,EAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,EAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,EAAA,GAAA,CAAI,QAAQ,IAAA,CAAK,KAAA;AACjB,EAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA,WAAA,EAET,KAAK,IAAI,CAAA;AAAA,YAAA,EACR,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA,gBAAA,EAGL,KAAK,KAAK,CAAA;AAAA,WAAA,EACf,KAAK,SAAS,CAAA;AAAA,eAAA,EACV,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAA,GAAO,GAAG,CAAC,CAAA;AAAA,iBAAA,EACzB,KAAK,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAY1B,EAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,IAAA,GAAA,CAAI,MAAM,SAAA,GAAY,aAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,IAAA,GAAA,CAAI,MAAM,SAAA,GAAY,UAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACnC,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAMA,SAAS,mBAAA,CAAoB,MAAiB,OAAA,EAA4B;AACxE,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,GAAS,IAAG,GAAI,IAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAEzB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC9C,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAUxB,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,OAAA,EAAS,IAAA,KAAS;AAC/B,IAAA,MAAM,OAAA,GACJ,IAAA,KAAS,CAAA,GACL,OAAA,CAAQ,WAAA,EAAY,GACpB,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,IAAK,OAAA,CAAQ,WAAA,EAAY;AAEhD,IAAA,MAAM,EAAA,GAAK,QAAQ,SAAA,EAAU;AAE7B,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,OAAA,EAAS,IAAA,EAAA,EAAQ;AACzC,MAAA,IAAI,iBAAA,CAAkB,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA,EAAG;AACzC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC3C,MAAA,MAAM,KAAK,QAAA,CAAS,aAAA,CAAc,IAAA,KAAS,CAAA,GAAI,OAAO,IAAI,CAAA;AAE1D,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,GAAA,GAAM,CAAA;AAC3C,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,CAAA;AAC3C,QAAA,IAAI,OAAA,GAAU,CAAA,EAAG,EAAA,CAAG,OAAA,GAAU,OAAA;AAC9B,QAAA,IAAI,OAAA,GAAU,CAAA,EAAG,EAAA,CAAG,OAAA,GAAU,OAAA;AAAA,MAChC;AAEA,MAAA,EAAA,CAAG,WAAA,GAAc,OAAA,CAAQ,IAAI,CAAA,IAAK,EAAA;AAClC,MAAA,EAAA,CAAG,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAKf,IAAA,KAAS,CAAA,GAAI,uEAAA,GAA0E,EAAE;AAAA,MAAA,CAAA;AAG7F,MAAA,EAAA,CAAG,YAAY,EAAE,CAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,EAAA,aAAA,CAAc,MAAM,OAAA,GAAU,oCAAA;AAC9B,EAAA,aAAA,CAAc,YAAY,OAAO,CAAA;AACjC,EAAA,OAAA,CAAQ,YAAY,aAAa,CAAA;AACnC;AASA,SAAS,iBACP,IAAA,EACA,CAAA,EACA,CAAA,EACA,QAAA,EACA,cACA,UAAA,EACM;AACN,EAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAQ;AAErC,EAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,EAAA,IAAA,CAAK,KAAA,EAAM;AAGX,EAAA,MAAM,QAAA,GAAW,SAAS,WAAA,EAAY;AACtC,EAAA,MAAM,MAAA,GAAS,OAAO,YAAA,EAAa;AACnC,EAAA,QAAA,CAAS,mBAAmB,IAAI,CAAA;AAChC,EAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AACvB,EAAA,MAAA,EAAQ,eAAA,EAAgB;AACxB,EAAA,MAAA,EAAQ,SAAS,QAAQ,CAAA;AAEzB,EAAA,SAAS,MAAA,GAAe;AACtB,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AACvB,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,MAAA,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAK,WAAA,IAAe,EAAA;AAAA,IACpC;AACA,IAAA,YAAA,EAAa;AAAA,EACf;AAEA,EAAA,SAAS,UAAU,CAAA,EAAwB;AACzC,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA;AAEpC,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AACvB,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AACpC,MAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC7C,MAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACvC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAA,EAAO;AACP,MAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC7C,MAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACvC,MAAA,MAAM,UAAU,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA;AAC/C,MAAA,UAAA,CAAW,SAAS,CAAC,CAAA;AACrB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAA,EAAO;AACP,MAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC7C,MAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACvC,MAAA,IAAI,EAAA,GAAK,CAAA;AACT,MAAA,IAAI,EAAA,GAAK,CAAA,CAAE,QAAA,GAAW,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClC,MAAA,IAAI,KAAK,CAAA,EAAG;AACV,QAAA,EAAA,GAAK,OAAA,GAAU,CAAA;AACf,QAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAAA,MACxB;AACA,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,EAAA,GAAK,CAAA;AACL,QAAA,EAAA,GAAK,KAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,MACvC;AACA,MAAA,UAAA,CAAW,IAAI,EAAE,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,SAAS,MAAA,GAAe;AACtB,IAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAQ;AACnC,MAAA,MAAA,EAAO;AACP,MAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC7C,MAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC1C,EAAA,IAAA,CAAK,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACtC;AAMA,SAAS,mBAAA,GAA4B;AACnC,EAAA,IAAI,QAAA,CAAS,cAAA,CAAe,mBAAmB,CAAA,EAAG;AAClD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,mBAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc,CAAA,wDAAA,CAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC;AAEA,SAAS,kBAAA,CACP,QACA,IAAA,EACa;AACb,EAAA,mBAAA,EAAoB;AACpB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,0BAAA;AACpB,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAMxB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAKxB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,EAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,EAAA,KAAA,CAAM,MAAM,OAAA,GAAU,CAAA,8EAAA,CAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,OAAO,CAAA;AAC3B,EAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AACzB,EAAA,MAAA,CAAO,YAAY,OAAO,CAAA;AAC1B,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,eAAA,CACP,OAAA,EACA,WAAA,EACA,OAAA,EACA,KACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,KAAiB,KAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,UAAA,EAAY,KAAA,IAAS,OAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,EAAY,MAAA,IAAU,QAAA;AAGhD,EAAA,MAAM,KAAA,GACJ,YAAY,KAAA,CAAM,MAAA,GAAS,IACvB,WAAA,CAAY,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAC,GAAG,CAAC,CAAC,CAAA,GACnC,gBAAA,CAAiB,QAAQ,IAAA,IAAQ,CAAA,EAAG,OAAA,CAAQ,OAAA,IAAW,CAAC,CAAA;AAC9D,EAAA,IAAI,MAAA,GACF,YAAY,MAAA,GAAS,CAAC,GAAG,WAAA,CAAY,MAAM,IAAI,EAAC;AAElD,EAAA,MAAM,MAAsB,EAAE,MAAA,EAAQ,MAAM,KAAA,EAAO,IAAA,EAAM,UAAU,KAAA,EAAM;AAGzE,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,EAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,EAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AACnB,EAAA,WAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,QAAQ,GAAG,KAAA,EAAO,CAAC,SAAS,GAAG,MAAA,EAAQ,CAAA;AAC7E,EAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAE/B,EAAA,SAAS,YAAA,GAAqB;AAC5B,IAAA,WAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,QAAQ,GAAG,KAAA,EAAO,CAAC,SAAS,GAAG,MAAA,EAAQ,CAAA;AAC7E,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,EAAE,CAAC,QAAQ,GAAG,KAAA,EAAO,CAAC,SAAS,GAAG,MAAA,EAAQ,CAAA;AAAA,IAC9E;AAAA,EACF;AAGA,EAAC,WAAA,CACE,oBAAA,GAAuB,CAAC,IAAA,KAAoB;AAC3C,IAAA,KAAA,CAAM,MAAA,GAAS,CAAA;AACf,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAA,KAAQ,KAAA,CAAM,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;AAChD,IAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAChB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,EAAE,GAAG,CAAA,EAAG,CAAC,CAAA;AAAA,IAClD;AACA,IAAA,GAAA,CAAI,MAAA,GAAS,IAAA;AACb,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAIF,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,EAAA,YAAA,CAAa,MAAM,OAAA,GACjB,sFAAA;AAEF,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC9C,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAQxB,EAAA,YAAA,CAAa,YAAY,OAAO,CAAA;AAGhC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,YAAA,EAAc,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,GAAA,CAAI,WAAA,EAAa,CAAA,CAAE,CAAA,IAAK,EAAC;AAEnF,EAAA,eAAe,WAAW,IAAA,EAA2B;AACnD,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,cAAA,EAAgB;AAGlC,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,aAAY,CAAE,OAAA,CAAQ,iBAAiB,IAAI,CAAA;AACjE,MAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAAA,IACjC;AAEA,IAAA,MAAM,OAAA,GAAU,kBAAA;AAAA,MACd,YAAA;AAAA,MACA,CAAA,CAAE,kBAAkB,KAAK;AAAA,KAC3B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,eAAe,IAAI,CAAA;AACrD,MAAA,MAAM,gBAAgB,MAAA,CAAO,KAAA;AAC7B,MAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,IAAU,EAAC;AAEzC,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,MAAM,GAAA,GAAM,cAAA;AAAA,UACV,cAAA;AAAA,UACA,aAAA,CAAc,MAAA;AAAA,UACd,aAAA,CAAc,CAAC,CAAA,EAAG,MAAA,IAAU;AAAA,SAC9B;AACA,QAAA,IAAI,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,GAAG,CAAA;AAAA,MAC9B;AAEA,MAAA,KAAA,CAAM,MAAA,GAAS,CAAA;AACf,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,GAAA,KAAQ,KAAA,CAAM,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;AACnD,MAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAChB,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,EAAE,GAAG,CAAA,EAAG,CAAC,CAAA;AAEnD,MAAA,GAAA,CAAI,MAAA,GAAS,IAAA;AACb,MAAA,GAAA,CAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,YAAA,EAAa;AACb,MAAA,OAAA,EAAQ;AAAA,IACV,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,SAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACxD,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,EAAE,kBAAA,EAAoB,KAAK,CAAA,CAAE,OAAA,CAAQ,WAAW,MAAM;AAAA,OACxD;AAAA,IACF,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,MAAA,EAAO;AAAA,IACjB;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,YAAA,IAAgB,KAAA,CAAM,MAAA,CAAO,cAAA,EAAgB;AACvD,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,IAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,IAAA,SAAA,CAAU,KAAA,GAAQ,CAAA,CAAE,iBAAA,EAAmB,KAAK,CAAA;AAC5C,IAAA,SAAA,CAAU,SAAA,GAAY,CAAA,iRAAA,CAAA;AACtB,IAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAW1B,IAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,MAAA,SAAA,CAAU,MAAM,KAAA,GAAQ,kCAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,MAAA,SAAA,CAAU,MAAM,KAAA,GAAQ,4BAAA;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,IAAA,WAAA,CAAY,IAAA,GAAO,MAAA;AACnB,IAAA,WAAA,CAAY,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AACxC,IAAA,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AAC5B,IAAA,YAAA,CAAa,YAAY,WAAW,CAAA;AAEpC,IAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,MAAM;AACxC,MAAA,WAAA,CAAY,KAAA,EAAM;AAAA,IACpB,CAAC,CAAA;AAED,IAAA,WAAA,CAAY,gBAAA,CAAiB,UAAU,MAAM;AAC3C,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,GAAQ,CAAC,CAAA;AAClC,MAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AACzB,MAAA,WAAA,CAAY,KAAA,GAAQ,EAAA;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,YAAA,CAAa,YAAY,SAAS,CAAA;AAGlC,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,YAAA,CAAa,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAiB;AAC3D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,EAAA;AACA,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU,6CAAA;AAC7B,QAAA,YAAA,CAAa,MAAM,aAAA,GAAgB,MAAA;AAAA,MACrC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,YAAA,CAAa,gBAAA,CAAiB,UAAA,EAAY,CAAC,CAAA,KAAiB;AAC1D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,CAAA,CAAE,YAAA,EAAc,CAAA,CAAE,YAAA,CAAa,UAAA,GAAa,MAAA;AAAA,IAClD,CAAC,CAAA;AACD,IAAA,YAAA,CAAa,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAiB;AAC3D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,EAAA;AACA,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,WAAA,GAAc,CAAA;AACd,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU,EAAA;AAC7B,QAAA,YAAA,CAAa,MAAM,aAAA,GAAgB,EAAA;AAAA,MACrC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,YAAA,CAAa,gBAAA,CAAiB,MAAA,EAAQ,CAAC,CAAA,KAAiB;AACtD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,GAAc,CAAA;AACd,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU,EAAA;AAC7B,MAAA,YAAA,CAAa,MAAM,aAAA,GAAgB,EAAA;AACnC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,EAAc,KAAA,GAAQ,CAAC,CAAA;AACtC,MAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAA,CAAQ,YAAY,YAAY,CAAA;AAIhC,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,EAAA,WAAA,CAAY,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAY5B,EAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAE/B,EAAA,SAAS,kBAAA,CAAmB,OAAe,OAAA,EAAwC;AACjF,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAWpB,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,MAAA,GAAA,CAAI,MAAM,UAAA,GAAa,kCAAA;AAAA,IACzB,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,MAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,IACzB,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAClC,MAAA,eAAA,EAAgB;AAChB,MAAA,OAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAiB;AACnD,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,WAAA,CAAY,SAAA,GAAY,EAAA;AACxB,IAAA,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AAE5B,IAAA,MAAM,KAAA,GAAQ,eAAe,GAAG,CAAA;AAChC,IAAA,MAAM,WAAA,GAAc,UAAU,KAAA,CAAM,EAAA,KAAO,MAAM,EAAA,IAAM,KAAA,CAAM,OAAO,KAAA,CAAM,EAAA,CAAA;AAC1E,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,MAAA,IAAU,UAAA,CAAW,GAAA,CAAI,OAAO,GAAA,EAAK,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AAEtF,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,CAAY,WAAA;AAAA,QACV,kBAAA,CAAmB,CAAA,CAAE,iBAAA,EAAmB,KAAK,GAAG,UAAU;AAAA,OAC5D;AAAA,IACF;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,WAAA,CAAY,WAAA;AAAA,QACV,kBAAA,CAAmB,CAAA,CAAE,gBAAA,EAAkB,KAAK,GAAG,SAAS;AAAA,OAC1D;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,YAAY,UAAA,EAAY;AAC3B,MAAA,eAAA,EAAgB;AAChB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,QAAA,CAAS,MAAA,GAAS,EAAA,GAAK,CAAA;AACtD,IAAA,MAAM,KAAK,MAAA,CAAO,UAAA;AAClB,IAAA,MAAM,KAAK,MAAA,CAAO,WAAA;AAClB,IAAA,MAAM,IAAA,GAAO,CAAA,GAAI,SAAA,GAAY,EAAA,GAAK,IAAI,SAAA,GAAY,CAAA;AAClD,IAAA,MAAM,GAAA,GAAM,CAAA,GAAI,UAAA,GAAa,EAAA,GAAK,IAAI,UAAA,GAAa,CAAA;AAEnD,IAAA,WAAA,CAAY,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAChC,IAAA,WAAA,CAAY,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAAA,EAChC;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,EAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC5C,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,MAAA,eAAA,CAAgB,KAAA,EAAM;AACtB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAC3C,MAAA,eAAA,EAAgB;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,EAAE,MAAA,EAAQ,eAAA,CAAgB,QAAQ,CAAA;AAGrC,EAAA,SAAS,oBAAA,GAA6B;AACpC,IAAA,MAAM,KAAA,GAAQ,eAAe,GAAG,CAAA;AAChC,IAAA,MAAM,MAAA,GACJ,OAAA,CAAQ,gBAAA,CAAuC,cAAc,CAAA;AAC/D,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,EAAA,KAAO;AACrB,MAAA,MAAM,IAAI,QAAA,CAAS,EAAA,CAAG,aAAa,UAAU,CAAA,IAAK,KAAK,EAAE,CAAA;AACzD,MAAA,MAAM,IAAI,QAAA,CAAS,EAAA,CAAG,aAAa,UAAU,CAAA,IAAK,KAAK,EAAE,CAAA;AACzD,MAAA,MAAM,QAAA,GACJ,GAAA,CAAI,MAAA,KAAW,IAAA,IACf,GAAA,CAAI,OAAO,GAAA,KAAQ,CAAA,IACnB,GAAA,CAAI,MAAA,CAAO,GAAA,KAAQ,CAAA;AACrB,MAAA,MAAM,OAAA,GACJ,KAAA,KAAU,IAAA,IACV,CAAA,IAAK,KAAA,CAAM,EAAA,IACX,CAAA,IAAK,KAAA,CAAM,EAAA,IACX,CAAA,IAAK,KAAA,CAAM,EAAA,IACX,KAAK,KAAA,CAAM,EAAA;AAEb,MAAA,EAAA,CAAG,KAAA,CAAM,OAAA,GAAU,QAAA,GACf,4CAAA,GACA,EAAA;AACJ,MAAA,EAAA,CAAG,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,MAAA,GAAS,EAAA;AAG7C,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,EAAA,CAAG,MAAM,eAAA,GAAkB,kCAAA;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,EAAA,CAAG,KAAA,CAAM,eAAA,GACP,OAAA,IAAW,CAAC,WAAW,sBAAA,GAAyB,EAAA;AAAA,MACpD;AAAA,IACF,CAAC,CAAA;AAAA,EAEH;AAGA,EAAA,SAAS,UAAA,CAAW,KAAa,GAAA,EAAmB;AAClD,IAAA,GAAA,CAAI,MAAA,GAAS,EAAE,GAAA,EAAK,GAAA,EAAI;AACxB,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,oBAAA,EAAqB;AACrB,IAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,EAChB;AAGA,EAAA,SAAS,QAAA,CAAS,KAAa,GAAA,EAAmB;AAChD,IAAA,MAAM,KAAK,OAAA,CAAQ,aAAA;AAAA,MACjB,CAAA,aAAA,EAAgB,GAAG,CAAA,aAAA,EAAgB,GAAG,CAAA,EAAA;AAAA,KACxC;AACA,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,aAAA,CAAc,MAAM,CAAA;AACpC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,GAAA,CAAI,MAAA,GAAS,EAAE,GAAA,EAAK,GAAA,EAAI;AACxB,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,oBAAA,EAAqB;AACrB,IAAA,gBAAA,CAAiB,MAAM,GAAA,EAAK,GAAA,EAAK,MAAM,KAAA,EAAO,cAAc,UAAU,CAAA;AAAA,EACxE;AAGA,EAAA,SAAS,OAAO,UAAA,EAA2B;AACzC,IAAA,MAAM,OAAA,GACJ,MAAM,MAAA,GAAS,CAAA,GAAI,MAAM,CAAC,CAAA,CAAE,MAAA,GAAS,OAAA,CAAQ,OAAA,IAAW,CAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,KAAA,CAAc,OAAO,CAAA,CAAE,KAAK,EAAE,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,UAAA,KAAe,MAAA,GAAY,UAAA,GAAa,IAAI,KAAA,CAAM,MAAA;AACnE,IAAA,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,CAAA,EAAG,MAAM,CAAA;AAGhC,IAAA,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACzB,MAAA,IAAI,CAAA,CAAE,OAAO,QAAA,EAAU;AACrB,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,EAAE;AAAA,MACtD;AACA,MAAA,IAAI,CAAA,CAAE,GAAA,GAAM,QAAA,IAAY,CAAA,CAAE,UAAU,QAAA,EAAU;AAC5C,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,SAAS,CAAA,EAAE;AAAA,MACtC;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,EAAQ;AAAA,EACV;AAEA,EAAA,SAAS,UAAU,SAAA,EAA0B;AAC3C,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACvB,IAAA,MAAM,WAAA,GACJ,SAAA,KAAc,MAAA,GACV,SAAA,GACA,GAAA,CAAI,SACF,GAAA,CAAI,MAAA,CAAO,GAAA,GACX,KAAA,CAAM,MAAA,GAAS,CAAA;AAEvB,IAAA,MAAA,GAAS,MAAA,CACN,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,IAAI,EAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,MAAA,KAAW,aAAa,OAAO,IAAA;AAC9D,MAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AAEzB,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,SAAS,CAAA,EAAE;AAAA,MACtC;AACA,MAAA,IAAI,CAAA,CAAE,WAAW,WAAA,EAAa;AAC5B,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,SAAS,CAAA,EAAE;AAAA,MACtC;AACA,MAAA,IAAI,CAAA,CAAE,GAAA,GAAM,WAAA,IAAe,CAAA,CAAE,SAAS,WAAA,EAAa;AACjD,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,SAAS,CAAA,EAAE;AAAA,MACtC;AACA,MAAA,IAAI,CAAA,CAAE,MAAM,WAAA,EAAa;AACvB,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,EAAE;AAAA,MACtD;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAuB,MAAM,IAAI,CAAA;AAE5C,IAAA,KAAA,CAAM,MAAA,CAAO,aAAa,CAAC,CAAA;AAC3B,IAAA,IAAI,IAAI,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,GAAA,IAAO,MAAM,MAAA,EAAQ;AAChD,MAAA,GAAA,CAAI,MAAA,GAAS,EAAE,GAAA,EAAK,KAAA,CAAM,SAAS,CAAA,EAAG,GAAA,EAAK,GAAA,CAAI,MAAA,CAAO,GAAA,EAAI;AAAA,IAC5D;AACA,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,EAAQ;AAAA,EACV;AAEA,EAAA,SAAS,UAAU,UAAA,EAA2B;AAC5C,IAAA,MAAM,QAAA,GAAW,eAAe,MAAA,GAAY,UAAA,GAAa,IAAI,KAAA,CAAM,CAAC,GAAG,MAAA,IAAU,CAAA;AACjF,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAO,QAAA,EAAU,CAAA,EAAG,EAAE,CAAC,CAAA;AAGlD,IAAA,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACzB,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,OAAO,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAE;AAAA,MACtD;AACA,MAAA,IAAI,CAAA,CAAE,IAAA,GAAO,QAAA,IAAY,CAAA,CAAE,SAAS,QAAA,EAAU;AAC5C,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,QAAQ,CAAA,EAAE;AAAA,MACpC;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,EAAQ;AAAA,EACV;AAEA,EAAA,SAAS,aAAa,SAAA,EAA0B;AAC9C,IAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,MAAM,CAAC,CAAA,CAAE,UAAU,CAAA,EAAG;AAChD,IAAA,MAAM,WAAA,GACJ,SAAA,KAAc,MAAA,GACV,SAAA,GACA,GAAA,CAAI,MAAA,GACF,GAAA,CAAI,MAAA,CAAO,GAAA,GACX,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AAE1B,IAAA,MAAA,GAAS,MAAA,CACN,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,IAAI,EAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,KAAA,KAAU,aAAa,OAAO,IAAA;AAC9D,MAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAE1B,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,QAAQ,CAAA,EAAE;AAAA,MACpC;AACA,MAAA,IAAI,CAAA,CAAE,UAAU,WAAA,EAAa;AAC3B,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,QAAQ,CAAA,EAAE;AAAA,MACpC;AACA,MAAA,IAAI,CAAA,CAAE,IAAA,GAAO,WAAA,IAAe,CAAA,CAAE,QAAQ,WAAA,EAAa;AACjD,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,QAAQ,CAAA,EAAE;AAAA,MACpC;AACA,MAAA,IAAI,CAAA,CAAE,OAAO,WAAA,EAAa;AACxB,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,OAAO,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAE;AAAA,MACtD;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAuB,MAAM,IAAI,CAAA;AAE5C,IAAA,KAAA,CAAM,QAAQ,CAAC,GAAA,KAAQ,IAAI,MAAA,CAAO,WAAA,EAAa,CAAC,CAAC,CAAA;AACjD,IAAA,IAAI,GAAA,CAAI,UAAU,GAAA,CAAI,MAAA,CAAO,OAAO,KAAA,CAAM,CAAC,EAAE,MAAA,EAAQ;AACnD,MAAA,GAAA,CAAI,MAAA,GAAS,EAAE,GAAA,EAAK,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA,EAAE;AAAA,IAC/D;AACA,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,EAAQ;AAAA,EACV;AAGA,EAAA,SAAS,UAAA,GAAmB;AAC1B,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,MAAM,KAAA,GAAQ,eAAe,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAG,GAAI,KAAA;AAC3B,IAAA,IAAI,EAAA,KAAO,EAAA,IAAM,EAAA,KAAO,EAAA,EAAI;AAG5B,IAAA,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM;AAC5B,MAAA,MAAM,QAAA,GACJ,CAAA,CAAE,GAAA,IAAO,EAAA,IAAM,CAAA,CAAE,MAAA,IAAU,EAAA,IAAM,CAAA,CAAE,IAAA,IAAQ,EAAA,IAAM,CAAA,CAAE,KAAA,IAAS,EAAA;AAC9D,MAAA,OAAO,CAAC,QAAA;AAAA,IACV,CAAC,CAAA;AAGD,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,EAAE,CAAA,CAAE,EAAE,CAAA;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC7B,MAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC7B,QAAA,IAAI,CAAA,KAAM,EAAA,IAAM,CAAA,KAAM,EAAA,EAAI;AACxB,UAAA,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAA,CAAM,EAAE,CAAA,CAAE,EAAE,CAAA,GAAI,UAAA;AAEhB,IAAA,MAAM,QAAA,GAAuB,EAAE,GAAA,EAAK,EAAA,EAAI,MAAM,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,EAAA,EAAG;AACxE,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,MAAA,EAAQ,QAAQ,CAAA;AACvC,IAAA,MAAM,GAAA,GAAM,eAAe,UAAA,EAAY,KAAA,CAAM,QAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,MAAA,IAAU,CAAC,CAAA;AAC1E,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAA,CAAQ,IAAA,CAAK,4BAA4B,GAAG,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,GAAS,EAAE,GAAA,EAAK,EAAA,EAAI,KAAK,EAAA,EAAG;AAChC,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,EAAQ;AAAA,EACV;AAEA,EAAA,SAAS,SAAA,GAAkB;AACzB,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACjB,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,GAAA,CAAI,MAAA;AACzB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,EAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,IAAA,KAAS,GAAG,CAAA;AACpE,IAAA,IAAI,SAAS,EAAA,EAAI;AAEjB,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACrB,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,EAAQ;AAAA,EACV;AAGA,EAAA,SAAS,OAAA,GAAgB;AACvB,IAAA,OAAA,CAAQ,SAAA,GAAY,EAAA;AAEpB,IAAA,MAAM,UAAU,KAAA,CAAM,MAAA;AACtB,IAAA,MAAM,UAAU,OAAA,GAAU,CAAA,GAAI,KAAA,CAAM,CAAC,EAAE,MAAA,GAAS,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,eAAe,GAAG,CAAA;AAGhC,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,OAAA,EAAS,IAAA,EAAA,EAAQ;AACzC,MAAA,MAAM,OAAA,GACJ,IAAA,KAAS,CAAA,GACL,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,WAAA,EAAY,GACrC,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,IAAK,QAAQ,WAAA,EAAY;AAEhD,MAAA,MAAM,EAAA,GAAK,QAAQ,SAAA,EAAU;AAE7B,MAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,OAAA,EAAS,IAAA,EAAA,EAAQ;AACzC,QAAA,IAAI,iBAAA,CAAkB,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA,EAAG;AACzC,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC3C,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,QAAA,EAAA,CAAG,YAAA,CAAa,UAAA,EAAY,MAAA,CAAO,IAAI,CAAC,CAAA;AACxC,QAAA,EAAA,CAAG,YAAA,CAAa,UAAA,EAAY,MAAA,CAAO,IAAI,CAAC,CAAA;AAExC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,GAAA,GAAM,CAAA;AAC3C,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,CAAA;AAC3C,UAAA,IAAI,OAAA,GAAU,CAAA,EAAG,EAAA,CAAG,OAAA,GAAU,OAAA;AAC9B,UAAA,IAAI,OAAA,GAAU,CAAA,EAAG,EAAA,CAAG,OAAA,GAAU,OAAA;AAAA,QAChC;AAEA,QAAA,MAAM,OAAA,GACJ,KAAA,KAAU,IAAA,IACV,IAAA,IAAQ,KAAA,CAAM,EAAA,IACd,IAAA,IAAQ,KAAA,CAAM,EAAA,IACd,IAAA,IAAQ,KAAA,CAAM,EAAA,IACd,QAAQ,KAAA,CAAM,EAAA;AAEhB,QAAA,MAAM,QAAA,GACJ,GAAA,CAAI,MAAA,KAAW,IAAA,IACf,GAAA,CAAI,OAAO,GAAA,KAAQ,IAAA,IACnB,GAAA,CAAI,MAAA,CAAO,GAAA,KAAQ,IAAA;AAErB,QAAA,EAAA,CAAG,MAAM,OAAA,GAAU;AAAA,UACjB,8DAAA;AAAA,UACA,mBAAA;AAAA,UACA,kBAAA;AAAA,UACA,sBAAA;AAAA,UACA,eAAA;AAAA,UACA,qBAAA;AAAA,UACA,IAAA,KAAS,IACL,uEAAA,GACA,EAAA;AAAA,UACJ,OAAA,IAAW,CAAC,QAAA,GACR,yCAAA,GACA,EAAA;AAAA,UACJ,WACI,4EAAA,GACA;AAAA,SACN,CAAE,KAAK,GAAG,CAAA;AAEV,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,QAAA,OAAA,CAAQ,WAAA,GAAc,KAAA,CAAM,IAAI,CAAA,CAAE,IAAI,CAAA;AACtC,QAAA,OAAA,CAAQ,MAAM,OAAA,GACZ,kGAAA;AACF,QAAA,EAAA,CAAG,YAAY,OAAO,CAAA;AAGtB,QAAA,MAAM,SAAA,GAAY,IAAA;AAClB,QAAA,MAAM,SAAA,GAAY,IAAA;AAGlB,QAAA,EAAA,CAAG,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAEtC,UAAA,IAAK,CAAA,CAAE,MAAA,CAAuB,OAAA,KAAY,QAAA,EAAU;AAEpD,UAAA,IAAK,CAAA,CAAE,MAAA,CAAuB,eAAA,KAAoB,MAAA,EAAQ;AAI1D,UAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClB,YAAA,MAAMK,MAAAA,GAAQ,eAAe,GAAG,CAAA;AAChC,YAAA,IACEA,MAAAA,IACA,SAAA,IAAaA,MAAAA,CAAM,EAAA,IACnB,SAAA,IAAaA,MAAAA,CAAM,EAAA,IACnB,SAAA,IAAaA,MAAAA,CAAM,EAAA,IACnB,SAAA,IAAaA,MAAAA,CAAM,EAAA,EACnB;AACA,cAAA;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,CAAA,CAAE,QAAA,IAAY,GAAA,CAAI,MAAA,EAAQ;AAC5B,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,GAAA,CAAI,KAAA,GAAQ,EAAE,GAAA,EAAK,SAAA,EAAW,KAAK,SAAA,EAAU;AAC7C,YAAA,GAAA,CAAI,QAAA,GAAW,KAAA;AACf,YAAA,oBAAA,EAAqB;AAAA,UACvB,CAAA,MAAO;AAEL,YAAA,GAAA,CAAI,MAAA,GAAS,EAAE,GAAA,EAAK,SAAA,EAAW,KAAK,SAAA,EAAU;AAC9C,YAAA,GAAA,CAAI,KAAA,GAAQ,IAAA;AACZ,YAAA,GAAA,CAAI,QAAA,GAAW,IAAA;AACf,YAAA,oBAAA,EAAqB;AAAA,UACvB;AAAA,QACF,CAAC,CAAA;AAED,QAAA,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAM;AACpC,UAAA,IAAK,CAAA,CAAE,MAAA,CAAuB,OAAA,KAAY,QAAA,EAAU;AACpD,UAAA,IAAI,IAAI,QAAA,EAAU;AAChB,YAAA,GAAA,CAAI,QAAA,GAAW,KAAA;AAEf,YAAA,MAAM,YAAA,GAAe,eAAe,GAAG,CAAA;AACvC,YAAA,MAAM,YAAA,GACJ,CAAC,YAAA,IACA,YAAA,CAAa,OAAO,YAAA,CAAa,EAAA,IAChC,YAAA,CAAa,EAAA,KAAO,YAAA,CAAa,EAAA;AACrC,YAAA,IAAI,YAAA,EAAc;AAChB,cAAA,QAAA,CAAS,WAAW,SAAS,CAAA;AAAA,YAC/B;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAED,QAAA,EAAA,CAAG,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AACtC,UAAA,IAAI,GAAA,CAAI,QAAA,IAAY,CAAA,CAAE,OAAA,KAAY,CAAA,EAAG;AACnC,YAAA,MAAM,gBAAgB,GAAA,CAAI,MAAA;AAC1B,YAAA,IACE,kBACC,aAAA,CAAc,GAAA,KAAQ,SAAA,IAAa,aAAA,CAAc,QAAQ,SAAA,CAAA,EAC1D;AACA,cAAA,GAAA,CAAI,KAAA,GAAQ,EAAE,GAAA,EAAK,SAAA,EAAW,KAAK,SAAA,EAAU;AAC7C,cAAA,oBAAA,EAAqB;AAAA,YACvB;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAGD,QAAA,EAAA,CAAG,gBAAA,CAAiB,aAAA,EAAe,CAAC,CAAA,KAAM;AACxC,UAAA,IAAI,CAAC,YAAA,EAAc;AACnB,UAAA,MAAM,YAAA,GAAe,eAAe,GAAG,CAAA;AACvC,UAAA,MAAM,OAAA,GACJ,iBACC,YAAA,CAAa,EAAA,KAAO,aAAa,EAAA,IAAM,YAAA,CAAa,OAAO,YAAA,CAAa,EAAA,CAAA;AAC3E,UAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,IAAU,UAAA,CAAW,GAAA,CAAI,OAAO,GAAA,EAAK,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AAChF,UAAA,IAAI,WAAW,QAAA,EAAU;AACvB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,eAAA,CAAgB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,OAAO,CAAA;AAAA,UACtC;AAAA,QACF,CAAC,CAAA;AAED,QAAA,EAAA,CAAG,YAAY,EAAE,CAAA;AAAA,MACnB;AAAA,IACF;AAGA,IAAA,mBAAA,EAAoB;AAGpB,IAAA,OAAA,CAAQ,YAAA,CAAa,YAAY,GAAG,CAAA;AACpC,IAAA,OAAA,CAAQ,SAAA,GAAY,CAAC,CAAA,KAAqB;AACxC,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,aAAA,CAAc,0BAA0B,CAAA;AAChE,MAAA,IAAI,OAAA,EAAS;AAEb,MAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,WAAW,KAAA,CAAM,MAAA;AACvB,MAAA,MAAM,WAAW,QAAA,GAAW,CAAA,GAAI,KAAA,CAAM,CAAC,EAAE,MAAA,GAAS,CAAA;AAElD,MAAA,MAAM,SAAA,GAA8C;AAAA,QAClD,OAAA,EAAS,CAAC,EAAA,EAAI,CAAC,CAAA;AAAA,QACf,SAAA,EAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,QAChB,SAAA,EAAW,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,QACjB,UAAA,EAAY,CAAC,CAAA,EAAG,CAAC;AAAA,OACnB;AAEA,MAAA,IAAI,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA,EAAG;AACpB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,SAAA,CAAU,EAAE,GAAG,CAAA;AAChC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,CAAA,EAAG,MAAA,CAAO,GAAA,GAAM,EAAE,CAAC,CAAA;AAClE,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,CAAA,EAAG,MAAA,CAAO,GAAA,GAAM,EAAE,CAAC,CAAA;AAClE,QAAA,IAAI,EAAE,QAAA,EAAU;AACd,UAAA,GAAA,CAAI,KAAA,GAAQ,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA,EAAO;AACvC,UAAA,oBAAA,EAAqB;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,QAAQ,MAAM,CAAA;AAAA,QAC3B;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA;AAC/B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA;AACrC,QAAA,IAAI,KAAK,MAAA,CAAO,GAAA;AAChB,QAAA,IAAI,KAAK,CAAA,CAAE,QAAA,GAAW,OAAO,GAAA,GAAM,CAAA,GAAI,OAAO,GAAA,GAAM,CAAA;AACpD,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,EAAA,GAAK,QAAA,GAAW,CAAA;AAChB,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA;AAAA,QACzB;AACA,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,EAAA,GAAK,CAAA;AACL,UAAA,EAAA,GAAK,KAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,QACxC;AACA,QAAA,UAAA,CAAW,IAAI,EAAE,CAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,YAAA,IAAgB,EAAE,GAAA,KAAQ,GAAA,IAAO,EAAE,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AAC7D,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,UAAA,EAAW;AACX,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,gBAAgB,CAAA,CAAE,GAAA,KAAQ,OAAO,CAAA,CAAE,OAAA,IAAW,EAAE,QAAA,EAAU;AAC5D,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,SAAA,EAAU;AAAA,MACZ;AAAA,IACF,CAAA;AAGA,IAAA,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,KAAsB;AACtC,MAAA,MAAMA,MAAAA,GAAQ,eAAe,GAAG,CAAA;AAChC,MAAA,IAAI,CAACA,MAAAA,EAAO;AACZ,MAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,MAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAG,GAAIA,MAAAA;AAC3B,MAAA,MAAM,UAAoB,EAAC;AAC3B,MAAA,MAAM,WAAqB,EAAC;AAE5B,MAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,MAAM,WAAqB,EAAC;AAC5B,QAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC7B,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AAC7B,UAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAChB,UAAA,MAAM,OAAA,GAAU,GAAA,CACb,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AACvB,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,IAAA,EAAO,OAAO,CAAA,KAAA,CAAO,CAAA;AAAA,QACrC;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,GAAI,CAAC,CAAA;AAC/B,QAAA,QAAA,CAAS,KAAK,CAAA,IAAA,EAAO,QAAA,CAAS,IAAA,CAAK,EAAE,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,MAC/C;AAEA,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACjC,MAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,QAAA,CAAS,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CAAA;AAE5C,MAAA,CAAA,CAAE,aAAA,EAAe,OAAA,CAAQ,YAAA,EAAc,OAAO,CAAA;AAC9C,MAAA,CAAA,CAAE,aAAA,EAAe,OAAA,CAAQ,WAAA,EAAa,QAAQ,CAAA;AAAA,IAChD,CAAA;AAGA,IAAA,OAAA,CAAQ,OAAA,GAAU,CAAC,CAAA,KAAsB;AACvC,MAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,EAAe,OAAA,CAAQ,YAAY,CAAA,IAAK,EAAA;AACvD,MAAA,MAAM,WAAA,GACJ,IAAA,CAAK,QAAA,CAAS,GAAI,KAClB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAA,GAAS,CAAA;AAGhD,MAAA,MAAM,OAAA,GACJ,OAAA,CAAQ,aAAA,CAA2B,0BAA0B,CAAA;AAC/D,MAAA,IAAI,OAAA,IAAW,CAAC,WAAA,EAAa;AAE7B,MAAA,CAAA,CAAE,cAAA,EAAe;AAGjB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,eAAA,GAAkB,SAAA;AAC1B,QAAA,MAAM,CAAA,GAAI,QAAA;AAAA,UACR,QAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG,YAAA,CAAa,UAAU,CAAA,IAAK,GAAA;AAAA,UACnD;AAAA,SACF;AACA,QAAA,MAAM,CAAA,GAAI,QAAA;AAAA,UACR,QAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG,YAAA,CAAa,UAAU,CAAA,IAAK,GAAA;AAAA,UACnD;AAAA,SACF;AACA,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,UAAA,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,QAAQ,WAAA,IAAe,EAAA;AAAA,QACvC;AAAA,MACF;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAElB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,GAAI,CAAC,CAAA;AAEpE,MAAA,IACE,UAAU,MAAA,GAAS,CAAA,IACnB,SAAA,CAAU,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,MAAA,KAAW,CAAA,IAC3C,UAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,MAAM,EAAA,EACvC;AACA,QAAA,SAAA,CAAU,GAAA,EAAI;AAAA,MAChB;AAEA,MAAA,MAAM,SAAS,MAAA,CAAO,GAAA;AACtB,MAAA,MAAM,SAAS,MAAA,CAAO,GAAA;AAGtB,MAAA,MAAM,UAAA,GAAa,SAAS,SAAA,CAAU,MAAA;AACtC,MAAA,OAAO,KAAA,CAAM,SAAS,UAAA,EAAY;AAChC,QAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAc,KAAA,CAAM,CAAC,CAAA,EAAG,UAAU,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,MAC1D;AACA,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,GAAG,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAC/D,MAAA,MAAM,aAAa,MAAA,GAAS,YAAA;AAC5B,MAAA,IAAI,MAAM,CAAC,CAAA,IAAK,aAAa,KAAA,CAAM,CAAC,EAAE,MAAA,EAAQ;AAC5C,QAAA,MAAM,SAAA,GAAY,UAAA,GAAa,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AACxC,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACrB,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,WAAW,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,QACjD,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,SAAA,CAAU,QAAQ,EAAA,EAAA,EAAM;AAC5C,QAAA,KAAA,IAAS,KAAK,CAAA,EAAG,EAAA,GAAK,UAAU,EAAE,CAAA,CAAE,QAAQ,EAAA,EAAA,EAAM;AAChD,UAAA,MAAM,KAAK,MAAA,GAAS,EAAA;AACpB,UAAA,MAAM,KAAK,MAAA,GAAS,EAAA;AACpB,UAAA,IAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACb,YAAA,KAAA,CAAM,EAAE,CAAA,CAAE,EAAE,IAAI,SAAA,CAAU,EAAE,EAAE,EAAE,CAAA;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAEA,MAAA,YAAA,EAAa;AACb,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAAA,EACF;AAKA,EAAA,MAAM,eAAe,oBAAA,CAAqB;AAAA,IACxC,KAAA,EAAO,GAAA;AAAA,IACP,KAAA,EAAO,CAAA,CAAE,gBAAA,EAAkB,KAAK,CAAA;AAAA,IAChC,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,kCAAA;AAAA,IACP,SAAA,EAAW,OAAA;AAAA,IACX,SAAS,MAAM;AACb,MAAA,MAAM,WAAW,QAAA,CAAS,YAAA,CAAa,OAAA,CAAQ,QAAA,IAAY,KAAK,EAAE,CAAA;AAClE,MAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,IACpB;AAAA,GACD,CAAA;AACD,EAAA,YAAA,CAAa,MAAM,QAAA,GAAW,UAAA;AAC9B,EAAA,YAAA,CAAa,MAAM,OAAA,GAAU,MAAA;AAC7B,EAAA,YAAA,CAAa,YAAY,YAAY,CAAA;AAErC,EAAA,MAAM,eAAe,oBAAA,CAAqB;AAAA,IACxC,KAAA,EAAO,GAAA;AAAA,IACP,KAAA,EAAO,CAAA,CAAE,aAAA,EAAe,KAAK,CAAA;AAAA,IAC7B,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,kCAAA;AAAA,IACP,SAAA,EAAW,OAAA;AAAA,IACX,SAAS,MAAM;AACb,MAAA,MAAM,WAAW,QAAA,CAAS,YAAA,CAAa,OAAA,CAAQ,QAAA,IAAY,KAAK,EAAE,CAAA;AAClE,MAAA,MAAA,CAAO,QAAQ,CAAA;AAAA,IACjB;AAAA,GACD,CAAA;AACD,EAAA,YAAA,CAAa,MAAM,QAAA,GAAW,UAAA;AAC9B,EAAA,YAAA,CAAa,MAAM,OAAA,GAAU,MAAA;AAC7B,EAAA,YAAA,CAAa,YAAY,YAAY,CAAA;AAGrC,EAAA,IAAI,gBAAqC,EAAC;AAC1C,EAAA,IAAI,gBAAqC,EAAC;AAG1C,EAAA,MAAM,gBAAgB,oBAAA,CAAqB;AAAA,IACzC,KAAA,EAAO,GAAA;AAAA,IACP,KAAA,EAAO,CAAA,CAAE,gBAAA,EAAkB,KAAK,CAAA;AAAA,IAChC,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,kCAAA;AAAA,IACP,SAAA,EAAW,OAAA;AAAA,IACX,OAAA,EAAS,MAAM,SAAA;AAAU,GAC1B,CAAA;AACD,EAAA,aAAA,CAAc,MAAM,QAAA,GAAW,UAAA;AAC/B,EAAA,aAAA,CAAc,MAAM,OAAA,GAAU,MAAA;AAC9B,EAAA,YAAA,CAAa,YAAY,aAAa,CAAA;AAGtC,EAAA,MAAM,gBAAgB,oBAAA,CAAqB;AAAA,IACzC,KAAA,EAAO,GAAA;AAAA,IACP,KAAA,EAAO,CAAA,CAAE,aAAA,EAAe,KAAK,CAAA;AAAA,IAC7B,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,kCAAA;AAAA,IACP,SAAA,EAAW,OAAA;AAAA,IACX,OAAA,EAAS,MAAM,MAAA;AAAO,GACvB,CAAA;AACD,EAAA,aAAA,CAAc,MAAM,QAAA,GAAW,UAAA;AAC/B,EAAA,aAAA,CAAc,MAAM,OAAA,GAAU,MAAA;AAC9B,EAAA,YAAA,CAAa,YAAY,aAAa,CAAA;AAEtC,EAAA,SAAS,mBAAA,GAA4B;AAEnC,IAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA;AACvC,IAAA,aAAA,GAAgB,EAAC;AACjB,IAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA;AACvC,IAAA,aAAA,GAAgB,EAAC;AAEjB,IAAA,MAAM,UAAU,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,CAAM,CAAC,EAAE,MAAA,GAAS,CAAA;AACrD,IAAA,MAAM,UAAU,KAAA,CAAM,MAAA;AAGtB,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,cAAc,KAAA,CAAM,IAAA;AAAA,QACxB,OAAA,CAAQ,iBAAuC,oBAAoB;AAAA,OACrE;AACA,MAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,QAAA,MAAM,SAAS,QAAA,CAAS,EAAA,CAAG,aAAa,UAAU,CAAA,IAAK,KAAK,EAAE,CAAA;AAC9D,QAAA,MAAM,MAAM,oBAAA,CAAqB;AAAA,UAC/B,KAAA,EAAO,MAAA;AAAA,UACP,KAAA,EAAO,CAAA,CAAE,mBAAA,EAAqB,KAAK,CAAA;AAAA,UACnC,IAAA,EAAM,EAAA;AAAA,UACN,KAAA,EAAO,gCAAA;AAAA,UACP,SAAA,EAAW,OAAA;AAAA,UACX,OAAA,EAAS,MAAM,YAAA,CAAa,MAAM;AAAA,SACnC,CAAA;AACD,QAAA,GAAA,CAAI,YAAA,CAAa,eAAe,YAAY,CAAA;AAC5C,QAAA,GAAA,CAAI,YAAA,CAAa,UAAA,EAAY,MAAA,CAAO,MAAM,CAAC,CAAA;AAC3C,QAAA,GAAA,CAAI,MAAM,QAAA,GAAW,UAAA;AACrB,QAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AACpB,QAAA,YAAA,CAAa,YAAY,GAAG,CAAA;AAC5B,QAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAGA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAI,QAAQ,KAAA,GAAQ,KAAA,CAAM,KAAK,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,EAAC;AAAA,QACtD,GAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAI,IAAI;AAAC,QAChE,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,aAAA,CAAc,cAAc,CAAC,CAAA;AAC/C,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,aAAA,CAAoC,cAAc,CAAA;AACxE,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,SAAS,QAAA,CAAS,OAAA,CAAQ,aAAa,UAAU,CAAA,IAAK,KAAK,EAAE,CAAA;AACnE,QAAA,MAAM,MAAM,oBAAA,CAAqB;AAAA,UAC/B,KAAA,EAAO,MAAA;AAAA,UACP,KAAA,EAAO,CAAA,CAAE,gBAAA,EAAkB,KAAK,CAAA;AAAA,UAChC,IAAA,EAAM,EAAA;AAAA,UACN,KAAA,EAAO,gCAAA;AAAA,UACP,SAAA,EAAW,OAAA;AAAA,UACX,OAAA,EAAS,MAAM,SAAA,CAAU,MAAM;AAAA,SAChC,CAAA;AACD,QAAA,GAAA,CAAI,YAAA,CAAa,eAAe,YAAY,CAAA;AAC5C,QAAA,GAAA,CAAI,YAAA,CAAa,UAAA,EAAY,MAAA,CAAO,MAAM,CAAC,CAAA;AAC3C,QAAA,GAAA,CAAI,MAAM,QAAA,GAAW,UAAA;AACrB,QAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AACpB,QAAA,YAAA,CAAa,YAAY,GAAG,CAAA;AAC5B,QAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAGA,IAAA,SAAS,qBAAA,CACP,EAAA,EAAY,EAAA,EAAa,IAAA,EAAe,SAAiB,MAAA,EACnD;AACN,MAAA,MAAM,WAAA,GAAc,SAChB,KAAA,CAAM,IAAA,CAAK,QAAQ,gBAAA,CAAuC,oBAAoB,CAAC,CAAA,GAC/E,EAAC;AAEL,MAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,MAAA,IAAI,cAAA,GAAiB,QAAA;AACrB,MAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,MAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,MAAA,IAAI,iBAAA,GAAoB,QAAA;AAExB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,CAAA,CAAE,qBAAA,EAAsB;AACtD,QAAA,MAAM,OAAA,GAAA,CAAW,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS,KAAA,IAAS,CAAA;AACnD,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,OAAO,CAAA;AAClC,QAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,aAAA,GAAgB,CAAA;AAAA,QAClB;AACA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,SAAS,KAAK,CAAA;AAC/C,QAAA,IAAI,UAAA,GAAa,iBAAA,IAAqB,UAAA,GAAa,EAAA,EAAI;AACrD,UAAA,iBAAA,GAAoB,UAAA;AACpB,UAAA,cAAA,GAAiB,QAAA,CAAS,KAAA,GAAQ,EAAA,CAAG,IAAA,GAAO,OAAA;AAC5C,UAAA,eAAA,GAAkB,QAAA,CAAS,YAAY,CAAC,CAAA,CAAE,aAAa,UAAU,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,QAC/E;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAClC,QAAA,IAAI,CAAC,MAAA,IAAU,GAAA,KAAQ,aAAA,EAAe;AACpC,UAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AACpB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAG,CAAA,CAAE,qBAAA,EAAsB;AACxD,QAAA,MAAM,WAAW,QAAA,CAAS,IAAA,GAAO,SAAS,KAAA,IAAS,CAAA,GAAI,GAAG,IAAA,GAAO,OAAA;AACjE,QAAA,GAAA,CAAI,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,EAAA,CAAA;AAC/B,QAAA,GAAA,CAAI,MAAM,GAAA,GAAM,KAAA;AAChB,QAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAAA,MACtB,CAAC,CAAA;AAED,MAAA,IAAI,MAAA,IAAU,mBAAmB,CAAA,EAAG;AAClC,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU,MAAA;AAC7B,QAAA,YAAA,CAAa,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,cAAA,GAAiB,EAAE,CAAA,EAAA,CAAA;AAChD,QAAA,YAAA,CAAa,MAAM,GAAA,GAAM,CAAA,EAAG,KAAK,GAAA,GAAM,EAAA,CAAG,MAAM,EAAE,CAAA,EAAA,CAAA;AAClD,QAAA,YAAA,CAAa,OAAA,CAAQ,QAAA,GAAW,MAAA,CAAO,eAAe,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU,MAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,SAAS,sBAAA,CACP,EAAA,EAAY,EAAA,EAAa,IAAA,EAAe,SAAiB,MAAA,EACnD;AACN,MAAA,MAAM,YAAmC,EAAC;AAC1C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,KAAA,MAAW,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AAChD,YAAA,IAAI,IAAI,aAAA,CAAc,cAAc,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,UAC3D;AAAA,QACF;AACA,QAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG;AACtB,UAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,IAAI,CAAA,EAAG;AACrD,YAAA,IAAI,IAAI,aAAA,CAAc,cAAc,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,MAAA,IAAI,cAAA,GAAiB,QAAA;AACrB,MAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,MAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,MAAA,IAAI,oBAAA,GAAuB,QAAA;AAE3B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,CAAC,CAAA,CAAE,qBAAA,EAAsB;AAClD,QAAA,MAAM,OAAA,GAAA,CAAW,MAAA,CAAO,GAAA,GAAM,MAAA,CAAO,MAAA,IAAU,CAAA;AAC/C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,OAAO,CAAA;AAClC,QAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,aAAA,GAAgB,CAAA;AAAA,QAClB;AACA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,OAAO,MAAM,CAAA;AAC9C,QAAA,IAAI,UAAA,GAAa,oBAAA,IAAwB,UAAA,GAAa,EAAA,EAAI;AACxD,UAAA,oBAAA,GAAuB,UAAA;AACvB,UAAA,cAAA,GAAiB,MAAA,CAAO,SAAS,EAAA,CAAG,GAAA;AACpC,UAAA,MAAM,OAAA,GAAU,SAAA,CAAU,CAAC,CAAA,CAAE,cAAc,cAAc,CAAA;AACzD,UAAA,eAAA,GAAkB,SAAS,OAAA,EAAS,YAAA,CAAa,UAAU,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,QACzE;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAClC,QAAA,IAAI,CAAC,MAAA,IAAU,GAAA,KAAQ,aAAA,EAAe;AACpC,UAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AACpB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAG,CAAA,CAAE,qBAAA,EAAsB;AACpD,QAAA,MAAM,WAAW,MAAA,CAAO,GAAA,GAAM,MAAA,CAAO,MAAA,IAAU,IAAI,EAAA,CAAG,GAAA;AACtD,QAAA,GAAA,CAAI,MAAM,IAAA,GAAO,KAAA;AACjB,QAAA,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,EAAA,CAAA;AAC9B,QAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAAA,MACtB,CAAC,CAAA;AAED,MAAA,IAAI,MAAA,IAAU,mBAAmB,CAAA,EAAG;AAClC,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU,MAAA;AAC7B,QAAA,YAAA,CAAa,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,cAAA,GAAiB,EAAE,CAAA,EAAA,CAAA;AAC/C,QAAA,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,EAAA,CAAG,IAAA,GAAO,UAAU,EAAE,CAAA,EAAA,CAAA;AAC/D,QAAA,YAAA,CAAa,OAAA,CAAQ,QAAA,GAAW,MAAA,CAAO,eAAe,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,MAAM,OAAA,GAAU,MAAA;AAAA,MAC/B;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,YAAA,CAAa,WAAA,GAAc,CAAC,CAAA,KAAkB;AAC5C,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,MAAA,CAAO,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,kBAAkB,YAAA,EAAc;AAE1E,MAAA,IAAI,UAAA,EAAY;AAChB,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,MAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AAEb,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,UAAA,GAAa,KAAA;AACb,QAAA,MAAM,EAAA,GAAK,aAAa,qBAAA,EAAsB;AAC9C,QAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,QAAA,MAAM,UAAU,YAAA,CAAa,UAAA;AAE7B,QAAA,MAAM,YAAY,EAAA,IAAM,EAAA,CAAG,GAAA,IAAO,EAAA,GAAK,KAAK,GAAA,GAAM,CAAA;AAClD,QAAA,MAAM,aAAa,EAAA,IAAM,EAAA,CAAG,IAAA,IAAQ,EAAA,GAAK,KAAK,IAAA,GAAO,CAAA;AACrD,QAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,GAAG,KAAK,CAAA;AAClD,QAAA,MAAM,WAAA,GAAc,EAAA,GAAK,YAAA,GAAe,EAAA,IAAM,MAAM,EAAA,CAAG,KAAA;AACvD,QAAA,MAAM,eAAe,EAAA,GAAK,IAAA,CAAK,SAAS,CAAA,IAAK,EAAA,IAAM,GAAG,MAAA,GAAS,EAAA;AAE/D,QAAA,qBAAA,CAAsB,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,SAAS,CAAA;AACtD,QAAA,sBAAA,CAAuB,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,UAAU,CAAA;AAExD,QAAA,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,WAAA,GAAc,MAAA,GAAS,MAAA;AACrD,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA,EAAG,EAAA,CAAG,QAAQ,EAAA,CAAG,IAAA,GAAO,UAAU,EAAE,CAAA,EAAA,CAAA;AAC/D,UAAA,aAAA,CAAc,KAAA,CAAM,GAAA,GAAM,CAAA,EAAA,CAAI,IAAA,CAAK,GAAA,GAAM,KAAK,MAAA,IAAU,CAAA,GAAI,EAAA,CAAG,GAAA,GAAM,EAAE,CAAA,EAAA,CAAA;AAAA,QACzE;AAEA,QAAA,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,YAAA,GAAe,MAAA,GAAS,MAAA;AACtD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,kBAAkB,EAAA,CAAG,IAAA,GAAO,GAAG,KAAA,IAAS,CAAA,GAAI,GAAG,IAAA,GAAO,OAAA;AAC5D,UAAA,aAAA,CAAc,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,cAAA,GAAiB,EAAE,CAAA,EAAA,CAAA;AACjD,UAAA,aAAA,CAAc,MAAM,GAAA,GAAM,CAAA,EAAG,KAAK,MAAA,GAAS,EAAA,CAAG,MAAM,EAAE,CAAA,EAAA,CAAA;AAAA,QACxD;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,YAAA,CAAa,eAAe,MAAM;AAChC,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAAE,QAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAAA,MAAQ,CAAC,CAAA;AAC9D,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAAE,QAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAAA,MAAQ,CAAC,CAAA;AAC9D,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU,MAAA;AAC7B,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU,MAAA;AAC7B,MAAA,aAAA,CAAc,MAAM,OAAA,GAAU,MAAA;AAC9B,MAAA,aAAA,CAAc,MAAM,OAAA,GAAU,MAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAGA,EAAA,OAAA,EAAQ;AACV;AAMA,SAAS,iBAAiB,OAAA,EAAkC;AAC1D,EAAA,OAAO;AAAA,IACL,OAAO,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,IAC/D,QAAQ;AAAC,GACX;AACF;AAEA,SAAS,YAAY,CAAA,EAA4B;AAC/C,EAAA,OACE,CAAA,KAAM,IAAA,IACN,OAAO,CAAA,KAAM,QAAA,IACb,WAAY,CAAA,IACZ,KAAA,CAAM,OAAA,CAAS,CAAA,CAAgB,KAAK,CAAA;AAExC;AAKA,SAAS,yBAAA,CACP,GACA,QAAA,EACS;AACT,EAAA,OACE,CAAA,KAAM,IAAA,IACN,OAAO,CAAA,KAAM,QAAA,IACb,QAAA,IAAa,CAAA,IACb,KAAA,CAAM,OAAA,CAAS,CAAA,CAA8B,QAAQ,CAAC,CAAA;AAE1D;AAEO,SAAS,kBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,UAAA,EAAY,KAAA,IAAS,OAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,EAAY,MAAA,IAAU,QAAA;AAEhD,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,WAAA,CAAY,UAAU,CAAA,EAAG;AAC3B,IAAA,WAAA,GAAc;AAAA,MACZ,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,QAAQ,UAAA,CAAW,MAAA,GAAS,cAAc,UAAA,CAAW,MAAM,IAAI;AAAC,KAClE;AAAA,EACF,CAAA,MAAA,IACE,UAAA,IACA,yBAAA,CAA0B,UAAA,EAAY,QAAQ,CAAA,EAC9C;AAEA,IAAA,MAAM,SAAA,GAAa,WAAuC,SAAS,CAAA;AACnE,IAAA,WAAA,GAAc;AAAA,MACZ,KAAA,EAAQ,WAAuC,QAAQ,CAAA;AAAA,MACvD,MAAA,EAAQ,SAAA,GAAY,aAAA,CAAc,SAAS,IAAI;AAAC,KAClD;AAAA,EACF,CAAA,MAAA,IAAW,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,EAAG;AACvC,IAAA,WAAA,GAAc;AAAA,MACZ,KAAA,EAAO,QAAQ,OAAA,CAAQ,KAAA;AAAA,MACvB,MAAA,EAAQ,QAAQ,OAAA,CAAQ,MAAA,GAAS,cAAc,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,GAAI;AAAC,KAC5E;AAAA,EACF,WAAW,OAAA,CAAQ,OAAA,IAAW,0BAA0B,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA,EAAG;AAClF,IAAA,MAAM,SAAA,GAAa,OAAA,CAAQ,OAAA,CAAoC,SAAS,CAAA;AACxE,IAAA,WAAA,GAAc;AAAA,MACZ,KAAA,EAAQ,OAAA,CAAQ,OAAA,CAAoC,QAAQ,CAAA;AAAA,MAC5D,MAAA,EAAQ,SAAA,GAAY,aAAA,CAAc,SAAS,IAAI;AAAC,KAClD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,WAAA,GAAc,iBAAiB,OAAO,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,WAAA,CAAY,MAAA,IAAU,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA,EAAG;AACvD,IAAA,MAAM,IAAA,GAAO,YAAY,KAAA,CAAM,MAAA;AAC/B,IAAA,MAAM,OAAO,IAAA,GAAO,CAAA,GAAI,YAAY,KAAA,CAAM,CAAC,EAAE,MAAA,GAAS,CAAA;AACtD,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,WAAA,CAAY,MAAA,EAAQ,MAAM,IAAI,CAAA;AACzD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAA,CAAQ,KAAK,CAAA,OAAA,EAAU,OAAA,CAAQ,GAAG,CAAA,oCAAA,EAAuC,GAAG,CAAA,CAAA,CAAG,CAAA;AAC/E,MAAA,WAAA,GAAc,EAAE,GAAG,WAAA,EAAa,MAAA,EAAQ,EAAC,EAAE;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AACzB,IAAA,mBAAA,CAAoB,aAAa,OAAO,CAAA;AAAA,EAC1C,CAAA,MAAO;AACL,IAAA,eAAA,CAAgB,OAAA,EAAS,WAAA,EAAa,OAAA,EAAS,GAAA,EAAK,OAAO,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,oBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,OAAA;AACtC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,UAAA,EAAY,KAAA,IAAS,OAAA;AAE9C,EAAA,MAAM,cAAc,SAAA,CAAU,aAAA;AAAA,IAC5B,UAAU,GAAG,CAAA,EAAA;AAAA,GACf;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAEhB,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,EAC/B;AAEA,EAAA,IAAI,KAAA,GAAwC,IAAA;AAC5C,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,KAAK,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,oBAAA,CAAsB,CAAA;AACxC,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,EAC/B;AAEA,EAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,EAAU;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAQ,CAAA;AAC5B,IAAA,MAAM,aAAa,KAAA,EAAO,IAAA;AAAA,MAAK,CAAC,QAC9B,GAAA,CAAI,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAK,KAAM,EAAE;AAAA,KACvC;AACA,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AACzB;AAEO,SAAS,gBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AACtB,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,UAAA,EAAY,KAAA,IAAS,OAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,EAAY,MAAA,IAAU,QAAA;AAEhD,EAAA,MAAM,cAAc,SAAA,CAAU,aAAA;AAAA,IAC5B,UAAU,SAAS,CAAA,EAAA;AAAA,GACrB;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,gDAAgD,SAAS,CAAA,iCAAA;AAAA,KAC3D;AACA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,SAAA,GAAY;AAAA,MACV,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA,GAAS,cAAc,KAAA,CAAM,MAAM,IAAI;AAAC,KACxD;AAAA,EACF,CAAA,MAAA,IAAW,KAAA,IAAS,yBAAA,CAA0B,KAAA,EAAO,QAAQ,CAAA,EAAG;AAC9D,IAAA,MAAM,SAAA,GAAa,MAAkC,SAAS,CAAA;AAC9D,IAAA,SAAA,GAAY;AAAA,MACV,KAAA,EAAQ,MAAkC,QAAQ,CAAA;AAAA,MAClD,MAAA,EAAQ,SAAA,GAAY,aAAA,CAAc,SAAS,IAAI;AAAC,KAClD;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,IAAa,YAAY,oBAAA,EAAsB;AACjD,IAAA,WAAA,CAAY,qBAAqB,SAAS,CAAA;AAAA,EAC5C,CAAA,MAAO;AACL,IAAA,WAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAAA,EAC1C;AACF;;;AC3qDA,SAASC,gBAAAA,CACP,UACA,QAAA,EACM;AACN,EAAA,QAAA,CAAS,MAAM,QAAA,GAAW,QAAA;AAC1B,EAAA,QAAA,CAAS,MAAM,MAAA,GAAS,MAAA;AAExB,EAAA,MAAM,SAAA,GAAA,CAAa,SAAS,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,IAAK,IAAI,MAAA,GAAS,CAAA;AAC/D,EAAA,QAAA,CAAS,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAErC,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,IAAI,CAAC,SAAS,WAAA,EAAa;AAC3B,IAAA,QAAA,CAAS,MAAM,MAAA,GAAS,GAAA;AACxB,IAAA,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,YAAY,CAAA,EAAA,CAAA;AAEhD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,YAAY,CAAA,EAAA,CAAA;AAAA,IAClD;AAAA,EACF,CAAA;AAEA,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM,CAAA;AAEzC,EAAA,UAAA,CAAW,MAAM;AACf,IAAA,IAAI,QAAA,CAAS,aAAa,MAAA,EAAO;AAAA,EACnC,GAAG,CAAC,CAAA;AACN;AAMA,SAAS,eAAA,CACP,OACA,KAAA,EACqB;AACrB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAE1C,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,GAAA;AAC3B,IAAA,SAAA,CAAU,IAAI,IAAA,EAAA,CAAO,SAAA,CAAU,IAAI,IAAI,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,EACpD;AAEA,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,GAAA;AAC3B,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA,IAAK,KAAK,IAAA,EAAM;AAC1C,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAG,IAAI,KAAK,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,IAAA,EAA6C;AAChE,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACtC;AAWA,SAAS,cAAA,CACP,OACA,KAAA,EACqB;AACrB,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAC3C,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,GAAA;AACT;AAOA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,IAAI,KAAK,IAAA,CAAK,IAAI,KAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACzC,IAAA,OAAO,CAAA,EAAA,EAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,IAAI,IAAI,CAAA,CAAA;AACjB;AAmBA,SAAS,aAAa,IAAA,EAAyB;AAC7C,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,MAAM,MAAM,IAAA,CAAK,MAAA;AACjB,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,IAAI,GAAA,EAAK;AACd,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACnB,MAAA,IAAI,CAAA,GAAI,KAAK,CAAC,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG;AACpC,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,CAAA;AACd,MAAA,CAAA,EAAA;AAEA,MAAA,IAAI,CAAA,GAAI,GAAA,IAAO,IAAA,CAAK,CAAC,MAAM,GAAA,EAAK;AAE9B,QAAA,CAAA,EAAA;AACA,QAAA,IAAI,IAAA,GAAO,EAAA;AACX,QAAA,OAAO,CAAA,GAAI,GAAA,IAAO,IAAA,CAAK,CAAC,MAAM,GAAA,EAAK;AACjC,UAAA,IAAI,KAAK,CAAC,CAAA,KAAM,IAAA,IAAQ,CAAA,GAAI,IAAI,GAAA,EAAK;AACnC,YAAA,IAAA,IAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAClB,YAAA,CAAA,IAAK,CAAA;AAAA,UACP,CAAA,MAAO;AACL,YAAA,IAAA,IAAQ,KAAK,CAAC,CAAA;AACd,YAAA,CAAA,EAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,CAAA,GAAI,GAAA,IAAO,IAAA,CAAK,CAAC,MAAM,GAAA,EAAK;AAC9B,UAAA,CAAA,EAAA;AACA,UAAA,IAAI,KAAK,GAAA,IAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AAClC,YAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA,EAAG,IAAA,EAAM,CAAA;AAAA,UAChE;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,IAAI,GAAA,IAAO,CAAC,KAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AAEzC,QAAA,MAAM,SAAA,GAAY,CAAA;AAClB,QAAA,OAAO,CAAA,GAAI,OAAO,CAAC,IAAA,CAAK,KAAK,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AACrC,UAAA,CAAA,EAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,CAAC,CAAA;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA,EAAG,IAAA,EAAM,CAAA;AAAA,MAChE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,YAAA,CACP,MACA,SAAA,EAC6D;AAC7D,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG,OAAO,EAAC;AAElC,EAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAChC,EAAA,MAAM,UACJ,EAAC;AAEH,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,wBAAA,CACP,MACA,SAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,EAAM,SAAS,CAAA;AAC7C,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAElC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,KAAK,CAAA;AACrC,IAAA,MAAA,IAAU,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,CAAA;AACnB,IAAA,OAAA,GAAU,CAAA,CAAE,GAAA;AAAA,EACd;AACA,EAAA,MAAA,IAAU,IAAA,CAAK,MAAM,OAAO,CAAA;AAC5B,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,wBAAA,CACP,IAAA,EACA,KAAA,EACA,KAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAC3C,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,EAAO,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACtC;AAEA,EAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAChC,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,IAAU,cAAc,KAAK,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,MAAA,IAAU,KAAA,CAAM,GAAA;AAAA,IAClB;AACA,IAAA,OAAA,GAAU,KAAA,CAAM,GAAA;AAAA,EAClB;AACA,EAAA,MAAA,IAAU,IAAA,CAAK,MAAM,OAAO,CAAA;AAC5B,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,kBAAA,CACP,KAAA,EACA,GAAA,EACA,IAAA,EACA,KAAA,EACM;AACN,EAAA,KAAA,CAAM,KAAK,CAAA;AAEX,EAAA,IAAI,IAAA,EAAM,IAAA,IAAQ,WAAA,CAAY,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,MAAM,IAAA,CAAK,IAAA;AACf,IAAA,GAAA,CAAI,MAAM,OAAA,GACR,+DAAA;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,KAAM;AACrB,MAAA,GAAA,CAAI,GAAA,GAAO,CAAA,CAAE,MAAA,EAAQ,MAAA,IAAqB,EAAA;AAAA,IAC5C,CAAA;AACA,IAAA,MAAA,CAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAC9B,IAAA,KAAA,CAAM,YAAY,GAAG,CAAA;AAAA,EACvB,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,YAAA,EAAc;AACpC,IAAA,KAAA,CAAM,OACH,YAAA,CAAa,GAAG,CAAA,CAChB,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,KAAA,CAAM,WAAA,EAAa;AAChC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,GAAA,CAAI,GAAA,GAAM,MAAM,IAAA,IAAQ,GAAA;AACxB,MAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AACV,MAAA,GAAA,CAAI,MAAM,OAAA,GACR,+DAAA;AACF,MAAA,KAAA,CAAM,KAAK,CAAA;AACX,MAAA,KAAA,CAAM,YAAY,GAAG,CAAA;AAAA,IACvB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAe;AACrB,MAAA,KAAA,CAAM,MAAA,CAAO,gBAAA,GAAmB,GAAA,EAAK,GAAG,CAAA;AAAA,IAC1C,CAAC,CAAA;AACH,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,MAAM,OAAA,GAChB,gJAAA;AACF,IAAA,WAAA,CAAY,SAAA,GACV,oOAAA;AACF,IAAA,KAAA,CAAM,YAAY,WAAW,CAAA;AAAA,EAC/B,CAAA,MAAO;AACL,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,MAAM,OAAA,GACT,iKAAA;AACF,IAAA,IAAA,CAAK,SAAA,GACH,oNAAA;AACF,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC5C,MAAA,MAAA,CAAO,MAAM,OAAA,GACX,4JAAA;AACF,MAAA,MAAA,CAAO,cAAc,IAAA,CAAK,IAAA;AAC1B,MAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IACzB;AACA,IAAA,KAAA,CAAM,YAAY,IAAI,CAAA;AAAA,EACxB;AACF;AAMA,SAAS,kBAAA,CACP,OAAA,EACA,GAAA,EACA,IAAA,EACA,KAAA,EACM;AACN,EAAA,KAAA,CAAM,OAAO,CAAA;AAEb,EAAA,IAAI,IAAA,EAAM,IAAA,IAAQ,WAAA,CAAY,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,MAAM,IAAA,CAAK,IAAA;AACf,IAAA,GAAA,CAAI,MAAM,OAAA,GACR,2EAAA;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,KAAM;AACrB,MAAA,GAAA,CAAI,GAAA,GAAO,CAAA,CAAE,MAAA,EAAQ,MAAA,IAAqB,EAAA;AAAA,IAC5C,CAAA;AACA,IAAA,MAAA,CAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAC9B,IAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAAA,EACzB,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,YAAA,EAAc;AACpC,IAAA,KAAA,CAAM,OACH,YAAA,CAAa,GAAG,CAAA,CAChB,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,OAAA,CAAQ,WAAA,EAAa;AAClC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,GAAA,CAAI,GAAA,GAAM,MAAM,IAAA,IAAQ,GAAA;AACxB,MAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AACV,MAAA,GAAA,CAAI,MAAM,OAAA,GACR,2EAAA;AACF,MAAA,KAAA,CAAM,OAAO,CAAA;AACb,MAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAAA,IACzB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAe;AACrB,MAAA,KAAA,CAAM,MAAA,CAAO,gBAAA,GAAmB,GAAA,EAAK,GAAG,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACL;AAEF;AAMA,SAAS,qBAAA,CAAsB,SAAsB,MAAA,EAA2B;AAC9E,EAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,EAAA,MAAM,MAAA,GAAS,QAAQ,qBAAA,EAAsB;AAC7C,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,IAChB,CAAA;AAAA,IACA,IAAA,CAAK,GAAA;AAAA,MACH,KAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,OAAO,KAAA,GAAQ,CAAA;AAAA,MAC5C,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,KAAA,GAAQ;AAAA;AACrC,GACF;AACA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,MAAA,GAAS,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,GAAS,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,QAAA,IAAY,CAAA,GAAI,QAAA,GAAW,QAAA;AACvC,EAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAC5B,EAAA,OAAA,CAAQ,MAAM,GAAA,GAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA,EAAA,CAAA;AACzC;AAMA,SAAS,kBAAA,CACP,MAAA,EACA,GAAA,EACA,KAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,0DAAA;AACpB,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAaxB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,MAAM,OAAA,GACZ,mGAAA;AACF,EAAA,kBAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,YAAY,OAAO,CAAA;AAE3B,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,EAAA,qBAAA,CAAsB,SAAS,MAAM,CAAA;AAErC,EAAA,OAAO,OAAA;AACT;AAcA,SAAS,eAAA,CACP,QACA,IAAA,EACa;AACb,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,UAAS,GAAI,IAAA;AACxD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,IAAQ,GAAA;AAE/B,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,uDAAA;AACpB,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAcxB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,MAAM,OAAA,GACZ,mGAAA;AACF,EAAA,kBAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,YAAY,OAAO,CAAA;AAG3B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,MAAM,OAAA,GACX,6JAAA;AACF,EAAA,MAAA,CAAO,WAAA,GAAc,QAAA;AACrB,EAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAG1B,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,EAAA,UAAA,CAAW,MAAM,OAAA,GACf,qJAAA;AAEF,EAAA,MAAM,QAAA,GACJ,iNAAA;AACF,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAiC;AACnD,IAAA,GAAA,CAAI,MAAM,UAAA,GAAa,2CAAA;AACvB,IAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,+BAAA;AAAA,EACpB,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAiC;AACpD,IAAA,GAAA,CAAI,MAAM,UAAA,GAAa,MAAA;AACvB,IAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,qCAAA;AAAA,EACpB,CAAA;AAKA,EAAA,IAAI,CAAC,cAAc,SAAA,EAAW;AAC5B,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,UAAA,CAAW,IAAA,GAAO,QAAA;AAClB,IAAA,UAAA,CAAW,KAAA,GAAQ,SAAA;AACnB,IAAA,UAAA,CAAW,MAAM,OAAA,GAAU,QAAA;AAC3B,IAAA,UAAA,CAAW,SAAA,GACT,sMAAA;AACF,IAAA,UAAA,CAAW,gBAAA,CAAiB,YAAA,EAAc,MAAM,UAAA,CAAW,UAAU,CAAC,CAAA;AACtE,IAAA,UAAA,CAAW,gBAAA,CAAiB,YAAA,EAAc,MAAM,WAAA,CAAY,UAAU,CAAC,CAAA;AACvE,IAAA,UAAA,CAAW,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAC1C,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,SAAA,EAAU;AACV,MAAA,OAAA,CAAQ,MAAA,EAAO;AAAA,IACjB,CAAC,CAAA;AACD,IAAA,UAAA,CAAW,YAAY,UAAU,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,KAAA,CAAM,OAAO,YAAA,EAAc;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC7C,IAAA,KAAA,CAAM,IAAA,GAAO,QAAA;AACb,IAAA,KAAA,CAAM,KAAA,GAAQ,UAAA;AACd,IAAA,KAAA,CAAM,MAAM,OAAA,GAAU,QAAA;AACtB,IAAA,KAAA,CAAM,SAAA,GACJ,0RAAA;AACF,IAAA,KAAA,CAAM,gBAAA,CAAiB,YAAA,EAAc,MAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AAC5D,IAAA,KAAA,CAAM,gBAAA,CAAiB,YAAA,EAAc,MAAM,WAAA,CAAY,KAAK,CAAC,CAAA;AAC7D,IAAA,KAAA,CAAM,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACrC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,KAAA,CAAM,MAAA,CAAO,YAAA,GAAe,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,UAAA,CAAW,YAAY,KAAK,CAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,aAAa,CAAC,EAAE,MAAM,MAAA,CAAO,cAAA,IAAkB,MAAM,MAAA,CAAO,YAAA,CAAA;AAClE,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC/C,IAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AACf,IAAA,OAAA,CAAQ,KAAA,GAAQ,oBAAA;AAChB,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,QAAA;AACxB,IAAA,OAAA,CAAQ,SAAA,GACN,uSAAA;AACF,IAAA,OAAA,CAAQ,gBAAA,CAAiB,YAAA,EAAc,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AAChE,IAAA,OAAA,CAAQ,gBAAA,CAAiB,YAAA,EAAc,MAAM,WAAA,CAAY,OAAO,CAAC,CAAA;AACjE,IAAA,OAAA,CAAQ,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACvC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAI,KAAA,CAAM,OAAO,cAAA,EAAgB;AAC/B,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,CAAO,cAAA,CAAe,GAAG,CAAA;AAC3C,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAA,CAAO,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,QAC3B,CAAA,MAAO;AAEL,UAAA,KAAA,CAAM,OAAO,YAAA,GAAe,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,KAAa;AAClD,YAAA,IAAI,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAAA,UAC9C,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,UAAe,CAAC,CAAA;AAAA,QACjC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,OAAO,YAAA,GAAe,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AAC7C,UAAA,IAAI,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AAAA,QACpC,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAe,CAAC,CAAA;AAAA,MACjC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,UAAA,CAAW,YAAY,OAAO,CAAA;AAAA,EAChC;AAGA,EAAA,IAAI,CAAC,cAAc,QAAA,EAAU;AAC3B,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,IAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,IAAA,SAAA,CAAU,KAAA,GAAQ,QAAA;AAClB,IAAA,SAAA,CAAU,MAAM,OAAA,GAAU,QAAA;AAC1B,IAAA,SAAA,CAAU,SAAA,GACR,mWAAA;AACF,IAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,MAAA,SAAA,CAAU,MAAM,UAAA,GAAa,2CAAA;AAC7B,MAAA,SAAA,CAAU,MAAM,KAAA,GAAQ,gCAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,SAAA,CAAU,gBAAA,CAAiB,YAAA,EAAc,MAAM,WAAA,CAAY,SAAS,CAAC,CAAA;AACrE,IAAA,SAAA,CAAU,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACzC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,QAAA,EAAS;AAAA,IACX,CAAC,CAAA;AACD,IAAA,UAAA,CAAW,YAAY,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,QAAA,CAAS,MAAA,GAAS,CAAA;AAChD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,CAAQ,YAAY,UAAU,CAAA;AAAA,EAChC;AAEA,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,EAAA,qBAAA,CAAsB,SAAS,MAAM,CAAA;AAErC,EAAA,OAAO,OAAA;AACT;AAWA,SAAS,mBAAA,GAAqC;AAC5C,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,IAAA,EAAK;AAC1C;AAEA,SAAS,mBAAA,CAAoB,MAAA,EAAuB,OAAA,GAAU,GAAA,EAAW;AACvE,EAAA,IAAI,MAAA,CAAO,cAAc,IAAA,EAAM;AAC/B,EAAA,MAAA,CAAO,SAAA,GAAY,WAAW,MAAM;AAClC,IAAA,MAAA,CAAO,SAAA,GAAY,IAAA;AACnB,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAA,CAAO,QAAQ,MAAA,EAAO;AACtB,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,IACnB;AAAA,EACF,GAAG,OAAO,CAAA;AACZ;AAEA,SAAS,kBAAkB,MAAA,EAA6B;AACtD,EAAA,IAAI,MAAA,CAAO,cAAc,IAAA,EAAM;AAC7B,IAAA,YAAA,CAAa,OAAO,SAAS,CAAA;AAC7B,IAAA,MAAA,CAAO,SAAA,GAAY,IAAA;AAAA,EACrB;AACF;AAEA,SAAS,oBAAoB,OAAA,EAAmC;AAC9D,EAAA,IAAI,OAAA,UAAiB,MAAA,EAAO;AAC5B,EAAA,OAAO,IAAA;AACT;AAuBA,SAAS,aACP,QAAA,EACuC;AACvC,EAAA,MAAM,SAAA,GAAY,SAAS,cAAA,IAAkB,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,GAAG,SAAS,CAAA;AAGpD,EAAA,KAAA,IAAS,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC/C,IAAA,IAAI,UAAA,CAAW,CAAC,CAAA,KAAM,GAAA,EAAK;AACzB,MAAA,IAAI,CAAA,KAAM,KAAK,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG;AAC3C,QAAA,IAAI,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAElC,QAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,UAAA,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,QACvB;AACA,QAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA,EAAE;AAAA,MACzB;AAEA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,sBAAA,CACP,KAAA,EACA,KAAA,EACA,MAAA,EACU;AACV,EAAA,MAAM,EAAA,GAAK,MAAM,WAAA,EAAY;AAC7B,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,KAAQ;AAC3B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA;AACjC,IAAA,OAAO,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,EAAE,CAAA;AAAA,EACxC,CAAC,CAAA;AACH;AAMA,IAAM,aAAA,GACJ,sGAAA;AACF,IAAM,gBAAA,GAAmB,+BAAA;AAMzB,SAAS,cAAA,CACP,OAAA,EACA,GAAA,EACA,OAAA,EACA,SACA,YAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAGlB,EAAA,MAAM,KAAA,GAAkB,CAAC,GAAG,YAAA,CAAa,KAAK,CAAA;AAE9C,EAAA,MAAM,aAAA,GAA+B;AAAA,IACnC,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,UAAA,EAAY,EAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAEA,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAK5C,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,EAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,EAAA,WAAA,CAAY,IAAA,GAAO,OAAA;AAEnB,EAAA,SAAS,eAAA,GAA4D;AACnE,IAAA,MAAM,UAAU,QAAA,CAAS,KAAA;AACzB,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AAC7C,IAAA,MAAM,cAAA,GAAiB,OAAA,GACnB,wBAAA,CAAyB,OAAA,EAAS,SAAS,CAAA,GAC3C,IAAA;AACJ,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,MAAA;AACnC,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,OAAA;AACrC,IAAA,OAAO;AAAA,MACL,CAAC,OAAO,GAAG,OAAA,KAAY,KAAK,IAAA,GAAO,cAAA;AAAA,MACnC,CAAC,QAAQ,GAAG,CAAC,GAAG,KAAK;AAAA,KACvB;AAAA,EACF;AAEA,EAAA,SAAS,WAAA,GAAoB;AAC3B,IAAA,WAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,CAAA;AAAA,EACtD;AAKA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,EAAA,QAAA,CAAS,SAAA,GAAY,sBAAA;AACrB,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AASzB,EAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,MAAM;AACzC,IAAA,QAAA,CAAS,MAAM,WAAA,GAAc,kCAAA;AAC7B,IAAA,QAAA,CAAS,MAAM,SAAA,GACb,iFAAA;AAAA,EACJ,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,YAAY,MAAM;AAC1C,IAAA,QAAA,CAAS,MAAM,WAAA,GAAc,iCAAA;AAC7B,IAAA,QAAA,CAAS,MAAM,SAAA,GAAY,MAAA;AAAA,EAC7B,CAAC,CAAA;AAKD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,oBAAA;AACpB,EAAA,OAAA,CAAQ,MAAM,OAAA,GACZ,0HAAA;AAEF,EAAA,IAAI,UAAA,GAAmD,IAAA;AAEvD,EAAA,SAAS,gBAAgB,OAAA,EAAuB;AAC9C,IAAA,OAAA,CAAQ,WAAA,GAAc,OAAA;AACtB,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,OAAA;AACxB,IAAA,IAAI,UAAA,eAAyB,UAAU,CAAA;AACvC,IAAA,UAAA,GAAa,WAAW,MAAM;AAC5B,MAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,MAAA;AACxB,MAAA,OAAA,CAAQ,WAAA,GAAc,EAAA;AACtB,MAAA,UAAA,GAAa,IAAA;AAAA,IACf,GAAG,GAAI,CAAA;AAAA,EACT;AAEA,EAAA,SAAS,sBAAsB,IAAA,EAAqB;AAClD,IAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,OAAA,CAAQ,MAAM,CAAA;AAC7D,IAAA,IAAI,CAAC,sBAAA,CAAuB,IAAA,CAAK,IAAA,EAAM,iBAAiB,CAAA,EAAG;AACzD,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAC3C,MAAA,eAAA;AAAA,QACE,CAAA,CAAE,wBAAwB,KAAA,EAAO,EAAE,MAAM,IAAA,CAAK,IAAA,EAAM,SAAS;AAAA,OAC/D;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,QAAQ,OAAA,IAAW,QAAA;AACrC,IAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,EAAM,SAAS,CAAA,EAAG;AACvC,MAAA,eAAA;AAAA,QACE,CAAA,CAAE,gBAAgB,KAAA,EAAO;AAAA,UACvB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAA,EAAS;AAAA,SACV;AAAA,OACH;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAKA,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC5C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,WAAA,EAAA;AACA,IAAA,QAAA,CAAS,MAAM,WAAA,GAAc,kCAAA;AAC7B,IAAA,QAAA,CAAS,MAAM,SAAA,GACb,iFAAA;AAAA,EACJ,CAAC,CAAA;AAED,EAAA,QAAA,CAAS,gBAAA,CAAiB,UAAA,EAAY,CAAC,CAAA,KAAM;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAAA,EACnB,CAAC,CAAA;AAED,EAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC5C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,WAAA,EAAA;AACA,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,WAAA,GAAc,CAAA;AACd,MAAA,QAAA,CAAS,MAAM,WAAA,GAAc,iCAAA;AAC7B,MAAA,QAAA,CAAS,MAAM,SAAA,GAAY,MAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,QAAA,CAAS,gBAAA,CAAiB,MAAA,EAAQ,CAAC,CAAA,KAAM;AACvC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,WAAA,GAAc,CAAA;AACd,IAAA,QAAA,CAAS,MAAM,WAAA,GAAc,iCAAA;AAC7B,IAAA,QAAA,CAAS,MAAM,SAAA,GAAY,MAAA;AAE3B,IAAA,MAAM,YAAA,GAAe,EAAE,YAAA,EAAc,KAAA;AACrC,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,KAAA,CAAM,OAAO,UAAA,EAAY;AAE/C,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,IAAI,KAAA,CAAM,UAAU,QAAA,EAAU;AAC5B,QAAA,eAAA;AAAA,UACE,CAAA,CAAE,sBAAsB,KAAA,EAAO;AAAA,YAC7B,OAAA,EAAS,aAAa,MAAA,GAAS,CAAA;AAAA,YAC/B,GAAA,EAAK;AAAA,WACN;AAAA,SACH;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,qBAAA,CAAsB,YAAA,CAAa,CAAC,CAAC,CAAA,EAAG;AAC7C,MAAA,UAAA,CAAW,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,IAC5B;AAAA,EACF,CAAC,CAAA;AAKD,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,EAAA,QAAA,CAAS,SAAA,GAAY,oBAAA;AACrB,EAAA,QAAA,CAAS,MAAM,OAAA,GACb,sFAAA;AAGF,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAChD,EAAA,SAAA,CAAU,IAAA,GAAO,MAAA;AACjB,EAAA,SAAA,CAAU,QAAA,GAAW,IAAA;AACrB,EAAA,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAE1B,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,EAAU;AACtC,MAAA,SAAA,CAAU,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,SAAS,OAAA,CAAQ,MAAA,CAAO,UAAA,CAC/B,GAAA,CAAI,CAAC,GAAA,KAAS,GAAA,CAAI,UAAA,CAAW,GAAG,IAAI,GAAA,GAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAG,CAAA,CACpD,KAAK,GAAG,CAAA;AAAA,IACb;AAAA,EACF;AAKA,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,EAAA,YAAA,CAAa,MAAM,OAAA,GAAU,qBAAA;AAG7B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,EAAA,QAAA,CAAS,SAAA,GAAY,uBAAA;AACrB,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA,IAAA,EAGrB,gBAAgB;AAAA,IAAA,EAChB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAWjB,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAClD,EAAA,QAAA,CAAS,IAAA,GAAO,GAAG,OAAO,CAAA,MAAA,CAAA;AAC1B,EAAA,QAAA,CAAS,WAAA,GACP,OAAA,CAAQ,WAAA,IAAe,CAAA,CAAE,wBAAwB,KAAK,CAAA;AAExD,EAAA,MAAM,cAAA,GAAiB,aAAa,IAAA,IAAQ,EAAA;AAC5C,EAAA,QAAA,CAAS,QAAQ,cAAA,GACb,wBAAA,CAAyB,cAAA,EAAgB,KAAA,EAAO,KAAK,CAAA,GACrD,EAAA;AACJ,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU;AAAA;AAAA,IAAA,EAErB,gBAAgB;AAAA,IAAA,EAChB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAWjB,EAAAA,gBAAAA,CAAgB,UAAU,QAAQ,CAAA;AAGlC,EAAA,QAAA,CAAS,gBAAA,CAAiB,UAAU,MAAM;AACxC,IAAA,QAAA,CAAS,YAAY,QAAA,CAAS,SAAA;AAAA,EAChC,CAAC,CAAA;AAGD,EAAA,IAAI,cAAA,GAAqC,IAAA;AAEzC,EAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAkB;AACxD,IAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,MAAA,CAAuB,OAAA,GAAU,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,IAAA,EAAM,OAAA,CAAQ,GAAA,EAAK;AACxB,IAAA,cAAA,GAAiB,oBAAoB,cAAc,CAAA;AACnD,IAAA,cAAA,GAAiB,kBAAA,CAAmB,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACnE,CAAC,CAAA;AAED,EAAA,QAAA,CAAS,gBAAA,CAAiB,UAAA,EAAY,CAAC,CAAA,KAAkB;AACvD,IAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,MAAA,CAAuB,OAAA,GAAU,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,UAAU,CAAA,CAAE,aAAA;AAClB,IAAA,IAAI,OAAA,EAAS,OAAA,GAAU,MAAM,CAAA,EAAG;AAChC,IAAA,cAAA,GAAiB,oBAAoB,cAAc,CAAA;AAAA,EACrD,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAkB;AACxD,IAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,MAAA,CAAuB,OAAA,GAAU,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,cAAA,GAAiB,oBAAoB,cAAc,CAAA;AAEnD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,gBAAA,CAA8B,MAAM,CAAA;AAC3D,IAAA,KAAA,CAAM,QAAQ,CAAC,CAAA,KAAO,CAAA,CAAE,KAAA,CAAM,gBAAgB,MAAO,CAAA;AAErD,IAAA,MAAM,QAAQ,QAAA,CAAS,gBAAA,CAAiB,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAC5D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,aAAA;AAAA,QACJ,IAAI,WAAW,WAAA,EAAa;AAAA,UAC1B,OAAA,EAAS,IAAA;AAAA,UACT,UAAA,EAAY,IAAA;AAAA,UACZ,IAAA,EAAM,MAAA;AAAA,UACN,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,QAAQ,CAAA,CAAE;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,gBAAA;AAAA,MACP,SAAA;AAAA,MACA,MAAM;AACJ,QAAA,KAAA,CAAM,QAAQ,CAAC,CAAA,KAAO,CAAA,CAAE,KAAA,CAAM,gBAAgB,MAAO,CAAA;AAAA,MACvD,CAAA;AAAA,MACA,EAAE,MAAM,IAAA;AAAK,KACf;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,SAAS,cAAA,GAAuB;AAC9B,IAAA,MAAM,OAAO,QAAA,CAAS,KAAA;AACtB,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAEhC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,SAAA,GAAY,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AACxC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,IAAQ,WAAW,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAC,CAAA;AACnD,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AACpC,MAAA,IAAI,GAAA,EAAK;AAEP,QAAA,IAAA,IAAQ,CAAA,gBAAA,EAAmB,UAAA,CAAW,GAAG,CAAC,CAAA,mbAAA,EAAsb,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,OAAA,CAAA;AAAA,MAChhB,CAAA,MAAO;AAEL,QAAA,IAAA,IAAQ,CAAA,wNAAA,EAA2N,WAAW,IAAA,CAAK,KAAA,CAAM,MAAM,KAAA,EAAO,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,OAAA,CAAA;AAAA,MACnR;AACA,MAAA,OAAA,GAAU,KAAA,CAAM,GAAA;AAAA,IAClB;AACA,IAAA,IAAA,IAAQ,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AACtC,IAAA,QAAA,CAAS,YAAY,IAAA,GAAO,IAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACpD,EAAA,YAAA,CAAa,IAAA,GAAO,QAAA;AACpB,EAAA,YAAA,CAAa,KAAA,GAAQ,CAAA,CAAE,qBAAA,EAAuB,KAAK,CAAA;AACnD,EAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAiB7B,EAAA,YAAA,CAAa,SAAA,GACX,uRAAA;AACF,EAAA,YAAA,CAAa,gBAAA,CAAiB,cAAc,MAAM;AAChD,IAAA,YAAA,CAAa,MAAM,KAAA,GAAQ,kCAAA;AAC3B,IAAA,YAAA,CAAa,MAAM,UAAA,GAAa,2CAAA;AAAA,EAClC,CAAC,CAAA;AACD,EAAA,YAAA,CAAa,gBAAA,CAAiB,cAAc,MAAM;AAChD,IAAA,YAAA,CAAa,MAAM,KAAA,GAAQ,qCAAA;AAC3B,IAAA,YAAA,CAAa,MAAM,UAAA,GAAa,aAAA;AAAA,EAClC,CAAC,CAAA;AACD,EAAA,YAAA,CAAa,gBAAA,CAAiB,SAAS,MAAM;AAC3C,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AACrC,IAAA,IAAI,KAAA,CAAM,UAAU,QAAA,EAAU;AAC5B,MAAA,eAAA;AAAA,QACE,CAAA,CAAE,sBAAsB,KAAA,EAAO,EAAE,SAAS,CAAA,EAAG,GAAA,EAAK,UAAU;AAAA,OAC9D;AACA,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,KAAA,EAAM;AAAA,EAClB,CAAC,CAAA;AAKD,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,EAAA,QAAA,CAAS,SAAA,GAAY,uBAAA;AACrB,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAerB,aAAa;AAAA,EAAA,CAAA;AAGjB,EAAA,SAAS,0BAAA,GAAkD;AACzD,IAAA,OAAO,eAAA,CAAgB,OAAO,KAAK,CAAA;AAAA,EACrC;AAEA,EAAA,SAAS,oBAAoB,QAAA,EAA0B;AACrD,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,MAAM,SAAS,0BAAA,EAA2B;AAE1C,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AACzB,MAAA,aAAA,CAAc,IAAA,GAAO,KAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAC7B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,MAAA,IAAA,CAAK,SAAA,GAAY,4BAAA;AACjB,MAAA,IAAA,CAAK,QAAQ,GAAA,GAAM,GAAA;AACnB,MAAA,IAAA,CAAK,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,oBAAA,EAIL,GAAA,KAAQ,aAAA,CAAc,aAAA,GAAgB,2CAAA,GAA8C,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAOjH,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,OAAA,GACV,sMAAA;AACF,MAAA,IAAI,IAAA,EAAM,IAAA,IAAQ,WAAA,CAAY,IAAI,CAAA,EAAG;AACnC,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,QAAA,GAAA,CAAI,MAAM,OAAA,GACR,+DAAA;AACF,QAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,QAAA,MAAA,CAAO,MAAA,GAAS,CAAC,EAAA,KAAO;AACtB,UAAA,GAAA,CAAI,GAAA,GAAO,EAAA,CAAG,MAAA,EAAQ,MAAA,IAAqB,EAAA;AAAA,QAC7C,CAAA;AACA,QAAA,MAAA,CAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAC9B,QAAA,KAAA,CAAM,YAAY,GAAG,CAAA;AAAA,MACvB,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,YAAA,EAAc;AACpC,QAAA,KAAA,CAAM,OACH,YAAA,CAAa,GAAG,CAAA,CAChB,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,UAAA,IAAI,CAAC,GAAA,IAAO,CAAC,KAAA,CAAM,WAAA,EAAa;AAChC,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,UAAA,GAAA,CAAI,MAAM,OAAA,GACR,+DAAA;AACF,UAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AACV,UAAA,KAAA,CAAM,KAAK,CAAA;AACX,UAAA,KAAA,CAAM,YAAY,GAAG,CAAA;AAAA,QACvB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,QAEb,CAAC,CAAA;AACH,QAAA,KAAA,CAAM,SAAA,GACJ,oNAAA;AAAA,MACJ,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,SAAA,GACJ,oNAAA;AAAA,MACJ;AACA,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAGtB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,QAAA,CAAS,MAAM,OAAA,GACb,iEAAA;AACF,MAAA,QAAA,CAAS,WAAA,GAAc,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA;AAC1C,MAAA,IAAA,CAAK,YAAY,QAAQ,CAAA;AAEzB,MAAA,QAAA,CAAS,YAAY,IAAI,CAAA;AAAA,IAC3B,CAAC,CAAA;AAGD,IAAA,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,KAAkB;AACxC,MAAA,MAAM,MAAA,GAAU,EAAE,MAAA,CAAuB,OAAA;AAAA,QACvC;AAAA,OACF;AACA,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,SAAS,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,OAAO,EAAE,CAAA;AACxD,MAAA,IAAI,MAAA,KAAW,EAAA,IAAM,MAAA,KAAW,aAAA,CAAc,aAAA,EAAe;AAE7D,MAAA,MAAM,QAAQ,QAAA,CAAS,gBAAA;AAAA,QACrB;AAAA,OACF;AACA,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACvB,QAAA,EAAA,CAAG,KAAA,CAAM,UAAA,GACP,CAAA,KAAM,MAAA,GACF,2CAAA,GACA,aAAA;AAAA,MACR,CAAC,CAAA;AACD,MAAA,aAAA,CAAc,aAAA,GAAgB,MAAA;AAAA,IAChC,CAAA;AAGA,IAAA,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,KAAkB;AACxC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAM,MAAA,GAAU,EAAE,MAAA,CAAuB,OAAA;AAAA,QACvC;AAAA,OACF;AACA,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,CAAQ,GAAA,EAAK;AAC1B,MAAA,aAAA,CAAc,MAAA,CAAO,QAAQ,GAAG,CAAA;AAAA,IAClC,CAAA;AAEA,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,OAAA;AACzB,IAAA,aAAA,CAAc,IAAA,GAAO,IAAA;AAAA,EACvB;AAEA,EAAA,SAAS,YAAA,GAAqB;AAC5B,IAAA,MAAM,OAAA,GAAU,aAAa,QAAQ,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,aAAA,EAAc;AACd,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,QAAQ,OAAA,CAAQ,KAAA;AAC9B,IAAA,aAAA,CAAc,aAAa,OAAA,CAAQ,GAAA;AACnC,IAAA,aAAA,CAAc,aAAA,GAAgB,CAAA;AAE9B,IAAA,MAAM,SAAS,0BAAA,EAA2B;AAC1C,IAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,OAAA,CAAQ,KAAA,EAAO,OAAO,MAAM,CAAA;AACpE,IAAA,mBAAA,CAAoB,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AACzB,IAAA,aAAA,CAAc,IAAA,GAAO,KAAA;AAAA,EACvB;AAEA,EAAA,SAAS,cAAc,GAAA,EAAmB;AACxC,IAAA,MAAM,SAAS,0BAAA,EAA2B;AAC1C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,MAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,IAAQ,GAAA;AACvE,IAAA,MAAM,SAAA,GAAY,SAAS,cAAA,IAAkB,CAAA;AAC7C,IAAA,MAAM,SAAS,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,cAAc,UAAU,CAAA;AAC/D,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA,CAAA;AACvC,IAAA,QAAA,CAAS,QAAQ,CAAA,EAAG,MAAM,CAAA,EAAG,OAAO,GAAG,KAAK,CAAA,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,MAAA;AACvC,IAAA,QAAA,CAAS,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AACzC,IAAA,QAAA,CAAS,aAAA,CAAc,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AACzC,IAAA,aAAA,EAAc;AAAA,EAChB;AAGA,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,cAAA,EAAe;AACf,IAAA,WAAA,EAAY;AACZ,IAAA,GAAA,CAAI,QAAA,EAAU,eAAA,CAAgB,OAAA,EAAS,eAAA,EAAiB,CAAA;AACxD,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,YAAA,EAAa;AAAA,IACf,CAAA,MAAO;AACL,MAAA,aAAA,EAAc;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,SAAS,uBAAA,GAAgC;AACvC,IAAA,MAAM,QAAQ,QAAA,CAAS,gBAAA;AAAA,MACrB;AAAA,KACF;AACA,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACvB,MAAA,EAAA,CAAG,KAAA,CAAM,UAAA,GACP,CAAA,KAAM,aAAA,CAAc,gBAChB,2CAAA,GACA,aAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAqB;AACzD,IAAA,IAAI,CAAC,cAAc,IAAA,EAAM;AACzB,IAAA,MAAM,SAAS,0BAAA,EAA2B;AAC1C,IAAA,MAAM,QAAA,GAAW,sBAAA;AAAA,MACf,aAAA,CAAc,KAAA;AAAA,MACd,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,aAAA,CAAc,gBAAgB,IAAA,CAAK,GAAA;AAAA,QACjC,cAAc,aAAA,GAAgB,CAAA;AAAA,QAC9B,SAAS,MAAA,GAAS;AAAA,OACpB;AACA,MAAA,uBAAA,EAAwB;AAAA,IAC1B,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,SAAA,EAAW;AAC9B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,aAAA,CAAc,gBAAgB,IAAA,CAAK,GAAA;AAAA,QACjC,cAAc,aAAA,GAAgB,CAAA;AAAA,QAC9B;AAAA,OACF;AACA,MAAA,uBAAA,EAAwB;AAAA,IAC1B,WAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AACnD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,aAAA,CAAc,QAAA,CAAS,aAAA,CAAc,aAAa,CAAC,CAAA;AAAA,IACrD,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,MAAA,aAAA,EAAc;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,gBAAA;AAAA,IACP,OAAA;AAAA,IACA,CAAC,CAAA,KAAkB;AACjB,MAAA,IACE,CAAC,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,IACnC,CAAC,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EACnC;AACA,QAAA,aAAA,EAAc;AAAA,MAChB;AAAA,IACF,CAAA;AAAA,IACA,EAAE,MAAA,EAAQ,eAAA,CAAgB,MAAA;AAAO,GACnC;AAMA,EAAA,SAAS,cAAA,GAAuB;AAC9B,IAAA,KAAA,CAAM,QAAQ,CAAA;AAEd,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAEzB,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACrB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAExC,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,MAAA,YAAA,CAAa,SAAA,GAAY,yBAAA;AACzB,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAY7B,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,MAAA,UAAA,CAAW,MAAM,OAAA,GACf,sEAAA;AACF,MAAA,kBAAA,CAAmB,UAAA,EAAY,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAC/C,MAAA,YAAA,CAAa,YAAY,UAAU,CAAA;AAGnC,MAAA,MAAM,gBAAgB,mBAAA,EAAoB;AAE1C,MAAA,MAAM,YAAY,MAAY;AAC5B,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,cAAA,IAAkB,QAAA,CAAS,KAAA,CAAM,MAAA;AAC5D,QAAA,MAAM,SAAS,0BAAA,EAA2B;AAC1C,QAAA,MAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,MAAM,IAAA,IAAQ,GAAA;AAC/C,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,GAAG,SAAS,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AAC5C,QAAA,MAAM,MAAA,GACJ,OAAO,MAAA,GAAS,CAAA,IAAK,CAAC,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,GAAO,EAAA;AACxD,QAAA,MAAM,UAAU,CAAA,EAAG,MAAM,CAAA,EAAG,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA,CAAA;AAChD,QAAA,QAAA,CAAS,QAAQ,CAAA,EAAG,MAAM,CAAA,EAAG,OAAO,GAAG,KAAK,CAAA,CAAA;AAC5C,QAAA,MAAM,MAAA,GAAS,YAAY,OAAA,CAAQ,MAAA;AACnC,QAAA,QAAA,CAAS,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AACzC,QAAA,QAAA,CAAS,KAAA,EAAM;AACf,QAAA,QAAA,CAAS,aAAA,CAAc,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MAC3C,CAAA;AAEA,MAAA,MAAM,WAAW,MAAY;AAC3B,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7B,QAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACnC,QAAA,cAAA,EAAe;AACf,QAAA,cAAA,EAAe;AACf,QAAA,WAAA,EAAY;AACZ,QAAA,GAAA,CAAI,QAAA,EAAU,eAAA,CAAgB,OAAA,EAAS,eAAA,EAAiB,CAAA;AAAA,MAC1D,CAAA;AAEA,MAAA,YAAA,CAAa,gBAAA,CAAiB,cAAc,MAAM;AAChD,QAAA,iBAAA,CAAkB,aAAa,CAAA;AAC/B,QAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC1B,UAAA,aAAA,CAAc,OAAA,GAAU,gBAAgB,YAAA,EAAc;AAAA,YACpD,GAAA;AAAA,YACA,KAAA;AAAA,YACA,UAAA,EAAY,KAAA;AAAA,YACZ,SAAA,EAAW,SAAA;AAAA,YACX,QAAA,EAAU;AAAA,WACX,CAAA;AAED,UAAA,aAAA,CAAc,OAAA,CAAQ,gBAAA,CAAiB,YAAA,EAAc,MAAM;AACzD,YAAA,iBAAA,CAAkB,aAAa,CAAA;AAAA,UACjC,CAAC,CAAA;AACD,UAAA,aAAA,CAAc,OAAA,CAAQ,gBAAA,CAAiB,YAAA,EAAc,MAAM;AACzD,YAAA,mBAAA,CAAoB,aAAa,CAAA;AAAA,UACnC,CAAC,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AAED,MAAA,YAAA,CAAa,gBAAA,CAAiB,cAAc,MAAM;AAChD,QAAA,mBAAA,CAAoB,aAAa,CAAA;AAAA,MACnC,CAAC,CAAA;AAED,MAAA,QAAA,CAAS,YAAY,YAAY,CAAA;AAAA,IACnC,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,SAAS,WAAW,IAAA,EAAkB;AACpC,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,UAAA,EAAY;AAE9B,IAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC3E,IAAA,KAAA,CAAM,aAAA,CAAc,IAAI,MAAA,EAAQ;AAAA,MAC9B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAA,sBAAgB,IAAA,EAAK;AAAA,MACrB;AAAA,KACD,CAAA;AACD,IAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,IAAA,cAAA,EAAe;AAGf,IAAA,MAAM,SAAS,QAAA,CAAS,gBAAA;AAAA,MACtB;AAAA,KACF;AACA,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAC7C,IAAA,IAAI,YAAA,EAAc,YAAA,CAAa,KAAA,CAAM,OAAA,GAAU,KAAA;AAE/C,IAAA,KAAA,CAAM,OACH,UAAA,CAAW,IAAI,CAAA,CACf,IAAA,CAAK,CAAC,UAAA,KAAuB;AAC5B,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAChC,MAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA,GAAI,UAAA;AAC7B,MAAA,KAAA,CAAM,aAAA,CAAc,OAAO,MAAM,CAAA;AACjC,MAAA,KAAA,CAAM,aAAA,CAAc,IAAI,UAAA,EAAY;AAAA,QAClC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAA,sBAAgB,IAAA,EAAK;AAAA,QACrB;AAAA,OACD,CAAA;AACD,MAAA,cAAA,EAAe;AACf,MAAA,cAAA,EAAe;AACf,MAAA,WAAA,EAAY;AACZ,MAAA,GAAA,CAAI,QAAA,EAAU,eAAA,CAAgB,OAAA,EAAS,eAAA,EAAiB,CAAA;AAAA,IAC1D,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAe;AACrB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAChC,MAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACnC,MAAA,KAAA,CAAM,aAAA,CAAc,OAAO,MAAM,CAAA;AACjC,MAAA,cAAA,EAAe;AACf,MAAA,KAAA,CAAM,MAAA,CAAO,aAAA,GAAgB,GAAA,EAAK,IAAI,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EACL;AAGA,EAAA,SAAA,CAAU,gBAAA,CAAiB,UAAU,MAAM;AACzC,IAAA,MAAM,WAAW,SAAA,CAAU,KAAA;AAC3B,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACxC,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,IAAI,KAAA,CAAM,UAAU,QAAA,EAAU;AAC5B,QAAA,eAAA;AAAA,UACE,CAAA,CAAE,sBAAsB,KAAA,EAAO;AAAA,YAC7B,OAAA,EAAS,SAAS,MAAA,GAAS,CAAA;AAAA,YAC3B,GAAA,EAAK;AAAA,WACN;AAAA,SACH;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,qBAAA,CAAsB,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACzC,MAAA,UAAA,CAAW,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACxB;AACA,IAAA,SAAA,CAAU,KAAA,GAAQ,EAAA;AAAA,EACpB,CAAC,CAAA;AAKD,EAAA,YAAA,CAAa,YAAY,QAAQ,CAAA;AACjC,EAAA,YAAA,CAAa,YAAY,QAAQ,CAAA;AACjC,EAAA,YAAA,CAAa,YAAY,YAAY,CAAA;AACrC,EAAA,YAAA,CAAa,YAAY,QAAQ,CAAA;AAEjC,EAAA,QAAA,CAAS,YAAY,QAAQ,CAAA;AAC7B,EAAA,QAAA,CAAS,YAAY,YAAY,CAAA;AACjC,EAAA,QAAA,CAAS,YAAY,OAAO,CAAA;AAG5B,EAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,IAAA,IAAQ,OAAA,CAAQ,aAAa,IAAA,EAAM;AAC1D,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,IAAA,UAAA,CAAW,MAAM,OAAA,GACf,+DAAA;AACF,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,OAAA,EAAgB,QAAA,EAAU,KAAK,CAAA;AACjE,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOxB,IAAA,UAAA,CAAW,YAAY,OAAO,CAAA;AAC9B,IAAA,QAAA,CAAS,YAAY,UAAU,CAAA;AAAA,EACjC;AAEA,EAAA,QAAA,CAAS,YAAY,WAAW,CAAA;AAChC,EAAA,QAAA,CAAS,YAAY,SAAS,CAAA;AAE9B,EAAA,WAAA,EAAY;AACZ,EAAA,cAAA,EAAe;AAGf,EACE,WAAA,CAGA,oBAAA,GAAuB,CAAC,KAAA,KAA0B;AAElD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,IAAQ,EAAA;AAC9B,IAAA,QAAA,CAAS,QAAQ,OAAA,GACb,wBAAA,CAAyB,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA,GAC9C,EAAA;AACJ,IAAA,QAAA,CAAS,aAAA,CAAc,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AACzC,IAAA,KAAA,CAAM,MAAA,GAAS,CAAA;AACf,IAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAC7C,IAAA,cAAA,EAAe;AACf,IAAA,cAAA,EAAe;AACf,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AAEA,EAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAC5B,EAAA,cAAA,EAAe;AAGf,EAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AAC1C,IAAA,IAAI,CAAC,SAAS,WAAA,EAAa;AACzB,MAAA,eAAA,CAAgB,KAAA,EAAM;AACtB,MAAA,cAAA,GAAiB,oBAAoB,cAAc,CAAA;AACnD,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,IAAA,QAAA,CAAS,QAAQ,QAAA,CAAS,aAAA,EAAe,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC9D;AACF;AAMA,SAAS,kBAAA,CACP,QAAA,EACA,GAAA,EACA,OAAA,EACA,UACA,KAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,KAAA;AAGxB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,IAAA,IAAI,MAAM,IAAA,EAAM,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,KAAK,IAAI,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAA,QAAA,CAAS,MAAM,OAAA,GACb,gEAAA;AAEF,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACrB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAExC,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,MAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAW7B,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,MAAA,UAAA,CAAW,MAAM,OAAA,GACf,sEAAA;AACF,MAAA,kBAAA,CAAmB,UAAA,EAAY,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAC/C,MAAA,YAAA,CAAa,YAAY,UAAU,CAAA;AAEnC,MAAA,MAAM,gBAAgB,mBAAA,EAAoB;AAC1C,MAAA,YAAA,CAAa,gBAAA,CAAiB,cAAc,MAAM;AAChD,QAAA,iBAAA,CAAkB,aAAa,CAAA;AAC/B,QAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC1B,UAAA,aAAA,CAAc,OAAA,GAAU,gBAAgB,YAAA,EAAc;AAAA,YACpD,GAAA;AAAA,YACA,KAAA;AAAA,YACA,UAAA,EAAY;AAAA,WACb,CAAA;AACD,UAAA,aAAA,CAAc,OAAA,CAAQ,gBAAA,CAAiB,YAAA,EAAc,MAAM;AACzD,YAAA,iBAAA,CAAkB,aAAa,CAAA;AAAA,UACjC,CAAC,CAAA;AACD,UAAA,aAAA,CAAc,OAAA,CAAQ,gBAAA,CAAiB,YAAA,EAAc,MAAM;AACzD,YAAA,mBAAA,CAAoB,aAAa,CAAA;AAAA,UACnC,CAAC,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AACD,MAAA,YAAA,CAAa,gBAAA,CAAiB,cAAc,MAAM;AAChD,QAAA,mBAAA,CAAoB,aAAa,CAAA;AAAA,MACnC,CAAC,CAAA;AAED,MAAA,QAAA,CAAS,YAAY,YAAY,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA,MAAA,EACpB,aAAa;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOjB,IAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAChC,IAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA;AAAA,MAC5B,CAAC,GAAA,KACC,SAAA,CAAU,GAAA,CAAI,IAAI,IAAI,CAAA,IACtB,CAAC,GAAG,UAAU,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,IAAI,IAAI;AAAA,KAC7C;AAEA,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AAC3B,UAAA,OAAA,CAAQ,WAAA;AAAA,YACN,SAAS,cAAA,CAAe,IAAA,CAAK,MAAM,SAAA,EAAW,KAAA,CAAM,KAAK,CAAC;AAAA,WAC5D;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,QAAA,IAAA,CAAK,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAUrB,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAI,IAChC,KAAA,CAAM,IAAA,GACN,CAAC,GAAG,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,CAAC,MAAM,CAAA,KAAM,KAAA,CAAM,IAAI,CAAA,GAAI,CAAC,CAAA;AAClE,QAAA,MAAM,cAAc,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA;AACvD,QAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAW,CAAA,CAAA;AAGlC,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,IAAI,WAAA,GAAkC,IAAA;AACtC,UAAA,MAAM,UAAA,GAAa,GAAA;AACnB,UAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,MAAM;AACxC,YAAA,WAAA,GAAc,oBAAoB,WAAW,CAAA;AAC7C,YAAA,WAAA,GAAc,kBAAA,CAAmB,IAAA,EAAM,UAAA,EAAY,KAAK,CAAA;AAAA,UAC1D,CAAC,CAAA;AACD,UAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,MAAM;AACxC,YAAA,WAAA,GAAc,oBAAoB,WAAW,CAAA;AAAA,UAC/C,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AACxB,QAAA,SAAA,GAAY,KAAA,CAAM,GAAA;AAAA,MACpB;AACA,MAAA,IAAI,SAAA,GAAY,KAAK,MAAA,EAAQ;AAC3B,QAAA,OAAA,CAAQ,YAAY,QAAA,CAAS,cAAA,CAAe,KAAK,KAAA,CAAM,SAAS,CAAC,CAAC,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,YAAY,OAAO,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,CAAC,IAAA,IAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,KAAA,CAAM,MAAM,OAAA,GACV,mFAAA;AACF,IAAA,KAAA,CAAM,WAAA,GAAc,QAAA;AACpB,IAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,EAC3B;AACF;AAMO,SAAS,sBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAElB,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,MAAA;AACnC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,OAAA;AACrC,EAAA,IAAI,YAAA;AAEJ,EAAA,IAAI,QAAQ,UAAA,EAAY;AAEtB,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA;AACrC,IAAA,YAAA,GAAe;AAAA,MACb,IAAA,EAAM,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,IAAA;AAAA,MAC9C,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAK,WAAwB;AAAC,KAC7D;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAC1C,IAAA,IAAI,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC9E,MAAA,MAAM,GAAA,GAAM,UAAA;AAEZ,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAO,CAAA,IAAK,IAAI,MAAM,CAAA;AAC1C,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAI,OAAO,CAAA;AAC7C,MAAA,YAAA,GAAe;AAAA,QACb,IAAA,EAAM,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,IAAA;AAAA,QAC9C,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAK,WAAwB;AAAC,OAC7D;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,UAAA,KAAe,QAAA,EAAU;AACzC,MAAA,YAAA,GAAe,EAAE,IAAA,EAAM,UAAA,IAAc,IAAA,EAAM,KAAA,EAAO,EAAC,EAAE;AAAA,IACvD,CAAA,MAAO;AACL,MAAA,YAAA,GAAe,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,EAAC,EAAE;AAAA,IACzC;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,aAAa,KAAA,EAAO;AACpC,IAAA,IAAI,CAAC,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,aAAA,CAAc,IAAI,GAAA,EAAK;AAAA,QAC3B,IAAA,EAAM,GAAA;AAAA,QACN,IAAA,EAAM,0BAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,UAAA,sBAAgB,IAAA,EAAK;AAAA,QACrB,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAO,QAAA,EAAU;AACzB,IAAA,kBAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAA,EAAS,YAAY,CAAA;AAAA,EACjE,CAAA,MAAO;AACL,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,UAAA,EAAY;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,iBAAA,EAAoB,QAAQ,GAAG,CAAA,uCAAA;AAAA,OACjC;AAAA,IACF;AACA,IAAA,cAAA,CAAe,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAA,EAAS,YAAY,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,wBAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,cAAA,EAAe,GAAI,OAAA;AAC7C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,MAAA;AACnC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,OAAA;AAErC,EAAA,MAAM,cAAc,SAAA,CAAU,aAAA;AAAA,IAC5B,UAAU,GAAG,CAAA,EAAA;AAAA,GACf;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,EAC/B;AAEA,EAAA,IAAI,WAAoC,EAAC;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,KAAK,CAAA;AAC3C,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,MAAA,QAAA,GAAW,MAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,wBAAA,CAA0B,CAAA;AAC5C,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,IAC/B;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,wBAAA,CAA0B,CAAA;AAC5C,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,EAC/B;AAEA,EAAA,MAAM,OAAA,GAAU,SAAS,OAAO,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,SAAS,QAAQ,CAAA;AAClC,EAAA,MAAM,OAAO,OAAA,KAAY,IAAA,IAAQ,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,IAAA;AACzE,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAK,WAAwB,EAAC;AAGlE,EAAA,MAAM,KAAA,GAAkD;AAAA,IACtD,CAAC,OAAO,GAAG,IAAA,IAAQ,IAAA;AAAA,IACnB,CAAC,QAAQ,GAAG;AAAA,GACd;AAEA,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,SAAA,GAAY,CAAC,IAAA,IAAS,IAAA,CAAgB,MAAK,KAAM,EAAA;AACvD,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,KAAW,CAAA;AAEpC,IAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,SAAA,IAAa,UAAA,EAAY;AAC/C,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA,EAAA,EAAK,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,CAAC,aAAa,IAAA,EAAM;AACtB,MAAA,IAAI,QAAQ,SAAA,IAAa,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,QAAQ,SAAA,EAAW;AAChE,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,WAAA,EAAa,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAAA,SAC9D;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,SAAA,IAAa,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,QAAQ,SAAA,EAAW;AAChE,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,WAAA,EAAa,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAAA,SAC9D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,QAAA,IAAY,IAAA,IAAQ,KAAA,CAAM,MAAA,GAAS,QAAQ,QAAA,EAAU;AAC/D,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,QAAA,EAAU,CAAC,CAAA;AAAA,OAC5D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAC,CAAC,QAAQ,UAAA,EAAW;AACvD;AAEO,SAAS,oBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AACtB,EAAA,MAAM,cAAc,SAAA,CAAU,aAAA;AAAA,IAC5B,UAAU,SAAS,CAAA,EAAA;AAAA,GACrB;AAMA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,oDAAoD,SAAS,CAAA,iCAAA;AAAA,KAC/D;AACA,IAAA;AAAA,EACF;AAIA,EAAA,IAAI,UAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,MAAA;AACnC,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,OAAA;AACrC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAO,CAAA,IAAK,IAAI,MAAM,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,QAAA,KAAa,MAAA,EAAW;AACnD,MAAA,UAAA,GAAa;AAAA,QACX,IAAA,EAAM,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,IAAA;AAAA,QAC9C,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAK,WAAwB;AAAC,OAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,IAAc,YAAY,oBAAA,EAAsB;AAClD,IAAA,WAAA,CAAY,qBAAqB,UAAU,CAAA;AAAA,EAC7C,WAAW,UAAA,EAAY;AACrB,IAAA,WAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAAA,EAC/C;AACF;;;ACh0DA,SAAS,WAAA,CAAY,WAAmB,MAAA,EAA2B;AACjE,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,SAAS,CAAA;AACjD,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,MAAM,kBAAA,GAAqB,CAAC,OAAA,CAAQ,SAAA,CAAU,SAAS,QAAQ,CAAA;AAG/D,EAAA,QAAA,CAAS,gBAAA,CAAiB,kBAAkB,CAAA,CAAE,OAAA,CAAQ,CAACC,EAAAA,KAAM;AAC3D,IAAAA,EAAAA,CAAE,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAAA,EAC1B,CAAC,CAAA;AAGD,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,EAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAC7B,EAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAG9B,EAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,aAAA,KAAkB,QAAA,CAAS,IAAA,EAAM;AACtD,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACnC;AAGA,EAAA,OAAA,CAAQ,MAAM,UAAA,GAAa,QAAA;AAC3B,EAAA,OAAA,CAAQ,MAAM,QAAA,GAAW,OAAA;AACzB,EAAA,OAAA,CAAQ,SAAA,CAAU,OAAO,QAAQ,CAAA;AACjC,EAAA,MAAM,WAAA,GAAc,QAAQ,qBAAA,EAAsB;AAClD,EAAA,OAAA,CAAQ,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC9B,EAAA,OAAA,CAAQ,MAAM,UAAA,GAAa,SAAA;AAE3B,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA;AAChB,EAAA,IAAI,GAAA,GAAM,KAAK,MAAA,GAAS,CAAA;AAGxB,EAAA,IAAI,IAAA,GAAO,WAAA,CAAY,KAAA,GAAQ,aAAA,EAAe;AAC5C,IAAA,IAAA,GAAO,IAAA,CAAK,QAAQ,WAAA,CAAY,KAAA;AAAA,EAClC;AAGA,EAAA,IAAI,GAAA,GAAM,WAAA,CAAY,MAAA,GAAS,cAAA,EAAgB;AAC7C,IAAA,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,WAAA,CAAY,MAAA,GAAS,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,OAAO,EAAA,EAAI;AACb,IAAA,IAAA,GAAO,EAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,EAAA,EAAI;AACZ,IAAA,GAAA,GAAM,KAAK,MAAA,GAAS,CAAA;AAAA,EACtB;AAEA,EAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAC5B,EAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAG1B,EAAA,OAAA,CAAQ,SAAA,CAAU,OAAO,QAAQ,CAAA;AAGjC,EAAA,UAAA,CAAW,MAAM;AACf,IAAA,OAAA,CAAQ,SAAA,CAAU,IAAI,QAAQ,CAAA;AAAA,EAChC,GAAG,IAAK,CAAA;AACV;AAGA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACxC,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,MAAM,YAAA,GACJ,OAAO,OAAA,CAAQ,QAAQ,KAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAU,OAAA;AAChE,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA;AAEnD,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,SAAA,EAAW;AAC/B,MAAA,QAAA,CAAS,gBAAA,CAAiB,kBAAkB,CAAA,CAAE,OAAA,CAAQ,CAAC,OAAA,KAAY;AACjE,QAAA,OAAA,CAAQ,SAAA,CAAU,IAAI,QAAQ,CAAA;AAAA,MAChC,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AACH;AAGA,SAAS,oBAAA,CACP,SACA,GAAA,EACS;AACT,EAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,WAAW,EAAC;AACrD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,CAAS,KAAA,IAAS,UAAA;AAKxC,IAAA,MAAM,gBACJ,KAAA,KAAU,UAAA,IAAc,GAAA,CAAI,IAAA,GACvB,IAAI,OAAA,GACL,KAAA,CAAA;AAEN,IAAA,MAAM,YAAA,GAAe,uBAAA;AAAA,MACnB,OAAA,CAAQ,QAAA;AAAA,MACR,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,CAAC,YAAA;AAAA,EACV,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,CAAA,qCAAA,EAAwC,QAAQ,GAAG,CAAA,EAAA,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,eAAA,CAAgB,WAAmB,QAAA,EAA4B;AAEtE,EAAA,MAAM,QAAQ,QAAA,CAAS,aAAA;AAAA,IACrB,UAAU,SAAS,CAAA,EAAA;AAAA,GACrB;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf,CAAA,MAAA,IAAW,iBAAiB,gBAAA,EAAkB;AAC5C,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,MAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACf,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,MAAA,MAAM,UAAU,QAAA,CAAS,aAAA;AAAA,QACvB,UAAU,SAAS,CAAA,UAAA;AAAA,OACrB;AACA,MAAA,OAAO,OAAA,GAAU,QAAQ,KAAA,GAAQ,MAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,OAAO,KAAA,CAAM,KAAA;AAAA,IACf;AAAA,EACF,CAAA,MAAA,IAAW,iBAAiB,mBAAA,EAAqB;AAC/C,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AAEA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,kBAAA,CACP,OAAA,EACA,OAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,KAAA,CAAM,QAAA;AAC3B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAA,CAAQ,MAAM,CAAA,6CAAA,CAA+C,CAAA;AAC7D,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,OAAA,CAAQ,QAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,IAAS,UAAA;AAGjC,EAAA,IAAI,eAAoC,EAAC;AACzC,EAAA,MAAM,gBAAqC,EAAC;AAI5C,EAAA,MAAM,iBAAkB,CAAC,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA,KAAS,KAAM,UAAA,GAAa,KAAA;AAErE,EAAA,IAAI,cAAA,KAAmB,UAAA,IAAc,GAAA,CAAI,IAAA,EAAM;AAG7C,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAA;AAEvD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,YAAA,GAAe,eAAe,CAAC,CAAA;AACrC,MAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,cAAA,CAAe,CAAC,GAAG,EAAE,CAAA;AACrD,MAAA,MAAM,uBAAuB,QAAA,CAAS,aAAA;AAAA,QACpC,CAAA,sBAAA,EAAyB,YAAY,CAAA,CAAA,EAAI,cAAc,CAAA,GAAA;AAAA,OACzD;AAEA,MAAA,IAAI,oBAAA,EAAsB;AAExB,QAAA,MAAM,SAAS,oBAAA,CAAqB,gBAAA;AAAA,UAClC;AAAA,SACF;AAEA,QAAA,MAAA,CAAO,QAAQ,CAAA,KAAA,KAAS;AACtB,UAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAC3C,UAAA,IAAI,SAAA,EAAW;AAEb,YAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,KAAA,CAAM,eAAe,CAAA;AACrD,YAAA,IAAI,aAAA,EAAe;AACjB,cAAA,MAAM,QAAA,GAAW,cAAc,CAAC,CAAA;AAGhC,cAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,gBAAA,aAAA,CAAc,QAAQ,IAAI,KAAA,CAAM,KAAA;AAAA,cAClC,CAAA,MAAA,IAAW,iBAAiB,gBAAA,EAAkB;AAC5C,gBAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,kBAAA,aAAA,CAAc,QAAQ,IAAI,KAAA,CAAM,OAAA;AAAA,gBAClC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,kBAAA,IAAI,MAAM,OAAA,EAAS;AACjB,oBAAA,aAAA,CAAc,QAAQ,IAAI,KAAA,CAAM,KAAA;AAAA,kBAClC;AAAA,gBACF,CAAA,MAAO;AACL,kBAAA,aAAA,CAAc,QAAQ,IAAI,KAAA,CAAM,KAAA;AAAA,gBAClC;AAAA,cACF,CAAA,MAAA,IAAW,iBAAiB,mBAAA,EAAqB;AAC/C,gBAAA,aAAA,CAAc,QAAQ,IAAI,KAAA,CAAM,KAAA;AAAA,cAClC;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAGL,IAAA,MAAM,gBAAgB,SAAA,CAAU,GAAA;AAChC,IAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,aAAA,EAAe,QAAQ,CAAA;AAE/D,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,YAAA,CAAa,aAAa,CAAA,GAAI,eAAA;AAAA,IAChC,CAAA,MAAO;AAEL,MAAA,YAAA,GAAe,GAAA,CAAI,YAAY,GAAA,CAAI,OAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,uBAAA;AAAA,MACnB,SAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,YAAA,EAAc;AAEhB,MAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,EAAA;AACxB,MAAA,OAAA,CAAQ,SAAA,CAAU,OAAO,2BAA2B,CAAA;AACpD,MAAA,OAAA,CAAQ,gBAAgB,6BAA6B,CAAA;AAAA,IACvD,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,MAAA;AACxB,MAAA,OAAA,CAAQ,SAAA,CAAU,IAAI,2BAA2B,CAAA;AACjD,MAAA,OAAA,CAAQ,YAAA,CAAa,+BAA+B,MAAM,CAAA;AAAA,IAC5D;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wCAAA,EAA2C,OAAA,CAAQ,GAAG,MAAM,KAAK,CAAA;AAAA,EACjF;AACF;AAGA,SAAS,sBAAA,CACP,OAAA,EACA,OAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,KAAA,CAAM,QAAA;AAC3B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAA,CAAQ,MAAM,CAAA,iDAAA,CAAmD,CAAA;AACjE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,OAAA,CAAQ,QAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,IAAS,UAAA;AACjC,EAAA,MAAM,gBAAgB,SAAA,CAAU,GAAA;AAGhC,EAAA,IAAI,mBAAA;AAEJ,EAAA,IAAI,KAAA,KAAU,UAAA,IAAc,GAAA,CAAI,IAAA,EAAM;AAEpC,IAAA,mBAAA,GAAsB,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAAA,EACpD,CAAA,MAAO;AAEL,IAAA,mBAAA,GAAsB,aAAA;AAAA,EACxB;AAGA,EAAA,MAAM,kBAAkB,QAAA,CAAS,aAAA;AAAA,IAC/B,UAAU,mBAAmB,CAAA,EAAA;AAAA,GAC/B;AAEA,EAAA,IAAI,CAAC,eAAA,EAAiB;AAGpB,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AAC1C,MAAA,MAAM,QAAQ,QAAA,CAAS,aAAA;AAAA,QACrB,UAAU,mBAAmB,CAAA,EAAA;AAAA,OAC/B;AACA,MAAA,IAAI,KAAA,EAAO;AAET,QAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,MAAM;AACrC,UAAA,kBAAA,CAAmB,OAAA,EAAS,SAAS,GAAG,CAAA;AAAA,QAC1C,CAAC,CAAA;AACD,QAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,MAAM;AACpC,UAAA,kBAAA,CAAmB,OAAA,EAAS,SAAS,GAAG,CAAA;AAAA,QAC1C,CAAC,CAAA;AACD,QAAA,QAAA,CAAS,UAAA,EAAW;AAAA,MACtB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,QAAQ,QAAA,EAAU;AAAA,MACzB,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA;AAAA,EACF;AAGA,EAAA,eAAA,CAAgB,gBAAA,CAAiB,UAAU,MAAM;AAC/C,IAAA,kBAAA,CAAmB,OAAA,EAAS,SAAS,GAAG,CAAA;AAAA,EAC1C,CAAC,CAAA;AAED,EAAA,eAAA,CAAgB,gBAAA,CAAiB,SAAS,MAAM;AAC9C,IAAA,kBAAA,CAAmB,OAAA,EAAS,SAAS,GAAG,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAGA,SAAS,iBAAiB,OAAA,EAAoC;AAC5D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,SAAA,GAAY,mCAAA;AAClB,EAAA,KAAA,CAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,GAAA;AAE7C,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,SAAA,GAAY,mBAAA;AAChB,IAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,IAAA,KAAA,CAAM,YAAY,GAAG,CAAA;AAAA,EACvB;AAEA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,iBAAiB,OAAA,EAAqC;AAC7D,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC/C,EAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AACf,EAAA,OAAA,CAAQ,SAAA,GAAY,wCAAA;AACpB,EAAA,OAAA,CAAQ,SAAA,GACN,iLAAA;AAEF,EAAA,MAAM,SAAA,GAAY,CAAA,QAAA,EAAW,OAAA,CAAQ,GAAG,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACnF,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,EAAA,GAAK,SAAA;AACb,EAAA,OAAA,CAAQ,SAAA,GACN,iHAAA;AACF,EAAA,OAAA,CAAQ,MAAM,QAAA,GAAW,OAAA;AACzB,EAAA,OAAA,CAAQ,WAAA,GACN,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,IAAA,IAAQ,mBAAA;AACzC,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AAEjC,EAAA,OAAA,CAAQ,OAAA,GAAU,CAAC,CAAA,KAAM;AACvB,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,WAAA,CAAY,WAAW,OAAO,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,qBAAqB,OAAA,EAAkC;AAC9D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,EAAA,KAAA,CAAM,SAAA,GAAY,wBAAA;AAElB,EAAA,MAAM,KAAA,GAAQ,iBAAiB,OAAO,CAAA;AACtC,EAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AAEvB,EAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,IAAA,EAAM;AACvC,IAAA,MAAM,OAAA,GAAU,iBAAiB,OAAO,CAAA;AACxC,IAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,kBAAA,CACP,OAAA,EACA,GAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,UAAA,IAAc,OAAA,IAAW,OAAA,CAAQ,QAAA;AAEpD,EAAA,QAAQ,QAAQ,IAAA;AAAM,IACpB,KAAK,MAAA;AACH,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,yBAAA,CAA0B,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,iBAAA,CAAkB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAClD;AACA,MAAA;AAAA,IAEF,KAAK,UAAA;AACH,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,6BAAA,CAA8B,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAC9D,CAAA,MAAO;AACL,QAAA,qBAAA,CAAsB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MACtD;AACA,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,2BAAA,CAA4B,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAC5D,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MACpD;AACA,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,2BAAA,CAA4B,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAC5D,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MACpD;AACA,MAAA;AAAA,IAEF,KAAK,UAAA;AACH,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,6BAAA,CAA8B,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAC9D,CAAA,MAAO;AACL,QAAA,qBAAA,CAAsB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MACtD;AACA,MAAA;AAAA,IAEF,KAAK,MAAA;AACH,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,yBAAA,CAA0B,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,iBAAA,CAAkB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAClD;AACA,MAAA;AAAA,IAEF,KAAK,OAAA;AACH,MAAA,kBAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AACjD,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,2BAAA,CAA4B,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAC5D,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MACpD;AACA,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,2BAAA,CAA4B,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAC5D,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MACpD;AACA,MAAA;AAAA,IAEF,KAAK,OAAA;AACH,MAAA,kBAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AACjD,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,8BAAA,CAA+B,OAAA,EAAS,GAAA,EAAK,OAAgB,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,4BAAA,CAA6B,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,MAC7D;AACA,MAAA;AAAA,IAEF,KAAK,OAAA;AACH,MAAA,kBAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AACjD,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,sBAAA,CAAuB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AACrD,MAAA;AAAA,IAEF,SAAS;AACP,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,MAAA,WAAA,CAAY,SAAA,GAAY,sBAAA;AACxB,MAAA,WAAA,CAAY,WAAA,GAAc,EAAE,sBAAA,EAAwB,GAAA,CAAI,OAAO,EAAE,IAAA,EAAO,OAAA,CAAgB,IAAA,EAAM,CAAA;AAC9F,MAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAAA,IACjC;AAAA;AAEJ;AAGO,SAASC,cAAAA,CACd,SACA,GAAA,EACa;AACb,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,OAAA,EAAS,GAAG,CAAA;AAG3D,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,uBAAA;AACpB,EAAA,OAAA,CAAQ,YAAA,CAAa,gBAAA,EAAkB,OAAA,CAAQ,GAAG,CAAA;AAGlD,EAAA,MAAM,KAAA,GAAQ,qBAAqB,OAAO,CAAA;AAC1C,EAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AAGzB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,QAAQ,GAAG,CAAA;AAC9C,EAAA,kBAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAEjD,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,OAAA,CAAQ,SAAA,CAAU,IAAI,2BAA2B,CAAA;AACjD,IAAA,OAAA,CAAQ,YAAA,CAAa,+BAA+B,MAAM,CAAA;AAAA,EAC5D;AAGA,EAAA,sBAAA,CAAuB,OAAA,EAAS,SAAS,GAAG,CAAA;AAK5C,EAAA,OAAO,OAAA;AACT;AAIA,gBAAA,CAA0BA,cAAa,CAAA;;;AC/jBhC,IAAM,aAAA,GAAwB;AAAA,EACnC,UAAA,EAAY,IAAA;AAAA,EACZ,YAAA,EAAc,IAAA;AAAA,EACd,YAAA,EAAc,IAAA;AAAA,EACd,cAAA,EAAgB,IAAA;AAAA,EAChB,aAAA,EAAe,IAAA;AAAA,EACf,QAAA,EAAU,IAAA;AAAA,EACV,aAAA,EAAe,IAAA;AAAA,EACf,gBAAA,EAAkB,IAAA;AAAA,EAClB,aAAA,EAAe,IAAA;AAAA,EACf,eAAA,EAAiB,IAAA;AAAA,EACjB,UAAA,EAAY,GAAA;AAAA,EACZ,aAAA,EAAe,KAAA;AAAA,EACf,iBAAA,EAAmB,IAAA;AAAA,EACnB,cAAA,EAAgB,OAAA;AAAA,EAChB,QAAA,EAAU,KAAA;AAAA,EACV,cAAA,EAAgB,IAAA;AAAA,EAChB,MAAA,EAAQ,IAAA;AAAA,EACR,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI;AAAA;AAAA,MAEF,aAAA,EAAe,QAAA;AAAA,MACf,aAAA,EAAe,oBAAA;AAAA,MACf,qBAAA,EAAuB,qBAAA;AAAA,MACvB,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAA,EAAiB,mBAAA;AAAA,MACjB,cAAA,EAAgB,UAAA;AAAA,MAChB,YAAA,EAAc,QAAA;AAAA,MACd,eAAA,EAAiB,YAAA;AAAA,MACjB,UAAA,EAAY,SAAA;AAAA,MACZ,kBAAA,EAAoB,qBAAA;AAAA,MACpB,YAAA,EAAc,eAAA;AAAA,MACd,iBAAA,EAAmB,8CAAA;AAAA;AAAA,MAEnB,eAAA,EAAiB,mBAAA;AAAA,MACjB,aAAA,EAAe,mBAAA;AAAA,MACf,aAAA,EAAe,mBAAA;AAAA,MACf,cAAA,EAAgB,aAAA;AAAA,MAChB,YAAA,EAAc,aAAA;AAAA,MACd,YAAA,EAAc,aAAA;AAAA,MACd,WAAA,EAAa,gBAAA;AAAA,MACb,WAAA,EAAa,WAAA;AAAA,MACb,YAAA,EAAc,UAAA;AAAA,MACd,YAAA,EAAc,UAAA;AAAA,MACd,WAAA,EAAa,mBAAA;AAAA,MACb,eAAA,EAAiB,cAAA;AAAA,MACjB,eAAA,EAAiB,eAAA;AAAA,MACjB,cAAA,EAAgB,eAAA;AAAA;AAAA,MAEhB,QAAA,EAAU,UAAA;AAAA,MACV,QAAA,EAAU,8BAAA;AAAA,MACV,QAAA,EAAU,6BAAA;AAAA,MACV,SAAA,EAAW,0BAAA;AAAA,MACX,SAAA,EAAW,0BAAA;AAAA,MACX,QAAA,EAAU,wBAAA;AAAA,MACV,QAAA,EAAU,uBAAA;AAAA,MACV,eAAA,EAAiB,gBAAA;AAAA,MACjB,cAAA,EAAgB,2BAAA;AAAA,MAChB,UAAA,EAAY,kBAAA;AAAA,MACZ,gBAAA,EAAkB,mBAAA;AAAA,MAClB,QAAA,EAAU,8BAAA;AAAA,MACV,QAAA,EAAU,6BAAA;AAAA,MACV,oBAAA,EACE,0DAAA;AAAA,MACF,YAAA,EAAc,mDAAA;AAAA,MACd,kBAAA,EACE,wDAAA;AAAA,MACF,oBAAA,EAAsB,gCAAA;AAAA,MACtB,aAAA,EAAe,gBAAA;AAAA,MACf,WAAA,EAAa,SAAA;AAAA,MACb,cAAA,EAAgB,YAAA;AAAA,MAChB,cAAA,EAAgB,YAAA;AAAA,MAChB,iBAAA,EAAmB,eAAA;AAAA,MACnB,eAAA,EAAiB,sBAAA;AAAA,MACjB,cAAA,EAAgB,2BAAA;AAAA,MAChB,eAAA,EAAiB,QAAA;AAAA,MACjB,cAAA,EAAgB,cAAA;AAAA,MAChB,gBAAA,EAAkB,wBAAA;AAAA,MAClB,oBAAA,EAAsB,cAAA;AAAA,MACtB,mBAAA,EAAqB,aAAA;AAAA,MACrB,gBAAA,EAAkB,SAAA;AAAA,MAClB,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA,EAAA,EAAI;AAAA;AAAA,MAEF,aAAA,EAAe,4CAAA;AAAA,MACf,aAAA,EAAe,qJAAA;AAAA,MACf,qBAAA,EAAuB,2JAAA;AAAA,MACvB,cAAA,EAAgB,4EAAA;AAAA,MAChB,eAAA,EAAiB,yDAAA;AAAA,MACjB,cAAA,EAAgB,4CAAA;AAAA,MAChB,YAAA,EAAc,kDAAA;AAAA,MACd,eAAA,EAAiB,2EAAA;AAAA,MACjB,UAAA,EAAY,0EAAA;AAAA,MACZ,kBAAA,EAAoB,uIAAA;AAAA,MACpB,YAAA,EAAc,qHAAA;AAAA,MACd,iBAAA,EAAmB,qLAAA;AAAA;AAAA,MAEnB,eAAA,EAAiB,8DAAA;AAAA,MACjB,aAAA,EAAe,8DAAA;AAAA,MACf,aAAA,EAAe,8DAAA;AAAA,MACf,cAAA,EAAgB,aAAA;AAAA,MAChB,YAAA,EAAc,aAAA;AAAA,MACd,YAAA,EAAc,aAAA;AAAA,MACd,WAAA,EAAa,0BAAA;AAAA,MACb,WAAA,EAAa,WAAA;AAAA,MACb,YAAA,EAAc,0EAAA;AAAA,MACd,YAAA,EAAc,sFAAA;AAAA,MACd,WAAA,EAAa,iDAAA;AAAA,MACb,eAAA,EAAiB,kCAAA;AAAA,MACjB,eAAA,EAAiB,8CAAA;AAAA,MACjB,cAAA,EAAgB,eAAA;AAAA;AAAA,MAEhB,QAAA,EAAU,mGAAA;AAAA,MACV,QAAA,EAAU,yGAAA;AAAA,MACV,QAAA,EAAU,+GAAA;AAAA,MACV,SAAA,EAAW,mGAAA;AAAA,MACX,SAAA,EAAW,yGAAA;AAAA,MACX,QAAA,EAAU,kKAAA;AAAA,MACV,QAAA,EAAU,kKAAA;AAAA,MACV,eAAA,EAAiB,uFAAA;AAAA,MACjB,cAAA,EAAgB,mIAAA;AAAA,MAChB,UAAA,EAAY,oGAAA;AAAA,MACZ,gBAAA,EAAkB,sHAAA;AAAA,MAClB,QAAA,EAAU,uFAAA;AAAA,MACV,QAAA,EAAU,6FAAA;AAAA,MACV,oBAAA,EACE,iRAAA;AAAA,MACF,YAAA,EACE,8NAAA;AAAA,MACF,kBAAA,EACE,sMAAA;AAAA,MACF,oBAAA,EAAsB,sJAAA;AAAA,MACtB,aAAA,EAAe,2HAAA;AAAA,MACf,WAAA,EAAa,uFAAA;AAAA,MACb,cAAA,EAAgB,6FAAA;AAAA,MAChB,cAAA,EAAgB,iFAAA;AAAA,MAChB,iBAAA,EAAmB,uFAAA;AAAA,MACnB,eAAA,EAAiB,4GAAA;AAAA,MACjB,cAAA,EAAgB,4GAAA;AAAA,MAChB,eAAA,EAAiB,sCAAA;AAAA,MACjB,cAAA,EAAgB,yCAAA;AAAA,MAChB,gBAAA,EAAkB,0FAAA;AAAA,MAClB,oBAAA,EAAsB,8EAAA;AAAA,MACtB,mBAAA,EAAqB,uFAAA;AAAA,MACrB,gBAAA,EAAkB,wDAAA;AAAA,MAClB,mBAAA,EAAqB;AAAA;AACvB,GACF;AAAA,EACA,OAAO;AACT,CAAA;AAMO,SAAS,oBAAoB,MAAA,EAAiC;AAEnE,EAAA,MAAM,kBAAA,GAAqB;AAAA,IACzB,GAAG,aAAA,CAAc;AAAA,GACnB;AAGA,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,gBAAgB,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,MAC9C,MAAA,CAAO;AAAA,KACT,EAAG;AACD,MAAA,kBAAA,CAAmB,MAAM,CAAA,GAAI;AAAA,QAC3B,GAAK,aAAA,CAAc,YAAA,CAAwC,MAAM,KAC/D,EAAC;AAAA,QACH,GAAG;AAAA,OACL;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU,IAAA;AAAA,IACV,aAAA,sBAAmB,GAAA,EAAI;AAAA,IACvB,eAAA,EAAiB,IAAA;AAAA,IACjB,OAAA,EAAS,OAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,GAAG,aAAA;AAAA,MACH,GAAG,MAAA;AAAA,MACH,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,aAAA,EAAe;AAAA,GACjB;AACF;AAKO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AACxD,EAAA,OAAO,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACpC;;;AC7IO,IAAM,YAAA,GAAsB;AAAA;AAAA,EAEjC,YAAA,EAAc,SAAA;AAAA;AAAA,EACd,iBAAA,EAAmB,SAAA;AAAA;AAAA,EACnB,UAAA,EAAY,SAAA;AAAA;AAAA,EACZ,eAAA,EAAiB,SAAA;AAAA;AAAA,EACjB,YAAA,EAAc,SAAA;AAAA;AAAA,EACd,WAAA,EAAa,SAAA;AAAA;AAAA,EACb,gBAAA,EAAkB,SAAA;AAAA;AAAA,EAClB,gBAAA,EAAkB,SAAA;AAAA;AAAA,EAClB,eAAA,EAAiB,SAAA;AAAA;AAAA,EACjB,oBAAA,EAAsB,SAAA;AAAA;AAAA,EACtB,uBAAA,EAAyB,SAAA;AAAA;AAAA,EACzB,SAAA,EAAW,SAAA;AAAA;AAAA,EACX,kBAAA,EAAoB,SAAA;AAAA;AAAA,EACpB,oBAAA,EAAsB,SAAA;AAAA;AAAA,EACtB,iBAAA,EAAmB,SAAA;AAAA;AAAA;AAAA,EAGnB,aAAA,EAAe,SAAA;AAAA;AAAA,EACf,eAAA,EAAiB,SAAA;AAAA;AAAA,EACjB,iBAAA,EAAmB,SAAA;AAAA;AAAA,EACnB,kBAAA,EAAoB,SAAA;AAAA;AAAA,EACpB,sBAAA,EAAwB,SAAA;AAAA;AAAA;AAAA,EAGxB,aAAA,EAAe,SAAA;AAAA;AAAA,EACf,eAAA,EAAiB,SAAA;AAAA;AAAA,EACjB,iBAAA,EAAmB,SAAA;AAAA;AAAA,EACnB,kBAAA,EAAoB,SAAA;AAAA;AAAA,EACpB,sBAAA,EAAwB,SAAA;AAAA;AAAA;AAAA,EAGxB,iBAAA,EAAmB,SAAA;AAAA;AAAA,EACnB,qBAAA,EAAuB,SAAA;AAAA;AAAA,EACvB,mBAAA,EAAqB,SAAA;AAAA;AAAA,EACrB,0BAAA,EAA4B,SAAA;AAAA;AAAA;AAAA,EAG5B,aAAA,EAAe,SAAA;AAAA;AAAA,EACf,aAAA,EAAe,QAAA;AAAA;AAAA,EACf,YAAA,EAAc,QAAA;AAAA;AAAA,EACd,WAAA,EAAa,KAAA;AAAA;AAAA,EAGb,QAAA,EAAU,UAAA;AAAA;AAAA,EACV,aAAA,EAAe,SAAA;AAAA;AAAA,EACf,kBAAA,EAAoB,UAAA;AAAA;AAAA,EACpB,UAAA,EACE,uGAAA;AAAA,EACF,gBAAA,EAAkB,KAAA;AAAA,EAClB,gBAAA,EAAkB,KAAA;AAAA;AAAA,EAGlB,cAAA,EAAgB,KAAA;AAAA,EAChB,cAAA,EAAgB,SAAA;AAAA;AAAA,EAChB,gBAAA,EAAkB,KAAA;AAAA;AAAA,EAGlB,kBAAA,EAAoB;AACtB;AAMO,SAAS,qBAAqB,KAAA,EAA+B;AAClE,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,YAAA,EAAc,GAAG,KAAA,EAAM;AAEhD,EAAA,MAAM,UAAoB,EAAC;AAG3B,EAAA,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAEpD,IAAA,MAAM,WAAW,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,KAAK,EAAE,WAAA,EAAY;AAC5D,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9C,CAAC,CAAA;AAED,EAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC1B;AAKO,SAAS,oBAAA,CACd,WACA,KAAA,EACM;AACN,EAAA,MAAM,YAAA,GAAe,qBAAqB,KAAK,CAAA;AAG/C,EAAA,IAAI,WAAW,SAAA,CAAU,aAAA;AAAA,IACvB;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,QAAA,CAAS,cAAc,OAAO,CAAA;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,iBAAiB,MAAM,CAAA;AAC7C,IAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAAA,EAChC;AAGA,EAAA,QAAA,CAAS,WAAA,GAAc;AAAA;AAAA,EAEvB,YAAY;AAAA;AAAA,EAAA,CAAA;AAGd;AAKO,IAAM,aAAA,GAAgB;AAAA,EAC3B,OAAA,EAAS,YAAA;AAAA,EAET,IAAA,EAAM;AAAA,IACJ,GAAG,YAAA;AAAA,IACH,YAAA,EAAc,SAAA;AAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA;AAAA,IACnB,WAAA,EAAa,SAAA;AAAA;AAAA,IACb,gBAAA,EAAkB,SAAA;AAAA;AAAA,IAClB,gBAAA,EAAkB,SAAA;AAAA;AAAA,IAClB,eAAA,EAAiB,SAAA;AAAA;AAAA,IACjB,oBAAA,EAAsB,SAAA;AAAA;AAAA,IACtB,uBAAA,EAAyB,SAAA;AAAA;AAAA,IACzB,SAAA,EAAW,SAAA;AAAA;AAAA,IACX,kBAAA,EAAoB,SAAA;AAAA;AAAA,IACpB,oBAAA,EAAsB,SAAA;AAAA;AAAA,IACtB,iBAAA,EAAmB,SAAA;AAAA;AAAA,IACnB,qBAAA,EAAuB,SAAA;AAAA;AAAA,IACvB,mBAAA,EAAqB;AAAA;AAAA,GACvB;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,GAAG,YAAA;AAAA,IACH,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA,IACnB,UAAA,EAAY,SAAA;AAAA,IACZ,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,SAAA;AAAA,IACd,WAAA,EAAa,SAAA;AAAA,IACb,gBAAA,EAAkB,SAAA;AAAA,IAClB,gBAAA,EAAkB,SAAA;AAAA,IAClB,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU,MAAA;AAAA,IACV,aAAA,EAAe,MAAA;AAAA,IACf,UAAA,EAAY;AAAA;AAEhB;;;AChGO,SAAS,uBAAA,CACd,MAAA,EACA,WAAA,GAAuB,KAAA,EACjB;AACN,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,aAAA,EAIV,WAAA,GAAc,gBAAgB,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAO3D,EAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,IAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,iCAAA;AAC/B,IAAA,MAAA,CAAO,MAAM,WAAA,GAAc,qCAAA;AAAA,EAC7B,CAAC,CAAA;AACD,EAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,MAAM;AAC1C,IAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,2BAAA;AAC/B,IAAA,MAAA,CAAO,MAAM,WAAA,GAAc,+BAAA;AAAA,EAC7B,CAAC,CAAA;AACH;;;AC5GA,IAAM,iBAAA,GAAyD;AAAA,EAC7D,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,mBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,uBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,QAAA,EAAU,qBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,QAAA,EAAU,qBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,uBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,mBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA;AAAA,IAEL,QAAA,EAAU,mBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,QAAA,EAAU,qBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,QAAA,EAAU,qBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,wBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA;AAAA,IAEL,QAAA,EAAU,oBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,oBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,wBAAA;AAAA,IACV,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAKO,SAAS,uBACd,WAAA,EAC4B;AAC5B,EAAA,OAAO,iBAAA,CAAkB,WAAW,CAAA,IAAK,IAAA;AAC3C;AAMO,SAAS,4BAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,EACyB;AACzB,EAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,OAAA,CAAQ,IAAI,CAAA;AAC/C,EAAA,IAAI,GAAA,IAAO,IAAI,QAAA,EAAU;AACvB,IAAA,OAAO,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,GAAA,EAAK,OAAO,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,0BAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACS;AACT,EAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,OAAA,CAAQ,IAAI,CAAA;AAC/C,EAAA,IAAI,GAAA,IAAO,IAAI,MAAA,EAAQ;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,OAAA,EAAS,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;;;ACjGO,IAAM,sBAAN,MAA0B;AAAA,EAI/B,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,aAAa,kBAAA,EAAmB;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,oBAAoB,MAAM,CAAA;AAGvC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAA,EAAe;AACnC,MAAA,IAAI,CAAC,WAAW,sBAAA,EAAwB;AACtC,QAAA,UAAA,CAAW,sBAAA,uBAA6B,GAAA,EAAY;AAAA,MACtD;AACA,MAAA,UAAA,CAAW,sBAAA,CAAuB,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAGrD,MAAA,IAAI,UAAA,CAAW,sBAAA,CAAuB,IAAA,GAAO,EAAA,EAAI;AAC/C,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,eAAA,EAAkB,UAAA,CAAW,sBAAA,CAAuB,IAAI,CAAA,8EAAA;AAAA,SAE1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,OAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAA+B;AACvC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAA,EAA0D;AACzE,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,UAAA,GAAa,QAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,mBACE,UAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,YAAA,GAAe,UAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,oBACE,WAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,YAAA,GAAe,WAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,iBACE,QAAA,EAGM;AACN,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,aAAA,GAAgB,QAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAA,EAAiC;AACvC,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,GAAW,IAAA,KAAS,UAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAA2B;AACnC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,MAAA,GAAS,MAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAA,CAAgB,WAAoB,UAAA,EAAwB;AAE1D,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAGhC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,aAAA,KAAkB,IAAA,EAAM;AACrC,MAAA,YAAA,CAAa,IAAA,CAAK,MAAM,aAAa,CAAA;AAAA,IACvC;AAGA,IAAA,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,UAAA,CAAW,MAAM;AAE1C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAGvC,MAAA,IAAA,CAAK,2BAAA,EAA4B;AAGjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,MACrC;AAGA,MAAA,IACE,KAAK,KAAA,CAAM,MAAA,CAAO,iBAClB,SAAA,KAAc,MAAA,IACd,eAAe,MAAA,EACf;AACA,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAA,CAAc,SAAA,EAAW,YAAY,QAAQ,CAAA;AAAA,MACjE;AAGA,MAAA,IAAA,CAAK,MAAM,aAAA,GAAgB,IAAA;AAAA,IAC7B,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,MAAA,EAA8B;AAC3C,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,KAAA,EAAO;AAC5B,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,eAAA,EAAiB;AAC/B,MAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,EAAC;AAAA,IAChC;AAGA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,SAAA;AAAA,MAC/C,CAAC,MACC,CAAA,CAAE,KAAA,KAAU,OAAO,KAAA,IAAS,CAAA,CAAE,kBAAkB,MAAA,CAAO;AAAA,KAC3D;AAEA,IAAA,IAAI,iBAAiB,CAAA,EAAG;AAEtB,MAAA,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,aAAa,CAAA,GAAI,MAAA;AAAA,IAC9C,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,SAAA,EAAuC;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,OAAO,IAAA;AAGjC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAE/B,MAAA,IAAI,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,aAAA;AAAA,QAChC,UAAU,SAAS,CAAA,EAAA;AAAA,OACrB;AACA,MAAA,IAAI,SAAS,OAAO,OAAA;AAGpB,MAAA,MAAM,UAAA,GAAa;AAAA,QACjB,SAAA;AAAA,QACA,SAAA,CAAU,OAAA,CAAQ,YAAA,EAAc,MAAM,CAAA;AAAA,QACtC,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,GAC1B,GAAA,CAAI,MAAA,CAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,IAAK,IAAI,MAAM;AAAA,OACpD;AAEA,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,OAAA,GAAU,IAAA,CAAK,MAAM,QAAA,CAAS,aAAA;AAAA,UAC5B,UAAU,SAAS,CAAA,EAAA;AAAA,SACrB;AACA,QAAA,IAAI,SAAS,OAAO,OAAA;AAAA,MACtB;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AACtD,IAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,IAAA,MAAM,aAAA,GACJ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,iBAAiB,mBAAmB,CAAA;AAC1D,IAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,MAAA,MAAM,SAAA,GAAY,aAAA,CAAc,KAAA,IAAS,aAAA,CAAc,GAAA;AACvD,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAA;AAClD,MAAA,IACE,YAAA,KACC,aAAa,WAAA,KAAgB,SAAA,IAC5B,aAAa,WAAA,KAAgB,CAAA,EAAG,SAAS,CAAA,CAAA,CAAA,CAAA,EAC3C;AACA,QAAA,IAAI,YAAA,GACF,OAAA,CAAQ,aAAA,CAA2B,oBAAoB,CAAA;AACzD,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,YAAA,GAAe,QAAA,CAAS,cAAc,KAAK,CAAA;AAC3C,UAAA,YAAA,CAAa,SAAA,GAAY,mBAAA;AACzB,UAAA,YAAA,CAAa,MAAM,OAAA,GAAU,MAAA;AAC7B,UAAA,OAAA,CAAQ,YAAY,YAAY,CAAA;AAAA,QAClC;AACA,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAA,EAAmC;AAC3D,IAAA,IAAI,CAAC,KAAK,KAAA,CAAM,MAAA,IAAU,CAAC,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,OAAO,IAAA;AAE9D,IAAA,IAAI,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA;AACxC,IAAA,IAAI,YAAA,GAA+B,IAAA;AAEnC,IAAA,MAAM,IAAA,GAAO,SAAA,CACV,OAAA,CAAQ,UAAA,EAAY,EAAE,EACtB,KAAA,CAAM,GAAG,CAAA,CACT,MAAA,CAAO,OAAO,CAAA;AAEjB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,YAAA,GAAe,gBAAgB,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,GAAA,KAAQ,GAAG,CAAA,IAAK,IAAA;AAC/D,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,UAAA,IAAc,YAAA,IAAgB,YAAA,CAAa,QAAA,EAAU;AACvD,QAAA,eAAA,GAAkB,YAAA,CAAa,QAAA;AAAA,MACjC;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CACN,SAAA,EACA,aAAA,EACA,aAAA,EACA,wBAAwB,KAAA,EAChB;AACR,IAAA,IAAI,aAAA,IAAiB,SAAA,IAAa,aAAA,IAAiB,aAAA,CAAc,OAAA,EAAS;AACxE,MAAA,MAAM,gBAAA,GAAmB,cAAc,OAAA,CAAQ,IAAA;AAAA,QAC7C,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ;AAAA,OACnB;AACA,MAAA,IAAI,gBAAA,IAAoB,iBAAiB,KAAA,EAAO;AAC9C,QAAA,OAAO,gBAAA,CAAiB,KAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,IACE,qBAAA,IACA,IAAA,CAAK,KAAA,CAAM,MAAA,IACX,SAAA,IAAa,IAAA,CAAK,KAAA,CAAM,MAAA,IACvB,IAAA,CAAK,KAAA,CAAM,MAAA,CAAe,OAAA,EAC3B;AACA,MAAA,MAAM,UAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,CAAe,OAAA,CAAQ,IAAA;AAAA,QACpD,CAAC,CAAA,KAAW,CAAA,CAAE,GAAA,KAAQ;AAAA,OACxB;AACA,MAAA,IAAI,UAAA,IAAc,WAAW,KAAA,EAAO;AAClC,QAAA,OAAO,UAAA,CAAW,KAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,OAAO,aAAA;AAAA,IACT;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAA,CACN,OAAA,EACA,oBAAA,GAAyC,EAAC,EACpC;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU;AAE1B,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,aAAA;AAAA,MAC5C;AAAA,KACF;AACA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,iBAAA,CAAkB,MAAA,EAAO;AAAA,IAC3B;AAEA,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACrD,IAAA,gBAAA,CAAiB,SAAA,GACf,4EAAA;AACF,IAAA,gBAAA,CAAiB,MAAM,OAAA,GAAU;AAAA;AAAA,IAAA,CAAA;AAIjC,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC1B,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,MAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,MAAA,uBAAA,CAAwB,WAAW,IAAI,CAAA;AAEvC,MAAA,MAAM,qBAAA,GAAwB,oBAAA,CAAqB,QAAA,CAAS,MAAM,CAAA;AAClE,MAAA,MAAM,gBAAgB,IAAA,CAAK,kBAAA;AAAA,QACzB,MAAA,CAAO,GAAA;AAAA,QACP,MAAA,CAAO,KAAA;AAAA,QACP,IAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,SAAA,CAAU,WAAA,GAAc,aAAA;AAExB,MAAA,SAAA,CAAU,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACzC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,QAAA,IACE,IAAA,CAAK,MAAM,MAAA,CAAO,aAAA,IAClB,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAA,KAAkB,UAAA,EAC3C;AACA,UAAA,IAAA,CAAK,MAAM,MAAA,CAAO,aAAA,CAAc,OAAO,KAAA,EAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,QAChE;AAAA,MACF,CAAC,CAAA;AAED,MAAA,gBAAA,CAAiB,YAAY,SAAS,CAAA;AAAA,IACxC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,WAAA,CAAY,gBAAgB,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAA8B;AAC5B,IAAA,IACE,CAAC,KAAK,KAAA,CAAM,eAAA,IACZ,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAEzC,MAAA;AAEF,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAA8B;AACzD,IAAA,MAAM,uBAAyC,EAAC;AAChD,IAAA,MAAM,wBAA0C,EAAC;AAEjD,IAAA,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC7C,MAAA,IAAI,CAAC,MAAA,CAAO,GAAA,IAAO,CAAC,OAAO,KAAA,EAAO;AAElC,MAAA,IAAI,CAAC,OAAO,aAAA,EAAe;AACzB,QAAA,oBAAA,CAAqB,KAAK,MAAM,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AAC7C,UAAA,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,aAAA,EAAe,EAAE,CAAA;AAAA,QAC7C;AACA,QAAA,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA,CAAG,KAAK,MAAM,CAAA;AAAA,MACvD;AAAA,IACF,CAAC,CAAA;AAED,IAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,OAAA,EAAS,SAAA,KAAc;AAC7C,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,0BAAA,CAA2B,SAAS,CAAA;AAC9D,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,2DAA2D,SAAS,CAAA,iCAAA;AAAA,SACtE;AACA,QAAA,qBAAA,CAAsB,IAAA,CAAK,GAAG,OAAO,CAAA;AACrC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,GAAU,YAAA,CAAa,OAAA,CAAQ,mBAAmB,CAAA;AACtD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,YAAA,CAAa,aAAA;AAAA,MACzB;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,sDAAsD,SAAS,CAAA,CAAA;AAAA,SACjE;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,oBAAoB,OAAA,CAAQ,aAAA;AAAA,QAChC;AAAA,OACF;AACA,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,iBAAA,CAAkB,MAAA,EAAO;AAAA,MAC3B;AAEA,MAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACrD,MAAA,gBAAA,CAAiB,SAAA,GACf,sDAAA;AAEF,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AAEtD,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC1B,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,QAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AACjB,QAAA,uBAAA,CAAwB,WAAW,KAAK,CAAA;AAExC,QAAA,MAAM,gBAAgB,IAAA,CAAK,kBAAA;AAAA,UACzB,MAAA,CAAO,GAAA;AAAA,UACP,MAAA,CAAO,KAAA;AAAA,UACP;AAAA,SACF;AACA,QAAA,SAAA,CAAU,WAAA,GAAc,aAAA;AAExB,QAAA,SAAA,CAAU,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACzC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,UAAA,IACE,IAAA,CAAK,MAAM,MAAA,CAAO,aAAA,IAClB,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAA,KAAkB,UAAA,EAC3C;AACA,YAAA,IAAA,CAAK,MAAM,MAAA,CAAO,aAAA;AAAA,cAChB,MAAA,CAAO,KAAA;AAAA,cACP,MAAA,CAAO,GAAA;AAAA,cACP,MAAA,CAAO;AAAA,aACT;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAED,QAAA,gBAAA,CAAiB,YAAY,SAAS,CAAA;AAAA,MACxC,CAAC,CAAA;AAED,MAAA,OAAA,CAAQ,YAAY,gBAAgB,CAAA;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,MAAM,mBAAA,GAAsB;AAAA,MAC1B,GAAG,oBAAA;AAAA,MACH,GAAG;AAAA,KACL;AACA,IAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,sBAAA,CAAuB,qBAAqB,oBAAoB,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,KAAA,EAAyB;AACtD,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAA,CAAM,eAAA,EAAgB;AAGtB,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,YAAA,CAAa,kBAAkB,CAAA;AAC7D,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,YAAA,CAAa,gBAAgB,CAAA,KAAM,MAAA;AAC7D,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,CAAa,oBAAoB,CAAA;AAG7D,IAAA,IAAI,CAAC,cAAA,IAAmB,CAAC,UAAA,IAAc,CAAC,YAAA,EAAe;AACrD,MAAA,OAAA,CAAQ,KAAK,+CAA+C,CAAA;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AAG5C,MAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AAEjC,QAAA,MAAM,WAAW,UAAA,GAAa,QAAA,GAAW,CAAA,EAAG,YAAY,IAAI,QAAQ,CAAA,CAAA;AACpE,QAAA,MAAM,KAAA,GAAQ,WAAW,QAAQ,CAAA;AACjC,QAAA,IAAA,CAAK,WAAA,CAAY,UAAU,KAAK,CAAA;AAAA,MAClC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,KAAA,EAA2B;AACxD,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,IAAA,cAAA,CAAe,SAAA,GAAY,4CAAA;AAE3B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,MAAA,UAAA,CAAW,IAAA,GAAO,QAAA;AAClB,MAAA,UAAA,CAAW,SAAA,GAAY,iBAAA;AAGvB,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,UAAA,CAAW,cAAc,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA;AAAA,MACrD,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,cAAc,IAAA,CAAK,KAAA;AAAA,MAChC;AAGA,MAAA,UAAA,CAAW,aAAa,kBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAC,CAAA;AACvE,MAAA,UAAA,CAAW,YAAA,CAAa,kBAAkB,MAAM,CAAA;AAEhD,MAAA,cAAA,CAAe,YAAY,UAAU,CAAA;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,OAAO,cAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,IAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,MAAM,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,IAAA;AACtB,IAAA,IAAA,CAAK,MAAM,MAAA,GAAS,MAAA;AACpB,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,OAAA,IAAW,IAAA;AAExC,IAAA,KAAA,CAAM,IAAI,CAAA;AAGV,IAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,MAAM,CAAA;AAGxC,IAAA,oBAAA,CAAqB,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAGlD,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,IAAA,aAAA,CAAc,SAAA,GAAY,WAAA;AAG1B,IAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,IAAA,CAAK,KAAA,CAAM,OAAO,QAAA,EAAU;AACtD,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,YAAY,CAAA;AACtE,MAAA,aAAA,CAAc,YAAY,cAAc,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,CAAA;AAElC,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,aAAA,CAAc,SAAA,GAAY,WAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,SAAA,GAAY,kBAAkB,OAAO,CAAA,MAAA,CAAA;AAAA,IACrD;AAGA,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AACnC,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQA,eAAc,OAAA,EAAS;AAAA,QACnC,IAAA,EAAM,EAAA;AAAA,QACN,OAAA,EAAS,WAAW,EAAC;AAAA,QACrB,QAAA,EAAU,WAAW,EAAC;AAAA;AAAA,QACtB,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,aAAA,CAAc,YAAY,KAAK,CAAA;AAAA,IACjC,CAAC,CAAA;AAED,IAAA,aAAA,CAAc,YAAY,aAAa,CAAA;AACvC,IAAA,IAAA,CAAK,YAAY,aAAa,CAAA;AAG9B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAC/B,MAAA,IAAA,CAAK,iBAAiB,OAAA,EAAS,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACvE;AAEA,IAAA,IACE,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,IAClB,IAAA,CAAK,KAAA,CAAM,eAAA,IACX,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA,EACxC;AACA,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,CAAa,iBAAiB,KAAA,EAAuB;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,CAAC,KAAK,KAAA,CAAM,QAAA;AACpC,MAAA,OAAO,EAAE,OAAO,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAE7C,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,OAA4B,EAAC;AAWnC,IAAA,MAAMC,gBAAAA,GAAkB,CACtB,OAAA,EACA,GAAA,EACA,kBAAsC,IAAA,KACF;AACpC,MAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,MAAA,MAAM,SAAA,GAAY,eAAA,IAAmB,IAAA,CAAK,KAAA,CAAM,QAAA;AAGhD,MAAA,MAAM,gBAAA,GAAqC;AAAA,QACzC,SAAA;AAAA,QACA,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAA,EAAU,IAAA;AAAA,QACV,MAAM,GAAA,CAAI,IAAA;AAAA,QACV;AAAA,OACF;AAEA,MAAA,MAAM,eAAA,GAAkB,4BAAA;AAAA,QACtB,OAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,oBAAoB,IAAA,EAAM;AAE5B,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,eAAA,CAAgB,MAAM,CAAA;AACrC,QAAA,OAAO,EAAE,OAAO,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAC,CAAC,gBAAgB,MAAA,EAAO;AAAA,MAC1E;AAGA,MAAA,OAAA,CAAQ,KAAK,CAAA,oBAAA,EAAuB,OAAA,CAAQ,IAAI,CAAA,WAAA,EAAc,GAAG,CAAA,CAAA,CAAG,CAAA;AACpE,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IACtC,CAAA;AAGA,IAAA,kBAAA,CAA4BA,gBAAe,CAAA;AAE3C,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAE9C,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,YAAA,GAAe,uBAAA;AAAA,YACnB,OAAA,CAAQ,QAAA;AAAA,YACR;AAAA,WACF;AACA,UAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,YAAA;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,qCAAA,EAAwC,QAAQ,GAAG,CAAA,oBAAA,CAAA;AAAA,YACnD;AAAA,WACF;AAAA,QAEF;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,IAAA,CAAK,QAAQ,GAAG,CAAA,GACd,QAAQ,OAAA,KAAY,MAAA,GAAY,QAAQ,OAAA,GAAU,IAAA;AAAA,MACtD,CAAA,MAAO;AACL,QAAA,MAAM,SAASA,gBAAAA,CAAgB,OAAA,EAAS,EAAE,IAAA,EAAM,IAAI,CAAA;AACpD,QAAA,IAAI,MAAA,CAAO,UAAU,MAAA,CAAO,KAAA,KAAU,QAAQ,OAAO,MAAA,CAAO,UAAU,QAAA,EAAU;AAC9E,UAAA,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAAA,QAClC,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA,CAAO,KAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA6B;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACtC,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAA,EAAQ;AAClD,QAAA,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,UACZ;AAAA,YACE,IAAA,EAAM,YAAA;AAAA,YACN,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,MAAA,EAAQ,KAAK,KAAA,CAAM;AAAA,WACrB;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA4B;AAC1B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACrC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAA,EAAQ;AAClD,MAAA,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,QACZ;AAAA,UACE,IAAA,EAAM,WAAA;AAAA,UACN,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAA,EAAQ,KAAK,KAAA,CAAM;AAAA,SACrB;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,GAAkB;AAChB,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,IAAA,CAAK,MAAM,QAAA,EAAU;AAC9C,MAAA,OAAA,CAAQ,KAAK,2DAA2D,CAAA;AACxE,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,QAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,eAAA;AAG3B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,qBAAA,CAAsB,MAAA,CAAO,QAAQ,CAAA;AAG/D,IAAA,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU,MAAA,EAAQ,YAAA,EAAc,WAAW,MAAS,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAsB,QAAA,EAA0C;AACtE,IAAA,MAAM,OAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AAGpB,MAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW;AACnD,QAAA,IAAA,CAAK,GAAG,IAAI,OAAA,CAAQ,OAAA;AAAA,MACtB;AAGA,MAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,WAAA,IAAe,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC5D,QAAA,MAAM,gBAAA,GAAmB,OAAA;AACzB,QAAA,MAAM,aAAa,IAAA,CAAK,qBAAA;AAAA,UACtB,gBAAA,CAAiB;AAAA,SACnB;AAEA,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACtC,UAAA,IAAI,EAAE,OAAO,IAAA,CAAA,EAAO;AAElB,YAAA,IAAA,CAAK,GAAG,CAAA,GAAI,UAAA;AAAA,UACd,WACE,OAAO,IAAA,CAAK,GAAG,CAAA,KAAM,YACrB,IAAA,CAAK,GAAG,CAAA,KAAM,IAAA,IACd,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,EACxB;AAEA,YAAA,IAAA,CAAK,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA,EAAG,GAAG,UAAA,EAAW;AAAA,UAC5C;AAAA,QAEF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBACN,QAAA,EAC4D;AAC5D,IAAA,MAAM,GAAA,uBAAU,GAAA,EAA2D;AAC3E,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAI,EAAA,CAAG,IAAA,KAAS,WAAA,IAAgB,EAAA,CAAW,UAAA,EAAY;AACrD,QAAA,MAAM,MAAA,GAAS,EAAA;AACf,QAAA,MAAM,OAAA,GAAkB,OAAO,OAAA,IAAW,MAAA;AAC1C,QAAA,MAAM,QAAA,GAAmB,OAAO,QAAA,IAAY,OAAA;AAC5C,QAAA,GAAA,CAAI,GAAA,CAAI,SAAS,EAAE,SAAA,EAAW,GAAG,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA;AACpD,QAAA,GAAA,CAAI,GAAA,CAAI,UAAU,EAAE,SAAA,EAAW,GAAG,GAAA,EAAK,IAAA,EAAM,SAAS,CAAA;AAAA,MACxD;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,IAAA,EAAiC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,IAAA,CAAK,MAAM,QAAA,EAAU;AAC9C,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,aAAa,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,OAAO,QAAQ,CAAA;AAGlE,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAiC;AAEzD,IAAA,KAAA,MAAW,aAAa,IAAA,EAAM;AAC5B,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AACzC,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACxC,UAAA,WAAA,CAAY,GAAA,CAAI,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AAAA,QACxC;AACA,QAAA,WAAA,CAAY,IAAI,QAAA,CAAS,SAAS,EAAG,SAAS,CAAA,GAAI,KAAK,SAAS,CAAA;AAAA,MAClE,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MAC7C;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,cAAc,CAAA,IAAK,WAAA,EAAa;AACrD,MAAA,IAAA,CAAK,WAAA,CAAY,WAAW,cAAc,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,CAAY,WAAmB,KAAA,EAAkB;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,IAAA,CAAK,MAAM,QAAA,EAAU;AAC9C,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AACtD,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,mDAAmD,SAAS,CAAA,CAAA;AAAA,OAC9D;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,0BAAA,CAA2B,SAAS,CAAA;AAC5D,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,gDAAgD,SAAS,CAAA,CAAA;AAAA,OAC3D;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAY,aAAA,EAAe,SAAA,EAAW,KAAK,CAAA;AAGjE,IAAA,IAAA,CAAK,2BAAA,EAA4B;AAGjC,IAAA,IAAI,KAAK,KAAA,CAAM,MAAA,CAAO,YAAY,IAAA,CAAK,KAAA,CAAM,OAAO,aAAA,EAAe;AACjE,MAAA,IAAA,CAAK,eAAA,CAAgB,WAAW,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAA,CACN,UAAA,EACA,aAAA,EACA,SAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,gBAAA,GAAqC;AAAA,MACzC,SAAA,EAAW,KAAK,KAAA,CAAM,QAAA;AAAA,MACtB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,MAAM,OAAA,GAAU,0BAAA;AAAA,MACd,aAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,8CAAA,EAAiD,aAAA,CAAc,IAAI,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA;AAAA,OAC5F;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,2BAAA,GAAoC;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,IAAA,CAAK,MAAM,QAAA,EAAU;AAGhD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA,CAAE,IAAA;AAIzC,IAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAqB,WAAA,KAA8B;AACxE,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAE5B,QAAA,MAAM,QAAA,GAAW,cACb,CAAA,EAAG,WAAW,IAAI,OAAA,CAAQ,GAAG,KAC7B,OAAA,CAAQ,GAAA;AAEZ,QAAA,IAAI,QAAQ,QAAA,EAAU;AAGpB,UAAA,IAAI,YAAA,GAAmC,IAAA;AAEvC,UAAA,IAAI,WAAA,EAAa;AAEf,YAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,CAAM,iBAAiB,CAAA;AACrD,YAAA,IAAI,SAAA,EAAW;AAEb,cAAA,MAAM,YAAA,GAAe,UAAU,CAAC,CAAA;AAChC,cAAA,MAAM,cAAA,GAAiB,UAAU,CAAC,CAAA;AAClC,cAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,QAAA,CAAU,aAAA;AAAA,gBAC5C,CAAA,sBAAA,EAAyB,YAAY,CAAA,CAAA,EAAI,cAAc,CAAA,GAAA;AAAA,eACzD;AACA,cAAA,IAAI,gBAAA,EAAkB;AACpB,gBAAA,YAAA,GAAe,gBAAA,CAAiB,aAAA;AAAA,kBAC9B,CAAA,iBAAA,EAAoB,QAAQ,GAAG,CAAA,EAAA;AAAA,iBACjC;AAAA,cACF;AAAA,YACF,CAAA,MAAO;AAEL,cAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,QAAA,CAAU,aAAA;AAAA,gBAC5C,oBAAoB,WAAW,CAAA,EAAA;AAAA,eACjC;AACA,cAAA,IAAI,gBAAA,EAAkB;AACpB,gBAAA,YAAA,GAAe,gBAAA,CAAiB,aAAA;AAAA,kBAC9B,CAAA,iBAAA,EAAoB,QAAQ,GAAG,CAAA,EAAA;AAAA,iBACjC;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,YAAA,GAAe,IAAA,CAAK,MAAM,QAAA,CAAU,aAAA;AAAA,cAClC,CAAA,iBAAA,EAAoB,QAAQ,GAAG,CAAA,EAAA;AAAA,aACjC;AAAA,UACF;AAEA,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,MAAM,OAAA,GAAU,YAAA;AAChB,YAAA,IAAI;AAEF,cAAA,IAAI,aAAA,GAAiD,KAAA,CAAA;AACrD,cAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,CAAU,KAAA,IAAS,UAAA;AAEzC,cAAA,IAAI,KAAA,KAAU,cAAc,WAAA,EAAa;AAEvC,gBAAA,aAAA,GAAgB,cAAA,CAAe,UAAU,WAAW,CAAA;AAAA,cACtD;AAEA,cAAA,MAAM,YAAA,GAAe,uBAAA;AAAA,gBACnB,OAAA,CAAQ,QAAA;AAAA,gBACR,QAAA;AAAA;AAAA,gBACA;AAAA;AAAA,eACF;AAEA,cAAA,MAAM,mBAAA,GACJ,OAAA,CAAQ,YAAA,CAAa,6BAA6B,CAAA,KAAM,MAAA;AAG1D,cAAA,IAAI,gBAAgB,mBAAA,EAAqB;AAEvC,gBAAA,MAAM,gBAAA,GAAmB,WAAA,GACrB,cAAA,CAAe,QAAA,EAAU,WAAW,CAAA,GACpC,QAAA;AACJ,gBAAA,MAAM,iBACJ,gBAAA,IAAoB,OAAO,gBAAA,KAAqB,QAAA,GAC3C,mBACD,EAAC;AAEP,gBAAA,MAAM,UAAA,GAAaD,eAAc,OAAA,EAAS;AAAA,kBACxC,IAAA,EAAM,WAAA;AAAA;AAAA,kBACN,OAAA,EAAS,cAAA;AAAA,kBACT,QAAA;AAAA;AAAA,kBACA,OAAO,IAAA,CAAK,KAAA;AAAA,kBACZ,QAAA,EAAU;AAAA,iBACX,CAAA;AAGD,gBAAA,OAAA,CAAQ,UAAA,EAAY,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AAAA,cACtD,CAAA,MAAA,IAAW,CAAC,YAAA,IAAgB,CAAC,mBAAA,EAAqB;AAEhD,gBAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACpD,gBAAA,eAAA,CAAgB,SAAA,GAAY,2BAAA;AAC5B,gBAAA,eAAA,CAAgB,MAAM,OAAA,GAAU,MAAA;AAChC,gBAAA,eAAA,CAAgB,YAAA,CAAa,gBAAA,EAAkB,OAAA,CAAQ,GAAG,CAAA;AAC1D,gBAAA,eAAA,CAAgB,YAAA,CAAa,+BAA+B,MAAM,CAAA;AAElE,gBAAA,OAAA,CAAQ,UAAA,EAAY,YAAA,CAAa,eAAA,EAAiB,OAAO,CAAA;AAAA,cAC3D;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA;AAAA,gBACN,CAAA,wCAAA,EAA2C,OAAA,CAAQ,GAAG,CAAA,WAAA,EAAc,QAAQ,CAAA,EAAA,CAAA;AAAA,gBAC5E;AAAA,eACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAA,CACG,OAAA,CAAQ,SAAS,WAAA,IAAe,OAAA,CAAQ,SAAS,OAAA,KAClD,UAAA,IAAc,OAAA,IACd,OAAA,CAAQ,QAAA,EACR;AACA,UAAA,MAAM,aAAA,GAAiB,QAAA,GAAmB,OAAA,CAAQ,GAAG,CAAA;AAGrD,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AAGhC,YAAA,MAAM,cAAA,GACJ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAU,gBAAA;AAAA,cACnB,CAAA,qBAAA;AAAA,aACF;AACF,YAAA,MAAM,cAAc,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO;AAC5D,cAAA,MAAM,IAAA,GACJ,EAAA,CAAG,YAAA,CAAa,qBAAqB,CAAA,IAAK,EAAA;AAC5C,cAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,QAAQ,CAAA,CAAA,CAAG,GAAG,OAAO,KAAA;AAE7C,cAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AACzC,cAAA,OAAO,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,YAChC,CAAC,CAAA;AACD,YAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC1B,cAAA,MAAM,IAAA,GACJ,EAAA,CAAG,YAAA,CAAa,qBAAqB,CAAA,IAAK,EAAA;AAC5C,cAAA,aAAA,CAAc,OAAA,CAAQ,UAAW,IAAI,CAAA;AAAA,YACvC,CAAC,CAAA;AAAA,UACH,CAAA,MAAO;AAEL,YAAA,aAAA,CAAc,OAAA,CAAQ,UAAW,QAAQ,CAAA;AAAA,UAC3C;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAGA,IAAA,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,EAAE,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AAEd,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,aAAA,KAAkB,IAAA,EAAM;AACrC,MAAA,YAAA,CAAa,IAAA,CAAK,MAAM,aAAa,CAAA;AACrC,MAAA,IAAA,CAAK,MAAM,aAAA,GAAgB,IAAA;AAAA,IAC7B;AAGA,IAAA,IAAA,CAAK,KAAA,CAAM,cAAc,KAAA,EAAM;AAG/B,IAAA,IAAI,IAAA,CAAK,MAAM,QAAA,EAAU;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,IAC3B;AAGA,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,IAAA;AACtB,IAAA,IAAA,CAAK,MAAM,MAAA,GAAS,IAAA;AACpB,IAAA,IAAA,CAAK,MAAM,eAAA,GAAkB,IAAA;AAG7B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAA,EAAe;AACnC,MAAA,UAAA,CAAW,sBAAA,EAAwB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,IAC3D;AAAA,EACF;AACF;;;ACllCO,SAAS,kBACd,MAAA,EACqB;AACrB,EAAA,OAAO,IAAI,oBAAoB,MAAM,CAAA;AACvC;AASA,IAAO,aAAA,GAAQ;AAIf,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,EAAC,OAAe,WAAA,GAAc,mBAAA;AAC9B,EAAC,OAAe,iBAAA,GAAoB,iBAAA;AACpC,EAAC,OAAe,cAAA,GAAiB,cAAA;AACnC","file":"index.js","sourcesContent":["// Translation utilities\n\nimport type { State } from \"../types/state.js\";\n\n/**\n * Get translated string for a key with optional interpolation\n * @param key Translation key\n * @param state Form state containing locale and translations\n * @param params Optional parameters for interpolation (e.g., {min: 5, max: 10})\n * @returns Translated string with interpolated values, or key if not found\n *\n * @example\n * // Template: \"Minimum {min} items required\"\n * t('minItems', state, { min: 3 }) // => \"Minimum 3 items required\"\n */\nexport function t(\n key: string,\n state: State,\n params?: Record<string, string | number>,\n): string {\n const locale = state.config.locale || \"en\";\n const localeTranslations = state.config.translations[locale];\n const fallbackTranslations = state.config.translations.en;\n\n // Try locale first, then fallback to English, then return key\n let text =\n (localeTranslations as Record<string, string>)?.[key] ||\n (fallbackTranslations as Record<string, string>)?.[key] ||\n key;\n\n // Interpolate {param} placeholders\n if (params) {\n for (const [paramKey, paramValue] of Object.entries(params)) {\n text = text.replace(new RegExp(`\\\\{${paramKey}\\\\}`, \"g\"), String(paramValue));\n }\n }\n\n return text;\n}\n","// Schema validation utilities\n\nimport type { Element } from \"../types/index.js\";\nimport type { State } from \"../types/state.js\";\nimport { t } from \"./translation.js\";\n\n// Helper functions for field hints\nfunction addLengthHint(element: any, parts: string[], state: State): void {\n if (element.minLength != null || element.maxLength != null) {\n if (element.minLength != null && element.maxLength != null) {\n parts.push(\n t(\"hintLengthRange\", state, {\n min: element.minLength,\n max: element.maxLength,\n }),\n );\n } else if (element.maxLength != null) {\n parts.push(t(\"hintMaxLength\", state, { max: element.maxLength }));\n } else if (element.minLength != null) {\n parts.push(t(\"hintMinLength\", state, { min: element.minLength }));\n }\n }\n}\n\nfunction addRangeHint(element: any, parts: string[], state: State): void {\n if (element.min != null || element.max != null) {\n if (element.min != null && element.max != null) {\n parts.push(\n t(\"hintValueRange\", state, { min: element.min, max: element.max }),\n );\n } else if (element.max != null) {\n parts.push(t(\"hintMaxValue\", state, { max: element.max }));\n } else if (element.min != null) {\n parts.push(t(\"hintMinValue\", state, { min: element.min }));\n }\n }\n}\n\nfunction addFileSizeHint(element: any, parts: string[], state: State): void {\n if (element.maxSizeMB) {\n parts.push(t(\"hintMaxSize\", state, { size: element.maxSizeMB }));\n }\n}\n\nfunction addFormatHint(element: any, parts: string[], state: State): void {\n if (element.accept?.extensions) {\n parts.push(\n t(\"hintFormats\", state, {\n formats: element.accept.extensions\n .map((ext: string) => ext.toUpperCase())\n .join(\",\"),\n }),\n );\n }\n}\n\nfunction addPatternHint(element: any, parts: string[], state: State): void {\n if (element.pattern) {\n parts.push(t(\"hintPattern\", state, { pattern: element.pattern }));\n }\n}\n\nexport function makeFieldHint(element: any, state: State): string {\n const parts: string[] = [];\n\n addLengthHint(element, parts, state);\n // Skip range hint for sliders - they visually show the range\n if (element.type !== \"slider\") {\n addRangeHint(element, parts, state);\n }\n addFileSizeHint(element, parts, state);\n addFormatHint(element, parts, state);\n addPatternHint(element, parts, state);\n\n return parts.join(\" • \");\n}\n\nexport function validateSchema(schema: any): string[] {\n const errors: string[] = [];\n\n if (!schema || typeof schema !== \"object\") {\n errors.push(\"Schema must be an object\");\n return errors;\n }\n\n // Version is now optional, defaults to \"0.3\"\n // if (!schema.version) {\n // errors.push(\"Schema missing version\");\n // }\n\n if (!Array.isArray(schema.elements)) {\n errors.push(\"Schema missing elements array\");\n return errors;\n }\n\n // Validate root-level columns property (fail fast on invalid values)\n if (\"columns\" in schema && schema.columns !== undefined) {\n const columns = schema.columns;\n const validColumns = [1, 2, 3, 4];\n if (!Number.isInteger(columns) || !validColumns.includes(columns as number)) {\n errors.push(`schema.columns must be 1, 2, 3, or 4 (got ${columns})`);\n }\n }\n\n // Validate root-level prefillHints (fail fast on invalid field references)\n if (\"prefillHints\" in schema && schema.prefillHints) {\n const prefillHints = schema.prefillHints;\n if (Array.isArray(prefillHints)) {\n prefillHints.forEach((hint: any, hintIndex: number) => {\n if (!hint.label || typeof hint.label !== \"string\") {\n errors.push(\n `schema.prefillHints[${hintIndex}] must have a 'label' property of type string`,\n );\n }\n if (!hint.values || typeof hint.values !== \"object\") {\n errors.push(\n `schema.prefillHints[${hintIndex}] must have a 'values' property of type object`,\n );\n } else {\n // Validate that each field in values exists in root elements\n for (const fieldKey in hint.values) {\n const fieldExists = schema.elements.some(\n (element: Element) => element.key === fieldKey,\n );\n if (!fieldExists) {\n errors.push(\n `schema.prefillHints[${hintIndex}] references non-existent field \"${fieldKey}\"`,\n );\n }\n }\n }\n });\n }\n }\n\n /**\n * Check for key collisions caused by flatOutput richinput elements.\n * When flatOutput is true, the element's textKey and filesKey become sibling output keys,\n * which can collide with other element keys or other flatOutput keys in the same scope.\n */\n function checkFlatOutputCollisions(elements: Element[], scopePath: string): void {\n const allOutputKeys = new Set<string>();\n\n for (const el of elements) {\n if (el.type === \"richinput\" && (el as any).flatOutput) {\n const richEl = el as any;\n const textKey: string = richEl.textKey ?? \"text\";\n const filesKey: string = richEl.filesKey ?? \"files\";\n\n // Check textKey against other element schema keys\n for (const otherEl of elements) {\n if (otherEl === el) continue;\n if (otherEl.key === textKey) {\n errors.push(\n `${scopePath}: RichInput \"${el.key}\" flatOutput textKey \"${textKey}\" collides with element key \"${otherEl.key}\"`,\n );\n }\n if (otherEl.key === filesKey) {\n errors.push(\n `${scopePath}: RichInput \"${el.key}\" flatOutput filesKey \"${filesKey}\" collides with element key \"${otherEl.key}\"`,\n );\n }\n }\n\n // Check against other flatOutput keys already collected\n if (allOutputKeys.has(textKey)) {\n errors.push(\n `${scopePath}: RichInput \"${el.key}\" flatOutput textKey \"${textKey}\" collides with another flatOutput key`,\n );\n }\n if (allOutputKeys.has(filesKey)) {\n errors.push(\n `${scopePath}: RichInput \"${el.key}\" flatOutput filesKey \"${filesKey}\" collides with another flatOutput key`,\n );\n }\n allOutputKeys.add(textKey);\n allOutputKeys.add(filesKey);\n } else {\n // Non-flatOutput element: check its key against accumulated flatOutput keys\n if (allOutputKeys.has(el.key)) {\n errors.push(\n `${scopePath}: Element key \"${el.key}\" collides with a flatOutput richinput key`,\n );\n }\n allOutputKeys.add(el.key);\n }\n }\n }\n\n function validateElements(elements: Element[], path: string): void {\n elements.forEach((element, index) => {\n const elementPath = `${path}[${index}]`;\n\n if (!element.type) {\n errors.push(`${elementPath}: missing type`);\n }\n\n if (!element.key) {\n errors.push(`${elementPath}: missing key`);\n }\n\n // Validate enableIf condition structure\n if (element.enableIf) {\n const enableIf = element.enableIf;\n\n if (!enableIf.key || typeof enableIf.key !== \"string\") {\n errors.push(\n `${elementPath}: enableIf must have a 'key' property of type string`,\n );\n }\n\n // Check that at least one operator is present\n const hasOperator = \"equals\" in enableIf;\n // Future: || \"notEquals\" in enableIf || \"in\" in enableIf || ...\n\n if (!hasOperator) {\n errors.push(\n `${elementPath}: enableIf must have at least one operator (equals, etc.)`,\n );\n }\n }\n\n if (\n element.type === \"group\" &&\n \"elements\" in element &&\n element.elements\n ) {\n validateElements(element.elements, `${elementPath}.elements`);\n }\n\n if (element.type === \"container\" && element.elements) {\n // Validate columns property (fail fast on invalid values)\n if (\"columns\" in element && element.columns !== undefined) {\n const columns = element.columns;\n const validColumns = [1, 2, 3, 4];\n if (\n !Number.isInteger(columns) ||\n !validColumns.includes(columns as number)\n ) {\n errors.push(\n `${elementPath}: columns must be 1, 2, 3, or 4 (got ${columns})`,\n );\n }\n }\n\n // Validate prefillHints (fail fast on invalid field references)\n if (\"prefillHints\" in element && element.prefillHints) {\n const prefillHints = element.prefillHints;\n if (Array.isArray(prefillHints)) {\n prefillHints.forEach((hint, hintIndex) => {\n if (!hint.label || typeof hint.label !== \"string\") {\n errors.push(\n `${elementPath}: prefillHints[${hintIndex}] must have a 'label' property of type string`,\n );\n }\n if (!hint.values || typeof hint.values !== \"object\") {\n errors.push(\n `${elementPath}: prefillHints[${hintIndex}] must have a 'values' property of type object`,\n );\n } else {\n // Validate that each field in values exists in container elements\n for (const fieldKey in hint.values) {\n const fieldExists = element.elements.some(\n (childElement) => childElement.key === fieldKey,\n );\n if (!fieldExists) {\n errors.push(\n `container \"${element.key}\": prefillHints[${hintIndex}] references non-existent field \"${fieldKey}\"`,\n );\n }\n }\n }\n });\n }\n }\n\n validateElements(element.elements, `${elementPath}.elements`);\n checkFlatOutputCollisions(element.elements, `${elementPath}.elements`);\n }\n\n if (element.type === \"select\" && element.options) {\n const defaultValue = element.default;\n if (\n defaultValue !== undefined &&\n defaultValue !== null &&\n defaultValue !== \"\"\n ) {\n const hasMatchingOption = element.options.some(\n (opt) => opt.value === defaultValue,\n );\n if (!hasMatchingOption) {\n errors.push(\n `${elementPath}: default \"${defaultValue}\" not in options`,\n );\n }\n }\n }\n });\n }\n\n if (Array.isArray(schema.elements)) {\n validateElements(schema.elements, \"elements\");\n checkFlatOutputCollisions(schema.elements, \"elements\");\n }\n return errors;\n}\n","// Utility helper functions\n\nexport function isPlainObject(obj: any): obj is Record<string, any> {\n return obj && typeof obj === \"object\" && obj.constructor === Object;\n}\n\n/**\n * Escape HTML special characters to prevent XSS\n * Use when inserting user-controlled or translated content via innerHTML\n */\nexport function escapeHtml(text: string): string {\n const div = document.createElement(\"div\");\n div.textContent = text;\n return div.innerHTML;\n}\n\nexport function pathJoin(base: string, key: string): string {\n return base ? `${base}.${key}` : key;\n}\n\nexport function pretty(obj: any): string {\n return JSON.stringify(obj, null, 2);\n}\n\nexport function clear(node: HTMLElement): void {\n while (node.firstChild) node.removeChild(node.firstChild);\n}\n\n/**\n * Format a file size in bytes to a human-readable string\n * e.g. 2400000 -> \"2.3 MB\", 512 -> \"512 B\"\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","// Enable condition evaluation utilities\n\nimport type { EnableCondition } from \"../types/index.js\";\n\n/**\n * Get value from nested object path\n * Supports nested paths: \"address.city\"\n * Supports array indices: \"items[0].name\", \"contacts[1].email\"\n * @param data - Form data object\n * @param path - Dot notation path with optional array indices\n * @returns The value at the path, or undefined if not found\n */\nexport function getValueByPath(data: any, path: string): any {\n if (!data || typeof data !== \"object\") {\n return undefined;\n }\n\n // Split path by dots, but preserve array indices\n // \"items[0].name\" -> [\"items\", \"[0]\", \"name\"]\n // \"address.city\" -> [\"address\", \"city\"]\n const segments = path.match(/[^.[\\]]+|\\[\\d+\\]/g);\n\n if (!segments || segments.length === 0) {\n return undefined;\n }\n\n let current = data;\n\n for (const segment of segments) {\n if (current === undefined || current === null) {\n return undefined;\n }\n\n // Handle array index notation: [0], [1], etc.\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n const index = parseInt(segment.slice(1, -1), 10);\n if (!Array.isArray(current) || isNaN(index)) {\n return undefined;\n }\n current = current[index];\n } else {\n // Handle object property\n current = current[segment];\n }\n }\n\n return current;\n}\n\n/**\n * Evaluate an enable condition against form data\n * @param condition - Enable condition to evaluate\n * @param formData - Root form data (for absolute scope)\n * @param containerData - Container instance data (for relative scope, optional)\n * @returns true if condition is met (field should be enabled), false otherwise\n */\nexport function evaluateEnableCondition(\n condition: EnableCondition,\n formData: Record<string, any>,\n containerData?: Record<string, any>,\n): boolean {\n if (!condition || !condition.key) {\n // Invalid condition structure - fail fast\n throw new Error(\"Invalid enableIf condition: must have a 'key' property\");\n }\n\n // Determine scope (default: \"relative\" - breaking change in v0.2.9)\n const scope = condition.scope ?? \"relative\";\n\n // Select data source based on scope\n let dataSource: Record<string, any>;\n if (scope === \"relative\") {\n // Use container data if available, otherwise fall back to root form data\n dataSource = containerData ?? formData;\n } else if (scope === \"absolute\") {\n // Always use root form data\n dataSource = formData;\n } else {\n // Invalid scope value - fail fast\n throw new Error(\n `Invalid enableIf scope: must be \"relative\" or \"absolute\" (got \"${scope}\")`,\n );\n }\n\n // Get value at the specified path\n const actualValue = getValueByPath(dataSource, condition.key);\n\n // Evaluate equals operator (initial implementation)\n if (\"equals\" in condition) {\n // Use strict equality for primitives, deep comparison for objects/arrays\n return deepEqual(actualValue, condition.equals);\n }\n\n // Future operators will be added here:\n // if (\"notEquals\" in condition) { ... }\n // if (\"in\" in condition) { ... }\n // if (\"exists\" in condition) { ... }\n // if (\"greaterThan\" in condition) { ... }\n // if (\"lessThan\" in condition) { ... }\n // if (\"and\" in condition) { ... }\n // if (\"or\" in condition) { ... }\n\n // No recognized operator - fail fast\n throw new Error(\n `Invalid enableIf condition: no recognized operator (equals, etc.)`,\n );\n}\n\n/**\n * Deep equality check for condition evaluation\n * Handles primitives, objects, and arrays\n * Protects against circular references using JSON.stringify with fallback to reference equality\n */\nfunction deepEqual(a: any, b: any): boolean {\n // Strict equality for primitives and same reference\n if (a === b) return true;\n\n // Handle null/undefined\n if (a == null || b == null) return a === b;\n\n // Type mismatch\n if (typeof a !== typeof b) return false;\n\n // For objects and arrays, use JSON comparison with circular reference protection\n if (typeof a === \"object\" && typeof b === \"object\") {\n try {\n return JSON.stringify(a) === JSON.stringify(b);\n } catch (e) {\n // Circular reference detected, fall back to reference equality\n if (\n e instanceof TypeError &&\n ((e as TypeError).message.includes(\"circular\") ||\n (e as TypeError).message.includes(\"cyclic\"))\n ) {\n console.warn(\n \"deepEqual: Circular reference detected in enableIf comparison, using reference equality\",\n );\n return a === b;\n }\n // Re-throw other errors\n throw e;\n }\n }\n\n // Fallback to strict equality for other types\n return a === b;\n}\n","// Text component rendering, validation, and update functions\n\nimport type {\n TextElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { t } from \"../utils/translation.js\";\n\n// Helper to build and update character counter for text/textarea fields\nexport function createCharCounter(\n element: TextElement,\n input: HTMLInputElement | HTMLTextAreaElement,\n isTextarea: boolean = false,\n): HTMLElement {\n const counter = document.createElement(\"span\");\n counter.className = \"char-counter\";\n counter.style.cssText = `\n position: absolute;\n ${isTextarea ? \"bottom: 8px\" : \"top: 50%; transform: translateY(-50%)\"};\n right: 10px;\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n pointer-events: none;\n background: var(--fb-background-color);\n padding: 0 4px;\n `;\n\n const updateCounter = (): void => {\n const len = input.value.length;\n const min = element.minLength;\n const max = element.maxLength;\n\n // Only show counter if min or max is defined\n if (min == null && max == null) {\n counter.textContent = \"\";\n return;\n }\n\n if (len === 0 || (min != null && len < min)) {\n // Empty or below minimum: show range\n if (min != null && max != null) {\n counter.textContent = `${min}-${max}`;\n } else if (max != null) {\n counter.textContent = `≤${max}`;\n } else if (min != null) {\n counter.textContent = `≥${min}`;\n }\n counter.style.color = \"var(--fb-text-secondary-color)\";\n } else if (max != null && len > max) {\n // Over maximum: show in red\n counter.textContent = `${len}/${max}`;\n counter.style.color = \"var(--fb-error-color)\";\n } else {\n // Within valid range: show current/max\n if (max != null) {\n counter.textContent = `${len}/${max}`;\n } else {\n counter.textContent = `${len}`;\n }\n counter.style.color = \"var(--fb-text-secondary-color)\";\n }\n };\n\n input.addEventListener(\"input\", updateCounter);\n updateCounter(); // Initial state\n\n return counter;\n}\n\nexport function renderTextElement(\n element: TextElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n\n // Wrapper for input + counter\n const inputWrapper = document.createElement(\"div\");\n inputWrapper.style.cssText = \"position: relative;\";\n\n const textInput = document.createElement(\"input\");\n textInput.type = \"text\";\n textInput.className = \"w-full rounded-lg\";\n textInput.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n padding-right: 60px;\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n width: 100%;\n box-sizing: border-box;\n `;\n textInput.name = pathKey;\n textInput.placeholder = element.placeholder || \"Введите текст\";\n textInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n textInput.readOnly = state.config.readonly;\n\n // Add focus styles via event listeners (CSS variables)\n if (!state.config.readonly) {\n textInput.addEventListener(\"focus\", () => {\n textInput.style.borderColor = \"var(--fb-border-focus-color)\";\n textInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n textInput.style.outlineOffset = \"0\";\n });\n textInput.addEventListener(\"blur\", () => {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n textInput.style.outline = \"none\";\n });\n textInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n textInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = textInput.value === \"\" ? null : textInput.value;\n ctx.instance.triggerOnChange(pathKey, value);\n };\n textInput.addEventListener(\"blur\", handleChange);\n textInput.addEventListener(\"input\", handleChange);\n }\n\n inputWrapper.appendChild(textInput);\n\n // Add character counter inside the input (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.minLength != null || element.maxLength != null)) {\n const counter = createCharCounter(element, textInput, false);\n inputWrapper.appendChild(counter);\n }\n\n wrapper.appendChild(inputWrapper);\n}\n\nexport function renderMultipleTextElement(\n element: TextElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-text-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addTextItem(value: string = \"\", index: number = -1): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-text-item flex items-center gap-2\";\n\n // Input container for relative positioning of counter\n const inputContainer = document.createElement(\"div\");\n inputContainer.style.cssText = \"position: relative; flex: 1;\";\n\n const textInput = document.createElement(\"input\");\n textInput.type = \"text\";\n textInput.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n padding-right: 60px;\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n width: 100%;\n box-sizing: border-box;\n `;\n textInput.placeholder = element.placeholder || t(\"placeholderText\", state);\n textInput.value = value;\n textInput.readOnly = state.config.readonly;\n\n // Add focus styles via event listeners\n if (!state.config.readonly) {\n textInput.addEventListener(\"focus\", () => {\n textInput.style.borderColor = \"var(--fb-border-focus-color)\";\n textInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n textInput.style.outlineOffset = \"0\";\n });\n textInput.addEventListener(\"blur\", () => {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n textInput.style.outline = \"none\";\n });\n textInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n textInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = textInput.value === \"\" ? null : textInput.value;\n ctx.instance.triggerOnChange(textInput.name, value);\n };\n textInput.addEventListener(\"blur\", handleChange);\n textInput.addEventListener(\"input\", handleChange);\n }\n\n inputContainer.appendChild(textInput);\n\n // Add character counter (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.minLength != null || element.maxLength != null)) {\n const counter = createCharCounter(element, textInput, false);\n inputContainer.appendChild(counter);\n }\n\n itemWrapper.appendChild(inputContainer);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-text-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-text-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addTextItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-text-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addTextItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate text input field and return extracted value with errors\n */\nexport function validateTextElement(\n element: TextElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate text input value\n const validateTextInput = (\n input: HTMLInputElement | HTMLTextAreaElement,\n val: string,\n fieldKey: string,\n ): void => {\n let hasError = false;\n const { state } = context;\n\n if (!skipValidation && val) {\n if (\n element.minLength !== undefined &&\n element.minLength !== null &&\n val.length < element.minLength\n ) {\n const msg = t(\"minLength\", state, { min: element.minLength });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n } else if (\n element.maxLength !== undefined &&\n element.maxLength !== null &&\n val.length > element.maxLength\n ) {\n const msg = t(\"maxLength\", state, { max: element.maxLength });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n } else if (element.pattern) {\n try {\n const re = new RegExp(element.pattern);\n if (!re.test(val)) {\n const msg = t(\"patternMismatch\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n }\n } catch {\n const msg = t(\"invalidPattern\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n }\n }\n }\n\n if (!hasError) {\n markValidity(input, null);\n }\n };\n\n if (element.multiple) {\n // Multiple text fields (array)\n const inputs = scopeRoot.querySelectorAll<\n HTMLInputElement | HTMLTextAreaElement\n >(`[name^=\"${key}[\"]`);\n const values: Array<string | null> = [];\n const rawValues: string[] = [];\n\n inputs.forEach((input, index) => {\n const val = input?.value ?? \"\";\n rawValues.push(val);\n values.push(val === \"\" ? null : val);\n validateTextInput(input, val, `${key}[${index}]`);\n });\n\n // Validate count\n if (!skipValidation) {\n const { state } = context;\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = rawValues.filter((v) => v.trim() !== \"\");\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single text field\n const input = scopeRoot.querySelector<\n HTMLInputElement | HTMLTextAreaElement\n >(`[name$=\"${key}\"]`);\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n const msg = t(\"required\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n if (input) {\n validateTextInput(input, val, key);\n }\n return { value: val === \"\" ? null : val, errors };\n }\n}\n\n/**\n * Update text field value in DOM without re-render\n */\nexport function updateTextField(\n element: TextElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple text fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateTextField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<\n HTMLInputElement | HTMLTextAreaElement\n >(`[name^=\"${fieldPath}[\"]`);\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n input.value = value[index] != null ? String(value[index]) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateTextField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single text field\n const input = scopeRoot.querySelector<\n HTMLInputElement | HTMLTextAreaElement\n >(`[name=\"${fieldPath}\"]`);\n if (input) {\n input.value = value != null ? String(value) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// Textarea component rendering, validation, and update functions\n\nimport type {\n TextareaElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { validateTextElement, updateTextField, createCharCounter } from \"./text.js\";\nimport { t } from \"../utils/translation.js\";\n\n/**\n * Applies auto-expand behavior to a textarea element.\n * The textarea starts as a single-line input and grows vertically as content is added.\n */\nfunction applyAutoExpand(textarea: HTMLTextAreaElement): void {\n textarea.style.overflow = \"hidden\";\n textarea.style.resize = \"none\";\n\n // Set initial rows based on content line count (correct pre-DOM sizing)\n const lineCount = (textarea.value.match(/\\n/g) || []).length + 1;\n textarea.rows = Math.max(1, lineCount);\n\n const resize = (): void => {\n // Guard: only resize when element is in the document (scrollHeight is unreliable otherwise)\n if (!textarea.isConnected) return;\n textarea.style.height = \"0\";\n textarea.style.height = `${textarea.scrollHeight}px`;\n };\n\n textarea.addEventListener(\"input\", resize);\n\n // Post-render resize: handles line wrapping that rows alone can't account for\n setTimeout(() => {\n if (textarea.isConnected) resize();\n }, 0);\n}\n\nexport function renderTextareaElement(\n element: TextareaElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n\n // Wrapper for textarea + counter\n const textareaWrapper = document.createElement(\"div\");\n textareaWrapper.style.cssText = \"position: relative;\";\n\n const textareaInput = document.createElement(\"textarea\");\n textareaInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\";\n textareaInput.style.cssText = \"padding-bottom: 24px;\"; // Space for counter\n textareaInput.name = pathKey;\n textareaInput.placeholder = element.placeholder || \"Введите текст\";\n textareaInput.rows = element.rows || 4;\n textareaInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n textareaInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = textareaInput.value === \"\" ? null : textareaInput.value;\n ctx.instance.triggerOnChange(pathKey, value);\n };\n textareaInput.addEventListener(\"blur\", handleChange);\n textareaInput.addEventListener(\"input\", handleChange);\n }\n\n // Apply auto-expand: explicitly when autoExpand is set, or always in readonly mode\n if (element.autoExpand || state.config.readonly) {\n applyAutoExpand(textareaInput);\n }\n\n textareaWrapper.appendChild(textareaInput);\n\n // Add character counter inside the textarea (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.minLength != null || element.maxLength != null)) {\n const counter = createCharCounter(element as any, textareaInput, true);\n textareaWrapper.appendChild(counter);\n }\n\n wrapper.appendChild(textareaWrapper);\n}\n\nexport function renderMultipleTextareaElement(\n element: TextareaElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-textarea-item\");\n items.forEach((item, index) => {\n const textarea = item.querySelector(\"textarea\");\n if (textarea) {\n textarea.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addTextareaItem(\n value: string = \"\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-textarea-item\";\n\n // Textarea container for relative positioning of counter\n const textareaContainer = document.createElement(\"div\");\n textareaContainer.style.cssText = \"position: relative;\";\n\n const textareaInput = document.createElement(\"textarea\");\n textareaInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\";\n textareaInput.style.cssText = \"padding-bottom: 24px;\"; // Space for counter\n textareaInput.placeholder = element.placeholder || t(\"placeholderText\", state);\n textareaInput.rows = element.rows || 4;\n textareaInput.value = value;\n textareaInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value =\n textareaInput.value === \"\" ? null : textareaInput.value;\n ctx.instance.triggerOnChange(textareaInput.name, value);\n };\n textareaInput.addEventListener(\"blur\", handleChange);\n textareaInput.addEventListener(\"input\", handleChange);\n }\n\n // Apply auto-expand: explicitly when autoExpand is set, or always in readonly mode\n if (element.autoExpand || state.config.readonly) {\n applyAutoExpand(textareaInput);\n }\n\n textareaContainer.appendChild(textareaInput);\n\n // Add character counter (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.minLength != null || element.maxLength != null)) {\n const counter = createCharCounter(element as any, textareaInput, true);\n textareaContainer.appendChild(counter);\n }\n\n itemWrapper.appendChild(textareaContainer);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-textarea-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn mt-1 px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-textarea-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addTextareaItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-textarea-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addTextareaItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate textarea element - delegates to text validator since they share validation logic\n */\nexport function validateTextareaElement(\n element: TextareaElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n // Textarea shares validation logic with text (minLength, maxLength, pattern)\n return validateTextElement(element as any, key, context);\n}\n\n/**\n * Update textarea field - delegates to text updater since they share update logic,\n * then triggers resize on autoExpand textareas.\n */\nexport function updateTextareaField(\n element: TextareaElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n // Textarea shares update logic with text\n updateTextField(element as any, fieldPath, value, context);\n\n // After updating value, trigger resize on autoExpand textareas.\n // autoExpand is active when element.autoExpand is true or in readonly mode.\n const { scopeRoot, state } = context;\n const shouldAutoExpand = element.autoExpand || state.config.readonly;\n if (!shouldAutoExpand) return;\n\n if (element.multiple) {\n const textareas = scopeRoot.querySelectorAll<HTMLTextAreaElement>(\n `textarea[name^=\"${fieldPath}[\"]`,\n );\n textareas.forEach((textarea) => {\n textarea.dispatchEvent(new Event(\"input\"));\n });\n } else {\n const textarea = scopeRoot.querySelector<HTMLTextAreaElement>(\n `textarea[name=\"${fieldPath}\"]`,\n );\n if (textarea) {\n textarea.dispatchEvent(new Event(\"input\"));\n }\n }\n}\n","// Number component rendering, validation, and update functions\n\nimport type {\n NumberElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { t } from \"../utils/translation.js\";\n\n// Helper to create range hint for number fields\nfunction createNumberRangeHint(\n element: NumberElement,\n input: HTMLInputElement,\n): HTMLElement {\n const hint = document.createElement(\"span\");\n hint.className = \"number-range-hint\";\n hint.style.cssText = `\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n right: 10px;\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n pointer-events: none;\n background: var(--fb-background-color);\n padding: 0 4px;\n `;\n\n const min = element.min;\n const max = element.max;\n\n // Build static range text\n let rangeText = \"\";\n if (min != null && max != null) {\n rangeText = `${min} – ${max}`;\n } else if (max != null) {\n rangeText = `≤${max}`;\n } else if (min != null) {\n rangeText = `≥${min}`;\n }\n\n hint.textContent = rangeText;\n\n // Update color based on validation (red if out of range)\n const updateColor = (): void => {\n const val = input.value ? parseFloat(input.value) : null;\n if (val != null) {\n const belowMin = min != null && val < min;\n const aboveMax = max != null && val > max;\n hint.style.color = belowMin || aboveMax\n ? \"var(--fb-error-color)\"\n : \"var(--fb-text-secondary-color)\";\n } else {\n hint.style.color = \"var(--fb-text-secondary-color)\";\n }\n };\n\n input.addEventListener(\"input\", updateColor);\n updateColor();\n\n return hint;\n}\n\nexport function renderNumberElement(\n element: NumberElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n\n // Wrapper for input + counter\n const inputWrapper = document.createElement(\"div\");\n inputWrapper.style.cssText = \"position: relative;\";\n\n const numberInput = document.createElement(\"input\");\n numberInput.type = \"number\";\n numberInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n numberInput.style.cssText = \"padding-right: 60px; width: 100%; box-sizing: border-box;\";\n numberInput.name = pathKey;\n numberInput.placeholder = element.placeholder || \"0\";\n if (element.min !== undefined) numberInput.min = element.min.toString();\n if (element.max !== undefined) numberInput.max = element.max.toString();\n if (element.step !== undefined) numberInput.step = element.step.toString();\n numberInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n numberInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = numberInput.value ? parseFloat(numberInput.value) : null;\n ctx.instance.triggerOnChange(pathKey, value);\n };\n numberInput.addEventListener(\"blur\", handleChange);\n numberInput.addEventListener(\"input\", handleChange);\n }\n\n inputWrapper.appendChild(numberInput);\n\n // Add value counter inside the input (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.min != null || element.max != null)) {\n const counter = createNumberRangeHint(element, numberInput);\n inputWrapper.appendChild(counter);\n }\n\n wrapper.appendChild(inputWrapper);\n}\n\nexport function renderMultipleNumberElement(\n element: NumberElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-number-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addNumberItem(\n value: string | number = \"\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-number-item flex items-center gap-2\";\n\n // Input container for relative positioning of counter\n const inputContainer = document.createElement(\"div\");\n inputContainer.style.cssText = \"position: relative; flex: 1;\";\n\n const numberInput = document.createElement(\"input\");\n numberInput.type = \"number\";\n numberInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n numberInput.style.cssText = \"padding-right: 60px; width: 100%; box-sizing: border-box;\";\n numberInput.placeholder = element.placeholder || \"0\";\n if (element.min !== undefined) numberInput.min = element.min.toString();\n if (element.max !== undefined) numberInput.max = element.max.toString();\n if (element.step !== undefined) numberInput.step = element.step.toString();\n numberInput.value = value.toString();\n numberInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const val = numberInput.value ? parseFloat(numberInput.value) : null;\n ctx.instance.triggerOnChange(numberInput.name, val);\n };\n numberInput.addEventListener(\"blur\", handleChange);\n numberInput.addEventListener(\"input\", handleChange);\n }\n\n inputContainer.appendChild(numberInput);\n\n // Add value counter (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.min != null || element.max != null)) {\n const counter = createNumberRangeHint(element, numberInput);\n inputContainer.appendChild(counter);\n }\n\n itemWrapper.appendChild(inputContainer);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-number-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-number-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addNumberItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-number-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addNumberItem(value as string | number));\n updateAddButton();\n updateRemoveButtons();\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate number input field and return extracted value with errors\n */\nexport function validateNumberElement(\n element: NumberElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate number value\n const validateNumberInput = (\n input: HTMLInputElement,\n v: number,\n fieldKey: string,\n ): void => {\n let hasError = false;\n const { state } = context;\n\n if (\n !skipValidation &&\n element.min !== undefined &&\n element.min !== null &&\n v < element.min\n ) {\n const msg = t(\"minValue\", state, { min: element.min });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n } else if (\n !skipValidation &&\n element.max !== undefined &&\n element.max !== null &&\n v > element.max\n ) {\n const msg = t(\"maxValue\", state, { max: element.max });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n }\n\n if (!hasError) {\n markValidity(input, null);\n }\n };\n\n if (element.multiple) {\n // Multiple number fields (array)\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: (number | null)[] = [];\n\n inputs.forEach((input, index) => {\n const raw = input?.value ?? \"\";\n if (raw === \"\") {\n values.push(null);\n markValidity(input, null);\n return;\n }\n\n const v = parseFloat(raw);\n if (!skipValidation && !Number.isFinite(v)) {\n const msg = t(\"notANumber\", context.state);\n errors.push(`${key}[${index}]: ${msg}`);\n markValidity(input, msg);\n values.push(null);\n return;\n }\n\n validateNumberInput(input, v, `${key}[${index}]`);\n const d = Number.isInteger(element.decimals ?? 0)\n ? (element.decimals ?? 0)\n : 0;\n values.push(Number(v.toFixed(d)));\n });\n\n // Validate count\n if (!skipValidation) {\n const { state } = context;\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v !== null);\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single number field\n const input = scopeRoot.querySelector<HTMLInputElement>(`[name$=\"${key}\"]`);\n const raw = input?.value ?? \"\";\n const { state } = context;\n\n if (!skipValidation && element.required && raw === \"\") {\n const msg = t(\"required\", state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n if (raw === \"\") {\n markValidity(input, null);\n return { value: null, errors };\n }\n\n const v = parseFloat(raw);\n if (!skipValidation && !Number.isFinite(v)) {\n const msg = t(\"notANumber\", state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n validateNumberInput(input!, v, key);\n const d = Number.isInteger(element.decimals ?? 0)\n ? (element.decimals ?? 0)\n : 0;\n return { value: Number(v.toFixed(d)), errors };\n }\n}\n\n/**\n * Update number field value in DOM without re-render\n */\nexport function updateNumberField(\n element: NumberElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple number fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateNumberField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n input.value = value[index] != null ? String(value[index]) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateNumberField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single number field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (input) {\n input.value = value != null ? String(value) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// Select component rendering functions\n\nimport type {\n SelectElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { t } from \"../utils/translation.js\";\n\nexport function renderSelectElement(\n element: SelectElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const selectInput = document.createElement(\"select\");\n selectInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n selectInput.name = pathKey;\n selectInput.disabled = state.config.readonly;\n\n (element.options || []).forEach((option) => {\n const optionEl = document.createElement(\"option\");\n optionEl.value = option.value;\n optionEl.textContent = option.label;\n if ((ctx.prefill[element.key] || element.default) === option.value) {\n optionEl.selected = true;\n }\n selectInput.appendChild(optionEl);\n });\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(pathKey, selectInput.value);\n };\n selectInput.addEventListener(\"change\", handleChange);\n }\n\n wrapper.appendChild(selectInput);\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const selectHint = document.createElement(\"p\");\n selectHint.className = \"text-xs text-gray-500 mt-1\";\n selectHint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(selectHint);\n }\n}\n\nexport function renderMultipleSelectElement(\n element: SelectElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || element.options?.[0]?.value || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-select-item\");\n items.forEach((item, index) => {\n const select = item.querySelector(\"select\");\n if (select) {\n select.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addSelectItem(value: string = \"\", index: number = -1): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-select-item flex items-center gap-2\";\n\n const selectInput = document.createElement(\"select\");\n selectInput.className =\n \"flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n selectInput.disabled = state.config.readonly;\n\n // Add options\n (element.options || []).forEach((option) => {\n const optionElement = document.createElement(\"option\");\n optionElement.value = option.value;\n optionElement.textContent = option.label;\n if (value === option.value) {\n optionElement.selected = true;\n }\n selectInput.appendChild(optionElement);\n });\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(selectInput.name, selectInput.value);\n };\n selectInput.addEventListener(\"change\", handleChange);\n }\n\n itemWrapper.appendChild(selectInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-select-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(item);\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-select-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n const defaultValue =\n element.default || element.options?.[0]?.value || \"\";\n values.push(defaultValue);\n addSelectItem(defaultValue);\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-select-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addSelectItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate select field and return extracted value with errors\n */\nexport function validateSelectElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate multiple count\n const validateMultipleCount = (\n key: string,\n values: string[],\n element: Element,\n filterFn: (v: string) => boolean,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n\n const filteredValues = values.filter(filterFn);\n const minCount = \"minCount\" in element ? (element.minCount ?? 1) : 1;\n const maxCount =\n \"maxCount\" in element ? (element.maxCount ?? Infinity) : Infinity;\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n };\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple select fields\n const inputs = scopeRoot.querySelectorAll<HTMLSelectElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: string[] = [];\n\n inputs.forEach((input) => {\n const val = input?.value ?? \"\";\n values.push(val);\n markValidity(input, null);\n });\n\n validateMultipleCount(key, values, element, (v) => v !== \"\");\n return { value: values, errors };\n } else {\n // Single select field\n const input = scopeRoot.querySelector<HTMLSelectElement>(\n `[name$=\"${key}\"]`,\n );\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n const msg = t(\"required\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n } else {\n markValidity(input, null);\n }\n\n return { value: val === \"\" ? null : val, errors };\n }\n}\n\n/**\n * Update select field value in DOM without re-render\n */\nexport function updateSelectField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple select fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateSelectField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const selects = scopeRoot.querySelectorAll<HTMLSelectElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n selects.forEach((select, index) => {\n if (index < value.length) {\n select.value = value[index] != null ? String(value[index]) : \"\";\n\n // Update selected option\n const options = select.querySelectorAll(\"option\");\n options.forEach((option) => {\n option.selected = option.value === String(value[index]);\n });\n\n select.classList.remove(\"invalid\");\n select.title = \"\";\n }\n });\n\n if (value.length !== selects.length) {\n console.warn(\n `updateSelectField: Multiple field \"${fieldPath}\" has ${selects.length} selects but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single select field\n const select = scopeRoot.querySelector<HTMLSelectElement>(\n `[name=\"${fieldPath}\"]`,\n );\n\n if (select) {\n select.value = value != null ? String(value) : \"\";\n\n // Update selected option\n const options = select.querySelectorAll(\"option\");\n options.forEach((option) => {\n option.selected = option.value === String(value);\n });\n\n select.classList.remove(\"invalid\");\n select.title = \"\";\n }\n }\n}\n","// Switcher component — segmented control / button group\n\nimport type {\n SwitcherElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { t } from \"../utils/translation.js\";\n\n// ============================================================================\n// Styling helpers\n// ============================================================================\n\n/**\n * Apply selected-state styles to a switcher button.\n * Selected: primary colour background with white text.\n */\nfunction applySelectedStyle(btn: HTMLButtonElement): void {\n btn.style.backgroundColor = \"var(--fb-primary-color)\";\n btn.style.color = \"#ffffff\";\n btn.style.borderColor = \"var(--fb-primary-color)\";\n}\n\n/**\n * Apply unselected-state styles to a switcher button.\n */\nfunction applyUnselectedStyle(btn: HTMLButtonElement): void {\n btn.style.backgroundColor = \"transparent\";\n btn.style.color = \"var(--fb-text-color)\";\n btn.style.borderColor = \"var(--fb-border-color)\";\n}\n\n/**\n * Build the segmented button group for a single switcher.\n * Returns the group wrapper element.\n *\n * @param element - Schema element\n * @param currentValue - Currently selected option value\n * @param hiddenInput - Hidden input to keep in sync\n * @param readonly - Whether the control is read-only\n * @param onChange - Called whenever the selection changes (edit mode only)\n */\nfunction buildSegmentedGroup(\n element: SwitcherElement,\n currentValue: string,\n hiddenInput: HTMLInputElement,\n readonly: boolean,\n onChange: ((value: string) => void) | null,\n): HTMLDivElement {\n const options = element.options || [];\n\n const group = document.createElement(\"div\");\n group.className = \"fb-switcher-group\";\n group.style.cssText = `\n display: inline-flex;\n flex-direction: row;\n flex-wrap: nowrap;\n `;\n\n const buttons: HTMLButtonElement[] = [];\n\n options.forEach((option, index) => {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"fb-switcher-btn\";\n btn.dataset.value = option.value;\n btn.textContent = option.label;\n\n // Base styles\n btn.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n font-size: var(--fb-font-size);\n border-width: var(--fb-border-width);\n border-style: solid;\n cursor: ${readonly ? \"default\" : \"pointer\"};\n transition: background-color var(--fb-transition-duration), color var(--fb-transition-duration), border-color var(--fb-transition-duration);\n white-space: nowrap;\n line-height: 1.25;\n outline: none;\n `;\n\n // Segmented border-radius: first, middle, last\n if (options.length === 1) {\n btn.style.borderRadius = \"var(--fb-border-radius)\";\n } else if (index === 0) {\n btn.style.borderRadius =\n \"var(--fb-border-radius) 0 0 var(--fb-border-radius)\";\n btn.style.borderRightWidth = \"0\";\n } else if (index === options.length - 1) {\n btn.style.borderRadius =\n \"0 var(--fb-border-radius) var(--fb-border-radius) 0\";\n } else {\n btn.style.borderRadius = \"0\";\n btn.style.borderRightWidth = \"0\";\n }\n\n // Initial state\n if (option.value === currentValue) {\n applySelectedStyle(btn);\n } else {\n applyUnselectedStyle(btn);\n }\n\n if (!readonly) {\n btn.addEventListener(\"click\", () => {\n // Update hidden input\n hiddenInput.value = option.value;\n\n // Update all button styles in this group\n buttons.forEach((b) => {\n if (b.dataset.value === option.value) {\n applySelectedStyle(b);\n } else {\n applyUnselectedStyle(b);\n }\n });\n\n if (onChange) {\n onChange(option.value);\n }\n });\n\n // Hover effect (only on unselected buttons)\n btn.addEventListener(\"mouseenter\", () => {\n if (hiddenInput.value !== option.value) {\n btn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n }\n });\n btn.addEventListener(\"mouseleave\", () => {\n if (hiddenInput.value !== option.value) {\n btn.style.backgroundColor = \"transparent\";\n }\n });\n }\n\n buttons.push(btn);\n group.appendChild(btn);\n });\n\n return group;\n}\n\n// ============================================================================\n// Single-mode renderer\n// ============================================================================\n\nexport function renderSwitcherElement(\n element: SwitcherElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const initialValue =\n String(ctx.prefill[element.key] ?? element.default ?? \"\");\n\n // Hidden input stores the value for form data extraction\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n hiddenInput.value = initialValue;\n\n const readonly = state.config.readonly;\n\n const onChange =\n !readonly && ctx.instance\n ? (value: string) => {\n ctx.instance.triggerOnChange(pathKey, value);\n }\n : null;\n\n const group = buildSegmentedGroup(\n element,\n initialValue,\n hiddenInput,\n readonly,\n onChange,\n );\n\n wrapper.appendChild(hiddenInput);\n wrapper.appendChild(group);\n\n // Hint (edit mode only)\n if (!readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Multiple-mode renderer\n// ============================================================================\n\nexport function renderMultipleSwitcherElement(\n element: SwitcherElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n // Pad to minimum count\n while (values.length < minCount) {\n values.push(element.default || element.options?.[0]?.value || \"\");\n }\n\n const readonly = state.config.readonly;\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-switcher-item\");\n items.forEach((item, index) => {\n const input = item.querySelector<HTMLInputElement>(\"input[type=hidden]\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addSwitcherItem(value: string = \"\", index: number = -1): HTMLElement {\n const currentIndex =\n index === -1 ? container.children.length : index;\n const itemPathKey = `${pathKey}[${currentIndex}]`;\n\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-switcher-item flex items-center gap-2\";\n\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = itemPathKey;\n hiddenInput.value = value;\n itemWrapper.appendChild(hiddenInput);\n\n const onChange =\n !readonly && ctx.instance\n ? (val: string) => {\n ctx.instance.triggerOnChange(hiddenInput.name, val);\n }\n : null;\n\n const group = buildSegmentedGroup(\n element,\n value,\n hiddenInput,\n readonly,\n onChange,\n );\n itemWrapper.appendChild(group);\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (readonly) return;\n const items = container.querySelectorAll(\".multiple-switcher-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n (removeBtn as HTMLButtonElement).style.backgroundColor =\n \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n (removeBtn as HTMLButtonElement).style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as HTMLElement,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-switcher-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n const defaultValue =\n element.default || element.options?.[0]?.value || \"\";\n values.push(defaultValue);\n addSwitcherItem(defaultValue);\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\n \".add-switcher-btn\",\n ) as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addSwitcherItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Hint (edit mode only)\n if (!readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate switcher field and return extracted value with errors.\n * Mirrors select validation logic — reads from hidden <input> elements.\n */\nexport function validateSwitcherElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n const validateMultipleCount = (\n fieldKey: string,\n values: string[],\n el: Element,\n filterFn: (v: string) => boolean,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n\n const filteredValues = values.filter(filterFn);\n const minCount = \"minCount\" in el ? (el.minCount ?? 1) : 1;\n const maxCount =\n \"maxCount\" in el ? (el.maxCount ?? Infinity) : Infinity;\n\n if (el.required && filteredValues.length === 0) {\n errors.push(`${fieldKey}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${fieldKey}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${fieldKey}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n };\n\n const validOptionValues = new Set(\n \"options\" in element\n ? (element as SwitcherElement).options.map((o) => o.value)\n : [],\n );\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple switcher fields — hidden inputs named pathKey[0], pathKey[1], …\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `input[type=\"hidden\"][name^=\"${key}[\"]`,\n );\n const values: string[] = [];\n\n inputs.forEach((input) => {\n const val = input?.value ?? \"\";\n values.push(val);\n\n if (!skipValidation && val !== \"\" && !validOptionValues.has(val)) {\n const msg = t(\"invalidOption\", context.state);\n markValidity(input, msg);\n errors.push(`${key}: ${msg}`);\n } else {\n markValidity(input, null);\n }\n });\n\n validateMultipleCount(key, values, element, (v) => v !== \"\");\n return { value: values, errors };\n } else {\n // Single switcher field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"hidden\"][name$=\"${key}\"]`,\n );\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n const msg = t(\"required\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n if (!skipValidation && val !== \"\" && !validOptionValues.has(val)) {\n const msg = t(\"invalidOption\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n markValidity(input, null);\n return { value: val === \"\" ? null : val, errors };\n }\n}\n\n// ============================================================================\n// DOM Update (setFormData / updateField support)\n// ============================================================================\n\n/**\n * Update switcher field value in the DOM without re-render.\n * Updates the hidden input value and refreshes button visual states.\n */\nexport function updateSwitcherField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (\"multiple\" in element && element.multiple) {\n if (!Array.isArray(value)) {\n console.warn(\n `updateSwitcherField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `input[type=\"hidden\"][name^=\"${fieldPath}[\"]`,\n );\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n const newVal = value[index] != null ? String(value[index]) : \"\";\n input.value = newVal;\n\n // Sync button visual state\n const group = input.parentElement?.querySelector(\".fb-switcher-group\");\n if (group) {\n group\n .querySelectorAll<HTMLButtonElement>(\".fb-switcher-btn\")\n .forEach((btn) => {\n if (btn.dataset.value === newVal) {\n applySelectedStyle(btn);\n } else {\n applyUnselectedStyle(btn);\n }\n });\n }\n\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateSwitcherField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"hidden\"][name=\"${fieldPath}\"]`,\n );\n\n if (input) {\n const newVal = value != null ? String(value) : \"\";\n input.value = newVal;\n\n // Sync button visual state\n const group = input.parentElement?.querySelector(\".fb-switcher-group\");\n if (group) {\n group\n .querySelectorAll<HTMLButtonElement>(\".fb-switcher-btn\")\n .forEach((btn) => {\n if (btn.dataset.value === newVal) {\n applySelectedStyle(btn);\n } else {\n applyUnselectedStyle(btn);\n }\n });\n }\n\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// File component rendering functions and helpers\n\nimport type {\n FileElement,\n FilesElement,\n RenderContext,\n ResourceMetadata,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport type { State } from \"../types/state.js\";\nimport { t } from \"../utils/translation.js\";\nimport { clear, escapeHtml, pathJoin } from \"../utils/helpers.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\n\n// File upload dependencies\ninterface FileDeps {\n picker: HTMLInputElement;\n fileUploadHandler: () => void;\n dragHandler: (files: FileList) => void;\n}\n\n// Constraints for multi-file upload handlers\ninterface FileUploadConstraints {\n maxCount: number;\n allowedExtensions: string[];\n maxSize: number; // in MB; Infinity means no limit\n}\n\n// Helper: Extract allowed file extensions from accept field\nexport function getAllowedExtensions(\n accept: string | { extensions: string[] } | undefined,\n): string[] {\n if (!accept) return [];\n if (typeof accept === \"object\" && Array.isArray(accept.extensions)) {\n return accept.extensions.map((ext) => ext.toLowerCase());\n }\n if (typeof accept === \"string\") {\n return accept\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.startsWith(\".\"))\n .map((s) => s.substring(1).toLowerCase());\n }\n return [];\n}\n\n// Helper: Check if a file's extension is in the allowed list\nexport function isFileExtensionAllowed(\n fileName: string,\n allowedExtensions: string[],\n): boolean {\n if (allowedExtensions.length === 0) return true;\n const ext = fileName.split(\".\").pop()?.toLowerCase() || \"\";\n return allowedExtensions.includes(ext);\n}\n\n// Helper: Check if a file exceeds the max size limit (maxSizeMB in MB, Infinity = no limit)\nexport function isFileSizeAllowed(file: File, maxSizeMB: number): boolean {\n if (maxSizeMB === Infinity) return true;\n return file.size <= maxSizeMB * 1024 * 1024;\n}\n\n// Helper: Render local image file preview\nfunction renderLocalImagePreview(\n container: HTMLElement,\n file: File,\n fileName: string,\n state: State,\n): void {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = fileName || t(\"previewAlt\", state);\n\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(file);\n container.appendChild(img);\n}\n\n// Helper: Render local video file preview\nfunction renderLocalVideoPreview(\n container: HTMLElement,\n file: File,\n videoType: string,\n resourceId: string,\n state: State,\n deps: FileDeps | null,\n): HTMLElement {\n const videoUrl = URL.createObjectURL(file);\n\n // Remove all conflicting handlers to prevent interference with video controls\n container.onclick = null;\n\n // Remove drag and drop event listeners by cloning the element\n const newContainer = container.cloneNode(false) as HTMLElement;\n if (container.parentNode) {\n container.parentNode.replaceChild(newContainer, container);\n }\n\n newContainer.innerHTML = `\n <div class=\"relative group h-full\">\n <video class=\"w-full h-full object-contain\" controls preload=\"auto\" muted src=\"${videoUrl}\">\n ${escapeHtml(t(\"videoNotSupported\", state))}\n </video>\n <div class=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity z-10 flex gap-1\">\n <button class=\"bg-red-600 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs delete-file-btn\">\n ${escapeHtml(t(\"removeElement\", state))}\n </button>\n <button class=\"bg-gray-800 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs change-file-btn\">\n ${escapeHtml(t(\"changeButton\", state))}\n </button>\n </div>\n </div>\n `;\n\n attachVideoButtonHandlers(newContainer, resourceId, state, deps);\n return newContainer;\n}\n\n// Helper: Attach video button handlers\nfunction attachVideoButtonHandlers(\n container: HTMLElement,\n resourceId: string,\n state: State,\n deps: FileDeps | null,\n): void {\n const changeBtn = container.querySelector(\n \".change-file-btn\",\n ) as HTMLButtonElement;\n if (changeBtn) {\n changeBtn.onclick = (e) => {\n e.stopPropagation();\n if (deps?.picker) {\n deps.picker.click();\n }\n };\n }\n\n const deleteBtn = container.querySelector(\n \".delete-file-btn\",\n ) as HTMLButtonElement;\n if (deleteBtn) {\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n handleVideoDelete(container, resourceId, state, deps);\n };\n }\n}\n\n// Helper: Handle video delete action\nfunction handleVideoDelete(\n container: HTMLElement,\n resourceId: string,\n state: State,\n deps: FileDeps | null,\n): void {\n state.resourceIndex.delete(resourceId);\n\n const hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (hiddenInput) {\n hiddenInput.value = \"\";\n }\n\n if (deps?.fileUploadHandler) {\n container.onclick = deps.fileUploadHandler;\n }\n if (deps?.dragHandler) {\n setupDragAndDrop(container, deps.dragHandler);\n }\n\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${escapeHtml(t(\"clickDragText\", state))}</div>\n </div>\n `;\n}\n\n// Helper: Render uploaded video preview\nfunction renderUploadedVideoPreview(\n container: HTMLElement,\n thumbnailUrl: string,\n _videoType: string,\n state: State,\n): void {\n const video = document.createElement(\"video\");\n video.className = \"w-full h-full object-contain\";\n video.controls = true;\n video.preload = \"metadata\";\n video.muted = true;\n video.src = thumbnailUrl;\n\n video.appendChild(\n document.createTextNode(t(\"videoNotSupported\", state)),\n );\n container.appendChild(video);\n}\n\n// Helper: Render delete button and setup handler\nfunction renderDeleteButton(\n container: HTMLElement,\n resourceId: string,\n state: State,\n): void {\n addDeleteButton(container, state, () => {\n state.resourceIndex.delete(resourceId);\n\n const hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (hiddenInput) {\n hiddenInput.value = \"\";\n }\n\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${escapeHtml(t(\"clickDragText\", state))}</div>\n </div>\n `;\n });\n}\n\n// Helper: Render local file preview (image, video, or document)\nasync function renderLocalFilePreview(\n container: HTMLElement,\n meta: ResourceMetadata,\n fileName: string,\n resourceId: string,\n isReadonly: boolean,\n state: State,\n deps: FileDeps | null,\n): Promise<void> {\n if (!meta.file || !(meta.file instanceof File)) {\n return;\n }\n\n if (meta.type && meta.type.startsWith(\"image/\")) {\n renderLocalImagePreview(container, meta.file, fileName, state);\n } else if (meta.type && meta.type.startsWith(\"video/\")) {\n const newContainer = renderLocalVideoPreview(\n container,\n meta.file,\n meta.type,\n resourceId,\n state,\n deps,\n );\n container = newContainer;\n } else {\n container.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\"><div class=\"text-2xl mb-2\">📁</div><div class=\"text-sm\">${escapeHtml(fileName)}</div></div>`;\n }\n\n // Add delete button for edit mode (except for videos which have custom buttons)\n if (!isReadonly && !(meta.type && meta.type.startsWith(\"video/\"))) {\n renderDeleteButton(container, resourceId, state);\n }\n}\n\n// Helper: Render uploaded file preview via getThumbnail\nasync function renderUploadedFilePreview(\n container: HTMLElement,\n resourceId: string,\n fileName: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): Promise<void> {\n if (!state.config.getThumbnail) {\n setEmptyFileContainer(container, state);\n return;\n }\n\n try {\n const thumbnailUrl = await state.config.getThumbnail(resourceId);\n\n if (thumbnailUrl) {\n clear(container);\n\n if (meta && meta.type && meta.type.startsWith(\"video/\")) {\n renderUploadedVideoPreview(container, thumbnailUrl, meta.type, state);\n } else {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = fileName || t(\"previewAlt\", state);\n img.src = thumbnailUrl;\n container.appendChild(img);\n }\n } else {\n setEmptyFileContainer(container, state);\n }\n } catch (error) {\n console.error(\"Failed to get thumbnail:\", error);\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${escapeHtml(fileName || t(\"previewUnavailable\", state))}</div>\n </div>\n `;\n }\n}\n\n// Render single file preview container\nexport async function renderFilePreview(\n container: HTMLElement,\n resourceId: string,\n state: State,\n options: {\n fileName?: string;\n isReadonly?: boolean;\n deps?: FileDeps | null;\n } = {},\n): Promise<void> {\n const { fileName = \"\", isReadonly = false, deps = null } = options;\n\n // Runtime validation for dependencies when not in readonly mode\n if (\n !isReadonly &&\n deps &&\n (!deps.picker || !deps.fileUploadHandler || !deps.dragHandler)\n ) {\n throw new Error(\n \"renderFilePreview: missing deps {picker, fileUploadHandler, dragHandler}\",\n );\n }\n\n clear(container);\n\n if (isReadonly) {\n container.classList.add(\"cursor-pointer\");\n }\n\n const meta = state.resourceIndex.get(resourceId);\n\n if (meta && meta.file && meta.file instanceof File) {\n await renderLocalFilePreview(\n container,\n meta,\n fileName,\n resourceId,\n isReadonly,\n state,\n deps,\n );\n } else {\n await renderUploadedFilePreview(\n container,\n resourceId,\n fileName,\n meta,\n state,\n );\n }\n}\n\n// Render file preview for readonly mode\nexport async function renderFilePreviewReadonly(\n resourceId: string,\n state: State,\n fileName?: string,\n): Promise<HTMLElement> {\n const meta = state.resourceIndex.get(resourceId);\n const actualFileName =\n fileName || meta?.name || resourceId.split(\"/\").pop() || \"file\";\n\n // Determine if this looks like a PSD file (should be treated as download, not preview)\n const isPSD = actualFileName.toLowerCase().match(/\\.psd$/);\n\n // Individual file result container\n const fileResult = document.createElement(\"div\");\n fileResult.className = isPSD ? \"space-y-2\" : \"space-y-3\";\n\n // Preview container - compact for PSD files, large for others\n const previewContainer = document.createElement(\"div\");\n if (isPSD) {\n // Compact container for PSD files\n previewContainer.className =\n \"bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity flex items-center p-3 max-w-sm\";\n } else {\n // Large container for images/videos\n previewContainer.className =\n \"bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity\";\n }\n\n // Determine if this looks like an image file (excluding PSD files)\n const isImage =\n !isPSD &&\n (meta?.type?.startsWith(\"image/\") ||\n actualFileName.toLowerCase().match(/\\.(jpg|jpeg|png|gif|webp)$/));\n\n // Determine if this looks like a video file\n const isVideo =\n meta?.type?.startsWith(\"video/\") ||\n actualFileName.toLowerCase().match(/\\.(mp4|webm|avi|mov)$/);\n\n if (isImage) {\n // Image preview - try getThumbnail first\n if (state.config.getThumbnail) {\n try {\n const thumbnailUrl = await state.config.getThumbnail(resourceId);\n if (thumbnailUrl) {\n previewContainer.innerHTML = `<img src=\"${thumbnailUrl}\" alt=\"${escapeHtml(actualFileName)}\" class=\"w-full h-auto\">`;\n } else {\n // Fallback to icon if getThumbnail returns null/undefined\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } catch (error) {\n console.warn(\"getThumbnail failed for\", resourceId, error);\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } else if (isVideo) {\n // Video preview - try getThumbnail for video URL\n if (state.config.getThumbnail) {\n try {\n const videoUrl = await state.config.getThumbnail(resourceId);\n if (videoUrl) {\n previewContainer.innerHTML = `\n <div class=\"relative group\">\n <video class=\"w-full h-auto\" controls preload=\"auto\" muted src=\"${videoUrl}\">\n ${escapeHtml(t(\"videoNotSupported\", state))}\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-20 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center pointer-events-none\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-3\">\n <svg class=\"w-8 h-8 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } catch (error) {\n console.warn(\"getThumbnail failed for video\", resourceId, error);\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } else {\n // Other file types - special handling for PSD files\n const fileIcon = isPSD ? \"🎨\" : \"📁\";\n const fileDescription = isPSD ? \"PSD File\" : \"Document\";\n\n if (isPSD) {\n // Compact horizontal layout for PSD files\n previewContainer.innerHTML = `\n <div class=\"flex items-center space-x-3\">\n <div class=\"text-3xl text-gray-400\">${fileIcon}</div>\n <div class=\"flex-1 min-w-0\">\n <div class=\"text-sm font-medium text-gray-900 truncate\">${escapeHtml(actualFileName)}</div>\n <div class=\"text-xs text-gray-500\">${fileDescription}</div>\n </div>\n </div>\n `;\n } else {\n // Large centered layout for other documents\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">${fileIcon}</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div><div class=\"text-xs text-gray-500 mt-1\">${fileDescription}</div></div></div>`;\n }\n }\n\n // File name (only show for non-PSD files since PSD files show name inline)\n const fileNameElement = document.createElement(\"p\");\n fileNameElement.className = isPSD\n ? \"hidden\"\n : \"text-sm font-medium text-gray-900 text-center\";\n fileNameElement.textContent = actualFileName;\n\n // Download button\n const downloadButton = document.createElement(\"button\");\n downloadButton.className =\n \"w-full px-3 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\";\n downloadButton.textContent = t(\"downloadButton\", state);\n downloadButton.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (state.config.downloadFile) {\n state.config.downloadFile(resourceId, actualFileName);\n } else {\n forceDownload(resourceId, actualFileName, state);\n }\n };\n\n fileResult.appendChild(previewContainer);\n fileResult.appendChild(fileNameElement);\n fileResult.appendChild(downloadButton);\n\n return fileResult;\n}\n\n// Render resource pills for files\nexport function renderResourcePills(\n container: HTMLElement,\n rids: string[] | null,\n state: State,\n onRemove: ((rid: string) => void) | null,\n hint?: string,\n countInfo?: string,\n): void {\n clear(container);\n\n // Build combined hint line: \"Нажмите или перетащите файлы • ≤5МБ • PNG,JPG • 0 файлов (0-10)\"\n const buildHintLine = (): string => {\n const parts: string[] = [t(\"clickDragTextMultiple\", state)];\n if (hint) parts.push(hint);\n if (countInfo) parts.push(countInfo);\n return parts.join(\" • \");\n };\n\n // Show initial placeholder only if this is the first render (no previous grid)\n const isInitialRender = !container.classList.contains(\"grid\");\n\n if ((!rids || rids.length === 0) && isInitialRender) {\n // Create grid container\n const gridContainer = document.createElement(\"div\");\n gridContainer.className = \"grid grid-cols-4 gap-3 mb-3\";\n\n // Create 4 placeholder slots\n for (let i = 0; i < 4; i++) {\n const slot = document.createElement(\"div\");\n slot.className =\n \"aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors\";\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"w-12 h-12 text-gray-400\");\n svg.setAttribute(\"fill\", \"currentColor\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n\n const path = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"path\",\n );\n path.setAttribute(\n \"d\",\n \"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\",\n );\n\n svg.appendChild(path);\n slot.appendChild(svg);\n\n // Add click handler to each slot\n slot.onclick = () => {\n // Look for file input\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n\n gridContainer.appendChild(slot);\n }\n\n // Add combined hint text\n const hintText = document.createElement(\"div\");\n hintText.className = \"text-center text-xs text-gray-500 mt-2\";\n hintText.textContent = buildHintLine();\n\n container.appendChild(gridContainer);\n container.appendChild(hintText);\n return;\n }\n\n // Create grid container\n const gridContainer = document.createElement(\"div\");\n gridContainer.className = \"files-list grid grid-cols-4 gap-3\";\n\n // Calculate how many slots we need\n const currentImagesCount = rids ? rids.length : 0;\n const rowsNeeded = Math.floor(currentImagesCount / 4) + 1;\n const slotsNeeded = rowsNeeded * 4;\n\n // Add all slots (filled and empty)\n for (let i = 0; i < slotsNeeded; i++) {\n const slot = document.createElement(\"div\");\n\n if (rids && i < rids.length) {\n // Filled slot with preview\n const rid = rids[i];\n const meta = state.resourceIndex.get(rid);\n slot.className =\n \"resource-pill aspect-square bg-gray-100 rounded-lg overflow-hidden relative group border border-gray-300\";\n slot.dataset.resourceId = rid;\n\n // Add image, video, or file content\n renderThumbnailForResource(slot, rid, meta, state).catch((err) => {\n console.error(\"Failed to render thumbnail:\", err);\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <div class=\"text-2xl mb-1\">📁</div>\n <div class=\"text-xs\">${escapeHtml(t(\"previewError\", state))}</div>\n </div>`;\n });\n\n // Add remove button overlay\n if (onRemove) {\n const overlay = document.createElement(\"div\");\n overlay.className =\n \"absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\";\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.className = \"bg-red-600 text-white px-2 py-1 rounded text-xs\";\n removeBtn.textContent = t(\"removeElement\", state);\n removeBtn.onclick = (e) => {\n e.stopPropagation();\n onRemove(rid);\n };\n\n overlay.appendChild(removeBtn);\n slot.appendChild(overlay);\n }\n } else {\n // Empty slot placeholder\n slot.className =\n \"aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded-lg flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors\";\n slot.innerHTML =\n '<svg class=\"w-12 h-12 text-gray-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/></svg>';\n slot.onclick = () => {\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n }\n\n gridContainer.appendChild(slot);\n }\n\n container.appendChild(gridContainer);\n\n // Add combined hint text below grid\n const hintText = document.createElement(\"div\");\n hintText.className = \"text-center text-xs text-gray-500 mt-2\";\n hintText.textContent = buildHintLine();\n container.appendChild(hintText);\n}\n\n// Helper function to render thumbnail error UI\nfunction renderThumbnailError(\n slot: HTMLElement,\n state: State,\n iconSize: string = \"w-12 h-12\",\n): void {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"${escapeHtml(iconSize)} text-red-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/>\n </svg>\n <div class=\"text-xs mt-1 text-red-600\">${escapeHtml(t(\"previewError\", state))}</div>\n </div>`;\n}\n\n// Render thumbnail for resource\nasync function renderThumbnailForResource(\n slot: HTMLElement,\n rid: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): Promise<void> {\n // Add image, video, or file content\n if (meta && meta.type?.startsWith(\"image/\")) {\n if (meta.file && meta.file instanceof File) {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = meta.name;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n slot.appendChild(img);\n } else if (state.config.getThumbnail) {\n try {\n const url = await state.config.getThumbnail(rid);\n if (url) {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = meta.name;\n img.src = url;\n slot.appendChild(img);\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n </div>`;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onThumbnailError) {\n state.config.onThumbnailError(err, rid);\n }\n // Show error state in UI\n renderThumbnailError(slot, state);\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n </div>`;\n }\n } else if (meta && meta.type?.startsWith(\"video/\")) {\n if (meta.file && meta.file instanceof File) {\n const videoUrl = URL.createObjectURL(meta.file);\n slot.innerHTML = `\n <div class=\"relative group h-full w-full\">\n <video class=\"w-full h-full object-contain\" preload=\"metadata\" muted src=\"${videoUrl}\">\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-30 flex items-center justify-center\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-1\">\n <svg class=\"w-4 h-4 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else if (state.config.getThumbnail) {\n try {\n const videoUrl = await state.config.getThumbnail(rid);\n if (videoUrl) {\n slot.innerHTML = `\n <div class=\"relative group h-full w-full\">\n <video class=\"w-full h-full object-contain\" preload=\"metadata\" muted src=\"${videoUrl}\">\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-30 flex items-center justify-center\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-1\">\n <svg class=\"w-4 h-4 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n <div class=\"text-xs mt-1\">${escapeHtml(meta?.name || \"Video\")}</div>\n </div>`;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onThumbnailError) {\n state.config.onThumbnailError(err, rid);\n }\n // Show error state in UI\n renderThumbnailError(slot, state, \"w-8 h-8\");\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n <div class=\"text-xs mt-1\">${escapeHtml(meta?.name || \"Video\")}</div>\n </div>`;\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <div class=\"text-2xl mb-1\">📁</div>\n <div class=\"text-xs\">${escapeHtml(meta?.name || \"File\")}</div>\n </div>`;\n }\n}\n\n// Helper functions\nfunction setEmptyFileContainer(\n fileContainer: HTMLElement,\n state: State,\n hint?: string,\n): void {\n const hintHtml = hint\n ? `<div class=\"text-xs text-gray-500 mt-1\">${escapeHtml(hint)}</div>`\n : \"\";\n fileContainer.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${escapeHtml(t(\"clickDragText\", state))}</div>\n ${hintHtml}\n </div>\n `;\n}\n\nfunction showFileError(\n container: HTMLElement,\n message: string,\n): void {\n // Remove any existing error\n const existing = container\n .closest(\".space-y-2\")\n ?.querySelector(\".file-error-message\");\n if (existing) existing.remove();\n\n const errorEl = document.createElement(\"div\");\n errorEl.className = \"file-error-message error-message\";\n errorEl.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n errorEl.textContent = message;\n container.closest(\".space-y-2\")?.appendChild(errorEl);\n}\n\nfunction clearFileError(container: HTMLElement): void {\n const existing = container\n .closest(\".space-y-2\")\n ?.querySelector(\".file-error-message\");\n if (existing) existing.remove();\n}\n\nasync function handleFileSelect(\n file: File,\n container: HTMLElement,\n fieldName: string,\n state: State,\n deps: FileDeps | null = null,\n instance?: any,\n allowedExtensions: string[] = [],\n maxSizeMB: number = Infinity,\n): Promise<void> {\n if (!isFileExtensionAllowed(file.name, allowedExtensions)) {\n const formats = allowedExtensions.join(\", \");\n showFileError(\n container,\n t(\"invalidFileExtension\", state, { name: file.name, formats }),\n );\n return;\n }\n\n if (!isFileSizeAllowed(file, maxSizeMB)) {\n showFileError(\n container,\n t(\"fileTooLarge\", state, { name: file.name, maxSize: maxSizeMB }),\n );\n return;\n }\n\n clearFileError(container);\n\n let rid: string;\n\n // If uploadHandler is configured, use it to upload the file\n if (state.config.uploadFile) {\n try {\n rid = await state.config.uploadFile(file);\n if (typeof rid !== \"string\") {\n throw new Error(\"Upload handler must return a string resource ID\");\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onUploadError) {\n state.config.onUploadError(err, file);\n }\n throw new Error(`File upload failed: ${err.message}`);\n }\n } else {\n throw new Error(\n \"No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()\",\n );\n }\n\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file, // Store the file object for local preview\n });\n\n // Create hidden input to store the resource ID\n let hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (!hiddenInput) {\n hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = fieldName;\n container.parentElement?.appendChild(hiddenInput);\n }\n hiddenInput.value = rid;\n\n renderFilePreview(container, rid, state, {\n fileName: file.name,\n isReadonly: false,\n deps,\n }).catch(console.error);\n\n // Trigger onChange after file upload completes\n if (instance && !state.config.readonly) {\n instance.triggerOnChange(fieldName, rid);\n }\n}\n\nfunction setupDragAndDrop(\n element: HTMLElement,\n dropHandler: (files: FileList) => void,\n): void {\n element.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n element.classList.add(\"border-blue-500\", \"bg-blue-50\");\n });\n\n element.addEventListener(\"dragleave\", (e) => {\n e.preventDefault();\n element.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n });\n\n element.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n element.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n if (e.dataTransfer?.files) {\n dropHandler(e.dataTransfer.files);\n }\n });\n}\n\nfunction addDeleteButton(\n container: HTMLElement,\n state: State,\n onDelete: () => void,\n): void {\n // Remove existing overlay if any\n const existingOverlay = container.querySelector(\".delete-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n\n // Create overlay with center delete button\n const overlay = document.createElement(\"div\");\n overlay.className =\n \"delete-overlay absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\";\n\n const deleteBtn = document.createElement(\"button\");\n deleteBtn.className =\n \"bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700 transition-colors\";\n deleteBtn.textContent = t(\"removeElement\", state);\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n onDelete();\n };\n\n overlay.appendChild(deleteBtn);\n container.appendChild(overlay);\n}\n\nasync function uploadSingleFile(file: File, state: State): Promise<string> {\n if (state.config.uploadFile) {\n try {\n const rid = await state.config.uploadFile(file);\n if (typeof rid !== \"string\") {\n throw new Error(\"Upload handler must return a string resource ID\");\n }\n return rid;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onUploadError) {\n state.config.onUploadError(err, file);\n }\n throw new Error(`File upload failed: ${err.message}`);\n }\n } else {\n throw new Error(\n \"No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()\",\n );\n }\n}\n\nasync function forceDownload(\n resourceId: string,\n fileName: string,\n state: State,\n): Promise<void> {\n try {\n // Try to get URL from dedicated download handler first, then fall back to thumbnail handler\n let fileUrl: string | null = null;\n\n if (state.config.getDownloadUrl) {\n fileUrl = state.config.getDownloadUrl(resourceId);\n } else if (state.config.getThumbnail) {\n fileUrl = await state.config.getThumbnail(resourceId);\n }\n\n if (fileUrl) {\n const finalUrl = fileUrl.startsWith(\"http\")\n ? fileUrl\n : new URL(fileUrl, window.location.href).href;\n\n const response = await fetch(finalUrl);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const blob = await response.blob();\n downloadBlob(blob, fileName);\n } else {\n throw new Error(\"No download URL available for resource\");\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onDownloadError) {\n state.config.onDownloadError(err, resourceId, fileName);\n }\n console.error(`File download failed for ${fileName}:`, err);\n throw err;\n }\n}\n\nfunction downloadBlob(blob: Blob, fileName: string): void {\n try {\n const blobUrl = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = blobUrl;\n link.download = fileName;\n link.style.display = \"none\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n setTimeout(() => {\n URL.revokeObjectURL(blobUrl);\n }, 100);\n } catch (error) {\n throw new Error(`Blob download failed: ${(error as Error).message}`);\n }\n}\n\nfunction addPrefillFilesToIndex(initialFiles: string[], state: State): void {\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n if (!state.resourceIndex.has(resourceId)) {\n const filename = resourceId.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(resourceId, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n });\n }\n}\n\nfunction handleInitialFileData(\n initial: string,\n fileContainer: HTMLElement,\n pathKey: string,\n fileWrapper: HTMLElement,\n state: State,\n deps: FileDeps,\n): void {\n // Add prefill data to resourceIndex\n if (!state.resourceIndex.has(initial)) {\n const filename = initial.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(initial, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n\n renderFilePreview(fileContainer, initial, state, {\n fileName: initial,\n isReadonly: false,\n deps,\n }).catch(console.error);\n\n // Create hidden input to store the prefilled resource ID\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n hiddenInput.value = initial;\n fileWrapper.appendChild(hiddenInput);\n}\n\nfunction setupFilesDropHandler(\n filesContainer: HTMLElement,\n initialFiles: string[],\n state: State,\n updateCallback: () => void,\n constraints: FileUploadConstraints,\n pathKey?: string,\n instance?: any,\n): void {\n setupDragAndDrop(filesContainer, async (files) => {\n const allFiles = Array.from(files);\n\n // Step 1: filter by extension\n const rejectedByExtension = allFiles.filter(\n (f) => !isFileExtensionAllowed(f.name, constraints.allowedExtensions),\n );\n const afterExtension = allFiles.filter((f) =>\n isFileExtensionAllowed(f.name, constraints.allowedExtensions),\n );\n\n // Step 2: filter by size\n const rejectedBySize = afterExtension.filter(\n (f) => !isFileSizeAllowed(f, constraints.maxSize),\n );\n const validFiles = afterExtension.filter((f) =>\n isFileSizeAllowed(f, constraints.maxSize),\n );\n\n // Step 3: slice by remaining capacity\n const remaining =\n constraints.maxCount === Infinity\n ? validFiles.length\n : Math.max(0, constraints.maxCount - initialFiles.length);\n const arr = validFiles.slice(0, remaining);\n const skippedByCount = validFiles.length - arr.length;\n\n // Build combined error message\n const errorParts: string[] = [];\n if (rejectedByExtension.length > 0) {\n const formats = constraints.allowedExtensions.join(\", \");\n const names = rejectedByExtension.map((f) => f.name).join(\", \");\n errorParts.push(\n t(\"invalidFileExtension\", state, { name: names, formats }),\n );\n }\n if (rejectedBySize.length > 0) {\n const names = rejectedBySize.map((f) => f.name).join(\", \");\n errorParts.push(\n t(\"fileTooLarge\", state, { name: names, maxSize: constraints.maxSize }),\n );\n }\n if (skippedByCount > 0) {\n errorParts.push(\n t(\"filesLimitExceeded\", state, {\n skipped: skippedByCount,\n max: constraints.maxCount,\n }),\n );\n }\n\n if (errorParts.length > 0) {\n showFileError(filesContainer, errorParts.join(\" • \"));\n } else {\n clearFileError(filesContainer);\n }\n\n for (const file of arr) {\n const rid = await uploadSingleFile(file, state);\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file: undefined,\n });\n initialFiles.push(rid);\n }\n updateCallback();\n\n // Trigger onChange after all files are uploaded\n if (instance && pathKey && !state.config.readonly) {\n instance.triggerOnChange(pathKey, initialFiles);\n }\n });\n}\n\nfunction setupFilesPickerHandler(\n filesPicker: HTMLInputElement,\n initialFiles: string[],\n state: State,\n updateCallback: () => void,\n constraints: FileUploadConstraints,\n pathKey?: string,\n instance?: any,\n): void {\n filesPicker.onchange = async () => {\n if (filesPicker.files) {\n const allFiles = Array.from(filesPicker.files);\n\n // Step 1: filter by extension\n const rejectedByExtension = allFiles.filter(\n (f) => !isFileExtensionAllowed(f.name, constraints.allowedExtensions),\n );\n const afterExtension = allFiles.filter((f) =>\n isFileExtensionAllowed(f.name, constraints.allowedExtensions),\n );\n\n // Step 2: filter by size\n const rejectedBySize = afterExtension.filter(\n (f) => !isFileSizeAllowed(f, constraints.maxSize),\n );\n const validFiles = afterExtension.filter((f) =>\n isFileSizeAllowed(f, constraints.maxSize),\n );\n\n // Step 3: slice by remaining capacity\n const remaining =\n constraints.maxCount === Infinity\n ? validFiles.length\n : Math.max(0, constraints.maxCount - initialFiles.length);\n const arr = validFiles.slice(0, remaining);\n const skippedByCount = validFiles.length - arr.length;\n\n // Build combined error message\n const errorParts: string[] = [];\n if (rejectedByExtension.length > 0) {\n const formats = constraints.allowedExtensions.join(\", \");\n const names = rejectedByExtension.map((f) => f.name).join(\", \");\n errorParts.push(\n t(\"invalidFileExtension\", state, { name: names, formats }),\n );\n }\n if (rejectedBySize.length > 0) {\n const names = rejectedBySize.map((f) => f.name).join(\", \");\n errorParts.push(\n t(\"fileTooLarge\", state, {\n name: names,\n maxSize: constraints.maxSize,\n }),\n );\n }\n if (skippedByCount > 0) {\n errorParts.push(\n t(\"filesLimitExceeded\", state, {\n skipped: skippedByCount,\n max: constraints.maxCount,\n }),\n );\n }\n\n const wrapper =\n filesPicker.closest(\".space-y-2\") || filesPicker.parentElement;\n if (errorParts.length > 0 && wrapper) {\n showFileError(wrapper as HTMLElement, errorParts.join(\" • \"));\n } else if (wrapper) {\n clearFileError(wrapper as HTMLElement);\n }\n\n for (const file of arr) {\n const rid = await uploadSingleFile(file, state);\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file: undefined,\n });\n initialFiles.push(rid);\n }\n }\n updateCallback();\n filesPicker.value = \"\";\n\n // Trigger onChange after all files are uploaded\n if (instance && pathKey && !state.config.readonly) {\n instance.triggerOnChange(pathKey, initialFiles);\n }\n };\n}\n\n// Component rendering functions\nexport function renderFileElement(\n element: FileElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n if (state.config.readonly) {\n // Readonly mode: use common preview function\n const initial = ctx.prefill[element.key];\n if (initial) {\n renderFilePreviewReadonly(initial as string, state)\n .then((filePreview) => {\n wrapper.appendChild(filePreview);\n })\n .catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n const emptyState = document.createElement(\"div\");\n emptyState.className =\n \"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\";\n emptyState.innerHTML = `<div class=\"text-center\">${escapeHtml(t(\"previewUnavailable\", state))}</div>`;\n wrapper.appendChild(emptyState);\n });\n } else {\n const emptyState = document.createElement(\"div\");\n emptyState.className =\n \"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\";\n emptyState.innerHTML = `<div class=\"text-center\">${escapeHtml(t(\"noFileSelected\", state))}</div>`;\n wrapper.appendChild(emptyState);\n }\n } else {\n // Edit mode: normal file input\n const fileWrapper = document.createElement(\"div\");\n fileWrapper.className = \"space-y-2\";\n\n const picker = document.createElement(\"input\");\n picker.type = \"file\";\n picker.name = pathKey;\n picker.style.display = \"none\";\n if (element.accept) {\n picker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const fileContainer = document.createElement(\"div\");\n fileContainer.className =\n \"file-preview-container w-full aspect-square max-w-xs bg-gray-100 rounded-lg overflow-hidden relative group cursor-pointer\";\n\n const initial = ctx.prefill[element.key];\n const allowedExts = getAllowedExtensions(element.accept);\n const maxSizeMB = element.maxSize ?? Infinity;\n\n // Set up click and drag handlers\n const fileUploadHandler = () => picker.click();\n const dragHandler = (files: FileList) => {\n if (files.length > 0) {\n const deps = { picker, fileUploadHandler, dragHandler };\n handleFileSelect(\n files[0],\n fileContainer,\n pathKey,\n state,\n deps,\n ctx.instance,\n allowedExts,\n maxSizeMB,\n );\n }\n };\n\n // Handle initial prefill data\n if (initial) {\n handleInitialFileData(\n initial as string,\n fileContainer,\n pathKey,\n fileWrapper,\n state,\n {\n picker,\n fileUploadHandler,\n dragHandler,\n },\n );\n } else {\n const hint = makeFieldHint(element, state);\n setEmptyFileContainer(fileContainer, state, hint);\n }\n\n fileContainer.onclick = fileUploadHandler;\n setupDragAndDrop(fileContainer, dragHandler);\n\n picker.onchange = () => {\n if (picker.files && picker.files.length > 0) {\n const deps = { picker, fileUploadHandler, dragHandler };\n handleFileSelect(\n picker.files[0],\n fileContainer,\n pathKey,\n state,\n deps,\n ctx.instance,\n allowedExts,\n maxSizeMB,\n );\n }\n };\n\n fileWrapper.appendChild(fileContainer);\n fileWrapper.appendChild(picker);\n\n wrapper.appendChild(fileWrapper);\n }\n}\n\nexport function renderFilesElement(\n element: FilesElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n if (state.config.readonly) {\n // Readonly mode: render as results list\n const resultsWrapper = document.createElement(\"div\");\n resultsWrapper.className = \"space-y-4\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n renderFilePreviewReadonly(resourceId, state)\n .then((filePreview) => {\n resultsWrapper.appendChild(filePreview);\n })\n .catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n });\n });\n } else {\n resultsWrapper.innerHTML = `<div class=\"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\"><div class=\"text-center\">${escapeHtml(t(\"noFilesSelected\", state))}</div></div>`;\n }\n\n wrapper.appendChild(resultsWrapper);\n } else {\n // Edit mode: normal files input\n const filesWrapper = document.createElement(\"div\");\n filesWrapper.className = \"space-y-2\";\n\n const filesPicker = document.createElement(\"input\");\n filesPicker.type = \"file\";\n filesPicker.name = pathKey;\n filesPicker.multiple = true;\n filesPicker.style.display = \"none\";\n if (element.accept) {\n filesPicker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const filesContainer = document.createElement(\"div\");\n filesContainer.className =\n \"border-2 border-dashed border-gray-300 rounded-lg p-3 hover:border-gray-400 transition-colors\";\n\n const list = document.createElement(\"div\");\n list.className = \"files-list\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n // Add prefill files to resourceIndex\n addPrefillFilesToIndex(initialFiles, state);\n\n const filesFieldHint = makeFieldHint(element, state);\n const filesConstraints: FileUploadConstraints = {\n maxCount: Infinity,\n allowedExtensions: getAllowedExtensions(element.accept),\n maxSize: element.maxSize ?? Infinity,\n };\n\n function updateFilesList(): void {\n renderResourcePills(\n list,\n initialFiles,\n state,\n (ridToRemove) => {\n const index = initialFiles.indexOf(ridToRemove);\n if (index > -1) {\n initialFiles.splice(index, 1);\n }\n updateFilesList();\n },\n filesFieldHint,\n );\n }\n\n // Initial render\n updateFilesList();\n\n setupFilesDropHandler(\n filesContainer,\n initialFiles,\n state,\n updateFilesList,\n filesConstraints,\n pathKey,\n ctx.instance,\n );\n setupFilesPickerHandler(\n filesPicker,\n initialFiles,\n state,\n updateFilesList,\n filesConstraints,\n pathKey,\n ctx.instance,\n );\n\n filesContainer.appendChild(list);\n filesWrapper.appendChild(filesContainer);\n filesWrapper.appendChild(filesPicker);\n\n wrapper.appendChild(filesWrapper);\n }\n}\n\nexport function renderMultipleFileElement(\n element: FileElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const minFiles = element.minCount ?? 0;\n const maxFiles = element.maxCount ?? Infinity;\n\n if (state.config.readonly) {\n // Readonly mode: render as results list\n const resultsWrapper = document.createElement(\"div\");\n resultsWrapper.className = \"space-y-4\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n renderFilePreviewReadonly(resourceId, state)\n .then((filePreview) => {\n resultsWrapper.appendChild(filePreview);\n })\n .catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n });\n });\n } else {\n resultsWrapper.innerHTML = `<div class=\"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\"><div class=\"text-center\">${escapeHtml(t(\"noFilesSelected\", state))}</div></div>`;\n }\n\n wrapper.appendChild(resultsWrapper);\n } else {\n // Edit mode: multiple file input with min/max validation\n const filesWrapper = document.createElement(\"div\");\n filesWrapper.className = \"space-y-2\";\n\n const filesPicker = document.createElement(\"input\");\n filesPicker.type = \"file\";\n filesPicker.name = pathKey;\n filesPicker.multiple = true;\n filesPicker.style.display = \"none\";\n if (element.accept) {\n filesPicker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const filesContainer = document.createElement(\"div\");\n filesContainer.className = \"files-list space-y-2\";\n\n filesWrapper.appendChild(filesPicker);\n filesWrapper.appendChild(filesContainer);\n\n const initialFiles = Array.isArray(ctx.prefill[element.key])\n ? [...(ctx.prefill[element.key] as string[])]\n : [];\n\n // Add initial files to resource index\n addPrefillFilesToIndex(initialFiles, state);\n\n const multipleFilesHint = makeFieldHint(element, state);\n const multipleConstraints: FileUploadConstraints = {\n maxCount: maxFiles,\n allowedExtensions: getAllowedExtensions(element.accept),\n maxSize: element.maxSize ?? Infinity,\n };\n\n // Build count info string: \"0 файлов (0-10)\"\n const buildCountInfo = (): string => {\n const countText =\n initialFiles.length === 1\n ? t(\"fileCountSingle\", state, { count: initialFiles.length })\n : t(\"fileCountPlural\", state, { count: initialFiles.length });\n const minMaxText =\n minFiles > 0 || maxFiles < Infinity\n ? ` ${t(\"fileCountRange\", state, { min: minFiles, max: maxFiles })}`\n : \"\";\n return countText + minMaxText;\n };\n\n const updateFilesDisplay = (): void => {\n renderResourcePills(\n filesContainer,\n initialFiles,\n state,\n (index) => {\n initialFiles.splice(initialFiles.indexOf(index), 1);\n updateFilesDisplay();\n },\n multipleFilesHint,\n buildCountInfo(),\n );\n };\n\n // Set up drag and drop\n setupFilesDropHandler(\n filesContainer,\n initialFiles,\n state,\n updateFilesDisplay,\n multipleConstraints,\n pathKey,\n ctx.instance,\n );\n\n // Set up file picker\n setupFilesPickerHandler(\n filesPicker,\n initialFiles,\n state,\n updateFilesDisplay,\n multipleConstraints,\n pathKey,\n ctx.instance,\n );\n\n // Initial display\n updateFilesDisplay();\n\n wrapper.appendChild(filesWrapper);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate file field and return extracted value with errors\n */\nexport function validateFileElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation, path } = context;\n\n const isMultipleField =\n element.type === \"files\" ||\n (\"multiple\" in element && Boolean((element as FileElement).multiple));\n\n // Helper to validate file count\n const validateFileCount = (\n key: string,\n resourceIds: string[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n\n const minFiles = \"minCount\" in element ? (element.minCount ?? 0) : 0;\n const maxFiles =\n \"maxCount\" in element ? (element.maxCount ?? Infinity) : Infinity;\n\n if (element.required && resourceIds.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (resourceIds.length < minFiles) {\n errors.push(`${key}: ${t(\"minFiles\", state, { min: minFiles })}`);\n }\n if (resourceIds.length > maxFiles) {\n errors.push(`${key}: ${t(\"maxFiles\", state, { max: maxFiles })}`);\n }\n };\n\n // Helper to validate file extensions for a list of resource IDs\n const validateFileExtensions = (\n key: string,\n resourceIds: string[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n const acceptField =\n \"accept\" in element ? (element as FileElement).accept : undefined;\n const allowedExtensions = getAllowedExtensions(acceptField);\n if (allowedExtensions.length === 0) return;\n const formats = allowedExtensions.join(\", \");\n for (const rid of resourceIds) {\n const meta = state.resourceIndex.get(rid);\n const fileName = meta?.name ?? rid;\n if (!isFileExtensionAllowed(fileName, allowedExtensions)) {\n errors.push(\n `${key}: ${t(\"invalidFileExtension\", state, { name: fileName, formats })}`,\n );\n }\n }\n };\n\n // Helper to validate file sizes for a list of resource IDs\n const validateFileSizes = (\n key: string,\n resourceIds: string[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n const maxSizeMB =\n \"maxSize\" in element ? ((element as FileElement).maxSize ?? Infinity) : Infinity;\n if (maxSizeMB === Infinity) return;\n for (const rid of resourceIds) {\n const meta = state.resourceIndex.get(rid);\n if (!meta) continue;\n if (meta.size > maxSizeMB * 1024 * 1024) {\n errors.push(\n `${key}: ${t(\"fileTooLarge\", state, { name: meta.name, maxSize: maxSizeMB })}`,\n );\n }\n }\n };\n\n if (isMultipleField) {\n // Multiple file fields\n const fullKey = pathJoin(path, key);\n const pickerInput = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"file\"][name=\"${fullKey}\"]`,\n );\n const filesWrapper = pickerInput?.closest(\".space-y-2\");\n const container = filesWrapper?.querySelector(\".files-list\") || null;\n\n const resourceIds: string[] = [];\n if (container) {\n const pills = container.querySelectorAll<HTMLElement>(\".resource-pill\");\n pills.forEach((pill) => {\n const resourceId = pill.dataset.resourceId;\n if (resourceId) {\n resourceIds.push(resourceId);\n }\n });\n }\n\n validateFileCount(key, resourceIds, element);\n validateFileExtensions(key, resourceIds, element);\n validateFileSizes(key, resourceIds, element);\n return { value: resourceIds, errors };\n } else {\n // Single file field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[name$=\"${key}\"][type=\"hidden\"]`,\n );\n const rid = input?.value ?? \"\";\n\n if (!skipValidation && element.required && rid === \"\") {\n errors.push(`${key}: ${t(\"required\", context.state)}`);\n return { value: null, errors };\n }\n\n if (!skipValidation && rid !== \"\") {\n validateFileExtensions(key, [rid], element);\n validateFileSizes(key, [rid], element);\n }\n\n return { value: rid || null, errors };\n }\n}\n\n/**\n * Update file field value in DOM without re-render\n */\nexport function updateFileField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot, state } = context;\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple file fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateFileField: Expected array for multiple file field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update resource IDs in state\n value.forEach((resourceId) => {\n if (resourceId && typeof resourceId === \"string\") {\n if (!state.resourceIndex.has(resourceId)) {\n const filename = resourceId.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(resourceId, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n }\n });\n\n // Note: Updating the file previews would require re-rendering\n console.info(\n `updateFileField: Multiple file field \"${fieldPath}\" updated. Preview update requires re-render.`,\n );\n } else {\n // Single file field\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `input[name=\"${fieldPath}\"][type=\"hidden\"]`,\n );\n\n if (!hiddenInput) {\n console.warn(\n `updateFileField: Hidden input not found for file field \"${fieldPath}\"`,\n );\n return;\n }\n\n // Update hidden input value\n hiddenInput.value = value != null ? String(value) : \"\";\n\n // If value is a resource ID, update the resource index\n if (value && typeof value === \"string\") {\n if (!state.resourceIndex.has(value)) {\n // Add to resource index if not present\n const filename = value.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(value, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n\n // Note: Updating the file preview would require re-rendering\n // This method only updates the underlying data\n console.info(\n `updateFileField: File field \"${fieldPath}\" updated. Preview update requires re-render.`,\n );\n }\n }\n}\n","// Colour component rendering, validation, and update functions\n\nimport type {\n BaseElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { t } from \"../utils/translation.js\";\n\nexport interface ColourElement extends BaseElement {\n type: \"colour\";\n placeholder?: string;\n multiple?: boolean;\n minCount?: number;\n maxCount?: number;\n}\n\n/**\n * Normalize colour value to uppercase hex format (#RRGGBB)\n * HTML color input always returns lowercase, we standardize to uppercase\n */\nfunction normalizeColourValue(value: string): string {\n if (!value) return \"#000000\";\n return value.toUpperCase();\n}\n\n/**\n * Validate hex colour format (#RRGGBB or #RGB)\n */\nfunction isValidHexColour(value: string): boolean {\n return /^#[0-9A-F]{6}$/i.test(value) || /^#[0-9A-F]{3}$/i.test(value);\n}\n\n/**\n * Convert 3-digit hex to 6-digit hex (#RGB → #RRGGBB)\n */\nfunction expandHexColour(value: string): string {\n if (/^#[0-9A-F]{3}$/i.test(value)) {\n const r = value[1];\n const g = value[2];\n const b = value[3];\n return `#${r}${r}${g}${g}${b}${b}`.toUpperCase();\n }\n return value.toUpperCase();\n}\n\n/**\n * Create readonly colour UI (swatch + hex text)\n * Shared helper to eliminate duplication between single and multiple modes\n */\nfunction createReadonlyColourUI(value: string): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.className = \"flex items-center gap-2\";\n\n const normalizedValue = normalizeColourValue(value);\n\n const swatch = document.createElement(\"div\");\n swatch.style.cssText = `\n width: 32px;\n height: 32px;\n border-radius: var(--fb-border-radius);\n border: var(--fb-border-width) solid var(--fb-border-color);\n background-color: ${normalizedValue};\n `;\n\n const hexText = document.createElement(\"span\");\n hexText.style.cssText = `\n font-size: var(--fb-font-size);\n color: var(--fb-text-color);\n font-family: var(--fb-font-family-mono, monospace);\n `;\n hexText.textContent = normalizedValue;\n\n container.appendChild(swatch);\n container.appendChild(hexText);\n\n return container;\n}\n\n/**\n * Create edit mode colour picker UI (swatch + hex input + hidden colour picker)\n * Shared helper to eliminate duplication between single and multiple modes\n */\nfunction createEditColourUI(\n value: string,\n pathKey: string,\n ctx: RenderContext,\n): HTMLDivElement {\n const normalizedValue = normalizeColourValue(value);\n\n const pickerWrapper = document.createElement(\"div\");\n pickerWrapper.className = \"colour-picker-wrapper\";\n pickerWrapper.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n `;\n\n // Colour swatch preview\n const swatch = document.createElement(\"div\");\n swatch.className = \"colour-swatch\";\n swatch.style.cssText = `\n width: 40px;\n height: 40px;\n border-radius: var(--fb-border-radius);\n border: var(--fb-border-width) solid var(--fb-border-color);\n background-color: ${normalizedValue};\n cursor: pointer;\n transition: border-color var(--fb-transition-duration) ease-in-out;\n flex-shrink: 0;\n `;\n\n // Hex value text input\n const hexInput = document.createElement(\"input\");\n hexInput.type = \"text\";\n hexInput.className = \"colour-hex-input\";\n hexInput.name = pathKey;\n hexInput.value = normalizedValue;\n hexInput.placeholder = \"#000000\";\n hexInput.style.cssText = `\n width: 100px;\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: var(--fb-background-color);\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family-mono, monospace);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n\n // Hidden native colour picker\n const colourInput = document.createElement(\"input\");\n colourInput.type = \"color\";\n colourInput.className = \"colour-picker-hidden\";\n colourInput.value = normalizedValue.toLowerCase();\n colourInput.style.cssText = `\n position: absolute;\n opacity: 0;\n pointer-events: none;\n `;\n\n // Event handlers for hex input\n hexInput.addEventListener(\"input\", () => {\n const inputValue = hexInput.value.trim();\n if (isValidHexColour(inputValue)) {\n const expanded = expandHexColour(inputValue);\n swatch.style.backgroundColor = expanded;\n colourInput.value = expanded.toLowerCase();\n hexInput.classList.remove(\"invalid\");\n\n if (ctx.instance) {\n ctx.instance.triggerOnChange(pathKey, expanded);\n }\n } else {\n hexInput.classList.add(\"invalid\");\n }\n });\n\n hexInput.addEventListener(\"blur\", () => {\n const inputValue = hexInput.value.trim();\n if (isValidHexColour(inputValue)) {\n const expanded = expandHexColour(inputValue);\n hexInput.value = expanded;\n swatch.style.backgroundColor = expanded;\n colourInput.value = expanded.toLowerCase();\n hexInput.classList.remove(\"invalid\");\n }\n });\n\n // Event handlers for native colour picker\n colourInput.addEventListener(\"change\", () => {\n const normalized = normalizeColourValue(colourInput.value);\n hexInput.value = normalized;\n swatch.style.backgroundColor = normalized;\n\n if (ctx.instance) {\n ctx.instance.triggerOnChange(pathKey, normalized);\n }\n });\n\n // Swatch click - trigger native colour picker\n swatch.addEventListener(\"click\", () => {\n colourInput.click();\n });\n\n // Hover effects for swatch\n swatch.addEventListener(\"mouseenter\", () => {\n swatch.style.borderColor = \"var(--fb-border-hover-color)\";\n });\n swatch.addEventListener(\"mouseleave\", () => {\n swatch.style.borderColor = \"var(--fb-border-color)\";\n });\n\n // Focus styles for hex input\n hexInput.addEventListener(\"focus\", () => {\n hexInput.style.borderColor = \"var(--fb-border-focus-color)\";\n hexInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n hexInput.style.outlineOffset = \"0\";\n });\n hexInput.addEventListener(\"blur\", () => {\n hexInput.style.borderColor = \"var(--fb-border-color)\";\n hexInput.style.outline = \"none\";\n });\n hexInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== hexInput) {\n hexInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n hexInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== hexInput) {\n hexInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n\n // Assemble the composite picker\n pickerWrapper.appendChild(swatch);\n pickerWrapper.appendChild(hexInput);\n pickerWrapper.appendChild(colourInput);\n\n return pickerWrapper;\n}\n\nexport function renderColourElement(\n element: ColourElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const initialValue =\n (ctx.prefill[element.key] as string) || element.default || \"#000000\";\n\n if (state.config.readonly) {\n // Readonly mode: use shared helper\n const readonlyUI = createReadonlyColourUI(initialValue);\n wrapper.appendChild(readonlyUI);\n } else {\n // Edit mode: use shared helper\n const editUI = createEditColourUI(initialValue, pathKey, ctx);\n wrapper.appendChild(editUI);\n }\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const colourHint = document.createElement(\"p\");\n colourHint.className = \"mt-1\";\n colourHint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n colourHint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(colourHint);\n }\n}\n\nexport function renderMultipleColourElement(\n element: ColourElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"#000000\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-colour-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addColourItem(\n value: string = \"#000000\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-colour-item flex items-center gap-2\";\n\n if (state.config.readonly) {\n // Readonly mode: use shared helper\n const readonlyUI = createReadonlyColourUI(value);\n // Extract children from readonlyUI to add to itemWrapper\n while (readonlyUI.firstChild) {\n itemWrapper.appendChild(readonlyUI.firstChild);\n }\n } else {\n // Edit mode: use shared helper\n // For multiple mode, we need to pass a temporary pathKey that will be updated by updateIndices\n const tempPathKey = `${pathKey}[${container.children.length}]`;\n const editUI = createEditColourUI(value, tempPathKey, ctx);\n // Add flex: 1 to the wrapper for multiple mode layout\n editUI.style.flex = \"1\";\n itemWrapper.appendChild(editUI);\n }\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-colour-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-colour-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n const defaultColour = element.default || \"#000000\";\n values.push(defaultColour);\n addColourItem(defaultColour);\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-colour-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addColourItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"mt-1\";\n hint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate colour input field and return extracted value with errors\n */\nexport function validateColourElement(\n element: ColourElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate colour value\n const validateColourValue = (\n input: HTMLInputElement,\n val: string,\n fieldKey: string,\n ): string => {\n const { state } = context;\n if (!val) {\n if (!skipValidation && element.required) {\n const msg = t(\"required\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n return \"\";\n }\n markValidity(input, null);\n return \"\";\n }\n\n const normalized = normalizeColourValue(val);\n if (!skipValidation && !isValidHexColour(normalized)) {\n const msg = t(\"invalidHexColour\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n return val;\n }\n\n markValidity(input, null);\n return normalized;\n };\n\n if (element.multiple) {\n // Multiple colour fields (array)\n // Look for hex input fields for this specific field (by name pattern)\n const hexInputs =\n scopeRoot.querySelectorAll<HTMLInputElement>(`[name^=\"${key}[\"].colour-hex-input`);\n const values: string[] = [];\n\n hexInputs.forEach((input, index) => {\n const val = input?.value ?? \"\";\n const validated = validateColourValue(input, val, `${key}[${index}]`);\n values.push(validated);\n });\n\n // Validate count\n if (!skipValidation) {\n const { state } = context;\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v !== \"\");\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single colour field\n // Look for hex input field (text input with class colour-hex-input)\n const hexInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${key}\"].colour-hex-input`,\n );\n const val = hexInput?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n const msg = t(\"required\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(hexInput, msg);\n return { value: \"\", errors };\n }\n\n const validated = validateColourValue(hexInput!, val, key);\n return { value: validated, errors };\n }\n}\n\n/**\n * Update colour field value in DOM without re-render\n */\nexport function updateColourField(\n element: ColourElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple colour fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateColourField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const hexInputs =\n scopeRoot.querySelectorAll<HTMLInputElement>(`[name^=\"${fieldPath}[\"].colour-hex-input`);\n\n hexInputs.forEach((hexInput, index) => {\n if (index < value.length) {\n const normalized = normalizeColourValue(value[index]);\n hexInput.value = normalized;\n hexInput.classList.remove(\"invalid\");\n hexInput.title = \"\";\n\n // Update swatch and hidden colour input\n const wrapper = hexInput.closest(\".colour-picker-wrapper\");\n if (wrapper) {\n const swatch = wrapper.querySelector<HTMLElement>(\".colour-swatch\");\n const colourInput = wrapper.querySelector<HTMLInputElement>(\n \".colour-picker-hidden\",\n );\n if (swatch) {\n swatch.style.backgroundColor = normalized;\n }\n if (colourInput) {\n colourInput.value = normalized.toLowerCase();\n }\n }\n }\n });\n\n if (value.length !== hexInputs.length) {\n console.warn(\n `updateColourField: Multiple field \"${fieldPath}\" has ${hexInputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single colour field\n const hexInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"].colour-hex-input`,\n );\n if (hexInput) {\n const normalized = normalizeColourValue(value);\n hexInput.value = normalized;\n hexInput.classList.remove(\"invalid\");\n hexInput.title = \"\";\n\n // Update swatch and hidden colour input\n const wrapper = hexInput.closest(\".colour-picker-wrapper\");\n if (wrapper) {\n const swatch = wrapper.querySelector<HTMLElement>(\".colour-swatch\");\n const colourInput = wrapper.querySelector<HTMLInputElement>(\n \".colour-picker-hidden\",\n );\n if (swatch) {\n swatch.style.backgroundColor = normalized;\n }\n if (colourInput) {\n colourInput.value = normalized.toLowerCase();\n }\n }\n }\n }\n}\n","// Slider component rendering, validation, and update functions\n\nimport type {\n SliderElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { t } from \"../utils/translation.js\";\n\n/**\n * Convert position (0-1) to exponential value\n * Useful for values like volume, frequency that span orders of magnitude\n */\nfunction positionToExponential(\n position: number,\n min: number,\n max: number,\n): number {\n if (min <= 0) {\n throw new Error(\"Exponential scale requires min > 0\");\n }\n const logMin = Math.log(min);\n const logMax = Math.log(max);\n return Math.exp(logMin + position * (logMax - logMin));\n}\n\n/**\n * Convert exponential value to position (0-1)\n */\nfunction exponentialToPosition(\n value: number,\n min: number,\n max: number,\n): number {\n if (min <= 0) {\n throw new Error(\"Exponential scale requires min > 0\");\n }\n const logMin = Math.log(min);\n const logMax = Math.log(max);\n const logValue = Math.log(value);\n return (logValue - logMin) / (logMax - logMin);\n}\n\n/**\n * Align value to step\n */\nfunction alignToStep(value: number, step: number): number {\n return Math.round(value / step) * step;\n}\n\n/**\n * Create slider UI with value display\n */\nfunction createSliderUI(\n value: number,\n pathKey: string,\n element: SliderElement,\n ctx: RenderContext,\n readonly: boolean,\n): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.className = \"slider-container\";\n\n // Main row: slider section + value display\n const mainRow = document.createElement(\"div\");\n mainRow.className = \"flex items-start gap-3\";\n\n // Slider section (track + labels)\n const sliderSection = document.createElement(\"div\");\n sliderSection.className = \"flex-1\";\n\n // HTML5 range input\n const slider = document.createElement(\"input\");\n slider.type = \"range\";\n slider.name = pathKey;\n slider.className = \"slider-input w-full\";\n slider.disabled = readonly;\n\n // For exponential scale, we use 0-1000 internal steps for smooth control\n const scale = element.scale || \"linear\";\n const min = element.min;\n const max = element.max;\n const step = element.step ?? 1;\n\n if (scale === \"exponential\") {\n // Validate min > 0 for exponential scale\n if (min <= 0) {\n throw new Error(\n `Slider \"${element.key}\": exponential scale requires min > 0 (got ${min})`,\n );\n }\n // Internal range 0-1000 for smooth exponential control\n slider.min = \"0\";\n slider.max = \"1000\";\n slider.step = \"1\";\n const position = exponentialToPosition(value, min, max);\n slider.value = (position * 1000).toString();\n } else {\n // Linear scale - direct mapping\n slider.min = min.toString();\n slider.max = max.toString();\n slider.step = step.toString();\n slider.value = value.toString();\n }\n\n // Styling for slider\n slider.style.cssText = `\n height: 6px;\n border-radius: 3px;\n background: linear-gradient(\n to right,\n var(--fb-primary-color) 0%,\n var(--fb-primary-color) ${((value - min) / (max - min)) * 100}%,\n var(--fb-border-color) ${((value - min) / (max - min)) * 100}%,\n var(--fb-border-color) 100%\n );\n outline: none;\n transition: background 0.1s ease-in-out;\n cursor: ${readonly ? \"not-allowed\" : \"pointer\"};\n opacity: ${readonly ? \"0.6\" : \"1\"};\n `;\n\n // Add slider to section\n sliderSection.appendChild(slider);\n\n // Min/max labels under the slider track\n const labelsRow = document.createElement(\"div\");\n labelsRow.className = \"flex justify-between\";\n labelsRow.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n margin-top: 4px;\n `;\n\n const minLabel = document.createElement(\"span\");\n minLabel.textContent = min.toString();\n const maxLabel = document.createElement(\"span\");\n maxLabel.textContent = max.toString();\n\n labelsRow.appendChild(minLabel);\n labelsRow.appendChild(maxLabel);\n sliderSection.appendChild(labelsRow);\n\n // Value display (separate from slider section)\n const valueDisplay = document.createElement(\"span\");\n valueDisplay.className = \"slider-value\";\n valueDisplay.style.cssText = `\n min-width: 60px;\n text-align: right;\n font-size: var(--fb-font-size);\n color: var(--fb-text-color);\n font-family: var(--fb-font-family-mono, monospace);\n font-weight: 500;\n padding-top: 2px;\n `;\n valueDisplay.textContent = value.toFixed(step < 1 ? 2 : 0);\n\n mainRow.appendChild(sliderSection);\n mainRow.appendChild(valueDisplay);\n container.appendChild(mainRow);\n\n // Event handlers for edit mode\n if (!readonly) {\n const updateValue = () => {\n let displayValue: number;\n\n if (scale === \"exponential\") {\n const position = parseFloat(slider.value) / 1000;\n displayValue = positionToExponential(position, min, max);\n displayValue = alignToStep(displayValue, step);\n // Clamp to min/max\n displayValue = Math.max(min, Math.min(max, displayValue));\n } else {\n displayValue = parseFloat(slider.value);\n displayValue = alignToStep(displayValue, step);\n }\n\n valueDisplay.textContent = displayValue.toFixed(step < 1 ? 2 : 0);\n\n // Update background gradient\n const percentage = ((displayValue - min) / (max - min)) * 100;\n slider.style.background = `linear-gradient(\n to right,\n var(--fb-primary-color) 0%,\n var(--fb-primary-color) ${percentage}%,\n var(--fb-border-color) ${percentage}%,\n var(--fb-border-color) 100%\n )`;\n\n // Trigger onChange event\n if (ctx.instance) {\n ctx.instance.triggerOnChange(pathKey, displayValue);\n }\n };\n\n slider.addEventListener(\"input\", updateValue);\n slider.addEventListener(\"change\", updateValue);\n }\n\n return container;\n}\n\nexport function renderSliderElement(\n element: SliderElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Validate required properties (FAIL FAST)\n if (element.min === undefined || element.min === null) {\n throw new Error(`Slider field \"${element.key}\" requires \"min\" property`);\n }\n if (element.max === undefined || element.max === null) {\n throw new Error(`Slider field \"${element.key}\" requires \"max\" property`);\n }\n if (element.min >= element.max) {\n throw new Error(\n `Slider field \"${element.key}\": min (${element.min}) must be less than max (${element.max})`,\n );\n }\n\n const state = ctx.state;\n const defaultValue =\n element.default !== undefined\n ? element.default\n : (element.min + element.max) / 2;\n const initialValue = (ctx.prefill[element.key] as number) ?? defaultValue;\n\n const sliderUI = createSliderUI(\n initialValue,\n pathKey,\n element,\n ctx,\n state.config.readonly,\n );\n wrapper.appendChild(sliderUI);\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"mt-1\";\n hint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\nexport function renderMultipleSliderElement(\n element: SliderElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Validate required properties (FAIL FAST)\n if (element.min === undefined || element.min === null) {\n throw new Error(`Slider field \"${element.key}\" requires \"min\" property`);\n }\n if (element.max === undefined || element.max === null) {\n throw new Error(`Slider field \"${element.key}\" requires \"max\" property`);\n }\n if (element.min >= element.max) {\n throw new Error(\n `Slider field \"${element.key}\": min (${element.min}) must be less than max (${element.max})`,\n );\n }\n\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n const defaultValue =\n element.default !== undefined\n ? element.default\n : (element.min + element.max) / 2;\n\n while (values.length < minCount) {\n values.push(defaultValue);\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-3\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-slider-item\");\n items.forEach((item, index) => {\n const slider = item.querySelector(\"input[type=range]\");\n if (slider) {\n slider.setAttribute(\"name\", `${pathKey}[${index}]`);\n }\n });\n }\n\n function addSliderItem(\n value: number = defaultValue,\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-slider-item flex items-start gap-2\";\n\n // Create slider UI\n const tempPathKey = `${pathKey}[${container.children.length}]`;\n const sliderUI = createSliderUI(\n value,\n tempPathKey,\n element,\n ctx,\n state.config.readonly,\n );\n sliderUI.style.flex = \"1\";\n itemWrapper.appendChild(sliderUI);\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-slider-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n margin-top: 8px;\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-slider-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(defaultValue);\n addSliderItem(defaultValue);\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-slider-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addSliderItem(value as number));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"mt-1\";\n hint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate slider input field and return extracted value with errors\n */\nexport function validateSliderElement(\n element: SliderElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Validate schema properties (FAIL FAST)\n if (element.min === undefined || element.min === null) {\n throw new Error(\n `Slider validation: field \"${key}\" requires \"min\" property`,\n );\n }\n if (element.max === undefined || element.max === null) {\n throw new Error(\n `Slider validation: field \"${key}\" requires \"max\" property`,\n );\n }\n\n const min = element.min;\n const max = element.max;\n const step = element.step ?? 1;\n const scale = element.scale || \"linear\";\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n // Insert error after the slider container\n const sliderContainer = input.closest(\".slider-container\");\n if (sliderContainer && sliderContainer.nextSibling) {\n sliderContainer.parentNode?.insertBefore(\n errorElement,\n sliderContainer.nextSibling,\n );\n } else if (sliderContainer) {\n sliderContainer.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to extract and validate slider value\n const validateSliderValue = (\n slider: HTMLInputElement,\n fieldKey: string,\n ): number | null => {\n const { state } = context;\n const rawValue = slider.value;\n if (!rawValue) {\n if (!skipValidation && element.required) {\n const msg = t(\"required\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(slider, msg);\n return null;\n }\n markValidity(slider, null);\n return null;\n }\n\n let value: number;\n\n if (scale === \"exponential\") {\n const position = parseFloat(rawValue) / 1000;\n value = positionToExponential(position, min, max);\n value = alignToStep(value, step);\n } else {\n value = parseFloat(rawValue);\n value = alignToStep(value, step);\n }\n\n // Validate range\n if (!skipValidation) {\n if (value < min) {\n const msg = t(\"minValue\", state, { min });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(slider, msg);\n return value;\n }\n if (value > max) {\n const msg = t(\"maxValue\", state, { max });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(slider, msg);\n return value;\n }\n }\n\n markValidity(slider, null);\n return value;\n };\n\n if (element.multiple) {\n // Multiple slider fields (array)\n const sliders = scopeRoot.querySelectorAll<HTMLInputElement>(\n `input[type=\"range\"][name^=\"${key}[\"]`,\n );\n const values: (number | null)[] = [];\n\n sliders.forEach((slider, index) => {\n const value = validateSliderValue(slider, `${key}[${index}]`);\n values.push(value);\n });\n\n // Validate count\n if (!skipValidation) {\n const { state } = context;\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v !== null);\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single slider field\n const slider = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"range\"][name=\"${key}\"]`,\n );\n\n if (!slider) {\n if (!skipValidation && element.required) {\n errors.push(`${key}: ${t(\"required\", context.state)}`);\n }\n return { value: null, errors };\n }\n\n const value = validateSliderValue(slider, key);\n return { value, errors };\n }\n}\n\n/**\n * Update slider field value in DOM without re-render\n */\nexport function updateSliderField(\n element: SliderElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n const min = element.min;\n const max = element.max;\n const step = element.step ?? 1;\n const scale = element.scale || \"linear\";\n\n if (element.multiple) {\n // Multiple slider fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateSliderField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const sliders = scopeRoot.querySelectorAll<HTMLInputElement>(\n `input[type=\"range\"][name^=\"${fieldPath}[\"]`,\n );\n\n sliders.forEach((slider, index) => {\n if (index < value.length && value[index] !== null) {\n const numValue = Number(value[index]);\n\n if (scale === \"exponential\") {\n const position = exponentialToPosition(numValue, min, max);\n slider.value = (position * 1000).toString();\n } else {\n slider.value = numValue.toString();\n }\n\n // Update value display\n const sliderContainer = slider.closest(\".slider-container\");\n if (sliderContainer) {\n const valueDisplay = sliderContainer.querySelector(\".slider-value\");\n if (valueDisplay) {\n valueDisplay.textContent = numValue.toFixed(step < 1 ? 2 : 0);\n }\n\n // Update background gradient\n const percentage = ((numValue - min) / (max - min)) * 100;\n slider.style.background = `linear-gradient(\n to right,\n var(--fb-primary-color) 0%,\n var(--fb-primary-color) ${percentage}%,\n var(--fb-border-color) ${percentage}%,\n var(--fb-border-color) 100%\n )`;\n }\n\n slider.classList.remove(\"invalid\");\n slider.title = \"\";\n }\n });\n\n if (value.length !== sliders.length) {\n console.warn(\n `updateSliderField: Multiple field \"${fieldPath}\" has ${sliders.length} sliders but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single slider field\n const slider = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"range\"][name=\"${fieldPath}\"]`,\n );\n\n if (slider && value !== null && value !== undefined) {\n const numValue = Number(value);\n\n if (scale === \"exponential\") {\n const position = exponentialToPosition(numValue, min, max);\n slider.value = (position * 1000).toString();\n } else {\n slider.value = numValue.toString();\n }\n\n // Update value display\n const sliderContainer = slider.closest(\".slider-container\");\n if (sliderContainer) {\n const valueDisplay = sliderContainer.querySelector(\".slider-value\");\n if (valueDisplay) {\n valueDisplay.textContent = numValue.toFixed(step < 1 ? 2 : 0);\n }\n\n // Update background gradient\n const percentage = ((numValue - min) / (max - min)) * 100;\n slider.style.background = `linear-gradient(\n to right,\n var(--fb-primary-color) 0%,\n var(--fb-primary-color) ${percentage}%,\n var(--fb-border-color) ${percentage}%,\n var(--fb-border-color) 100%\n )`;\n }\n\n slider.classList.remove(\"invalid\");\n slider.title = \"\";\n }\n }\n}\n","// Container component rendering functions\n\nimport type {\n ContainerElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { pathJoin, isPlainObject } from \"../utils/helpers.js\";\nimport { evaluateEnableCondition } from \"../utils/enable-conditions.js\";\nimport { t } from \"../utils/translation.js\";\n\n/**\n * Extract default values from container child elements.\n * Used to pre-populate prefill context for enableIf evaluation.\n */\nfunction extractChildDefaults(elements: Element[]): Record<string, any> {\n const defaults: Record<string, any> = {};\n for (const child of elements) {\n if (\"default\" in child && child.default !== undefined) {\n defaults[child.key] = child.default;\n }\n }\n return defaults;\n}\n\n/**\n * Merge defaults with prefill data, giving precedence to prefill values.\n */\nfunction mergeWithDefaults(\n prefill: Record<string, any>,\n defaults: Record<string, any>,\n): Record<string, any> {\n return { ...defaults, ...prefill };\n}\n\n// Helper: Extract current root-level form data from DOM\nfunction extractRootFormData(formRoot: HTMLElement): Record<string, any> {\n const data: Record<string, any> = {};\n\n // Get all root-level inputs (inputs not inside containers)\n const inputs = formRoot.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n 'input, select, textarea'\n );\n\n inputs.forEach(input => {\n const fieldName = input.getAttribute('name');\n if (fieldName && !fieldName.includes('[') && !fieldName.includes('.')) {\n // Root-level field (no array indices or dots in name)\n if (input instanceof HTMLSelectElement) {\n data[fieldName] = input.value;\n } else if (input instanceof HTMLInputElement) {\n if (input.type === 'checkbox') {\n data[fieldName] = input.checked;\n } else if (input.type === 'radio') {\n if (input.checked) {\n data[fieldName] = input.value;\n }\n } else {\n data[fieldName] = input.value;\n }\n } else if (input instanceof HTMLTextAreaElement) {\n data[fieldName] = input.value;\n }\n }\n });\n\n return data;\n}\n\n// Forward declaration - will be imported from components/index.ts\n// This creates a circular dependency that will be resolved at runtime\nlet renderElementFunc:\n | ((element: any, ctx: RenderContext) => HTMLElement)\n | null = null;\n\n// Export setter for renderElement function (called from components/index.ts)\nexport function setRenderElement(\n fn: (element: any, ctx: RenderContext) => HTMLElement,\n): void {\n renderElementFunc = fn;\n}\n\nfunction renderElement(element: any, ctx: RenderContext): HTMLElement {\n if (!renderElementFunc) {\n throw new Error(\n \"renderElement not initialized. Import from components/index.ts\",\n );\n }\n return renderElementFunc(element, ctx);\n}\n\n/**\n * Render prefill hints chips under container title (edit mode only)\n * Returns the hints container element to be inserted at appropriate position\n */\nfunction createPrefillHints(\n element: ContainerElement,\n pathKey: string,\n): HTMLElement | null {\n if (!element.prefillHints || element.prefillHints.length === 0) {\n return null;\n }\n\n const hintsContainer = document.createElement(\"div\");\n hintsContainer.className = \"fb-prefill-hints flex flex-wrap gap-2 mb-4\";\n\n element.prefillHints.forEach((hint, index) => {\n const hintButton = document.createElement(\"button\");\n hintButton.type = \"button\";\n hintButton.className = \"fb-prefill-hint\";\n hintButton.textContent = hint.label;\n\n // Store hint data as JSON in data attribute\n hintButton.setAttribute(\"data-hint-values\", JSON.stringify(hint.values));\n hintButton.setAttribute(\"data-container-key\", pathKey);\n hintButton.setAttribute(\"data-hint-index\", String(index));\n\n hintsContainer.appendChild(hintButton);\n });\n\n return hintsContainer;\n}\n\nexport function renderSingleContainerElement(\n element: ContainerElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Container wrapper (label is already added outside by renderElement)\n const containerWrap = document.createElement(\"div\");\n containerWrap.className = \"border border-gray-200 rounded-lg p-4 bg-gray-50\";\n containerWrap.setAttribute(\"data-container\", pathKey);\n\n const itemsWrap = document.createElement(\"div\");\n const columns = element.columns || 1;\n if (columns === 1) {\n itemsWrap.className = \"space-y-4\"; // Vertical layout (default)\n } else {\n itemsWrap.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n // Render prefill hints BEFORE items (edit mode only)\n if (!ctx.state.config.readonly) {\n const hintsElement = createPrefillHints(element, pathKey);\n if (hintsElement) {\n containerWrap.appendChild(hintsElement);\n }\n }\n\n // Single object container\n // Extract defaults from child elements for enableIf evaluation\n const childDefaults = extractChildDefaults(element.elements);\n const containerPrefill = (ctx.prefill?.[element.key] as Record<string, any>) || {};\n const mergedPrefill = mergeWithDefaults(containerPrefill, childDefaults);\n\n const subCtx: RenderContext = {\n path: pathJoin(ctx.path, element.key),\n prefill: mergedPrefill, // Merged prefill with defaults for enableIf evaluation\n formData: ctx.formData ?? ctx.prefill, // Complete root data for enableIf evaluation\n state: ctx.state,\n };\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n itemsWrap.appendChild(renderElement(child, subCtx));\n }\n });\n containerWrap.appendChild(itemsWrap);\n\n wrapper.appendChild(containerWrap);\n}\n\nexport function renderMultipleContainerElement(\n element: ContainerElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n _pathKey: string,\n): void {\n const state = ctx.state;\n // Container wrapper (label is already added outside by renderElement)\n const containerWrap = document.createElement(\"div\");\n containerWrap.className = \"border border-gray-200 rounded-lg p-4 bg-gray-50\";\n\n // Count indicator (will be placed next to add button)\n const countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n const itemsWrap = document.createElement(\"div\");\n itemsWrap.className = \"space-y-4\";\n\n // Render prefill hints AFTER header but BEFORE items (edit mode only)\n if (!ctx.state.config.readonly) {\n const hintsElement = createPrefillHints(element, element.key);\n if (hintsElement) {\n containerWrap.appendChild(hintsElement);\n }\n }\n\n const min = element.minCount ?? 0;\n const max = element.maxCount ?? Infinity;\n const pre = Array.isArray(ctx.prefill?.[element.key])\n ? (ctx.prefill[element.key] as Array<Record<string, any>>)\n : null;\n\n // Extract defaults from child elements once for reuse in all rendering paths\n const childDefaults = extractChildDefaults(element.elements);\n\n const countItems = (): number =>\n itemsWrap.querySelectorAll(\":scope > .containerItem\").length;\n\n const createAddButton = (): HTMLButtonElement => {\n const add = document.createElement(\"button\");\n add.type = \"button\";\n add.className = \"add-container-btn px-3 py-1 rounded\";\n add.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n add.textContent = \"+\";\n add.addEventListener(\"mouseenter\", () => {\n add.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n add.addEventListener(\"mouseleave\", () => {\n add.style.backgroundColor = \"transparent\";\n });\n add.onclick = () => {\n if (countItems() < max) {\n const idx = countItems();\n // Extract current form data from DOM for enableIf evaluation\n const currentFormData = state.formRoot ? extractRootFormData(state.formRoot) : {};\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: childDefaults, // Defaults for enableIf evaluation\n formData: currentFormData, // Current root data from DOM for enableIf\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n // Create child wrapper with column layout support\n const childWrapper = document.createElement(\"div\");\n const columns = element.columns || 1;\n if (columns === 1) {\n childWrapper.className = \"space-y-4\"; // Vertical layout (default)\n } else {\n childWrapper.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n childWrapper.appendChild(renderElement(child, subCtx));\n }\n });\n\n item.appendChild(childWrapper);\n\n // Only add remove button in edit mode\n if (!state.config.readonly) {\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className = \"absolute top-2 right-2 px-2 py-1 rounded\";\n rem.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n rem.textContent = \"✕\";\n rem.addEventListener(\"mouseenter\", () => {\n rem.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n rem.addEventListener(\"mouseleave\", () => {\n rem.style.backgroundColor = \"transparent\";\n });\n rem.onclick = () => handleRemoveItem(item);\n item.style.position = \"relative\";\n item.appendChild(rem);\n }\n\n itemsWrap.appendChild(item);\n updateAddButton();\n }\n };\n return add;\n };\n\n const updateAddButton = (): void => {\n const currentCount = countItems();\n const existingAddBtn = containerWrap.querySelector(\n \".add-container-btn\",\n ) as HTMLButtonElement;\n if (existingAddBtn) {\n existingAddBtn.disabled = currentCount >= max;\n existingAddBtn.style.opacity = currentCount >= max ? \"0.5\" : \"1\";\n existingAddBtn.style.pointerEvents =\n currentCount >= max ? \"none\" : \"auto\";\n }\n countDisplay.textContent = `${currentCount}/${max === Infinity ? \"∞\" : max}`;\n };\n\n const handleRemoveItem = (item: HTMLElement): void => {\n item.remove();\n updateAddButton();\n };\n\n // Pre-fill initial items\n if (pre && Array.isArray(pre)) {\n pre.forEach((prefillObj, idx) => {\n // Merge defaults with prefill data (prefill takes precedence)\n const mergedPrefill = mergeWithDefaults(prefillObj || {}, childDefaults);\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: mergedPrefill, // Merged prefill with defaults for enableIf\n formData: ctx.formData ?? ctx.prefill, // Complete root data for enableIf\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n // Create child wrapper with column layout support\n const childWrapper = document.createElement(\"div\");\n const columns = element.columns || 1;\n if (columns === 1) {\n childWrapper.className = \"space-y-4\"; // Vertical layout (default)\n } else {\n childWrapper.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n childWrapper.appendChild(renderElement(child, subCtx));\n }\n });\n\n item.appendChild(childWrapper);\n\n // Only add remove button in edit mode\n if (!state.config.readonly) {\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className = \"absolute top-2 right-2 px-2 py-1 rounded\";\n rem.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n rem.textContent = \"✕\";\n rem.addEventListener(\"mouseenter\", () => {\n rem.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n rem.addEventListener(\"mouseleave\", () => {\n rem.style.backgroundColor = \"transparent\";\n });\n rem.onclick = () => handleRemoveItem(item);\n item.style.position = \"relative\";\n item.appendChild(rem);\n }\n\n itemsWrap.appendChild(item);\n });\n }\n\n // Ensure minimum items\n if (!state.config.readonly) {\n while (countItems() < min) {\n const idx = countItems();\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: childDefaults, // Defaults for enableIf evaluation\n formData: ctx.formData ?? ctx.prefill, // Complete root data for enableIf\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n // Create child wrapper with column layout support\n const childWrapper = document.createElement(\"div\");\n const columns = element.columns || 1;\n if (columns === 1) {\n childWrapper.className = \"space-y-4\"; // Vertical layout (default)\n } else {\n childWrapper.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n childWrapper.appendChild(renderElement(child, subCtx));\n }\n });\n\n item.appendChild(childWrapper);\n\n // Remove button - but disabled if we're at minimum\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className = \"absolute top-2 right-2 px-2 py-1 rounded\";\n rem.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n rem.textContent = \"✕\";\n rem.addEventListener(\"mouseenter\", () => {\n rem.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n rem.addEventListener(\"mouseleave\", () => {\n rem.style.backgroundColor = \"transparent\";\n });\n rem.onclick = () => {\n if (countItems() > min) {\n handleRemoveItem(item);\n }\n };\n item.style.position = \"relative\";\n item.appendChild(rem);\n\n itemsWrap.appendChild(item);\n }\n }\n\n containerWrap.appendChild(itemsWrap);\n\n // Add \"Add Element\" button with count indicator at the bottom (edit mode only)\n if (!state.config.readonly) {\n const addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n addRow.appendChild(createAddButton());\n addRow.appendChild(countDisplay);\n containerWrap.appendChild(addRow);\n }\n\n updateAddButton();\n\n wrapper.appendChild(containerWrap);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n// Forward declaration for validateElement - will be set from FormBuilderInstance\nlet validateElementFunc:\n | ((\n element: Element,\n ctx: { path: string },\n customScopeRoot?: HTMLElement | null,\n ) => { value: any; spread: boolean })\n | null = null;\n\n// Export setter for validateElement function\nexport function setValidateElement(\n fn: (\n element: Element,\n ctx: { path: string },\n customScopeRoot?: HTMLElement | null,\n ) => { value: any; spread: boolean },\n): void {\n validateElementFunc = fn;\n}\n\nfunction validateElement(\n element: Element,\n ctx: { path: string },\n customScopeRoot?: HTMLElement | null,\n): { value: any; spread: boolean } {\n if (!validateElementFunc) {\n throw new Error(\n \"validateElement not initialized. Should be set from FormBuilderInstance\",\n );\n }\n return validateElementFunc(element, ctx, customScopeRoot);\n}\n\n/**\n * Validate container field and return extracted value with errors\n */\nexport function validateContainerElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation, path } = context;\n\n if (!(\"elements\" in element)) {\n return { value: null, errors };\n }\n\n // Helper to validate container count\n const validateContainerCount = (\n key: string,\n items: any[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n\n const minItems = \"minCount\" in element ? (element.minCount ?? 0) : 0;\n const maxItems =\n \"maxCount\" in element ? (element.maxCount ?? Infinity) : Infinity;\n\n if (element.required && items.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (items.length < minItems) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minItems })}`);\n }\n if (items.length > maxItems) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxItems })}`);\n }\n };\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple containers\n const items: any[] = [];\n const allContainerWrappers = scopeRoot.querySelectorAll<HTMLElement>(\n \"[data-container-item]\",\n );\n const containerWrappers = Array.from(allContainerWrappers).filter((el) => {\n const attr = el.getAttribute(\"data-container-item\") || \"\";\n if (!attr.startsWith(`${key}[`)) return false;\n // Strict match: only direct key[N], not key_extra[N] or key[0].nested[0]\n const suffix = attr.slice(key.length);\n return /^\\[\\d+\\]$/.test(suffix);\n });\n containerWrappers.forEach((itemContainer) => {\n const itemData: Record<string, any> = {};\n // Extract real index from DOM attribute (indices may be non-sequential after deletion)\n const containerAttr =\n itemContainer.getAttribute(\"data-container-item\") || \"\";\n const indexMatch = containerAttr.match(/\\[(\\d+)\\]$/);\n const domIndex = indexMatch ? parseInt(indexMatch[1], 10) : 0;\n\n element.elements.forEach((child: any) => {\n // Check enableIf condition for child element (relative to container data)\n if (child.enableIf) {\n try {\n const rootFormData = context.instance?.getState().formRoot\n ? extractRootFormData(context.instance.getState().formRoot!)\n : {};\n const shouldEnable = evaluateEnableCondition(\n child.enableIf,\n rootFormData, // Root form data for absolute scope\n itemData, // Container data for relative scope\n );\n if (!shouldEnable) {\n // Field is conditionally disabled, exclude from container data entirely\n return;\n }\n } catch (error) {\n console.error(\n `Error evaluating enableIf for field \"${child.key}\" in container \"${key}[${domIndex}]\":`,\n error,\n );\n // Continue validation in case of error (fail-safe)\n }\n }\n\n if (child.hidden || child.type === \"hidden\") {\n itemData[child.key] =\n child.default !== undefined ? child.default : null;\n } else {\n const childKey = `${key}[${domIndex}].${child.key}`;\n const childResult = validateElement(\n { ...child, key: childKey } as Element,\n { path },\n itemContainer,\n );\n if (childResult.spread && childResult.value !== null && typeof childResult.value === \"object\") {\n Object.assign(itemData, childResult.value);\n } else {\n itemData[child.key] = childResult.value;\n }\n }\n });\n items.push(itemData);\n });\n\n validateContainerCount(key, items, element);\n return { value: items, errors };\n } else {\n // Single container\n const containerData: Record<string, any> = {};\n const containerContainer =\n scopeRoot.querySelector<HTMLElement>(`[data-container=\"${key}\"]`) ||\n scopeRoot;\n\n element.elements.forEach((child: any) => {\n // Check enableIf condition for child element (relative to container data)\n if (child.enableIf) {\n try {\n const rootFormData = context.instance?.getState().formRoot\n ? extractRootFormData(context.instance.getState().formRoot!)\n : {};\n const shouldEnable = evaluateEnableCondition(\n child.enableIf,\n rootFormData, // Root form data for absolute scope\n containerData, // Container data for relative scope\n );\n if (!shouldEnable) {\n // Field is conditionally disabled, exclude from container data entirely\n return;\n }\n } catch (error) {\n console.error(\n `Error evaluating enableIf for field \"${child.key}\" in container \"${key}\":`,\n error,\n );\n // Continue validation in case of error (fail-safe)\n }\n }\n\n if (child.hidden || child.type === \"hidden\") {\n containerData[child.key] =\n child.default !== undefined ? child.default : null;\n } else {\n const childKey = `${key}.${child.key}`;\n const childResult = validateElement(\n { ...child, key: childKey } as Element,\n { path },\n containerContainer,\n );\n if (childResult.spread && childResult.value !== null && typeof childResult.value === \"object\") {\n Object.assign(containerData, childResult.value);\n } else {\n containerData[child.key] = childResult.value;\n }\n }\n });\n\n return { value: containerData, errors };\n }\n}\n\n/**\n * Update container field value in DOM without re-render\n */\nexport function updateContainerField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { instance, scopeRoot } = context;\n\n if (!(\"elements\" in element)) {\n return;\n }\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple containers\n if (!Array.isArray(value)) {\n console.warn(\n `updateContainerField: Expected array for multiple container field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update nested fields for each item\n value.forEach((itemValue, index) => {\n if (isPlainObject(itemValue)) {\n element.elements.forEach((childElement) => {\n const childPath = `${fieldPath}[${index}].${childElement.key}`;\n\n // Handle flatOutput richinput children: the item value has flat keys instead of the schema key\n if (childElement.type === \"richinput\" && (childElement as any).flatOutput) {\n const richChild = childElement as any;\n const textKey: string = richChild.textKey ?? \"text\";\n const filesKey: string = richChild.filesKey ?? \"files\";\n const containerValue = itemValue as Record<string, any>;\n const compositeValue: Record<string, any> = {};\n if (textKey in containerValue) compositeValue[textKey] = containerValue[textKey];\n if (filesKey in containerValue) compositeValue[filesKey] = containerValue[filesKey];\n if (Object.keys(compositeValue).length > 0) {\n instance.updateField(childPath, compositeValue);\n }\n } else {\n const childValue = (itemValue as Record<string, any>)[childElement.key];\n if (childValue !== undefined) {\n instance.updateField(childPath, childValue);\n }\n }\n });\n }\n });\n\n const existingContainers = scopeRoot.querySelectorAll(\n `[data-container-item^=\"${fieldPath}[\"]`,\n );\n if (value.length !== existingContainers.length) {\n console.warn(\n `updateContainerField: Multiple container field \"${fieldPath}\" item count mismatch. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single container\n if (!isPlainObject(value)) {\n console.warn(\n `updateContainerField: Expected object for container field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update nested fields\n element.elements.forEach((childElement) => {\n const childPath = `${fieldPath}.${childElement.key}`;\n\n // Handle flatOutput richinput children: the container value has flat keys instead of the schema key\n if (childElement.type === \"richinput\" && (childElement as any).flatOutput) {\n const richChild = childElement as any;\n const textKey: string = richChild.textKey ?? \"text\";\n const filesKey: string = richChild.filesKey ?? \"files\";\n const containerValue = value as Record<string, any>;\n const compositeValue: Record<string, any> = {};\n if (textKey in containerValue) compositeValue[textKey] = containerValue[textKey];\n if (filesKey in containerValue) compositeValue[filesKey] = containerValue[filesKey];\n if (Object.keys(compositeValue).length > 0) {\n instance.updateField(childPath, compositeValue);\n }\n } else {\n const childValue = (value as Record<string, any>)[childElement.key];\n if (childValue !== undefined) {\n instance.updateField(childPath, childValue);\n }\n }\n });\n }\n}\n","// Group component - compatibility layer that delegates to container\n// Translates legacy GroupElement (with repeat: {min, max}) to ContainerElement (with multiple: true, minCount, maxCount)\n\nimport type {\n GroupElement,\n ContainerElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { isPlainObject } from \"../utils/helpers.js\";\nimport {\n renderSingleContainerElement,\n renderMultipleContainerElement,\n validateContainerElement,\n updateContainerField,\n} from \"./container.js\";\n\n// Export setter for renderElement function (called from components/index.ts)\n// This is a no-op since group now delegates to container (which has its own setRenderElement)\nexport function setRenderElement(\n _fn: (element: any, ctx: RenderContext) => HTMLElement,\n): void {\n // No-op: container handles renderElement initialization\n}\n\n/**\n * Renders a group element by translating it to a ContainerElement\n * and delegating to container rendering functions.\n *\n * This maintains backward compatibility with the legacy group type\n * while eliminating code duplication.\n *\n * @deprecated Use type: \"container\" with multiple: true instead of type: \"group\" with repeat: {min, max}\n */\nexport function renderGroupElement(\n element: GroupElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Log deprecation warning once per element\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated and will be removed in a future version. ` +\n `Please use type: \"container\" with multiple: true instead. ` +\n `Field key: \"${element.key}\"`,\n );\n }\n\n // Translate GroupElement → ContainerElement\n const containerElement: ContainerElement = {\n type: \"container\",\n key: element.key,\n label: element.label,\n description: element.description,\n hint: element.hint,\n required: element.required,\n hidden: element.hidden,\n default: element.default,\n actions: element.actions,\n elements: element.elements,\n // Translate repeat pattern to multiple pattern\n multiple: !!(element.repeat && isPlainObject(element.repeat)),\n minCount: element.repeat?.min,\n maxCount: element.repeat?.max,\n };\n\n // Delegate to container implementation\n if (containerElement.multiple) {\n renderMultipleContainerElement(containerElement, ctx, wrapper, pathKey);\n } else {\n renderSingleContainerElement(containerElement, ctx, wrapper, pathKey);\n }\n}\n\n// Legacy exports for backward compatibility (not used internally)\nexport { renderGroupElement as renderRepeatableGroup };\nexport { renderGroupElement as renderSingleGroup };\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Helper to translate GroupElement to ContainerElement\n */\nfunction translateGroupToContainer(element: Element): ContainerElement {\n const groupElement = element as GroupElement;\n return {\n type: \"container\",\n key: groupElement.key,\n label: groupElement.label,\n description: groupElement.description,\n hint: groupElement.hint,\n required: groupElement.required,\n hidden: groupElement.hidden,\n default: groupElement.default,\n actions: groupElement.actions,\n elements: groupElement.elements,\n // Translate repeat pattern to multiple pattern\n multiple: !!(groupElement.repeat && isPlainObject(groupElement.repeat)),\n minCount: groupElement.repeat?.min,\n maxCount: groupElement.repeat?.max,\n };\n}\n\n/**\n * Validate group field by delegating to container validation\n * @deprecated Use validateContainerElement with type: \"container\" instead\n */\nexport function validateGroupElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n // Log deprecation warning\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated. ` +\n `Please use type: \"container\" instead. Field key: \"${key}\"`,\n );\n }\n\n // Translate group to container and delegate\n const containerElement = translateGroupToContainer(element);\n return validateContainerElement(containerElement, key, context);\n}\n\n/**\n * Update group field by delegating to container update\n * @deprecated Use updateContainerField with type: \"container\" instead\n */\nexport function updateGroupField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n // Log deprecation warning\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated. ` +\n `Please use type: \"container\" instead. Field path: \"${fieldPath}\"`,\n );\n }\n\n // Translate group to container and delegate\n const containerElement = translateGroupToContainer(element);\n return updateContainerField(containerElement, fieldPath, value, context);\n}\n","// Table component rendering, validation, and update functions\n\nimport type {\n TableElement,\n TableMerge,\n TableData,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { t } from \"../utils/translation.js\";\n\n// ---------------------------------------------------------------------------\n// Legacy merge migration (row/col/rowspan/colspan → top/left/bottom/right)\n// ---------------------------------------------------------------------------\n\ninterface LegacyMerge {\n row: number;\n col: number;\n rowspan: number;\n colspan: number;\n}\n\nfunction isLegacyMerge(m: unknown): m is LegacyMerge {\n return (\n m !== null &&\n typeof m === \"object\" &&\n \"row\" in (m as object) &&\n \"col\" in (m as object) &&\n \"rowspan\" in (m as object) &&\n \"colspan\" in (m as object)\n );\n}\n\nfunction isValidMergeShape(m: unknown): m is TableMerge {\n if (m === null || typeof m !== \"object\") return false;\n const o = m as Record<string, unknown>;\n return (\n typeof o.top === \"number\" &&\n typeof o.left === \"number\" &&\n typeof o.bottom === \"number\" &&\n typeof o.right === \"number\"\n );\n}\n\nfunction migrateMerge(m: unknown): TableMerge | null {\n if (isLegacyMerge(m)) {\n return {\n top: m.row,\n left: m.col,\n bottom: m.row + m.rowspan - 1,\n right: m.col + m.colspan - 1,\n };\n }\n if (isValidMergeShape(m)) return m;\n return null;\n}\n\nfunction migrateMerges(merges: unknown[]): TableMerge[] {\n return merges.map(migrateMerge).filter((m): m is TableMerge => m !== null);\n}\n\n// ---------------------------------------------------------------------------\n// Internal data model helpers\n// ---------------------------------------------------------------------------\n\nfunction createEmptyCells(rows: number, cols: number): string[][] {\n return Array.from({ length: rows }, () =>\n Array.from({ length: cols }, () => \"\"),\n );\n}\n\n/**\n * Validate that merges don't overlap and are within bounds.\n * Returns an error string, or null if valid.\n */\nfunction validateMerges(\n merges: TableMerge[],\n rows: number,\n cols: number,\n): string | null {\n for (let i = 0; i < merges.length; i++) {\n const a = merges[i];\n if (\n a.top < 0 ||\n a.left < 0 ||\n a.bottom >= rows ||\n a.right >= cols ||\n a.top > a.bottom ||\n a.left > a.right\n )\n return `Merge ${i} out of bounds`;\n for (let j = i + 1; j < merges.length; j++) {\n const b = merges[j];\n if (\n a.top <= b.bottom &&\n a.bottom >= b.top &&\n a.left <= b.right &&\n a.right >= b.left\n )\n return `Merges ${i} and ${j} overlap`;\n }\n }\n return null;\n}\n\n/**\n * Check whether a given cell is \"shadowed\" (covered by a merge starting\n * at a different cell). Returns the owning merge if shadowed, null otherwise.\n */\nfunction getShadowingMerge(\n row: number,\n col: number,\n merges: TableMerge[],\n): TableMerge | null {\n for (const m of merges) {\n if (m.top === row && m.left === col) {\n return null; // This cell *is* the merge origin, not shadowed\n }\n if (\n row >= m.top &&\n row <= m.bottom &&\n col >= m.left &&\n col <= m.right\n ) {\n return m;\n }\n }\n return null;\n}\n\n/**\n * Find the merge that starts at (row, col), if any.\n */\nfunction getMergeAt(\n row: number,\n col: number,\n merges: TableMerge[],\n): TableMerge | null {\n return merges.find((m) => m.top === row && m.left === col) ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Selection state — held per-table in a closure\n// ---------------------------------------------------------------------------\n\ninterface SelectionState {\n anchor: { row: number; col: number } | null;\n focus: { row: number; col: number } | null;\n dragging: boolean;\n}\n\nfunction selectionRange(\n sel: SelectionState,\n): { r1: number; c1: number; r2: number; c2: number } | null {\n if (!sel.anchor) return null;\n const focus = sel.focus ?? sel.anchor;\n return {\n r1: Math.min(sel.anchor.row, focus.row),\n c1: Math.min(sel.anchor.col, focus.col),\n r2: Math.max(sel.anchor.row, focus.row),\n c2: Math.max(sel.anchor.col, focus.col),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Overlay button factory\n// ---------------------------------------------------------------------------\n\ninterface OverlayButtonOptions {\n label: string;\n title: string;\n size: number;\n color: string;\n textColor: string;\n onClick: (e: MouseEvent) => void;\n}\n\nfunction makeOverlayCircleBtn(opts: OverlayButtonOptions): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.textContent = opts.label;\n btn.title = opts.title;\n btn.style.cssText = `\n position: absolute;\n width: ${opts.size}px;\n height: ${opts.size}px;\n border-radius: 50%;\n border: none;\n background: ${opts.color};\n color: ${opts.textColor};\n font-size: ${Math.floor(opts.size * 0.6)}px;\n line-height: ${opts.size}px;\n text-align: center;\n cursor: pointer;\n z-index: 10;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 4px rgba(0,0,0,0.2);\n transition: transform 0.1s, opacity 0.1s;\n pointer-events: all;\n `;\n btn.addEventListener(\"mouseenter\", () => {\n btn.style.transform = \"scale(1.15)\";\n });\n btn.addEventListener(\"mouseleave\", () => {\n btn.style.transform = \"scale(1)\";\n });\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n opts.onClick(e);\n });\n return btn;\n}\n\n// ---------------------------------------------------------------------------\n// Readonly renderer\n// ---------------------------------------------------------------------------\n\nfunction renderReadonlyTable(data: TableData, wrapper: HTMLElement): void {\n const { cells, merges = [] } = data;\n if (cells.length === 0) return;\n\n const numCols = cells[0].length;\n\n const tableEl = document.createElement(\"table\");\n tableEl.style.cssText = `\n width: 100%;\n border-collapse: collapse;\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n color: var(--fb-text-color);\n `;\n\n cells.forEach((rowData, rIdx) => {\n const section =\n rIdx === 0\n ? tableEl.createTHead()\n : tableEl.tBodies[0] ?? tableEl.createTBody();\n\n const tr = section.insertRow();\n\n for (let cIdx = 0; cIdx < numCols; cIdx++) {\n if (getShadowingMerge(rIdx, cIdx, merges)) {\n continue;\n }\n\n const merge = getMergeAt(rIdx, cIdx, merges);\n const td = document.createElement(rIdx === 0 ? \"th\" : \"td\");\n\n if (merge) {\n const rowspan = merge.bottom - merge.top + 1;\n const colspan = merge.right - merge.left + 1;\n if (rowspan > 1) td.rowSpan = rowspan;\n if (colspan > 1) td.colSpan = colspan;\n }\n\n td.textContent = rowData[cIdx] ?? \"\";\n td.style.cssText = `\n padding: 6px 10px;\n border: var(--fb-border-width) solid var(--fb-border-color);\n text-align: left;\n vertical-align: top;\n ${rIdx === 0 ? \"background-color: var(--fb-background-hover-color); font-weight: 600;\" : \"\"}\n `;\n\n tr.appendChild(td);\n }\n });\n\n const scrollWrapper = document.createElement(\"div\");\n scrollWrapper.style.cssText = \"overflow-x: auto; max-width: 100%;\";\n scrollWrapper.appendChild(tableEl);\n wrapper.appendChild(scrollWrapper);\n}\n\n// ---------------------------------------------------------------------------\n// Edit renderer helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Activate contenteditable on a cell's content span.\n */\nfunction startCellEditing(\n span: HTMLSpanElement,\n r: number,\n c: number,\n getCells: () => string[][],\n persistValue: () => void,\n selectCell: (row: number, col: number) => void,\n): void {\n if (span.contentEditable === \"true\") return;\n\n span.contentEditable = \"true\";\n span.focus();\n\n // Place cursor at end\n const domRange = document.createRange();\n const winSel = window.getSelection();\n domRange.selectNodeContents(span);\n domRange.collapse(false);\n winSel?.removeAllRanges();\n winSel?.addRange(domRange);\n\n function commit(): void {\n span.contentEditable = \"inherit\";\n const cells = getCells();\n if (cells[r]) {\n cells[r][c] = span.textContent ?? \"\";\n }\n persistValue();\n }\n\n function onKeyDown(e: KeyboardEvent): void {\n const cells = getCells();\n const numCols = cells[0]?.length ?? 0;\n\n if (e.key === \"Escape\") {\n span.contentEditable = \"inherit\";\n span.textContent = cells[r]?.[c] ?? \"\";\n span.removeEventListener(\"keydown\", onKeyDown);\n span.removeEventListener(\"blur\", onBlur);\n return;\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n commit();\n span.removeEventListener(\"keydown\", onKeyDown);\n span.removeEventListener(\"blur\", onBlur);\n const nextRow = r + 1 < cells.length ? r + 1 : r;\n selectCell(nextRow, c);\n return;\n }\n if (e.key === \"Tab\") {\n e.preventDefault();\n e.stopPropagation();\n commit();\n span.removeEventListener(\"keydown\", onKeyDown);\n span.removeEventListener(\"blur\", onBlur);\n let nr = r;\n let nc = e.shiftKey ? c - 1 : c + 1;\n if (nc < 0) {\n nc = numCols - 1;\n nr = Math.max(0, r - 1);\n }\n if (nc >= numCols) {\n nc = 0;\n nr = Math.min(cells.length - 1, r + 1);\n }\n selectCell(nr, nc);\n }\n }\n\n function onBlur(): void {\n if (span.contentEditable === \"true\") {\n commit();\n span.removeEventListener(\"keydown\", onKeyDown);\n span.removeEventListener(\"blur\", onBlur);\n }\n }\n\n span.addEventListener(\"keydown\", onKeyDown);\n span.addEventListener(\"blur\", onBlur);\n}\n\n// ---------------------------------------------------------------------------\n// Loading overlay helpers\n// ---------------------------------------------------------------------------\n\nfunction ensureSpinKeyframes(): void {\n if (document.getElementById(\"fb-spin-keyframes\")) return;\n const style = document.createElement(\"style\");\n style.id = \"fb-spin-keyframes\";\n style.textContent = `@keyframes fb-spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n}\n\nfunction showLoadingOverlay(\n parent: HTMLElement,\n text: string,\n): HTMLElement {\n ensureSpinKeyframes();\n const overlay = document.createElement(\"div\");\n overlay.className = \"fb-table-loading-overlay\";\n overlay.style.cssText = `\n position: absolute; top: 0; left: 0; right: 0; bottom: 0;\n background: rgba(255,255,255,0.8); display: flex;\n align-items: center; justify-content: center; flex-direction: column;\n gap: 8px; z-index: 100;\n `;\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = `\n width: 24px; height: 24px; border: 3px solid var(--fb-border-color, #ccc);\n border-top-color: var(--fb-primary-color, #0066cc); border-radius: 50%;\n animation: fb-spin 0.8s linear infinite;\n `;\n const label = document.createElement(\"span\");\n label.textContent = text;\n label.style.cssText = `font-size: var(--fb-font-size-small, 12px); color: var(--fb-text-color, #333);`;\n overlay.appendChild(spinner);\n overlay.appendChild(label);\n parent.appendChild(overlay);\n return overlay;\n}\n\n// ---------------------------------------------------------------------------\n// Edit renderer\n// ---------------------------------------------------------------------------\n\nfunction renderEditTable(\n element: TableElement,\n initialData: TableData,\n pathKey: string,\n ctx: RenderContext,\n wrapper: HTMLElement,\n): void {\n const state = ctx.state;\n const instance = ctx.instance;\n const mergeAllowed = element.mergeAllowed !== false;\n const cellsKey = element.fieldNames?.cells ?? \"cells\";\n const mergesKey = element.fieldNames?.merges ?? \"merges\";\n\n // Mutable model (captured by all inner functions via closure)\n const cells: string[][] =\n initialData.cells.length > 0\n ? initialData.cells.map((r) => [...r])\n : createEmptyCells(element.rows ?? 3, element.columns ?? 3);\n let merges: TableMerge[] =\n initialData.merges ? [...initialData.merges] : [];\n\n const sel: SelectionState = { anchor: null, focus: null, dragging: false };\n\n // Hidden input carries the serialised value for getFormData\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n hiddenInput.value = JSON.stringify({ [cellsKey]: cells, [mergesKey]: merges });\n wrapper.appendChild(hiddenInput);\n\n function persistValue(): void {\n hiddenInput.value = JSON.stringify({ [cellsKey]: cells, [mergesKey]: merges });\n if (instance) {\n instance.triggerOnChange(pathKey, { [cellsKey]: cells, [mergesKey]: merges });\n }\n }\n\n // Fix #1: expose update callback so updateTableField can sync closure state\n (hiddenInput as HTMLInputElement & { _applyExternalUpdate?: (data: TableData) => void })\n ._applyExternalUpdate = (data: TableData) => {\n cells.length = 0;\n data.cells.forEach((row) => cells.push([...row]));\n merges.length = 0;\n if (data.merges) {\n data.merges.forEach((m) => merges.push({ ...m }));\n }\n sel.anchor = null;\n sel.focus = null;\n persistValue();\n rebuild();\n };\n\n // ---- DOM containers ----\n // Outer wrapper has padding so overlay (+) buttons are not clipped\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.style.cssText =\n \"position: relative; padding: 20px 20px 20px 24px; overflow-x: auto; max-width: 100%;\";\n\n const tableEl = document.createElement(\"table\");\n tableEl.style.cssText = `\n border-collapse: collapse;\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n color: var(--fb-text-color);\n table-layout: fixed;\n `;\n\n tableWrapper.appendChild(tableEl);\n\n // ---- File import (shared logic for button click and drag-and-drop) ----\n const acceptExts = element.importAccept?.map((ext) => `.${ext.toLowerCase()}`) ?? [];\n\n async function importFile(file: File): Promise<void> {\n if (!state.config.parseTableFile) return;\n\n // Validate extension if importAccept is specified\n if (acceptExts.length > 0) {\n const ext = file.name.toLowerCase().replace(/^.*(\\.[^.]+)$/, \"$1\");\n if (!acceptExts.includes(ext)) return;\n }\n\n const overlay = showLoadingOverlay(\n tableWrapper,\n t(\"tableImporting\", state),\n );\n\n try {\n const result = await state.config.parseTableFile(file);\n const importedCells = result.cells;\n const importedMerges = result.merges ?? [];\n\n if (importedMerges.length > 0) {\n const err = validateMerges(\n importedMerges,\n importedCells.length,\n importedCells[0]?.length ?? 0,\n );\n if (err) throw new Error(err);\n }\n\n cells.length = 0;\n importedCells.forEach((row) => cells.push([...row]));\n merges.length = 0;\n importedMerges.forEach((m) => merges.push({ ...m }));\n\n sel.anchor = null;\n sel.focus = null;\n persistValue();\n rebuild();\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : String(e);\n console.error(\n t(\"tableImportError\", state).replace(\"{error}\", errMsg),\n );\n } finally {\n overlay.remove();\n }\n }\n\n // Import button (paperclip icon in the top-left buffer of tableWrapper)\n if (element.importAccept && state.config.parseTableFile) {\n const importBtn = document.createElement(\"button\");\n importBtn.type = \"button\";\n importBtn.title = t(\"tableImportFile\", state);\n importBtn.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>`;\n importBtn.style.cssText = `\n position: absolute; top: 2px; left: 2px;\n width: 20px; height: 20px;\n padding: 0;\n display: flex; align-items: center; justify-content: center;\n color: var(--fb-text-color, #999);\n border: none;\n background: transparent;\n cursor: pointer;\n z-index: 2;\n `;\n importBtn.addEventListener(\"mouseenter\", () => {\n importBtn.style.color = \"var(--fb-primary-color, #0066cc)\";\n });\n importBtn.addEventListener(\"mouseleave\", () => {\n importBtn.style.color = \"var(--fb-text-color, #999)\";\n });\n\n const importInput = document.createElement(\"input\");\n importInput.type = \"file\";\n importInput.accept = acceptExts.join(\",\");\n importInput.style.display = \"none\";\n tableWrapper.appendChild(importInput);\n\n importBtn.addEventListener(\"click\", () => {\n importInput.click();\n });\n\n importInput.addEventListener(\"change\", () => {\n const file = importInput.files?.[0];\n if (file) importFile(file);\n importInput.value = \"\";\n });\n\n tableWrapper.appendChild(importBtn);\n\n // Drag-and-drop on tableWrapper\n let dragCounter = 0;\n tableWrapper.addEventListener(\"dragenter\", (e: DragEvent) => {\n e.preventDefault();\n dragCounter++;\n if (dragCounter === 1) {\n tableWrapper.style.outline = \"2px dashed var(--fb-primary-color, #0066cc)\";\n tableWrapper.style.outlineOffset = \"-2px\";\n }\n });\n tableWrapper.addEventListener(\"dragover\", (e: DragEvent) => {\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n });\n tableWrapper.addEventListener(\"dragleave\", (e: DragEvent) => {\n e.preventDefault();\n dragCounter--;\n if (dragCounter <= 0) {\n dragCounter = 0;\n tableWrapper.style.outline = \"\";\n tableWrapper.style.outlineOffset = \"\";\n }\n });\n tableWrapper.addEventListener(\"drop\", (e: DragEvent) => {\n e.preventDefault();\n dragCounter = 0;\n tableWrapper.style.outline = \"\";\n tableWrapper.style.outlineOffset = \"\";\n const file = e.dataTransfer?.files?.[0];\n if (file) importFile(file);\n });\n }\n\n wrapper.appendChild(tableWrapper);\n\n // ---- Context menu (floating panel for merge/split) ----\n // Appended to wrapper (inside the form root) so destroy() cleans it up.\n const contextMenu = document.createElement(\"div\");\n contextMenu.style.cssText = `\n position: fixed;\n display: none;\n background: white;\n border: 1px solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n padding: 4px;\n z-index: 1000;\n gap: 4px;\n flex-direction: column;\n `;\n wrapper.appendChild(contextMenu);\n\n function makeContextMenuBtn(label: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.textContent = label;\n btn.style.cssText = `\n padding: 4px 10px;\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-color);\n border: 1px solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background: transparent;\n cursor: pointer;\n white-space: nowrap;\n text-align: left;\n `;\n btn.addEventListener(\"mouseenter\", () => {\n btn.style.background = \"var(--fb-background-hover-color)\";\n });\n btn.addEventListener(\"mouseleave\", () => {\n btn.style.background = \"transparent\";\n });\n btn.addEventListener(\"click\", () => {\n hideContextMenu();\n onClick();\n });\n return btn;\n }\n\n function showContextMenu(x: number, y: number): void {\n if (!mergeAllowed) return;\n contextMenu.innerHTML = \"\";\n contextMenu.style.display = \"flex\";\n\n const range = selectionRange(sel);\n const isMultiCell = range && (range.r1 !== range.r2 || range.c1 !== range.c2);\n const isSingleMerged = sel.anchor && getMergeAt(sel.anchor.row, sel.anchor.col, merges);\n\n if (isMultiCell) {\n contextMenu.appendChild(\n makeContextMenuBtn(t(\"tableMergeCells\", state), mergeCells),\n );\n }\n if (isSingleMerged) {\n contextMenu.appendChild(\n makeContextMenuBtn(t(\"tableSplitCell\", state), splitCell),\n );\n }\n\n if (!contextMenu.firstChild) {\n hideContextMenu();\n return;\n }\n\n // Position near click\n const menuWidth = 140;\n const menuHeight = contextMenu.children.length * 32 + 8;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const left = x + menuWidth > vw ? x - menuWidth : x;\n const top = y + menuHeight > vh ? y - menuHeight : y;\n\n contextMenu.style.left = `${left}px`;\n contextMenu.style.top = `${top}px`;\n }\n\n function hideContextMenu(): void {\n contextMenu.style.display = \"none\";\n }\n\n // Close context menu on outside click (auto-cleanup when DOM disconnected)\n const menuDismissCtrl = new AbortController();\n document.addEventListener(\"mousedown\", (e) => {\n if (!wrapper.isConnected) {\n menuDismissCtrl.abort();\n return;\n }\n if (!contextMenu.contains(e.target as Node)) {\n hideContextMenu();\n }\n }, { signal: menuDismissCtrl.signal });\n\n // ---- Update selection visuals without rebuilding DOM ----\n function applySelectionStyles(): void {\n const range = selectionRange(sel);\n const allTds =\n tableEl.querySelectorAll<HTMLTableCellElement>(\"td[data-row]\");\n allTds.forEach((td) => {\n const r = parseInt(td.getAttribute(\"data-row\") || \"0\", 10);\n const c = parseInt(td.getAttribute(\"data-col\") || \"0\", 10);\n const isAnchor =\n sel.anchor !== null &&\n sel.anchor.row === r &&\n sel.anchor.col === c;\n const inRange =\n range !== null &&\n r >= range.r1 &&\n r <= range.r2 &&\n c >= range.c1 &&\n c <= range.c2;\n\n td.style.outline = isAnchor\n ? \"2px solid var(--fb-primary-color, #0066cc)\"\n : \"\";\n td.style.outlineOffset = isAnchor ? \"-2px\" : \"\";\n\n // Preserve header background\n if (r === 0) {\n td.style.backgroundColor = \"var(--fb-background-hover-color)\";\n } else {\n td.style.backgroundColor =\n inRange && !isAnchor ? \"rgba(0,102,204,0.08)\" : \"\";\n }\n });\n\n }\n\n // ---- selectCell: set anchor, update styles, focus table ----\n function selectCell(row: number, col: number): void {\n sel.anchor = { row, col };\n sel.focus = null;\n applySelectionStyles();\n tableEl.focus();\n }\n\n // ---- editCell: focus the span inside a cell for immediate editing ----\n function editCell(row: number, col: number): void {\n const td = tableEl.querySelector<HTMLTableCellElement>(\n `td[data-row=\"${row}\"][data-col=\"${col}\"]`,\n );\n if (!td) return;\n const span = td.querySelector(\"span\");\n if (!span) return;\n sel.anchor = { row, col };\n sel.focus = null;\n applySelectionStyles();\n startCellEditing(span, row, col, () => cells, persistValue, selectCell);\n }\n\n // ---- Row / Column operations ----\n function addRow(afterIndex?: number): void {\n const numCols =\n cells.length > 0 ? cells[0].length : element.columns ?? 3;\n const newRow = Array<string>(numCols).fill(\"\");\n const insertAt = afterIndex !== undefined ? afterIndex + 1 : cells.length;\n cells.splice(insertAt, 0, newRow);\n\n // Adjust merges for rows after insertion\n merges = merges.map((m) => {\n if (m.top >= insertAt) {\n return { ...m, top: m.top + 1, bottom: m.bottom + 1 };\n }\n if (m.top < insertAt && m.bottom >= insertAt) {\n return { ...m, bottom: m.bottom + 1 };\n }\n return m;\n });\n\n persistValue();\n rebuild();\n }\n\n function removeRow(targetRow?: number): void {\n if (cells.length <= 1) return;\n const rowToRemove =\n targetRow !== undefined\n ? targetRow\n : sel.anchor\n ? sel.anchor.row\n : cells.length - 1;\n\n merges = merges\n .map((m) => {\n if (m.top === rowToRemove && m.bottom === rowToRemove) return null;\n if (m.top === rowToRemove) {\n // Merge starts at removed row: keep top (now points to next row), shrink bottom\n return { ...m, bottom: m.bottom - 1 };\n }\n if (m.bottom === rowToRemove) {\n return { ...m, bottom: m.bottom - 1 };\n }\n if (m.top < rowToRemove && m.bottom > rowToRemove) {\n return { ...m, bottom: m.bottom - 1 };\n }\n if (m.top > rowToRemove) {\n return { ...m, top: m.top - 1, bottom: m.bottom - 1 };\n }\n return m;\n })\n .filter((m): m is TableMerge => m !== null);\n\n cells.splice(rowToRemove, 1);\n if (sel.anchor && sel.anchor.row >= cells.length) {\n sel.anchor = { row: cells.length - 1, col: sel.anchor.col };\n }\n persistValue();\n rebuild();\n }\n\n function addColumn(afterIndex?: number): void {\n const insertAt = afterIndex !== undefined ? afterIndex + 1 : cells[0]?.length ?? 0;\n cells.forEach((row) => row.splice(insertAt, 0, \"\"));\n\n // Adjust merges for columns after insertion\n merges = merges.map((m) => {\n if (m.left >= insertAt) {\n return { ...m, left: m.left + 1, right: m.right + 1 };\n }\n if (m.left < insertAt && m.right >= insertAt) {\n return { ...m, right: m.right + 1 };\n }\n return m;\n });\n\n persistValue();\n rebuild();\n }\n\n function removeColumn(targetCol?: number): void {\n if (cells.length === 0 || cells[0].length <= 1) return;\n const colToRemove =\n targetCol !== undefined\n ? targetCol\n : sel.anchor\n ? sel.anchor.col\n : cells[0].length - 1;\n\n merges = merges\n .map((m) => {\n if (m.left === colToRemove && m.right === colToRemove) return null;\n if (m.left === colToRemove) {\n // Merge starts at removed col: keep left (now points to next col), shrink right\n return { ...m, right: m.right - 1 };\n }\n if (m.right === colToRemove) {\n return { ...m, right: m.right - 1 };\n }\n if (m.left < colToRemove && m.right > colToRemove) {\n return { ...m, right: m.right - 1 };\n }\n if (m.left > colToRemove) {\n return { ...m, left: m.left - 1, right: m.right - 1 };\n }\n return m;\n })\n .filter((m): m is TableMerge => m !== null);\n\n cells.forEach((row) => row.splice(colToRemove, 1));\n if (sel.anchor && sel.anchor.col >= cells[0].length) {\n sel.anchor = { row: sel.anchor.row, col: cells[0].length - 1 };\n }\n persistValue();\n rebuild();\n }\n\n // ---- Merge logic ----\n function mergeCells(): void {\n if (!mergeAllowed) return;\n const range = selectionRange(sel);\n if (!range) return;\n const { r1, c1, r2, c2 } = range;\n if (r1 === r2 && c1 === c2) return;\n\n // Remove any merge that overlaps with the selection\n merges = merges.filter((m) => {\n const overlaps =\n m.top <= r2 && m.bottom >= r1 && m.left <= c2 && m.right >= c1;\n return !overlaps;\n });\n\n // Clear shadowed cells; keep anchor text\n const anchorText = cells[r1][c1];\n for (let r = r1; r <= r2; r++) {\n for (let c = c1; c <= c2; c++) {\n if (r !== r1 || c !== c1) {\n cells[r][c] = \"\";\n }\n }\n }\n cells[r1][c1] = anchorText;\n\n const newMerge: TableMerge = { top: r1, left: c1, bottom: r2, right: c2 };\n const testMerges = [...merges, newMerge];\n const err = validateMerges(testMerges, cells.length, cells[0]?.length ?? 0);\n if (err) {\n console.warn(\"Merge validation failed:\", err);\n return;\n }\n\n merges.push(newMerge);\n sel.anchor = { row: r1, col: c1 };\n sel.focus = null;\n persistValue();\n rebuild();\n }\n\n function splitCell(): void {\n if (!mergeAllowed) return;\n if (!sel.anchor) return;\n const { row, col } = sel.anchor;\n const mIdx = merges.findIndex((m) => m.top === row && m.left === col);\n if (mIdx === -1) return;\n\n merges.splice(mIdx, 1);\n sel.focus = null;\n persistValue();\n rebuild();\n }\n\n // ---- Full re-render of table DOM ----\n function rebuild(): void {\n tableEl.innerHTML = \"\";\n\n const numRows = cells.length;\n const numCols = numRows > 0 ? cells[0].length : 0;\n const range = selectionRange(sel);\n\n // Header row (row 0) — rendered as regular td rows but styled distinctly\n for (let rIdx = 0; rIdx < numRows; rIdx++) {\n const section =\n rIdx === 0\n ? tableEl.tHead ?? tableEl.createTHead()\n : tableEl.tBodies[0] ?? tableEl.createTBody();\n\n const tr = section.insertRow();\n\n for (let cIdx = 0; cIdx < numCols; cIdx++) {\n if (getShadowingMerge(rIdx, cIdx, merges)) {\n continue;\n }\n\n const merge = getMergeAt(rIdx, cIdx, merges);\n const td = document.createElement(\"td\");\n td.setAttribute(\"data-row\", String(rIdx));\n td.setAttribute(\"data-col\", String(cIdx));\n\n if (merge) {\n const rowspan = merge.bottom - merge.top + 1;\n const colspan = merge.right - merge.left + 1;\n if (rowspan > 1) td.rowSpan = rowspan;\n if (colspan > 1) td.colSpan = colspan;\n }\n\n const inRange =\n range !== null &&\n rIdx >= range.r1 &&\n rIdx <= range.r2 &&\n cIdx >= range.c1 &&\n cIdx <= range.c2;\n\n const isAnchor =\n sel.anchor !== null &&\n sel.anchor.row === rIdx &&\n sel.anchor.col === cIdx;\n\n td.style.cssText = [\n \"border: var(--fb-border-width) solid var(--fb-border-color);\",\n \"padding: 4px 8px;\",\n \"min-width: 80px;\",\n \"vertical-align: top;\",\n \"cursor: text;\",\n \"position: relative;\",\n rIdx === 0\n ? \"background-color: var(--fb-background-hover-color); font-weight: 600;\"\n : \"\",\n inRange && !isAnchor\n ? \"background-color: rgba(0,102,204,0.08);\"\n : \"\",\n isAnchor\n ? \"outline: 2px solid var(--fb-primary-color, #0066cc); outline-offset: -2px;\"\n : \"\",\n ].join(\" \");\n\n const content = document.createElement(\"span\");\n content.textContent = cells[rIdx][cIdx];\n content.style.cssText =\n \"display: block; min-height: 1.4em; white-space: pre-wrap; word-break: break-word; outline: none;\";\n td.appendChild(content);\n\n // Capture loop variables for event listeners\n const capturedR = rIdx;\n const capturedC = cIdx;\n\n // Single click → edit cell immediately\n td.addEventListener(\"mousedown\", (e) => {\n // If clicking on overlay button, let it handle itself\n if ((e.target as HTMLElement).tagName === \"BUTTON\") return;\n // If already editing this cell, don't interfere\n if ((e.target as HTMLElement).contentEditable === \"true\") return;\n // If any span is editing and we click another cell, blur will commit\n\n // Right-click inside existing selection → preserve selection for context menu\n if (e.button === 2) {\n const range = selectionRange(sel);\n if (\n range &&\n capturedR >= range.r1 &&\n capturedR <= range.r2 &&\n capturedC >= range.c1 &&\n capturedC <= range.c2\n ) {\n return; // Don't reset selection\n }\n }\n\n if (e.shiftKey && sel.anchor) {\n e.preventDefault();\n sel.focus = { row: capturedR, col: capturedC };\n sel.dragging = false;\n applySelectionStyles();\n } else {\n // Start drag selection\n sel.anchor = { row: capturedR, col: capturedC };\n sel.focus = null;\n sel.dragging = true;\n applySelectionStyles();\n }\n });\n\n td.addEventListener(\"mouseup\", (e) => {\n if ((e.target as HTMLElement).tagName === \"BUTTON\") return;\n if (sel.dragging) {\n sel.dragging = false;\n // If selection is single cell (no drag range), start editing\n const currentRange = selectionRange(sel);\n const isSingleCell =\n !currentRange ||\n (currentRange.r1 === currentRange.r2 &&\n currentRange.c1 === currentRange.c2);\n if (isSingleCell) {\n editCell(capturedR, capturedC);\n }\n }\n });\n\n td.addEventListener(\"mousemove\", (e) => {\n if (sel.dragging && e.buttons === 1) {\n const currentAnchor = sel.anchor;\n if (\n currentAnchor &&\n (currentAnchor.row !== capturedR || currentAnchor.col !== capturedC)\n ) {\n sel.focus = { row: capturedR, col: capturedC };\n applySelectionStyles();\n }\n }\n });\n\n // Right-click for context menu\n td.addEventListener(\"contextmenu\", (e) => {\n if (!mergeAllowed) return;\n const currentRange = selectionRange(sel);\n const isMulti =\n currentRange &&\n (currentRange.r1 !== currentRange.r2 || currentRange.c1 !== currentRange.c2);\n const isMerged = sel.anchor && getMergeAt(sel.anchor.row, sel.anchor.col, merges);\n if (isMulti || isMerged) {\n e.preventDefault();\n showContextMenu(e.clientX, e.clientY);\n }\n });\n\n tr.appendChild(td);\n }\n }\n\n // ---- Hover overlay (+) buttons for insert row/column ----\n buildInsertOverlays();\n\n // Table keyboard handler — replaced on each rebuild\n tableEl.setAttribute(\"tabindex\", \"0\");\n tableEl.onkeydown = (e: KeyboardEvent) => {\n const editing = tableEl.querySelector(\"[contenteditable='true']\");\n if (editing) return;\n\n const anchor = sel.anchor;\n if (!anchor) return;\n\n const numRows2 = cells.length;\n const numCols2 = numRows2 > 0 ? cells[0].length : 0;\n\n const navDeltas: Record<string, [number, number]> = {\n ArrowUp: [-1, 0],\n ArrowDown: [1, 0],\n ArrowLeft: [0, -1],\n ArrowRight: [0, 1],\n };\n\n if (navDeltas[e.key]) {\n e.preventDefault();\n const [dr, dc] = navDeltas[e.key];\n const newRow = Math.max(0, Math.min(numRows2 - 1, anchor.row + dr));\n const newCol = Math.max(0, Math.min(numCols2 - 1, anchor.col + dc));\n if (e.shiftKey) {\n sel.focus = { row: newRow, col: newCol };\n applySelectionStyles();\n } else {\n selectCell(newRow, newCol);\n }\n return;\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n editCell(anchor.row, anchor.col);\n return;\n }\n\n if (e.key === \"Tab\") {\n e.preventDefault();\n const numCols3 = cells[0]?.length ?? 0;\n let nr = anchor.row;\n let nc = e.shiftKey ? anchor.col - 1 : anchor.col + 1;\n if (nc < 0) {\n nc = numCols3 - 1;\n nr = Math.max(0, nr - 1);\n }\n if (nc >= numCols3) {\n nc = 0;\n nr = Math.min(cells.length - 1, nr + 1);\n }\n selectCell(nr, nc);\n return;\n }\n\n if (mergeAllowed && e.key === \"m\" && e.ctrlKey && !e.shiftKey) {\n e.preventDefault();\n mergeCells();\n return;\n }\n\n if (mergeAllowed && e.key === \"M\" && e.ctrlKey && e.shiftKey) {\n e.preventDefault();\n splitCell();\n }\n };\n\n // ---- Copy: export selected cells as TSV + clean HTML ----\n tableEl.oncopy = (e: ClipboardEvent) => {\n const range = selectionRange(sel);\n if (!range) return;\n e.preventDefault();\n\n const { r1, c1, r2, c2 } = range;\n const tsvRows: string[] = [];\n const htmlRows: string[] = [];\n\n for (let r = r1; r <= r2; r++) {\n const tsvCols: string[] = [];\n const htmlCols: string[] = [];\n for (let c = c1; c <= c2; c++) {\n const val = cells[r]?.[c] ?? \"\";\n tsvCols.push(val);\n const escaped = val\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n htmlCols.push(`<td>${escaped}</td>`);\n }\n tsvRows.push(tsvCols.join(\"\\t\"));\n htmlRows.push(`<tr>${htmlCols.join(\"\")}</tr>`);\n }\n\n const tsvText = tsvRows.join(\"\\n\");\n const htmlText = `<table>${htmlRows.join(\"\")}</table>`;\n\n e.clipboardData?.setData(\"text/plain\", tsvText);\n e.clipboardData?.setData(\"text/html\", htmlText);\n };\n\n // ---- Paste: parse TSV from clipboard into cells ----\n tableEl.onpaste = (e: ClipboardEvent) => {\n const anchor = sel.anchor;\n if (!anchor) return;\n\n const text = e.clipboardData?.getData(\"text/plain\") ?? \"\";\n const isMultiCell =\n text.includes(\"\\t\") ||\n text.split(/\\r?\\n/).filter((l) => l).length > 1;\n\n // Single-value paste while editing → let browser handle it natively\n const editing =\n tableEl.querySelector<HTMLElement>(\"[contenteditable='true']\");\n if (editing && !isMultiCell) return;\n\n e.preventDefault();\n\n // If editing, commit current cell and exit edit mode\n if (editing) {\n editing.contentEditable = \"inherit\";\n const r = parseInt(\n editing.closest(\"td\")?.getAttribute(\"data-row\") ?? \"0\",\n 10,\n );\n const c = parseInt(\n editing.closest(\"td\")?.getAttribute(\"data-col\") ?? \"0\",\n 10,\n );\n if (cells[r]) {\n cells[r][c] = editing.textContent ?? \"\";\n }\n }\n if (!text.trim()) return;\n\n const pasteRows = text.split(/\\r?\\n/).map((line) => line.split(\"\\t\"));\n // Remove trailing empty row (common in spreadsheet copies)\n if (\n pasteRows.length > 1 &&\n pasteRows[pasteRows.length - 1].length === 1 &&\n pasteRows[pasteRows.length - 1][0] === \"\"\n ) {\n pasteRows.pop();\n }\n\n const startR = anchor.row;\n const startC = anchor.col;\n\n // Expand table if paste data exceeds current size\n const neededRows = startR + pasteRows.length;\n while (cells.length < neededRows) {\n cells.push(Array<string>(cells[0]?.length ?? 1).fill(\"\"));\n }\n const maxPasteCols = Math.max(...pasteRows.map((r) => r.length));\n const neededCols = startC + maxPasteCols;\n if (cells[0] && neededCols > cells[0].length) {\n const extraCols = neededCols - cells[0].length;\n cells.forEach((row) => {\n for (let i = 0; i < extraCols; i++) row.push(\"\");\n });\n }\n\n for (let pr = 0; pr < pasteRows.length; pr++) {\n for (let pc = 0; pc < pasteRows[pr].length; pc++) {\n const tr = startR + pr;\n const tc = startC + pc;\n if (cells[tr]) {\n cells[tr][tc] = pasteRows[pr][pc];\n }\n }\n }\n\n persistValue();\n rebuild();\n };\n }\n\n // ---- Unified hover overlay (+) buttons for inserting rows/columns ----\n // One floating button for columns, one for rows. Positioned via mousemove\n // on the wrapper (includes padding buffer zone).\n const insertColBtn = makeOverlayCircleBtn({\n label: \"+\",\n title: t(\"tableAddColumn\", state),\n size: 20,\n color: \"var(--fb-primary-color, #0066cc)\",\n textColor: \"white\",\n onClick: () => {\n const afterIdx = parseInt(insertColBtn.dataset.afterCol ?? \"0\", 10);\n addColumn(afterIdx);\n },\n });\n insertColBtn.style.position = \"absolute\";\n insertColBtn.style.display = \"none\";\n tableWrapper.appendChild(insertColBtn);\n\n const insertRowBtn = makeOverlayCircleBtn({\n label: \"+\",\n title: t(\"tableAddRow\", state),\n size: 20,\n color: \"var(--fb-primary-color, #0066cc)\",\n textColor: \"white\",\n onClick: () => {\n const afterIdx = parseInt(insertRowBtn.dataset.afterRow ?? \"0\", 10);\n addRow(afterIdx);\n },\n });\n insertRowBtn.style.position = \"absolute\";\n insertRowBtn.style.display = \"none\";\n tableWrapper.appendChild(insertRowBtn);\n\n // Overlay (×) buttons for columns and rows — recreated on each rebuild\n let colRemoveBtns: HTMLButtonElement[] = [];\n let rowRemoveBtns: HTMLButtonElement[] = [];\n\n // (+) to add column at end (shown in right buffer)\n const addLastColBtn = makeOverlayCircleBtn({\n label: \"+\",\n title: t(\"tableAddColumn\", state),\n size: 20,\n color: \"var(--fb-primary-color, #0066cc)\",\n textColor: \"white\",\n onClick: () => addColumn(),\n });\n addLastColBtn.style.position = \"absolute\";\n addLastColBtn.style.display = \"none\";\n tableWrapper.appendChild(addLastColBtn);\n\n // (+) to add row at end (shown in bottom buffer)\n const addLastRowBtn = makeOverlayCircleBtn({\n label: \"+\",\n title: t(\"tableAddRow\", state),\n size: 20,\n color: \"var(--fb-primary-color, #0066cc)\",\n textColor: \"white\",\n onClick: () => addRow(),\n });\n addLastRowBtn.style.position = \"absolute\";\n addLastRowBtn.style.display = \"none\";\n tableWrapper.appendChild(addLastRowBtn);\n\n function buildInsertOverlays(): void {\n // Clear previous remove buttons\n colRemoveBtns.forEach((b) => b.remove());\n colRemoveBtns = [];\n rowRemoveBtns.forEach((b) => b.remove());\n rowRemoveBtns = [];\n\n const numCols = cells.length > 0 ? cells[0].length : 0;\n const numRows = cells.length;\n\n // Create column (×) remove buttons — positioned dynamically on mousemove\n if (numCols > 1) {\n const headerCells = Array.from(\n tableEl.querySelectorAll<HTMLTableCellElement>(\"thead td[data-col]\"),\n );\n for (const hc of headerCells) {\n const colIdx = parseInt(hc.getAttribute(\"data-col\") ?? \"0\", 10);\n const btn = makeOverlayCircleBtn({\n label: \"×\",\n title: t(\"tableRemoveColumn\", state),\n size: 16,\n color: \"var(--fb-error-color, #dc3545)\",\n textColor: \"white\",\n onClick: () => removeColumn(colIdx),\n });\n btn.setAttribute(\"data-action\", \"remove-col\");\n btn.setAttribute(\"data-col\", String(colIdx));\n btn.style.position = \"absolute\";\n btn.style.display = \"none\";\n tableWrapper.appendChild(btn);\n colRemoveBtns.push(btn);\n }\n }\n\n // Create row (×) remove buttons — positioned dynamically on mousemove\n if (numRows > 1) {\n const allRowElements = [\n ...(tableEl.tHead ? Array.from(tableEl.tHead.rows) : []),\n ...(tableEl.tBodies[0] ? Array.from(tableEl.tBodies[0].rows) : []),\n ].filter((r) => r.querySelector(\"td[data-row]\"));\n for (const rowEl of allRowElements) {\n const firstTd = rowEl.querySelector<HTMLTableCellElement>(\"td[data-row]\");\n if (!firstTd) continue;\n const rowIdx = parseInt(firstTd.getAttribute(\"data-row\") ?? \"0\", 10);\n const btn = makeOverlayCircleBtn({\n label: \"×\",\n title: t(\"tableRemoveRow\", state),\n size: 16,\n color: \"var(--fb-error-color, #dc3545)\",\n textColor: \"white\",\n onClick: () => removeRow(rowIdx),\n });\n btn.setAttribute(\"data-action\", \"remove-row\");\n btn.setAttribute(\"data-row\", String(rowIdx));\n btn.style.position = \"absolute\";\n btn.style.display = \"none\";\n tableWrapper.appendChild(btn);\n rowRemoveBtns.push(btn);\n }\n }\n\n // ---- Buffer zone overlay positioning helpers ----\n function updateTopZoneOverlays(\n mx: number, wr: DOMRect, tblR: DOMRect, scrollL: number, active: boolean,\n ): void {\n const headerCells = active\n ? Array.from(tableEl.querySelectorAll<HTMLTableCellElement>(\"thead td[data-col]\"))\n : [];\n\n let closestColIdx = -1;\n let closestColDist = Infinity;\n let closestBorderX = -1;\n let closestAfterCol = -1;\n let closestBorderDist = Infinity;\n\n for (let i = 0; i < headerCells.length; i++) {\n const cellRect = headerCells[i].getBoundingClientRect();\n const centerX = (cellRect.left + cellRect.right) / 2;\n const dist = Math.abs(mx - centerX);\n if (dist < closestColDist) {\n closestColDist = dist;\n closestColIdx = i;\n }\n const borderDist = Math.abs(mx - cellRect.right);\n if (borderDist < closestBorderDist && borderDist < 20) {\n closestBorderDist = borderDist;\n closestBorderX = cellRect.right - wr.left + scrollL;\n closestAfterCol = parseInt(headerCells[i].getAttribute(\"data-col\") ?? \"0\", 10);\n }\n }\n\n colRemoveBtns.forEach((btn, idx) => {\n if (!active || idx !== closestColIdx) {\n btn.style.display = \"none\";\n return;\n }\n const cellRect = headerCells[idx].getBoundingClientRect();\n const centerX = (cellRect.left + cellRect.right) / 2 - wr.left + scrollL;\n btn.style.left = `${centerX - 8}px`;\n btn.style.top = \"2px\";\n btn.style.display = \"flex\";\n });\n\n if (active && closestAfterCol >= 0) {\n insertColBtn.style.display = \"flex\";\n insertColBtn.style.left = `${closestBorderX - 10}px`;\n insertColBtn.style.top = `${tblR.top - wr.top - 10}px`;\n insertColBtn.dataset.afterCol = String(closestAfterCol);\n } else {\n insertColBtn.style.display = \"none\";\n }\n }\n\n function updateLeftZoneOverlays(\n my: number, wr: DOMRect, tblR: DOMRect, scrollL: number, active: boolean,\n ): void {\n const allRowEls: HTMLTableRowElement[] = [];\n if (active) {\n if (tableEl.tHead) {\n for (const row of Array.from(tableEl.tHead.rows)) {\n if (row.querySelector(\"td[data-row]\")) allRowEls.push(row);\n }\n }\n if (tableEl.tBodies[0]) {\n for (const row of Array.from(tableEl.tBodies[0].rows)) {\n if (row.querySelector(\"td[data-row]\")) allRowEls.push(row);\n }\n }\n }\n\n let closestRowIdx = -1;\n let closestRowDist = Infinity;\n let closestBorderY = -1;\n let closestAfterRow = -1;\n let closestRowBorderDist = Infinity;\n\n for (let i = 0; i < allRowEls.length; i++) {\n const trRect = allRowEls[i].getBoundingClientRect();\n const centerY = (trRect.top + trRect.bottom) / 2;\n const dist = Math.abs(my - centerY);\n if (dist < closestRowDist) {\n closestRowDist = dist;\n closestRowIdx = i;\n }\n const borderDist = Math.abs(my - trRect.bottom);\n if (borderDist < closestRowBorderDist && borderDist < 14) {\n closestRowBorderDist = borderDist;\n closestBorderY = trRect.bottom - wr.top;\n const firstTd = allRowEls[i].querySelector(\"td[data-row]\");\n closestAfterRow = parseInt(firstTd?.getAttribute(\"data-row\") ?? \"0\", 10);\n }\n }\n\n rowRemoveBtns.forEach((btn, idx) => {\n if (!active || idx !== closestRowIdx) {\n btn.style.display = \"none\";\n return;\n }\n const trRect = allRowEls[idx].getBoundingClientRect();\n const centerY = (trRect.top + trRect.bottom) / 2 - wr.top;\n btn.style.left = \"4px\";\n btn.style.top = `${centerY - 8}px`;\n btn.style.display = \"flex\";\n });\n\n if (active && closestAfterRow >= 0) {\n insertRowBtn.style.display = \"flex\";\n insertRowBtn.style.top = `${closestBorderY - 10}px`;\n insertRowBtn.style.left = `${tblR.left - wr.left + scrollL - 10}px`;\n insertRowBtn.dataset.afterRow = String(closestAfterRow);\n } else {\n insertRowBtn.style.display = \"none\";\n }\n }\n\n // Unified mousemove handler (rAF-throttled for performance)\n let rafPending = false;\n tableWrapper.onmousemove = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === \"BUTTON\" && target.parentElement === tableWrapper) return;\n\n if (rafPending) return;\n rafPending = true;\n const mx = e.clientX;\n const my = e.clientY;\n\n requestAnimationFrame(() => {\n rafPending = false;\n const wr = tableWrapper.getBoundingClientRect();\n const tblR = tableEl.getBoundingClientRect();\n const scrollL = tableWrapper.scrollLeft;\n\n const inTopZone = my >= wr.top && my < tblR.top + 4;\n const inLeftZone = mx >= wr.left && mx < tblR.left + 4;\n const visibleRight = Math.min(tblR.right, wr.right);\n const inRightZone = mx > visibleRight - 20 && mx <= wr.right;\n const inBottomZone = my > tblR.bottom - 4 && my <= wr.bottom + 20;\n\n updateTopZoneOverlays(mx, wr, tblR, scrollL, inTopZone);\n updateLeftZoneOverlays(my, wr, tblR, scrollL, inLeftZone);\n\n addLastColBtn.style.display = inRightZone ? \"flex\" : \"none\";\n if (inRightZone) {\n addLastColBtn.style.left = `${wr.right - wr.left + scrollL - 20}px`;\n addLastColBtn.style.top = `${(tblR.top + tblR.bottom) / 2 - wr.top - 10}px`;\n }\n\n addLastRowBtn.style.display = inBottomZone ? \"flex\" : \"none\";\n if (inBottomZone) {\n const visibleCenterX = (wr.left + wr.right) / 2 - wr.left + scrollL;\n addLastRowBtn.style.left = `${visibleCenterX - 10}px`;\n addLastRowBtn.style.top = `${tblR.bottom - wr.top - 10}px`;\n }\n });\n };\n\n tableWrapper.onmouseleave = () => {\n colRemoveBtns.forEach((btn) => { btn.style.display = \"none\"; });\n rowRemoveBtns.forEach((btn) => { btn.style.display = \"none\"; });\n insertColBtn.style.display = \"none\";\n insertRowBtn.style.display = \"none\";\n addLastColBtn.style.display = \"none\";\n addLastRowBtn.style.display = \"none\";\n };\n }\n\n // Initial render\n rebuild();\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nfunction defaultTableData(element: TableElement): TableData {\n return {\n cells: createEmptyCells(element.rows ?? 3, element.columns ?? 3),\n merges: [],\n };\n}\n\nfunction isTableData(v: unknown): v is TableData {\n return (\n v !== null &&\n typeof v === \"object\" &&\n \"cells\" in (v as object) &&\n Array.isArray((v as TableData).cells)\n );\n}\n\n/**\n * Check if value has table data using custom field names\n */\nfunction isTableDataWithFieldNames(\n v: unknown,\n cellsKey: string,\n): boolean {\n return (\n v !== null &&\n typeof v === \"object\" &&\n cellsKey in (v as object) &&\n Array.isArray((v as Record<string, unknown>)[cellsKey])\n );\n}\n\nexport function renderTableElement(\n element: TableElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const rawPrefill = ctx.prefill[element.key];\n const cellsKey = element.fieldNames?.cells ?? \"cells\";\n const mergesKey = element.fieldNames?.merges ?? \"merges\";\n\n let initialData: TableData;\n\n if (isTableData(rawPrefill)) {\n initialData = {\n cells: rawPrefill.cells,\n merges: rawPrefill.merges ? migrateMerges(rawPrefill.merges) : [],\n };\n } else if (\n rawPrefill &&\n isTableDataWithFieldNames(rawPrefill, cellsKey)\n ) {\n // Map custom field names to standard internal format\n const rawMerges = (rawPrefill as Record<string, unknown>)[mergesKey] as unknown[] | undefined;\n initialData = {\n cells: (rawPrefill as Record<string, unknown>)[cellsKey] as string[][],\n merges: rawMerges ? migrateMerges(rawMerges) : [],\n };\n } else if (isTableData(element.default)) {\n initialData = {\n cells: element.default.cells,\n merges: element.default.merges ? migrateMerges(element.default.merges) : [],\n };\n } else if (element.default && isTableDataWithFieldNames(element.default, cellsKey)) {\n const rawMerges = (element.default as Record<string, unknown>)[mergesKey] as unknown[] | undefined;\n initialData = {\n cells: (element.default as Record<string, unknown>)[cellsKey] as string[][],\n merges: rawMerges ? migrateMerges(rawMerges) : [],\n };\n } else {\n initialData = defaultTableData(element);\n }\n\n // Validate merges in prefill data\n if (initialData.merges && initialData.merges.length > 0) {\n const rows = initialData.cells.length;\n const cols = rows > 0 ? initialData.cells[0].length : 0;\n const err = validateMerges(initialData.merges, rows, cols);\n if (err) {\n console.warn(`Table \"${element.key}\": invalid prefill merges stripped (${err})`);\n initialData = { ...initialData, merges: [] };\n }\n }\n\n if (state.config.readonly) {\n renderReadonlyTable(initialData, wrapper);\n } else {\n renderEditTable(element, initialData, pathKey, ctx, wrapper);\n }\n}\n\nexport function validateTableElement(\n element: TableElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const { scopeRoot, skipValidation } = context;\n const errors: string[] = [];\n const cellsKey = element.fieldNames?.cells ?? \"cells\";\n\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${key}\"]`,\n );\n if (!hiddenInput) {\n // Readonly mode: no hidden input\n return { value: null, errors };\n }\n\n let value: Record<string, unknown> | null = null;\n try {\n value = JSON.parse(hiddenInput.value) as Record<string, unknown>;\n } catch {\n errors.push(`${key}: invalid table data`);\n return { value: null, errors };\n }\n\n if (!skipValidation && element.required) {\n const cells = value[cellsKey] as string[][] | undefined;\n const hasContent = cells?.some((row) =>\n row.some((cell) => cell.trim() !== \"\"),\n );\n if (!hasContent) {\n errors.push(`${key}: ${t(\"required\", context.state)}`);\n }\n }\n\n return { value, errors };\n}\n\nexport function updateTableField(\n element: TableElement,\n fieldPath: string,\n value: unknown,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n const cellsKey = element.fieldNames?.cells ?? \"cells\";\n const mergesKey = element.fieldNames?.merges ?? \"merges\";\n\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]`,\n ) as (HTMLInputElement & { _applyExternalUpdate?: (data: TableData) => void }) | null;\n if (!hiddenInput) {\n console.warn(\n `updateTableField: no hidden input found for \"${fieldPath}\". Re-render to reflect new data.`,\n );\n return;\n }\n\n // Normalize value with custom field names to internal TableData (+ legacy merge migration)\n let tableData: TableData | null = null;\n if (isTableData(value)) {\n tableData = {\n cells: value.cells,\n merges: value.merges ? migrateMerges(value.merges) : [],\n };\n } else if (value && isTableDataWithFieldNames(value, cellsKey)) {\n const rawMerges = (value as Record<string, unknown>)[mergesKey] as unknown[] | undefined;\n tableData = {\n cells: (value as Record<string, unknown>)[cellsKey] as string[][],\n merges: rawMerges ? migrateMerges(rawMerges) : [],\n };\n }\n\n if (tableData && hiddenInput._applyExternalUpdate) {\n hiddenInput._applyExternalUpdate(tableData);\n } else {\n hiddenInput.value = JSON.stringify(value);\n }\n}\n","// RichInput component - composite textarea + file attachments + @mention support\n\nimport type {\n RichInputElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n ResourceMetadata,\n} from \"../types/index.js\";\nimport type { State } from \"../types/state.js\";\nimport { t } from \"../utils/translation.js\";\nimport { escapeHtml, clear, formatFileSize } from \"../utils/helpers.js\";\nimport { createCharCounter } from \"./text.js\";\nimport {\n getAllowedExtensions,\n isFileExtensionAllowed,\n isFileSizeAllowed,\n} from \"./file.js\";\n\n// ---------------------------------------------------------------------------\n// Data model\n// ---------------------------------------------------------------------------\n\ninterface RichInputValue {\n text: string | null;\n files: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Auto-expand helper (mirrors textarea.ts pattern)\n// ---------------------------------------------------------------------------\n\nfunction applyAutoExpand(\n textarea: HTMLTextAreaElement,\n backdrop: HTMLElement | null,\n): void {\n textarea.style.overflow = \"hidden\";\n textarea.style.resize = \"none\";\n\n const lineCount = (textarea.value.match(/\\n/g) || []).length + 1;\n textarea.rows = Math.max(3, lineCount);\n\n const resize = (): void => {\n if (!textarea.isConnected) return;\n textarea.style.height = \"0\";\n textarea.style.height = `${textarea.scrollHeight}px`;\n // Sync backdrop height\n if (backdrop) {\n backdrop.style.height = `${textarea.scrollHeight}px`;\n }\n };\n\n textarea.addEventListener(\"input\", resize);\n\n setTimeout(() => {\n if (textarea.isConnected) resize();\n }, 0);\n}\n\n// ---------------------------------------------------------------------------\n// File display helpers\n// ---------------------------------------------------------------------------\n\nfunction buildFileLabels(\n files: string[],\n state: State,\n): Map<string, string> {\n const labels = new Map<string, string>();\n const nameCount = new Map<string, number>();\n\n for (const rid of files) {\n const meta = state.resourceIndex.get(rid);\n const name = meta?.name ?? rid;\n nameCount.set(name, (nameCount.get(name) ?? 0) + 1);\n }\n\n for (const rid of files) {\n const meta = state.resourceIndex.get(rid);\n const name = meta?.name ?? rid;\n if ((nameCount.get(name) ?? 1) > 1 && meta) {\n labels.set(rid, `${name} (${formatFileSize(meta.size)})`);\n } else {\n labels.set(rid, name);\n }\n }\n\n return labels;\n}\n\nfunction isImageMeta(meta: ResourceMetadata | undefined): boolean {\n if (!meta) return false;\n return meta.type.startsWith(\"image/\");\n}\n\n// ---------------------------------------------------------------------------\n// Mention matching helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build a label→rid map from the current files array.\n * Uses disambiguated labels (from buildFileLabels) so that duplicate\n * filenames get unique mention keys like \"image.png (1.2 MB)\".\n */\nfunction buildNameToRid(\n files: string[],\n state: State,\n): Map<string, string> {\n const labels = buildFileLabels(files, state);\n const map = new Map<string, string>();\n for (const rid of files) {\n const label = labels.get(rid);\n if (label) map.set(label, rid);\n }\n return map;\n}\n\n/**\n * Format a mention for insertion into text.\n * Names with spaces or quotes get quoted: @\"name with spaces\"\n * Names without spaces: @name\n */\nfunction formatMention(name: string): string {\n if (/\\s/.test(name) || name.includes('\"')) {\n return `@\"${name.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n }\n return `@${name}`;\n}\n\n/**\n * Token found by scanning text for @-patterns (quoted and unquoted).\n */\ninterface AtToken {\n start: number;\n end: number;\n raw: string;\n name: string;\n}\n\n/**\n * Scan text for all @-tokens.\n * Unquoted: @word (no whitespace in name)\n * Quoted: @\"name with spaces\" (backslash-escaped quotes inside)\n * Boundary: @ must be at start or preceded by whitespace;\n * token must be followed by whitespace or end.\n */\nfunction findAtTokens(text: string): AtToken[] {\n const tokens: AtToken[] = [];\n const len = text.length;\n let i = 0;\n\n while (i < len) {\n if (text[i] === \"@\") {\n if (i > 0 && !/\\s/.test(text[i - 1])) {\n i++;\n continue;\n }\n\n const start = i;\n i++; // skip @\n\n if (i < len && text[i] === '\"') {\n // Quoted mention: @\"...\"\n i++; // skip opening \"\n let name = \"\";\n while (i < len && text[i] !== '\"') {\n if (text[i] === \"\\\\\" && i + 1 < len) {\n name += text[i + 1];\n i += 2;\n } else {\n name += text[i];\n i++;\n }\n }\n if (i < len && text[i] === '\"') {\n i++; // skip closing \"\n if (i >= len || /\\s/.test(text[i])) {\n tokens.push({ start, end: i, raw: text.slice(start, i), name });\n }\n }\n } else if (i < len && !/\\s/.test(text[i])) {\n // Unquoted mention: @word\n const wordStart = i;\n while (i < len && !/\\s/.test(text[i])) {\n i++;\n }\n const name = text.slice(wordStart, i);\n tokens.push({ start, end: i, raw: text.slice(start, i), name });\n }\n } else {\n i++;\n }\n }\n\n return tokens;\n}\n\n/**\n * Find all @mentions in text matched against known file names.\n * Supports both @name and @\"name with spaces\" forms.\n */\nfunction findMentions(\n text: string,\n nameToRid: Map<string, string>,\n): { start: number; end: number; name: string; rid: string }[] {\n if (nameToRid.size === 0) return [];\n\n const tokens = findAtTokens(text);\n const results: { start: number; end: number; name: string; rid: string }[] =\n [];\n\n for (const token of tokens) {\n const rid = nameToRid.get(token.name);\n if (rid) {\n results.push({\n start: token.start,\n end: token.end,\n name: token.name,\n rid,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Replace @filename with @resourceId in text for submission.\n */\nfunction replaceFilenamesWithRids(\n text: string,\n nameToRid: Map<string, string>,\n): string {\n const mentions = findMentions(text, nameToRid);\n if (mentions.length === 0) return text;\n\n let result = \"\";\n let lastIdx = 0;\n for (const m of mentions) {\n result += text.slice(lastIdx, m.start);\n result += `@${m.rid}`;\n lastIdx = m.end;\n }\n result += text.slice(lastIdx);\n return result;\n}\n\n/**\n * Replace @resourceId with @label in text for display in edit mode.\n * Uses disambiguated labels so duplicate filenames get unique mentions.\n * Resource IDs are always unquoted; output uses quoted form when label has spaces.\n */\nfunction replaceRidsWithFilenames(\n text: string,\n files: string[],\n state: State,\n): string {\n const labels = buildFileLabels(files, state);\n const ridToLabel = new Map<string, string>();\n for (const rid of files) {\n const label = labels.get(rid);\n if (label) ridToLabel.set(rid, label);\n }\n\n const tokens = findAtTokens(text);\n if (tokens.length === 0) return text;\n\n let result = \"\";\n let lastIdx = 0;\n for (const token of tokens) {\n result += text.slice(lastIdx, token.start);\n const label = ridToLabel.get(token.name);\n if (label) {\n result += formatMention(label);\n } else {\n result += token.raw;\n }\n lastIdx = token.end;\n }\n result += text.slice(lastIdx);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Thumbnail rendering (for a single file thumb slot)\n// ---------------------------------------------------------------------------\n\nfunction renderThumbContent(\n thumb: HTMLElement,\n rid: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): void {\n clear(thumb);\n\n if (meta?.file && isImageMeta(meta)) {\n const img = document.createElement(\"img\");\n img.alt = meta.name;\n img.style.cssText =\n \"width: 100%; height: 100%; object-fit: cover; display: block;\";\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n thumb.appendChild(img);\n } else if (state.config.getThumbnail) {\n state.config\n .getThumbnail(rid)\n .then((url) => {\n if (!url || !thumb.isConnected) return;\n const img = document.createElement(\"img\");\n img.alt = meta?.name ?? rid;\n img.src = url;\n img.style.cssText =\n \"width: 100%; height: 100%; object-fit: cover; display: block;\";\n clear(thumb);\n thumb.appendChild(img);\n })\n .catch((err: Error) => {\n state.config.onThumbnailError?.(err, rid);\n });\n const placeholder = document.createElement(\"div\");\n placeholder.style.cssText =\n \"width: 100%; height: 100%; background: var(--fb-background-hover-color, #f3f4f6); display: flex; align-items: center; justify-content: center;\";\n placeholder.innerHTML =\n '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>';\n thumb.appendChild(placeholder);\n } else {\n const icon = document.createElement(\"div\");\n icon.style.cssText =\n \"width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 2px; box-sizing: border-box;\";\n icon.innerHTML =\n '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>';\n if (meta?.name) {\n const nameEl = document.createElement(\"span\");\n nameEl.style.cssText =\n \"font-size: 9px; text-align: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 44px; color: var(--fb-text-color, #111827);\";\n nameEl.textContent = meta.name;\n icon.appendChild(nameEl);\n }\n thumb.appendChild(icon);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hover preview rendering (for mention tooltip — image only)\n// ---------------------------------------------------------------------------\n\nfunction renderImagePreview(\n hoverEl: HTMLElement,\n rid: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): void {\n clear(hoverEl);\n\n if (meta?.file && isImageMeta(meta)) {\n const img = document.createElement(\"img\");\n img.alt = meta.name;\n img.style.cssText =\n \"max-width: 120px; max-height: 120px; object-fit: contain; display: block;\";\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n hoverEl.appendChild(img);\n } else if (state.config.getThumbnail) {\n state.config\n .getThumbnail(rid)\n .then((url) => {\n if (!url || !hoverEl.isConnected) return;\n const img = document.createElement(\"img\");\n img.alt = meta?.name ?? rid;\n img.src = url;\n img.style.cssText =\n \"max-width: 120px; max-height: 120px; object-fit: contain; display: block;\";\n clear(hoverEl);\n hoverEl.appendChild(img);\n })\n .catch((err: Error) => {\n state.config.onThumbnailError?.(err, rid);\n });\n }\n // If no image and no getThumbnail, render nothing (mention tooltip stays compact)\n}\n\n// ---------------------------------------------------------------------------\n// Portal tooltip positioning helper\n// ---------------------------------------------------------------------------\n\nfunction positionPortalTooltip(tooltip: HTMLElement, anchor: HTMLElement): void {\n const rect = anchor.getBoundingClientRect();\n const ttRect = tooltip.getBoundingClientRect();\n const left = Math.max(\n 4,\n Math.min(\n rect.left + rect.width / 2 - ttRect.width / 2,\n window.innerWidth - ttRect.width - 4,\n ),\n );\n const topAbove = rect.top - ttRect.height - 8;\n const topBelow = rect.bottom + 8;\n const top = topAbove >= 4 ? topAbove : topBelow;\n tooltip.style.left = `${left}px`;\n tooltip.style.top = `${Math.max(4, top)}px`;\n}\n\n// ---------------------------------------------------------------------------\n// Mention tooltip (shown on @mention hover in backdrop — image preview only)\n// ---------------------------------------------------------------------------\n\nfunction showMentionTooltip(\n anchor: HTMLElement,\n rid: string,\n state: State,\n): HTMLElement {\n const meta = state.resourceIndex.get(rid);\n const tooltip = document.createElement(\"div\");\n tooltip.className = \"fb-richinput-portal-tooltip fb-richinput-mention-tooltip\";\n tooltip.style.cssText = `\n position: fixed;\n z-index: 99999;\n background: #fff;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n padding: 4px;\n pointer-events: none;\n min-width: 60px;\n max-width: 140px;\n `;\n\n const preview = document.createElement(\"div\");\n preview.style.cssText =\n \"min-height: 60px; max-height: 120px; display: flex; align-items: center; justify-content: center;\";\n renderImagePreview(preview, rid, meta, state);\n tooltip.appendChild(preview);\n\n document.body.appendChild(tooltip);\n positionPortalTooltip(tooltip, anchor);\n\n return tooltip;\n}\n\n// ---------------------------------------------------------------------------\n// File tooltip (shown on file chip hover — full filename + action buttons)\n// ---------------------------------------------------------------------------\n\ninterface FileTooltipOptions {\n rid: string;\n state: State;\n isReadonly: boolean;\n onMention?: () => void;\n onRemove?: () => void;\n}\n\nfunction showFileTooltip(\n anchor: HTMLElement,\n opts: FileTooltipOptions,\n): HTMLElement {\n const { rid, state, isReadonly, onMention, onRemove } = opts;\n const meta = state.resourceIndex.get(rid);\n const filename = meta?.name ?? rid;\n\n const tooltip = document.createElement(\"div\");\n tooltip.className = \"fb-richinput-portal-tooltip fb-richinput-file-tooltip\";\n tooltip.style.cssText = `\n position: fixed;\n z-index: 99999;\n background: #fff;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n padding: 4px;\n pointer-events: auto;\n min-width: 80px;\n max-width: 260px;\n `;\n\n // Image preview area\n const preview = document.createElement(\"div\");\n preview.style.cssText =\n \"min-height: 60px; max-height: 120px; display: flex; align-items: center; justify-content: center;\";\n renderImagePreview(preview, rid, meta, state);\n tooltip.appendChild(preview);\n\n // Full filename (no truncation)\n const nameEl = document.createElement(\"div\");\n nameEl.style.cssText =\n \"padding: 4px 6px 2px; font-size: 12px; color: var(--fb-text-color, #111827); word-break: break-word; border-top: 1px solid var(--fb-border-color, #d1d5db);\";\n nameEl.textContent = filename;\n tooltip.appendChild(nameEl);\n\n // Action buttons row\n const actionsRow = document.createElement(\"div\");\n actionsRow.style.cssText =\n \"display: flex; align-items: center; gap: 2px; padding: 3px 4px 2px; border-top: 1px solid var(--fb-border-color, #d1d5db); justify-content: center;\";\n\n const btnStyle =\n \"background: none; border: none; cursor: pointer; padding: 3px 5px; border-radius: 4px; color: var(--fb-text-muted-color, #6b7280); display: flex; align-items: center; transition: background 0.1s, color 0.1s;\";\n const btnHoverIn = (btn: HTMLButtonElement): void => {\n btn.style.background = \"var(--fb-background-hover-color, #f3f4f6)\";\n btn.style.color = \"var(--fb-text-color, #111827)\";\n };\n const btnHoverOut = (btn: HTMLButtonElement): void => {\n btn.style.background = \"none\";\n btn.style.color = \"var(--fb-text-muted-color, #6b7280)\";\n };\n\n // Order: mention, download, open, bin\n\n // Mention button (edit-only, first)\n if (!isReadonly && onMention) {\n const mentionBtn = document.createElement(\"button\");\n mentionBtn.type = \"button\";\n mentionBtn.title = \"Mention\";\n mentionBtn.style.cssText = btnStyle;\n mentionBtn.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-3.92 7.94\"/></svg>';\n mentionBtn.addEventListener(\"mouseenter\", () => btnHoverIn(mentionBtn));\n mentionBtn.addEventListener(\"mouseleave\", () => btnHoverOut(mentionBtn));\n mentionBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n onMention();\n tooltip.remove();\n });\n actionsRow.appendChild(mentionBtn);\n }\n\n // Download button\n if (state.config.downloadFile) {\n const dlBtn = document.createElement(\"button\");\n dlBtn.type = \"button\";\n dlBtn.title = \"Download\";\n dlBtn.style.cssText = btnStyle;\n dlBtn.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>';\n dlBtn.addEventListener(\"mouseenter\", () => btnHoverIn(dlBtn));\n dlBtn.addEventListener(\"mouseleave\", () => btnHoverOut(dlBtn));\n dlBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n state.config.downloadFile?.(rid, filename);\n });\n actionsRow.appendChild(dlBtn);\n }\n\n // Open in new window button\n const hasOpenUrl = !!(state.config.getDownloadUrl ?? state.config.getThumbnail);\n if (hasOpenUrl) {\n const openBtn = document.createElement(\"button\");\n openBtn.type = \"button\";\n openBtn.title = \"Open in new window\";\n openBtn.style.cssText = btnStyle;\n openBtn.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg>';\n openBtn.addEventListener(\"mouseenter\", () => btnHoverIn(openBtn));\n openBtn.addEventListener(\"mouseleave\", () => btnHoverOut(openBtn));\n openBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (state.config.getDownloadUrl) {\n const url = state.config.getDownloadUrl(rid);\n if (url) {\n window.open(url, \"_blank\");\n } else {\n // fallback to thumbnail\n state.config.getThumbnail?.(rid).then((thumbUrl) => {\n if (thumbUrl) window.open(thumbUrl, \"_blank\");\n }).catch(() => { /* ignore */ });\n }\n } else {\n state.config.getThumbnail?.(rid).then((url) => {\n if (url) window.open(url, \"_blank\");\n }).catch(() => { /* ignore */ });\n }\n });\n actionsRow.appendChild(openBtn);\n }\n\n // Bin/trash button (edit-only, last)\n if (!isReadonly && onRemove) {\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.title = \"Remove\";\n removeBtn.style.cssText = btnStyle;\n removeBtn.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/></svg>';\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.background = \"var(--fb-background-hover-color, #f3f4f6)\";\n removeBtn.style.color = \"var(--fb-error-color, #ef4444)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => btnHoverOut(removeBtn));\n removeBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n tooltip.remove();\n onRemove();\n });\n actionsRow.appendChild(removeBtn);\n }\n\n const hasActions = actionsRow.children.length > 0;\n if (hasActions) {\n tooltip.appendChild(actionsRow);\n }\n\n document.body.appendChild(tooltip);\n positionPortalTooltip(tooltip, anchor);\n\n return tooltip;\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip hide helper with delay (so mouse can travel from chip to tooltip)\n// ---------------------------------------------------------------------------\n\ninterface TooltipHandle {\n element: HTMLElement | null;\n hideTimer: ReturnType<typeof setTimeout> | null;\n}\n\nfunction createTooltipHandle(): TooltipHandle {\n return { element: null, hideTimer: null };\n}\n\nfunction scheduleHideTooltip(handle: TooltipHandle, delayMs = 150): void {\n if (handle.hideTimer !== null) return;\n handle.hideTimer = setTimeout(() => {\n handle.hideTimer = null;\n if (handle.element) {\n handle.element.remove();\n handle.element = null;\n }\n }, delayMs);\n}\n\nfunction cancelHideTooltip(handle: TooltipHandle): void {\n if (handle.hideTimer !== null) {\n clearTimeout(handle.hideTimer);\n handle.hideTimer = null;\n }\n}\n\nfunction removePortalTooltip(tooltip: HTMLElement | null): null {\n if (tooltip) tooltip.remove();\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// @mention dropdown\n// ---------------------------------------------------------------------------\n\ninterface DropdownState {\n open: boolean;\n query: string;\n triggerPos: number;\n selectedIndex: number;\n}\n\n/**\n * Find the @trigger position. Allows spaces in the query so filenames\n * with spaces (e.g. \"photo 2026-03-06.jpeg\") work properly.\n * Walks backward from cursor to find the last @ preceded by whitespace or at start.\n *\n * Rules:\n * - `@mention` as first symbol → valid\n * - `\\s@mention` (space/tab/newline before @) → valid\n * - `char@not`, `@@not`, `.@not` → invalid (non-whitespace before @)\n */\nfunction getAtTrigger(\n textarea: HTMLTextAreaElement,\n): { query: string; pos: number } | null {\n const cursorPos = textarea.selectionStart ?? 0;\n const textBefore = textarea.value.slice(0, cursorPos);\n\n // Find the last @ that is at position 0 or preceded by whitespace (\\s)\n for (let i = textBefore.length - 1; i >= 0; i--) {\n if (textBefore[i] === \"@\") {\n if (i === 0 || /\\s/.test(textBefore[i - 1])) {\n let query = textBefore.slice(i + 1);\n // Strip leading quote if user is typing a quoted mention\n if (query.startsWith('\"')) {\n query = query.slice(1);\n }\n return { query, pos: i };\n }\n // @ preceded by non-whitespace — not a valid trigger, stop searching\n return null;\n }\n }\n return null;\n}\n\nfunction filterFilesForDropdown(\n query: string,\n files: string[],\n labels: Map<string, string>,\n): string[] {\n const lq = query.toLowerCase();\n return files.filter((rid) => {\n const label = labels.get(rid) ?? rid;\n return label.toLowerCase().includes(lq);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Common style constants\n// ---------------------------------------------------------------------------\n\nconst TEXTAREA_FONT =\n \"font-size: var(--fb-font-size, 14px); font-family: var(--fb-font-family, inherit); line-height: 1.6;\";\nconst TEXTAREA_PADDING = \"padding: 12px 52px 12px 14px;\"; // right padding for paperclip\n\n// ---------------------------------------------------------------------------\n// Edit mode renderer\n// ---------------------------------------------------------------------------\n\nfunction renderEditMode(\n element: RichInputElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n initialValue: RichInputValue,\n): void {\n const state = ctx.state;\n\n // Closure state\n const files: string[] = [...initialValue.files];\n\n const dropdownState: DropdownState = {\n open: false,\n query: \"\",\n triggerPos: -1,\n selectedIndex: 0,\n };\n\n const docListenerCtrl = new AbortController();\n\n // ---------------------------------------------------------------------------\n // Hidden input (stores JSON for getFormData())\n // ---------------------------------------------------------------------------\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n\n function getCurrentValue(): Record<string, string | string[] | null> {\n const rawText = textarea.value;\n const nameToRid = buildNameToRid(files, state);\n const submissionText = rawText\n ? replaceFilenamesWithRids(rawText, nameToRid)\n : null;\n const textKey = element.textKey ?? \"text\";\n const filesKey = element.filesKey ?? \"files\";\n return {\n [textKey]: rawText === \"\" ? null : submissionText,\n [filesKey]: [...files],\n };\n }\n\n function writeHidden(): void {\n hiddenInput.value = JSON.stringify(getCurrentValue());\n }\n\n // ---------------------------------------------------------------------------\n // Outer container (chat-like rounded card)\n // ---------------------------------------------------------------------------\n const outerDiv = document.createElement(\"div\");\n outerDiv.className = \"fb-richinput-wrapper\";\n outerDiv.style.cssText = `\n position: relative;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 16px;\n background: var(--fb-background-color, #f9fafb);\n transition: box-shadow 0.15s, border-color 0.15s;\n `;\n\n // Focus-within ring\n outerDiv.addEventListener(\"focusin\", () => {\n outerDiv.style.borderColor = \"var(--fb-primary-color, #0066cc)\";\n outerDiv.style.boxShadow =\n \"0 0 0 2px color-mix(in srgb, var(--fb-primary-color, #0066cc) 25%, transparent)\";\n });\n outerDiv.addEventListener(\"focusout\", () => {\n outerDiv.style.borderColor = \"var(--fb-border-color, #d1d5db)\";\n outerDiv.style.boxShadow = \"none\";\n });\n\n // ---------------------------------------------------------------------------\n // Upload error display\n // ---------------------------------------------------------------------------\n const errorEl = document.createElement(\"div\");\n errorEl.className = \"fb-richinput-error\";\n errorEl.style.cssText =\n \"display: none; color: var(--fb-error-color, #ef4444); font-size: var(--fb-font-size-small, 12px); padding: 4px 14px 8px;\";\n\n let errorTimer: ReturnType<typeof setTimeout> | null = null;\n\n function showUploadError(message: string): void {\n errorEl.textContent = message;\n errorEl.style.display = \"block\";\n if (errorTimer) clearTimeout(errorTimer);\n errorTimer = setTimeout(() => {\n errorEl.style.display = \"none\";\n errorEl.textContent = \"\";\n errorTimer = null;\n }, 5000);\n }\n\n function validateFileForUpload(file: File): boolean {\n const allowedExtensions = getAllowedExtensions(element.accept);\n if (!isFileExtensionAllowed(file.name, allowedExtensions)) {\n const formats = allowedExtensions.join(\", \");\n showUploadError(\n t(\"invalidFileExtension\", state, { name: file.name, formats }),\n );\n return false;\n }\n\n const maxSizeMB = element.maxSize ?? Infinity;\n if (!isFileSizeAllowed(file, maxSizeMB)) {\n showUploadError(\n t(\"fileTooLarge\", state, {\n name: file.name,\n maxSize: maxSizeMB,\n }),\n );\n return false;\n }\n\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // Drag and drop\n // ---------------------------------------------------------------------------\n let dragCounter = 0;\n\n outerDiv.addEventListener(\"dragenter\", (e) => {\n e.preventDefault();\n dragCounter++;\n outerDiv.style.borderColor = \"var(--fb-primary-color, #0066cc)\";\n outerDiv.style.boxShadow =\n \"0 0 0 2px color-mix(in srgb, var(--fb-primary-color, #0066cc) 25%, transparent)\";\n });\n\n outerDiv.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n });\n\n outerDiv.addEventListener(\"dragleave\", (e) => {\n e.preventDefault();\n dragCounter--;\n if (dragCounter <= 0) {\n dragCounter = 0;\n outerDiv.style.borderColor = \"var(--fb-border-color, #d1d5db)\";\n outerDiv.style.boxShadow = \"none\";\n }\n });\n\n outerDiv.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n dragCounter = 0;\n outerDiv.style.borderColor = \"var(--fb-border-color, #d1d5db)\";\n outerDiv.style.boxShadow = \"none\";\n\n const droppedFiles = e.dataTransfer?.files;\n if (!droppedFiles || !state.config.uploadFile) return;\n\n const maxFiles = element.maxFiles ?? Infinity;\n for (let i = 0; i < droppedFiles.length; i++) {\n if (files.length >= maxFiles) {\n showUploadError(\n t(\"filesLimitExceeded\", state, {\n skipped: droppedFiles.length - i,\n max: maxFiles,\n }),\n );\n break;\n }\n if (!validateFileForUpload(droppedFiles[i])) continue;\n uploadFile(droppedFiles[i]);\n }\n });\n\n // ---------------------------------------------------------------------------\n // Files row (inside container, at top)\n // ---------------------------------------------------------------------------\n const filesRow = document.createElement(\"div\");\n filesRow.className = \"fb-richinput-files\";\n filesRow.style.cssText =\n \"display: none; flex-wrap: wrap; gap: 6px; padding: 10px 14px 0; align-items: center;\";\n\n // Hidden file picker\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.multiple = true;\n fileInput.style.display = \"none\";\n\n if (element.accept) {\n if (typeof element.accept === \"string\") {\n fileInput.accept = element.accept;\n } else {\n fileInput.accept = element.accept.extensions\n .map((ext) => (ext.startsWith(\".\") ? ext : `.${ext}`))\n .join(\",\");\n }\n }\n\n // ---------------------------------------------------------------------------\n // Textarea area (with highlight backdrop)\n // ---------------------------------------------------------------------------\n const textareaArea = document.createElement(\"div\");\n textareaArea.style.cssText = \"position: relative;\";\n\n // Highlight backdrop - renders behind textarea with @mentions highlighted\n const backdrop = document.createElement(\"div\");\n backdrop.className = \"fb-richinput-backdrop\";\n backdrop.style.cssText = `\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n ${TEXTAREA_PADDING}\n ${TEXTAREA_FONT}\n white-space: pre-wrap;\n word-break: break-word;\n color: transparent;\n pointer-events: none;\n overflow: hidden;\n border-radius: inherit;\n box-sizing: border-box;\n z-index: 2;\n `;\n\n const textarea = document.createElement(\"textarea\");\n textarea.name = `${pathKey}__text`;\n textarea.placeholder =\n element.placeholder || t(\"richinputPlaceholder\", state);\n // Convert any @resourceId references to @filename for display\n const rawInitialText = initialValue.text ?? \"\";\n textarea.value = rawInitialText\n ? replaceRidsWithFilenames(rawInitialText, files, state)\n : \"\";\n textarea.style.cssText = `\n width: 100%;\n ${TEXTAREA_PADDING}\n ${TEXTAREA_FONT}\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n color: var(--fb-text-color, #111827);\n box-sizing: border-box;\n position: relative;\n z-index: 1;\n caret-color: var(--fb-text-color, #111827);\n `;\n applyAutoExpand(textarea, backdrop);\n\n // Sync scroll\n textarea.addEventListener(\"scroll\", () => {\n backdrop.scrollTop = textarea.scrollTop;\n });\n\n // Mention hover tooltip (event delegation on backdrop marks)\n let mentionTooltip: HTMLElement | null = null;\n\n backdrop.addEventListener(\"mouseover\", (e: MouseEvent) => {\n const mark = (e.target as HTMLElement).closest?.(\"mark\") as HTMLElement | null;\n if (!mark?.dataset.rid) return;\n mentionTooltip = removePortalTooltip(mentionTooltip);\n mentionTooltip = showMentionTooltip(mark, mark.dataset.rid, state);\n });\n\n backdrop.addEventListener(\"mouseout\", (e: MouseEvent) => {\n const mark = (e.target as HTMLElement).closest?.(\"mark\") as HTMLElement | null;\n if (!mark) return;\n // Check if we moved to another mark or outside\n const related = e.relatedTarget as HTMLElement | null;\n if (related?.closest?.(\"mark\")) return; // moved to another mark\n mentionTooltip = removePortalTooltip(mentionTooltip);\n });\n\n // Forward mousedown on marks to the textarea for cursor placement\n backdrop.addEventListener(\"mousedown\", (e: MouseEvent) => {\n const mark = (e.target as HTMLElement).closest?.(\"mark\") as HTMLElement | null;\n if (!mark) return;\n mentionTooltip = removePortalTooltip(mentionTooltip);\n // Temporarily disable mark pointer-events\n const marks = backdrop.querySelectorAll<HTMLElement>(\"mark\");\n marks.forEach((m) => (m.style.pointerEvents = \"none\"));\n // Find the element underneath (should be textarea)\n const under = document.elementFromPoint(e.clientX, e.clientY);\n if (under) {\n under.dispatchEvent(\n new MouseEvent(\"mousedown\", {\n bubbles: true,\n cancelable: true,\n view: window,\n clientX: e.clientX,\n clientY: e.clientY,\n button: e.button,\n buttons: e.buttons,\n detail: e.detail,\n }),\n );\n }\n // Restore pointer-events on mouseup\n document.addEventListener(\n \"mouseup\",\n () => {\n marks.forEach((m) => (m.style.pointerEvents = \"auto\"));\n },\n { once: true },\n );\n });\n\n /** Re-render the highlight backdrop to match textarea content. */\n function updateBackdrop(): void {\n const text = textarea.value;\n const nameToRid = buildNameToRid(files, state);\n const tokens = findAtTokens(text);\n\n if (tokens.length === 0) {\n backdrop.innerHTML = escapeHtml(text) + \"\\n\";\n return;\n }\n\n // Classify each token as resolved or unresolved\n let html = \"\";\n let lastIdx = 0;\n for (const token of tokens) {\n html += escapeHtml(text.slice(lastIdx, token.start));\n const rid = nameToRid.get(token.name);\n if (rid) {\n // Resolved mention — blue highlight\n html += `<mark data-rid=\"${escapeHtml(rid)}\" style=\"background: color-mix(in srgb, var(--fb-primary-color, #0066cc) 15%, transparent); color: transparent; border-radius: 8px; padding: 0; border: none; box-shadow: 0 0 0 2px color-mix(in srgb, var(--fb-primary-color, #0066cc) 15%, transparent), 0 0 0 3px color-mix(in srgb, var(--fb-primary-color, #0066cc) 30%, transparent); box-decoration-break: clone; -webkit-box-decoration-break: clone; pointer-events: auto; cursor: text;\">${escapeHtml(text.slice(token.start, token.end))}</mark>`;\n } else {\n // Unresolved mention — red wavy underline (MS Word style)\n html += `<mark style=\"color: transparent; background: none; padding: 0; border: none; text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: rgba(239, 68, 68, 0.45); text-underline-offset: 2px;\">${escapeHtml(text.slice(token.start, token.end))}</mark>`;\n }\n lastIdx = token.end;\n }\n html += escapeHtml(text.slice(lastIdx));\n backdrop.innerHTML = html + \"\\n\";\n }\n\n // Paperclip button (inside textarea area, bottom-right)\n const paperclipBtn = document.createElement(\"button\");\n paperclipBtn.type = \"button\";\n paperclipBtn.title = t(\"richinputAttachFile\", state);\n paperclipBtn.style.cssText = `\n position: absolute;\n right: 10px;\n bottom: 10px;\n z-index: 2;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 8px;\n background: transparent;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--fb-text-muted-color, #9ca3af);\n transition: color 0.15s, background 0.15s;\n `;\n paperclipBtn.innerHTML =\n '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"/></svg>';\n paperclipBtn.addEventListener(\"mouseenter\", () => {\n paperclipBtn.style.color = \"var(--fb-primary-color, #0066cc)\";\n paperclipBtn.style.background = \"var(--fb-background-hover-color, #f3f4f6)\";\n });\n paperclipBtn.addEventListener(\"mouseleave\", () => {\n paperclipBtn.style.color = \"var(--fb-text-muted-color, #9ca3af)\";\n paperclipBtn.style.background = \"transparent\";\n });\n paperclipBtn.addEventListener(\"click\", () => {\n const maxFiles = element.maxFiles ?? Infinity;\n if (files.length >= maxFiles) {\n showUploadError(\n t(\"filesLimitExceeded\", state, { skipped: 1, max: maxFiles }),\n );\n return;\n }\n fileInput.click();\n });\n\n // ---------------------------------------------------------------------------\n // Dropdown element\n // ---------------------------------------------------------------------------\n const dropdown = document.createElement(\"div\");\n dropdown.className = \"fb-richinput-dropdown\";\n dropdown.style.cssText = `\n display: none;\n position: absolute;\n bottom: 100%;\n left: 0;\n z-index: 1000;\n background: #fff;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: var(--fb-border-radius, 6px);\n box-shadow: 0 4px 12px rgba(0,0,0,0.12);\n min-width: 180px;\n max-width: 320px;\n max-height: 200px;\n overflow-y: auto;\n margin-bottom: 4px;\n ${TEXTAREA_FONT}\n `;\n\n function buildFileLabelsFromClosure(): Map<string, string> {\n return buildFileLabels(files, state);\n }\n\n function renderDropdownItems(filtered: string[]): void {\n clear(dropdown);\n const labels = buildFileLabelsFromClosure();\n\n if (filtered.length === 0) {\n dropdown.style.display = \"none\";\n dropdownState.open = false;\n return;\n }\n\n filtered.forEach((rid, idx) => {\n const meta = state.resourceIndex.get(rid);\n const item = document.createElement(\"div\");\n item.className = \"fb-richinput-dropdown-item\";\n item.dataset.rid = rid;\n item.style.cssText = `\n padding: 5px 10px;\n cursor: pointer;\n color: var(--fb-text-color, #111827);\n background: ${idx === dropdownState.selectedIndex ? \"var(--fb-background-hover-color, #f3f4f6)\" : \"transparent\"};\n display: flex;\n align-items: center;\n gap: 8px;\n `;\n\n // Small preview thumbnail\n const thumb = document.createElement(\"div\");\n thumb.style.cssText =\n \"width: 24px; height: 24px; border-radius: 4px; overflow: hidden; flex-shrink: 0; background: var(--fb-background-hover-color, #f3f4f6); display: flex; align-items: center; justify-content: center;\";\n if (meta?.file && isImageMeta(meta)) {\n const img = document.createElement(\"img\");\n img.style.cssText =\n \"width: 100%; height: 100%; object-fit: cover; display: block;\";\n const reader = new FileReader();\n reader.onload = (ev) => {\n img.src = (ev.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n thumb.appendChild(img);\n } else if (state.config.getThumbnail) {\n state.config\n .getThumbnail(rid)\n .then((url) => {\n if (!url || !thumb.isConnected) return;\n const img = document.createElement(\"img\");\n img.style.cssText =\n \"width: 100%; height: 100%; object-fit: cover; display: block;\";\n img.src = url;\n clear(thumb);\n thumb.appendChild(img);\n })\n .catch(() => {\n /* ignore */\n });\n thumb.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>';\n } else {\n thumb.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>';\n }\n item.appendChild(thumb);\n\n // Filename label\n const nameSpan = document.createElement(\"span\");\n nameSpan.style.cssText =\n \"overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\";\n nameSpan.textContent = labels.get(rid) ?? rid;\n item.appendChild(nameSpan);\n\n dropdown.appendChild(item);\n });\n\n // Single mouseenter on dropdown — update highlight without re-rendering\n dropdown.onmousemove = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest?.(\n \".fb-richinput-dropdown-item\",\n ) as HTMLElement | null;\n if (!target) return;\n const newIdx = filtered.indexOf(target.dataset.rid ?? \"\");\n if (newIdx === -1 || newIdx === dropdownState.selectedIndex) return;\n // Update styles directly without re-rendering\n const items = dropdown.querySelectorAll<HTMLElement>(\n \".fb-richinput-dropdown-item\",\n );\n items.forEach((el, i) => {\n el.style.background =\n i === newIdx\n ? \"var(--fb-background-hover-color, #f3f4f6)\"\n : \"transparent\";\n });\n dropdownState.selectedIndex = newIdx;\n };\n\n // Single mousedown on dropdown — insert mention\n dropdown.onmousedown = (e: MouseEvent) => {\n e.preventDefault(); // keep textarea focus\n e.stopPropagation();\n const target = (e.target as HTMLElement).closest?.(\n \".fb-richinput-dropdown-item\",\n ) as HTMLElement | null;\n if (!target?.dataset.rid) return;\n insertMention(target.dataset.rid);\n };\n\n dropdown.style.display = \"block\";\n dropdownState.open = true;\n }\n\n function openDropdown(): void {\n const trigger = getAtTrigger(textarea);\n if (!trigger) {\n closeDropdown();\n return;\n }\n dropdownState.query = trigger.query;\n dropdownState.triggerPos = trigger.pos;\n dropdownState.selectedIndex = 0;\n\n const labels = buildFileLabelsFromClosure();\n const filtered = filterFilesForDropdown(trigger.query, files, labels);\n renderDropdownItems(filtered);\n }\n\n function closeDropdown(): void {\n dropdown.style.display = \"none\";\n dropdownState.open = false;\n }\n\n function insertMention(rid: string): void {\n const labels = buildFileLabelsFromClosure();\n const label = labels.get(rid) ?? state.resourceIndex.get(rid)?.name ?? rid;\n const cursorPos = textarea.selectionStart ?? 0;\n const before = textarea.value.slice(0, dropdownState.triggerPos);\n const after = textarea.value.slice(cursorPos);\n const mention = `${formatMention(label)} `;\n textarea.value = `${before}${mention}${after}`;\n const newPos = before.length + mention.length;\n textarea.setSelectionRange(newPos, newPos);\n textarea.dispatchEvent(new Event(\"input\"));\n closeDropdown();\n }\n\n // Textarea events\n textarea.addEventListener(\"input\", () => {\n updateBackdrop();\n writeHidden();\n ctx.instance?.triggerOnChange(pathKey, getCurrentValue());\n if (files.length > 0) {\n openDropdown();\n } else {\n closeDropdown();\n }\n });\n\n /** Update highlight styles on dropdown items without re-rendering DOM. */\n function updateDropdownHighlight(): void {\n const items = dropdown.querySelectorAll<HTMLElement>(\n \".fb-richinput-dropdown-item\",\n );\n items.forEach((el, i) => {\n el.style.background =\n i === dropdownState.selectedIndex\n ? \"var(--fb-background-hover-color, #f3f4f6)\"\n : \"transparent\";\n });\n }\n\n textarea.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (!dropdownState.open) return;\n const labels = buildFileLabelsFromClosure();\n const filtered = filterFilesForDropdown(\n dropdownState.query,\n files,\n labels,\n );\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n dropdownState.selectedIndex = Math.min(\n dropdownState.selectedIndex + 1,\n filtered.length - 1,\n );\n updateDropdownHighlight();\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n dropdownState.selectedIndex = Math.max(\n dropdownState.selectedIndex - 1,\n 0,\n );\n updateDropdownHighlight();\n } else if (e.key === \"Enter\" && filtered.length > 0) {\n e.preventDefault();\n insertMention(filtered[dropdownState.selectedIndex]);\n } else if (e.key === \"Escape\") {\n closeDropdown();\n }\n });\n\n // Close dropdown on outside click\n document.addEventListener(\n \"click\",\n (e: MouseEvent) => {\n if (\n !outerDiv.contains(e.target as Node) &&\n !dropdown.contains(e.target as Node)\n ) {\n closeDropdown();\n }\n },\n { signal: docListenerCtrl.signal },\n );\n\n // ---------------------------------------------------------------------------\n // Files row rendering\n // ---------------------------------------------------------------------------\n\n function renderFilesRow(): void {\n clear(filesRow);\n\n if (files.length === 0) {\n filesRow.style.display = \"none\";\n return;\n }\n filesRow.style.display = \"flex\";\n\n files.forEach((rid) => {\n const meta = state.resourceIndex.get(rid);\n\n const thumbWrapper = document.createElement(\"div\");\n thumbWrapper.className = \"fb-richinput-file-thumb\";\n thumbWrapper.style.cssText = `\n position: relative;\n width: 48px;\n height: 48px;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n cursor: pointer;\n background: #fff;\n `;\n\n const thumbInner = document.createElement(\"div\");\n thumbInner.style.cssText =\n \"width: 48px; height: 48px; border-radius: inherit; overflow: hidden;\";\n renderThumbContent(thumbInner, rid, meta, state);\n thumbWrapper.appendChild(thumbInner);\n\n // File tooltip with delayed hide so mouse can travel from chip to tooltip\n const tooltipHandle = createTooltipHandle();\n\n const doMention = (): void => {\n const cursorPos = textarea.selectionStart ?? textarea.value.length;\n const labels = buildFileLabelsFromClosure();\n const label = labels.get(rid) ?? meta?.name ?? rid;\n const before = textarea.value.slice(0, cursorPos);\n const after = textarea.value.slice(cursorPos);\n const prefix =\n before.length > 0 && !/[\\s\\n]$/.test(before) ? \"\\n\" : \"\";\n const mention = `${prefix}${formatMention(label)} `;\n textarea.value = `${before}${mention}${after}`;\n const newPos = cursorPos + mention.length;\n textarea.setSelectionRange(newPos, newPos);\n textarea.focus();\n textarea.dispatchEvent(new Event(\"input\"));\n };\n\n const doRemove = (): void => {\n const idx = files.indexOf(rid);\n if (idx !== -1) files.splice(idx, 1);\n renderFilesRow();\n updateBackdrop();\n writeHidden();\n ctx.instance?.triggerOnChange(pathKey, getCurrentValue());\n };\n\n thumbWrapper.addEventListener(\"mouseenter\", () => {\n cancelHideTooltip(tooltipHandle);\n if (!tooltipHandle.element) {\n tooltipHandle.element = showFileTooltip(thumbWrapper, {\n rid,\n state,\n isReadonly: false,\n onMention: doMention,\n onRemove: doRemove,\n });\n // Keep tooltip visible when mouse moves into it\n tooltipHandle.element.addEventListener(\"mouseenter\", () => {\n cancelHideTooltip(tooltipHandle);\n });\n tooltipHandle.element.addEventListener(\"mouseleave\", () => {\n scheduleHideTooltip(tooltipHandle);\n });\n }\n });\n\n thumbWrapper.addEventListener(\"mouseleave\", () => {\n scheduleHideTooltip(tooltipHandle);\n });\n\n filesRow.appendChild(thumbWrapper);\n });\n }\n\n // Shared upload function (used by file picker and drag-and-drop)\n function uploadFile(file: File): void {\n if (!state.config.uploadFile) return;\n\n const tempId = `temp-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n state.resourceIndex.set(tempId, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file,\n });\n files.push(tempId);\n renderFilesRow();\n\n // Mark loading\n const thumbs = filesRow.querySelectorAll<HTMLElement>(\n \".fb-richinput-file-thumb\",\n );\n const loadingThumb = thumbs[thumbs.length - 1];\n if (loadingThumb) loadingThumb.style.opacity = \"0.5\";\n\n state.config\n .uploadFile(file)\n .then((resourceId: string) => {\n const idx = files.indexOf(tempId);\n if (idx !== -1) files[idx] = resourceId;\n state.resourceIndex.delete(tempId);\n state.resourceIndex.set(resourceId, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file,\n });\n renderFilesRow();\n updateBackdrop();\n writeHidden();\n ctx.instance?.triggerOnChange(pathKey, getCurrentValue());\n })\n .catch((err: Error) => {\n const idx = files.indexOf(tempId);\n if (idx !== -1) files.splice(idx, 1);\n state.resourceIndex.delete(tempId);\n renderFilesRow();\n state.config.onUploadError?.(err, file);\n });\n }\n\n // File picker change handler\n fileInput.addEventListener(\"change\", () => {\n const selected = fileInput.files;\n if (!selected || selected.length === 0) return;\n const maxFiles = element.maxFiles ?? Infinity;\n for (let i = 0; i < selected.length; i++) {\n if (files.length >= maxFiles) {\n showUploadError(\n t(\"filesLimitExceeded\", state, {\n skipped: selected.length - i,\n max: maxFiles,\n }),\n );\n break;\n }\n if (!validateFileForUpload(selected[i])) continue;\n uploadFile(selected[i]);\n }\n fileInput.value = \"\";\n });\n\n // ---------------------------------------------------------------------------\n // Assemble\n // ---------------------------------------------------------------------------\n textareaArea.appendChild(backdrop);\n textareaArea.appendChild(textarea);\n textareaArea.appendChild(paperclipBtn);\n textareaArea.appendChild(dropdown);\n\n outerDiv.appendChild(filesRow);\n outerDiv.appendChild(textareaArea);\n outerDiv.appendChild(errorEl);\n\n // Character counter (only when min/maxLength defined)\n if (element.minLength != null || element.maxLength != null) {\n const counterRow = document.createElement(\"div\");\n counterRow.style.cssText =\n \"position: relative; padding: 2px 14px 6px; text-align: right;\";\n const counter = createCharCounter(element as any, textarea, false);\n counter.style.cssText = `\n position: static;\n display: inline-block;\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n pointer-events: none;\n `;\n counterRow.appendChild(counter);\n outerDiv.appendChild(counterRow);\n }\n\n outerDiv.appendChild(hiddenInput);\n outerDiv.appendChild(fileInput);\n\n writeHidden();\n updateBackdrop();\n\n // External update callback\n (\n hiddenInput as HTMLInputElement & {\n _applyExternalUpdate?: (value: RichInputValue) => void;\n }\n )._applyExternalUpdate = (value: RichInputValue) => {\n // Convert any @resourceId references to @filename for display\n const rawText = value.text ?? \"\";\n textarea.value = rawText\n ? replaceRidsWithFilenames(rawText, files, state)\n : \"\";\n textarea.dispatchEvent(new Event(\"input\"));\n files.length = 0;\n for (const rid of value.files) files.push(rid);\n renderFilesRow();\n updateBackdrop();\n writeHidden();\n };\n\n wrapper.appendChild(outerDiv);\n renderFilesRow();\n\n // Cleanup\n const observer = new MutationObserver(() => {\n if (!outerDiv.isConnected) {\n docListenerCtrl.abort();\n mentionTooltip = removePortalTooltip(mentionTooltip);\n observer.disconnect();\n }\n });\n if (outerDiv.parentElement) {\n observer.observe(outerDiv.parentElement, { childList: true });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Readonly mode renderer\n// ---------------------------------------------------------------------------\n\nfunction renderReadonlyMode(\n _element: RichInputElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n _pathKey: string,\n value: RichInputValue,\n): void {\n const state = ctx.state;\n const { text, files } = value;\n\n // In submitted data text has @resourceId — map back to filenames for display\n const ridToName = new Map<string, string>();\n for (const rid of files) {\n const meta = state.resourceIndex.get(rid);\n if (meta?.name) ridToName.set(rid, meta.name);\n }\n\n // File previews (read-only) — shown at top\n if (files.length > 0) {\n const filesRow = document.createElement(\"div\");\n filesRow.style.cssText =\n \"display: flex; flex-wrap: wrap; gap: 6px; padding-bottom: 8px;\";\n\n files.forEach((rid) => {\n const meta = state.resourceIndex.get(rid);\n\n const thumbWrapper = document.createElement(\"div\");\n thumbWrapper.style.cssText = `\n position: relative;\n width: 48px; height: 48px;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n background: #fff;\n cursor: default;\n `;\n\n const thumbInner = document.createElement(\"div\");\n thumbInner.style.cssText =\n \"width: 48px; height: 48px; border-radius: inherit; overflow: hidden;\";\n renderThumbContent(thumbInner, rid, meta, state);\n thumbWrapper.appendChild(thumbInner);\n\n const tooltipHandle = createTooltipHandle();\n thumbWrapper.addEventListener(\"mouseenter\", () => {\n cancelHideTooltip(tooltipHandle);\n if (!tooltipHandle.element) {\n tooltipHandle.element = showFileTooltip(thumbWrapper, {\n rid,\n state,\n isReadonly: true,\n });\n tooltipHandle.element.addEventListener(\"mouseenter\", () => {\n cancelHideTooltip(tooltipHandle);\n });\n tooltipHandle.element.addEventListener(\"mouseleave\", () => {\n scheduleHideTooltip(tooltipHandle);\n });\n }\n });\n thumbWrapper.addEventListener(\"mouseleave\", () => {\n scheduleHideTooltip(tooltipHandle);\n });\n\n filesRow.appendChild(thumbWrapper);\n });\n\n wrapper.appendChild(filesRow);\n }\n\n if (text) {\n const textDiv = document.createElement(\"div\");\n textDiv.style.cssText = `\n ${TEXTAREA_FONT}\n color: var(--fb-text-color, #111827);\n white-space: pre-wrap;\n word-break: break-word;\n `;\n\n // Match @resourceId or @filename or @\"quoted name\" patterns using token scanner\n const tokens = findAtTokens(text);\n const resolvedTokens = tokens.filter(\n (tok) =>\n ridToName.has(tok.name) ||\n [...ridToName.values()].includes(tok.name),\n );\n\n if (resolvedTokens.length === 0) {\n textDiv.textContent = text;\n } else {\n let lastIndex = 0;\n\n for (const token of resolvedTokens) {\n if (token.start > lastIndex) {\n textDiv.appendChild(\n document.createTextNode(text.slice(lastIndex, token.start)),\n );\n }\n const span = document.createElement(\"span\");\n span.style.cssText = `\n display: inline;\n background: color-mix(in srgb, var(--fb-primary-color, #0066cc) 15%, transparent);\n color: var(--fb-primary-color, #0066cc);\n border-radius: 8px;\n padding: 1px 6px;\n font-weight: 500;\n cursor: default;\n `;\n // Display filename even if data has @resourceId\n const rid = ridToName.has(token.name)\n ? token.name\n : [...ridToName.entries()].find(([, n]) => n === token.name)?.[0];\n const displayName = ridToName.get(token.name) ?? token.name;\n span.textContent = `@${displayName}`;\n\n // Tooltip on mention hover\n if (rid) {\n let spanTooltip: HTMLElement | null = null;\n const mentionRid = rid;\n span.addEventListener(\"mouseenter\", () => {\n spanTooltip = removePortalTooltip(spanTooltip);\n spanTooltip = showMentionTooltip(span, mentionRid, state);\n });\n span.addEventListener(\"mouseleave\", () => {\n spanTooltip = removePortalTooltip(spanTooltip);\n });\n }\n\n textDiv.appendChild(span);\n lastIndex = token.end;\n }\n if (lastIndex < text.length) {\n textDiv.appendChild(document.createTextNode(text.slice(lastIndex)));\n }\n }\n\n wrapper.appendChild(textDiv);\n }\n\n if (!text && files.length === 0) {\n const empty = document.createElement(\"div\");\n empty.style.cssText =\n \"color: var(--fb-text-muted-color, #6b7280); font-size: var(--fb-font-size, 14px);\";\n empty.textContent = \"—\";\n wrapper.appendChild(empty);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function renderRichInputElement(\n element: RichInputElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n\n const textKey = element.textKey ?? \"text\";\n const filesKey = element.filesKey ?? \"files\";\n let initialValue: RichInputValue;\n\n if (element.flatOutput) {\n // Flat output mode: text and files are sibling keys in the parent scope\n const textVal = ctx.prefill[textKey];\n const filesVal = ctx.prefill[filesKey];\n initialValue = {\n text: typeof textVal === \"string\" ? textVal : null,\n files: Array.isArray(filesVal) ? (filesVal as string[]) : [],\n };\n } else {\n const rawPrefill = ctx.prefill[element.key];\n if (rawPrefill && typeof rawPrefill === \"object\" && !Array.isArray(rawPrefill)) {\n const obj = rawPrefill as Record<string, unknown>;\n // Accept both custom keys and default keys (custom keys take priority)\n const textVal = obj[textKey] ?? obj[\"text\"];\n const filesVal = obj[filesKey] ?? obj[\"files\"];\n initialValue = {\n text: typeof textVal === \"string\" ? textVal : null,\n files: Array.isArray(filesVal) ? (filesVal as string[]) : [],\n };\n } else if (typeof rawPrefill === \"string\") {\n initialValue = { text: rawPrefill || null, files: [] };\n } else {\n initialValue = { text: null, files: [] };\n }\n }\n\n // Backfill resourceIndex for prefilled files not already tracked (Finding 2)\n for (const rid of initialValue.files) {\n if (!state.resourceIndex.has(rid)) {\n state.resourceIndex.set(rid, {\n name: rid,\n type: \"application/octet-stream\",\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n }\n\n if (state.config.readonly) {\n renderReadonlyMode(element, ctx, wrapper, pathKey, initialValue);\n } else {\n if (!state.config.uploadFile) {\n throw new Error(\n `RichInput field \"${element.key}\" requires uploadFile handler in config`,\n );\n }\n renderEditMode(element, ctx, wrapper, pathKey, initialValue);\n }\n}\n\nexport function validateRichInputElement(\n element: RichInputElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const { scopeRoot, state, skipValidation } = context;\n const errors: string[] = [];\n const textKey = element.textKey ?? \"text\";\n const filesKey = element.filesKey ?? \"files\";\n\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${key}\"]`,\n );\n if (!hiddenInput) {\n return { value: null, errors };\n }\n\n let rawValue: Record<string, unknown> = {};\n try {\n const parsed = JSON.parse(hiddenInput.value) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n rawValue = parsed as Record<string, unknown>;\n } else {\n errors.push(`${key}: invalid richinput data`);\n return { value: null, errors };\n }\n } catch {\n errors.push(`${key}: invalid richinput data`);\n return { value: null, errors };\n }\n\n const textVal = rawValue[textKey];\n const filesVal = rawValue[filesKey];\n const text = textVal === null || typeof textVal === \"string\" ? textVal : null;\n const files = Array.isArray(filesVal) ? (filesVal as string[]) : [];\n\n // Return value with the element's configured keys (textKey/filesKey)\n const value: Record<string, string | string[] | null> = {\n [textKey]: text ?? null,\n [filesKey]: files,\n };\n\n if (!skipValidation) {\n const textEmpty = !text || (text as string).trim() === \"\";\n const filesEmpty = files.length === 0;\n\n if (element.required && textEmpty && filesEmpty) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n\n if (!textEmpty && text) {\n if (element.minLength != null && text.length < element.minLength) {\n errors.push(\n `${key}: ${t(\"minLength\", state, { min: element.minLength })}`,\n );\n }\n if (element.maxLength != null && text.length > element.maxLength) {\n errors.push(\n `${key}: ${t(\"maxLength\", state, { max: element.maxLength })}`,\n );\n }\n }\n\n if (element.maxFiles != null && files.length > element.maxFiles) {\n errors.push(\n `${key}: ${t(\"maxFiles\", state, { max: element.maxFiles })}`,\n );\n }\n }\n\n return { value, errors, spread: !!element.flatOutput };\n}\n\nexport function updateRichInputField(\n element: RichInputElement,\n fieldPath: string,\n value: unknown,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]`,\n ) as\n | (HTMLInputElement & {\n _applyExternalUpdate?: (v: RichInputValue) => void;\n })\n | null;\n\n if (!hiddenInput) {\n console.warn(\n `updateRichInputField: no hidden input found for \"${fieldPath}\". Re-render to reflect new data.`,\n );\n return;\n }\n\n // Normalize incoming value: accept both default keys {text,files}\n // and custom keys {[textKey],[filesKey]}\n let normalized: RichInputValue | null = null;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const textKey = element.textKey ?? \"text\";\n const filesKey = element.filesKey ?? \"files\";\n const textVal = obj[textKey] ?? obj[\"text\"];\n const filesVal = obj[filesKey] ?? obj[\"files\"];\n if (textVal !== undefined || filesVal !== undefined) {\n normalized = {\n text: typeof textVal === \"string\" ? textVal : null,\n files: Array.isArray(filesVal) ? (filesVal as string[]) : [],\n };\n }\n }\n\n if (normalized && hiddenInput._applyExternalUpdate) {\n hiddenInput._applyExternalUpdate(normalized);\n } else if (normalized) {\n hiddenInput.value = JSON.stringify(normalized);\n }\n}\n","// Component registry and main renderElement dispatcher\n\nimport type { Element, RenderContext } from \"../types/index.js\";\nimport { pathJoin } from \"../utils/helpers.js\";\nimport { t } from \"../utils/translation.js\";\nimport { evaluateEnableCondition } from \"../utils/enable-conditions.js\";\nimport { renderTextElement, renderMultipleTextElement } from \"./text.js\";\nimport {\n renderTextareaElement,\n renderMultipleTextareaElement,\n} from \"./textarea.js\";\nimport { renderNumberElement, renderMultipleNumberElement } from \"./number.js\";\nimport { renderSelectElement, renderMultipleSelectElement } from \"./select.js\";\nimport {\n renderSwitcherElement,\n renderMultipleSwitcherElement,\n} from \"./switcher.js\";\nimport {\n renderFileElement,\n renderFilesElement,\n renderMultipleFileElement,\n} from \"./file.js\";\nimport { renderColourElement, renderMultipleColourElement } from \"./colour.js\";\nimport { renderSliderElement, renderMultipleSliderElement } from \"./slider.js\";\nimport {\n renderSingleContainerElement,\n renderMultipleContainerElement,\n setRenderElement as setContainerRenderElement,\n setValidateElement as setContainerValidateElement,\n} from \"./container.js\";\nimport {\n renderGroupElement,\n setRenderElement as setGroupRenderElement,\n} from \"./group.js\";\nimport { renderTableElement } from \"./table.js\";\nimport { renderRichInputElement } from \"./richinput.js\";\n\n// Tooltip management\nfunction showTooltip(tooltipId: string, button: HTMLElement): void {\n const tooltip = document.getElementById(tooltipId);\n if (!tooltip) return;\n\n const isCurrentlyVisible = !tooltip.classList.contains(\"hidden\");\n\n // Hide all tooltips first\n document.querySelectorAll('[id^=\"tooltip-\"]').forEach((t) => {\n t.classList.add(\"hidden\");\n });\n\n // If the tooltip was already visible, keep it hidden (toggle behavior)\n if (isCurrentlyVisible) {\n return;\n }\n\n // Position the tooltip intelligently\n const rect = button.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Ensure tooltip is appended to body for proper positioning\n if (tooltip && tooltip.parentElement !== document.body) {\n document.body.appendChild(tooltip);\n }\n\n // Show tooltip temporarily to measure its size\n tooltip.style.visibility = \"hidden\";\n tooltip.style.position = \"fixed\";\n tooltip.classList.remove(\"hidden\");\n const tooltipRect = tooltip.getBoundingClientRect();\n tooltip.classList.add(\"hidden\");\n tooltip.style.visibility = \"visible\";\n\n let left = rect.left;\n let top = rect.bottom + 5;\n\n // Adjust horizontal position if tooltip would go off-screen\n if (left + tooltipRect.width > viewportWidth) {\n left = rect.right - tooltipRect.width;\n }\n\n // Adjust vertical position if tooltip would go off-screen\n if (top + tooltipRect.height > viewportHeight) {\n top = rect.top - tooltipRect.height - 5;\n }\n\n // Ensure tooltip doesn't go off the left edge\n if (left < 10) {\n left = 10;\n }\n\n // Ensure tooltip doesn't go off the top edge\n if (top < 10) {\n top = rect.bottom + 5;\n }\n\n tooltip.style.left = `${left}px`;\n tooltip.style.top = `${top}px`;\n\n // Show the tooltip\n tooltip.classList.remove(\"hidden\");\n\n // Hide after 25 seconds\n setTimeout(() => {\n tooltip.classList.add(\"hidden\");\n }, 25000);\n}\n\n// Close tooltips when clicking outside\nif (typeof document !== \"undefined\") {\n document.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n const isInfoButton =\n target.closest(\"button\") && (target.closest(\"button\") as any).onclick;\n const isTooltip = target.closest('[id^=\"tooltip-\"]');\n\n if (!isInfoButton && !isTooltip) {\n document.querySelectorAll('[id^=\"tooltip-\"]').forEach((tooltip) => {\n tooltip.classList.add(\"hidden\");\n });\n }\n });\n}\n\n// Helper: Determine if element should be disabled based on enableIf\nfunction shouldDisableElement(\n element: Element,\n ctx: RenderContext,\n): boolean {\n if (!element.enableIf) {\n return false;\n }\n\n try {\n const rootFormData = ctx.formData ?? ctx.prefill ?? {};\n const scope = element.enableIf.scope ?? \"relative\";\n\n // For relative scope inside containers, use ctx.prefill directly\n // (it contains merged defaults from container rendering)\n // For absolute scope, containerData is not used by evaluateEnableCondition\n const containerData: Record<string, any> | undefined =\n scope === \"relative\" && ctx.path\n ? (ctx.prefill as Record<string, any>)\n : undefined;\n\n const shouldEnable = evaluateEnableCondition(\n element.enableIf,\n rootFormData,\n containerData,\n );\n\n return !shouldEnable;\n } catch (error) {\n // FAIL FAST: Log error and render field (fail-safe approach)\n console.error(\n `Error evaluating enableIf for field \"${element.key}\":`,\n error,\n );\n }\n\n return false;\n}\n\n// Helper: Extract current value from DOM for a field at given path\nfunction extractDOMValue(fieldPath: string, formRoot: HTMLElement): any {\n // Try to find input/select/textarea elements with matching name attribute\n const input = formRoot.querySelector<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n `[name=\"${fieldPath}\"]`\n );\n\n if (!input) {\n return undefined;\n }\n\n // Extract value based on input type\n if (input instanceof HTMLSelectElement) {\n return input.value;\n } else if (input instanceof HTMLInputElement) {\n if (input.type === 'checkbox') {\n return input.checked;\n } else if (input.type === 'radio') {\n const checked = formRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]:checked`\n );\n return checked ? checked.value : undefined;\n } else {\n return input.value;\n }\n } else if (input instanceof HTMLTextAreaElement) {\n return input.value;\n }\n\n return undefined;\n}\n\n// Helper: Re-evaluate enableIf for a field wrapper\nfunction reevaluateEnableIf(\n wrapper: HTMLElement,\n element: Element,\n ctx: RenderContext,\n): void {\n if (!element.enableIf) {\n return;\n }\n\n const formRoot = ctx.state.formRoot;\n if (!formRoot) {\n console.error(`Cannot re-evaluate enableIf: formRoot is null`);\n return;\n }\n\n const condition = element.enableIf;\n const scope = condition.scope ?? \"relative\";\n\n // Build data objects for evaluation\n let rootFormData: Record<string, any> = {};\n const containerData: Record<string, any> = {};\n\n // For root-level fields (empty ctx.path), relative scope behaves like absolute\n // because there's no container to be relative to\n const effectiveScope = (!ctx.path || ctx.path === \"\") ? \"absolute\" : scope;\n\n if (effectiveScope === \"relative\" && ctx.path) {\n // Extract container-local data from DOM\n // Parse container path to get all fields in this container\n const containerMatch = ctx.path.match(/^(.+)\\[(\\d+)\\]$/);\n\n if (containerMatch) {\n const containerKey = containerMatch[1];\n const containerIndex = parseInt(containerMatch[2], 10);\n const containerItemElement = formRoot.querySelector<HTMLElement>(\n `[data-container-item=\"${containerKey}[${containerIndex}]\"]`\n );\n\n if (containerItemElement) {\n // Extract all field values from this container instance\n const inputs = containerItemElement.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n 'input, select, textarea'\n );\n\n inputs.forEach(input => {\n const fieldName = input.getAttribute('name');\n if (fieldName) {\n // Extract the field key (last part after the last dot)\n const fieldKeyMatch = fieldName.match(/\\.([^.[\\]]+)$/);\n if (fieldKeyMatch) {\n const fieldKey = fieldKeyMatch[1];\n\n // Extract value based on input type\n if (input instanceof HTMLSelectElement) {\n containerData[fieldKey] = input.value;\n } else if (input instanceof HTMLInputElement) {\n if (input.type === 'checkbox') {\n containerData[fieldKey] = input.checked;\n } else if (input.type === 'radio') {\n if (input.checked) {\n containerData[fieldKey] = input.value;\n }\n } else {\n containerData[fieldKey] = input.value;\n }\n } else if (input instanceof HTMLTextAreaElement) {\n containerData[fieldKey] = input.value;\n }\n }\n }\n });\n }\n }\n } else {\n // For absolute scope, extract root-level data from DOM\n // Get the specific field value we need for the condition\n const dependencyKey = condition.key;\n const dependencyValue = extractDOMValue(dependencyKey, formRoot);\n\n if (dependencyValue !== undefined) {\n rootFormData[dependencyKey] = dependencyValue;\n } else {\n // Fall back to ctx.formData if we can't extract from DOM\n rootFormData = ctx.formData ?? ctx.prefill;\n }\n }\n\n // Evaluate the condition\n try {\n const shouldEnable = evaluateEnableCondition(\n condition,\n rootFormData,\n containerData,\n );\n\n // Update visibility\n if (shouldEnable) {\n // Show the field\n wrapper.style.display = '';\n wrapper.classList.remove('fb-field-wrapper-disabled');\n wrapper.removeAttribute('data-conditionally-disabled');\n } else {\n // Hide the field\n wrapper.style.display = 'none';\n wrapper.classList.add('fb-field-wrapper-disabled');\n wrapper.setAttribute('data-conditionally-disabled', 'true');\n }\n } catch (error) {\n console.error(`Error re-evaluating enableIf for field \"${element.key}\":`, error);\n }\n}\n\n// Helper: Set up change listeners for enableIf dependencies\nfunction setupEnableIfListeners(\n wrapper: HTMLElement,\n element: Element,\n ctx: RenderContext,\n): void {\n if (!element.enableIf) {\n return;\n }\n\n const formRoot = ctx.state.formRoot;\n if (!formRoot) {\n console.error(`Cannot setup enableIf listeners: formRoot is null`);\n return;\n }\n\n const condition = element.enableIf;\n const scope = condition.scope ?? \"relative\";\n const dependencyKey = condition.key;\n\n // Determine the dependency field path\n let dependencyFieldPath: string;\n\n if (scope === \"relative\" && ctx.path) {\n // For relative scope, dependency is in the same container\n dependencyFieldPath = `${ctx.path}.${dependencyKey}`;\n } else {\n // For absolute scope, dependency is at root level\n dependencyFieldPath = dependencyKey;\n }\n\n // Find the dependency field input\n const dependencyInput = formRoot.querySelector<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n `[name=\"${dependencyFieldPath}\"]`\n );\n\n if (!dependencyInput) {\n // Dependency field not found - might be rendered later\n // Set up a mutation observer to watch for it\n const observer = new MutationObserver(() => {\n const input = formRoot.querySelector<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n `[name=\"${dependencyFieldPath}\"]`\n );\n if (input) {\n // Found the dependency field, attach listener\n input.addEventListener('change', () => {\n reevaluateEnableIf(wrapper, element, ctx);\n });\n input.addEventListener('input', () => {\n reevaluateEnableIf(wrapper, element, ctx);\n });\n observer.disconnect();\n }\n });\n\n observer.observe(formRoot, {\n childList: true,\n subtree: true,\n });\n\n return;\n }\n\n // Attach change/input listeners\n dependencyInput.addEventListener('change', () => {\n reevaluateEnableIf(wrapper, element, ctx);\n });\n\n dependencyInput.addEventListener('input', () => {\n reevaluateEnableIf(wrapper, element, ctx);\n });\n}\n\n// Helper: Create field label with required indicator\nfunction createFieldLabel(element: Element): HTMLLabelElement {\n const title = document.createElement(\"label\");\n title.className = \"text-sm font-medium text-gray-900\";\n title.textContent = element.label || element.key;\n\n if (element.required) {\n const req = document.createElement(\"span\");\n req.className = \"text-red-500 ml-1\";\n req.textContent = \"*\";\n title.appendChild(req);\n }\n\n return title;\n}\n\n// Helper: Create info button with tooltip\nfunction createInfoButton(element: Element): HTMLButtonElement {\n const infoBtn = document.createElement(\"button\");\n infoBtn.type = \"button\";\n infoBtn.className = \"ml-2 text-gray-400 hover:text-gray-600\";\n infoBtn.innerHTML =\n '<svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>';\n\n const tooltipId = `tooltip-${element.key}-${Math.random().toString(36).substr(2, 9)}`;\n const tooltip = document.createElement(\"div\");\n tooltip.id = tooltipId;\n tooltip.className =\n \"hidden absolute z-50 bg-gray-200 text-gray-900 text-sm rounded-lg p-3 max-w-sm border border-gray-300 shadow-lg\";\n tooltip.style.position = \"fixed\";\n tooltip.textContent =\n element.description || element.hint || \"Field information\";\n document.body.appendChild(tooltip);\n\n infoBtn.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n showTooltip(tooltipId, infoBtn);\n };\n\n return infoBtn;\n}\n\n// Helper: Create label container with title and optional info button\nfunction createLabelContainer(element: Element): HTMLDivElement {\n const label = document.createElement(\"div\");\n label.className = \"flex items-center mb-2\";\n\n const title = createFieldLabel(element);\n label.appendChild(title);\n\n if (element.description || element.hint) {\n const infoBtn = createInfoButton(element);\n label.appendChild(infoBtn);\n }\n\n return label;\n}\n\n// Helper: Dispatch to appropriate renderer based on element type and multiple property\nfunction dispatchToRenderer(\n element: Element,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const isMultiple = \"multiple\" in element && element.multiple;\n\n switch (element.type) {\n case \"text\":\n if (isMultiple) {\n renderMultipleTextElement(element, ctx, wrapper, pathKey);\n } else {\n renderTextElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"textarea\":\n if (isMultiple) {\n renderMultipleTextareaElement(element, ctx, wrapper, pathKey);\n } else {\n renderTextareaElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"number\":\n if (isMultiple) {\n renderMultipleNumberElement(element, ctx, wrapper, pathKey);\n } else {\n renderNumberElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"select\":\n if (isMultiple) {\n renderMultipleSelectElement(element, ctx, wrapper, pathKey);\n } else {\n renderSelectElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"switcher\":\n if (isMultiple) {\n renderMultipleSwitcherElement(element, ctx, wrapper, pathKey);\n } else {\n renderSwitcherElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"file\":\n if (isMultiple) {\n renderMultipleFileElement(element, ctx, wrapper, pathKey);\n } else {\n renderFileElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"files\":\n renderFilesElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"colour\":\n if (isMultiple) {\n renderMultipleColourElement(element, ctx, wrapper, pathKey);\n } else {\n renderColourElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"slider\":\n if (isMultiple) {\n renderMultipleSliderElement(element, ctx, wrapper, pathKey);\n } else {\n renderSliderElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"group\":\n renderGroupElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"container\":\n if (isMultiple) {\n renderMultipleContainerElement(element, ctx, wrapper, pathKey);\n } else {\n renderSingleContainerElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"table\":\n renderTableElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"richinput\":\n renderRichInputElement(element, ctx, wrapper, pathKey);\n break;\n\n default: {\n const unsupported = document.createElement(\"div\");\n unsupported.className = \"text-red-500 text-sm\";\n unsupported.textContent = t(\"unsupportedFieldType\", ctx.state, { type: (element as any).type });\n wrapper.appendChild(unsupported);\n }\n }\n}\n\n// Main renderElement function - dispatcher to component-specific renderers\nexport function renderElement(\n element: Element,\n ctx: RenderContext,\n): HTMLElement {\n const initiallyDisabled = shouldDisableElement(element, ctx);\n\n // Create wrapper\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"mb-6 fb-field-wrapper\";\n wrapper.setAttribute(\"data-field-key\", element.key);\n\n // Create label container\n const label = createLabelContainer(element);\n wrapper.appendChild(label);\n\n // Dispatch to appropriate renderer\n const pathKey = pathJoin(ctx.path, element.key);\n dispatchToRenderer(element, ctx, wrapper, pathKey);\n\n if (initiallyDisabled) {\n wrapper.style.display = \"none\";\n wrapper.classList.add(\"fb-field-wrapper-disabled\");\n wrapper.setAttribute(\"data-conditionally-disabled\", \"true\");\n }\n\n // Set up enableIf change listeners after rendering\n setupEnableIfListeners(wrapper, element, ctx);\n\n // Actions are now only rendered via external actions system in renderExternalActions()\n // element.actions are only used for label lookup, not direct rendering\n\n return wrapper;\n}\n\n// Initialize circular dependencies\n// Container and Group components need renderElement for nested rendering\nsetContainerRenderElement(renderElement);\nsetGroupRenderElement(renderElement);\n\n// Export setter for container validation (will be called from FormBuilderInstance)\nexport { setContainerValidateElement };\n\n// Export all component renderers for potential direct use\nexport {\n renderTextElement,\n renderMultipleTextElement,\n renderTextareaElement,\n renderMultipleTextareaElement,\n renderNumberElement,\n renderMultipleNumberElement,\n renderSelectElement,\n renderMultipleSelectElement,\n renderSwitcherElement,\n renderMultipleSwitcherElement,\n renderFileElement,\n renderFilesElement,\n renderMultipleFileElement,\n renderColourElement,\n renderMultipleColourElement,\n renderSliderElement,\n renderMultipleSliderElement,\n renderSingleContainerElement,\n renderMultipleContainerElement,\n renderGroupElement,\n renderTableElement,\n renderRichInputElement,\n};\n","// Instance state factory for Form Builder\n// Creates isolated state objects for each FormBuilderInstance\n\nimport type { State, Config } from \"../types/index.js\";\n\n/**\n * Default configuration for new instances\n */\nexport const defaultConfig: Config = {\n uploadFile: null,\n downloadFile: null,\n getThumbnail: null,\n getDownloadUrl: null,\n actionHandler: null,\n onChange: null,\n onFieldChange: null,\n onThumbnailError: null,\n onUploadError: null,\n onDownloadError: null,\n debounceMs: 300,\n verboseErrors: false,\n enableFilePreview: true,\n maxPreviewSize: \"200px\",\n readonly: false,\n parseTableFile: null,\n locale: \"en\",\n translations: {\n en: {\n // UI texts\n removeElement: \"Remove\",\n clickDragText: \"Click or drag file\",\n clickDragTextMultiple: \"Click or drag files\",\n noFileSelected: \"No file selected\",\n noFilesSelected: \"No files selected\",\n downloadButton: \"Download\",\n changeButton: \"Change\",\n placeholderText: \"Enter text\",\n previewAlt: \"Preview\",\n previewUnavailable: \"Preview unavailable\",\n previewError: \"Preview error\",\n videoNotSupported: \"Your browser does not support the video tag.\",\n // Field hints\n hintLengthRange: \"{min}-{max} chars\",\n hintMaxLength: \"≤{max} chars\",\n hintMinLength: \"≥{min} chars\",\n hintValueRange: \"{min}-{max}\",\n hintMaxValue: \"≤{max}\",\n hintMinValue: \"≥{min}\",\n hintMaxSize: \"≤{size}MB\",\n hintFormats: \"{formats}\",\n hintRequired: \"Required\",\n hintOptional: \"Optional\",\n hintPattern: \"Format: {pattern}\",\n fileCountSingle: \"{count} file\",\n fileCountPlural: \"{count} files\",\n fileCountRange: \"({min}-{max})\",\n // Validation errors\n required: \"Required\",\n minItems: \"Minimum {min} items required\",\n maxItems: \"Maximum {max} items allowed\",\n minLength: \"Minimum {min} characters\",\n maxLength: \"Maximum {max} characters\",\n minValue: \"Must be at least {min}\",\n maxValue: \"Must be at most {max}\",\n patternMismatch: \"Invalid format\",\n invalidPattern: \"Invalid pattern in schema\",\n notANumber: \"Must be a number\",\n invalidHexColour: \"Invalid hex color\",\n minFiles: \"Minimum {min} files required\",\n maxFiles: \"Maximum {max} files allowed\",\n invalidFileExtension:\n 'File \"{name}\" has unsupported format. Allowed: {formats}',\n fileTooLarge: 'File \"{name}\" exceeds maximum size of {maxSize}MB',\n filesLimitExceeded:\n \"{skipped} file(s) skipped: maximum {max} files allowed\",\n unsupportedFieldType: \"Unsupported field type: {type}\",\n invalidOption: \"Invalid option\",\n tableAddRow: \"Add row\",\n tableAddColumn: \"Add column\",\n tableRemoveRow: \"Remove row\",\n tableRemoveColumn: \"Remove column\",\n tableMergeCells: \"Merge cells (Ctrl+M)\",\n tableSplitCell: \"Split cell (Ctrl+Shift+M)\",\n tableImportFile: \"Import\",\n tableImporting: \"Importing...\",\n tableImportError: \"Import failed: {error}\",\n richinputPlaceholder: \"Type text...\",\n richinputAttachFile: \"Attach file\",\n richinputMention: \"Mention\",\n richinputRemoveFile: \"Remove\",\n },\n ru: {\n // UI texts\n removeElement: \"Удалить\",\n clickDragText: \"Нажмите или перетащите файл\",\n clickDragTextMultiple: \"Нажмите или перетащите файлы\",\n noFileSelected: \"Файл не выбран\",\n noFilesSelected: \"Нет файлов\",\n downloadButton: \"Скачать\",\n changeButton: \"Изменить\",\n placeholderText: \"Введите текст\",\n previewAlt: \"Предпросмотр\",\n previewUnavailable: \"Предпросмотр недоступен\",\n previewError: \"Ошибка предпросмотра\",\n videoNotSupported: \"Ваш браузер не поддерживает видео.\",\n // Field hints\n hintLengthRange: \"{min}-{max} символов\",\n hintMaxLength: \"≤{max} символов\",\n hintMinLength: \"≥{min} символов\",\n hintValueRange: \"{min}-{max}\",\n hintMaxValue: \"≤{max}\",\n hintMinValue: \"≥{min}\",\n hintMaxSize: \"≤{size}МБ\",\n hintFormats: \"{formats}\",\n hintRequired: \"Обязательное\",\n hintOptional: \"Необязательное\",\n hintPattern: \"Формат: {pattern}\",\n fileCountSingle: \"{count} файл\",\n fileCountPlural: \"{count} файлов\",\n fileCountRange: \"({min}-{max})\",\n // Validation errors\n required: \"Обязательное поле\",\n minItems: \"Минимум {min} элементов\",\n maxItems: \"Максимум {max} элементов\",\n minLength: \"Минимум {min} символов\",\n maxLength: \"Максимум {max} символов\",\n minValue: \"Значение должно быть не менее {min}\",\n maxValue: \"Значение должно быть не более {max}\",\n patternMismatch: \"Неверный формат\",\n invalidPattern: \"Неверный паттерн в схеме\",\n notANumber: \"Должно быть числом\",\n invalidHexColour: \"Неверный формат цвета\",\n minFiles: \"Минимум {min} файлов\",\n maxFiles: \"Максимум {max} файлов\",\n invalidFileExtension:\n 'Файл \"{name}\" имеет неподдерживаемый формат. Допустимые: {formats}',\n fileTooLarge:\n 'Файл \"{name}\" превышает максимальный размер {maxSize}МБ',\n filesLimitExceeded:\n \"{skipped} файл(ов) пропущено: максимум {max} файлов\",\n unsupportedFieldType: \"Неподдерживаемый тип поля: {type}\",\n invalidOption: \"Недопустимое значение\",\n tableAddRow: \"Добавить строку\",\n tableAddColumn: \"Добавить столбец\",\n tableRemoveRow: \"Удалить строку\",\n tableRemoveColumn: \"Удалить столбец\",\n tableMergeCells: \"Объединить ячейки (Ctrl+M)\",\n tableSplitCell: \"Разделить ячейку (Ctrl+Shift+M)\",\n tableImportFile: \"Импорт\",\n tableImporting: \"Импорт...\",\n tableImportError: \"Ошибка импорта: {error}\",\n richinputPlaceholder: \"Введите текст...\",\n richinputAttachFile: \"Прикрепить файл\",\n richinputMention: \"Упомянуть\",\n richinputRemoveFile: \"Удалить\",\n },\n },\n theme: {},\n};\n\n/**\n * Create a new isolated state object for a FormBuilderInstance\n * Uses deep merge for translations to preserve default en/ru fallbacks\n */\nexport function createInstanceState(config?: Partial<Config>): State {\n // Deep merge translations to preserve default locales as fallbacks\n const mergedTranslations = {\n ...defaultConfig.translations,\n };\n\n // Merge user-provided translations on top of defaults\n if (config?.translations) {\n for (const [locale, userTranslations] of Object.entries(\n config.translations,\n )) {\n mergedTranslations[locale] = {\n ...((defaultConfig.translations as Record<string, object>)[locale] ||\n {}),\n ...userTranslations,\n };\n }\n }\n\n return {\n schema: null,\n formRoot: null,\n resourceIndex: new Map(),\n externalActions: null,\n version: \"1.0.0\",\n config: {\n ...defaultConfig,\n ...config,\n translations: mergedTranslations,\n },\n debounceTimer: null,\n };\n}\n\n/**\n * Generate unique instance ID for resource prefixing\n */\nexport function generateInstanceId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 9);\n return `inst-${timestamp}-${random}`;\n}\n","// Theme configuration and CSS custom properties\n// Provides a centralized theming system using CSS variables\n\nexport interface Theme {\n // Colors\n primaryColor: string;\n primaryHoverColor: string;\n errorColor: string;\n errorHoverColor: string;\n successColor: string;\n borderColor: string;\n borderHoverColor: string;\n borderFocusColor: string;\n backgroundColor: string;\n backgroundHoverColor: string;\n backgroundReadonlyColor: string;\n textColor: string;\n textSecondaryColor: string;\n textPlaceholderColor: string;\n textDisabledColor: string;\n\n // Button colors\n buttonBgColor: string;\n buttonTextColor: string;\n buttonBorderColor: string;\n buttonHoverBgColor: string;\n buttonHoverBorderColor: string;\n\n // Action button colors\n actionBgColor: string;\n actionTextColor: string;\n actionBorderColor: string;\n actionHoverBgColor: string;\n actionHoverBorderColor: string;\n\n // File upload colors\n fileUploadBgColor: string;\n fileUploadBorderColor: string;\n fileUploadTextColor: string;\n fileUploadHoverBorderColor: string;\n\n // Spacing\n inputPaddingX: string;\n inputPaddingY: string;\n borderRadius: string;\n borderWidth: string;\n\n // Typography\n fontSize: string;\n fontSizeSmall: string;\n fontSizeExtraSmall: string;\n fontFamily: string;\n fontWeightNormal: string;\n fontWeightMedium: string;\n\n // Focus ring\n focusRingWidth: string;\n focusRingColor: string;\n focusRingOpacity: string;\n\n // Transitions\n transitionDuration: string;\n}\n\nexport const defaultTheme: Theme = {\n // Colors - matching Tailwind defaults\n primaryColor: \"#3b82f6\", // blue-500\n primaryHoverColor: \"#2563eb\", // blue-600\n errorColor: \"#ef4444\", // red-500\n errorHoverColor: \"#dc2626\", // red-600\n successColor: \"#10b981\", // green-500\n borderColor: \"#d1d5db\", // gray-300\n borderHoverColor: \"#9ca3af\", // gray-400\n borderFocusColor: \"#3b82f6\", // blue-500\n backgroundColor: \"#ffffff\", // white\n backgroundHoverColor: \"#f9fafb\", // gray-50\n backgroundReadonlyColor: \"#f3f4f6\", // gray-100\n textColor: \"#1f2937\", // gray-800\n textSecondaryColor: \"#6b7280\", // gray-500\n textPlaceholderColor: \"#9ca3af\", // gray-400\n textDisabledColor: \"#d1d5db\", // gray-300\n\n // Button colors\n buttonBgColor: \"#3b82f6\", // blue-500\n buttonTextColor: \"#ffffff\", // white\n buttonBorderColor: \"#2563eb\", // blue-600\n buttonHoverBgColor: \"#2563eb\", // blue-600\n buttonHoverBorderColor: \"#1d4ed8\", // blue-700\n\n // Action button colors\n actionBgColor: \"#ffffff\", // white\n actionTextColor: \"#374151\", // gray-700\n actionBorderColor: \"#e5e7eb\", // gray-200\n actionHoverBgColor: \"#f9fafb\", // gray-50\n actionHoverBorderColor: \"#d1d5db\", // gray-300\n\n // File upload colors\n fileUploadBgColor: \"#f3f4f6\", // gray-100\n fileUploadBorderColor: \"#d1d5db\", // gray-300\n fileUploadTextColor: \"#9ca3af\", // gray-400\n fileUploadHoverBorderColor: \"#3b82f6\", // blue-500\n\n // Spacing\n inputPaddingX: \"0.75rem\", // 3 (12px)\n inputPaddingY: \"0.5rem\", // 2 (8px)\n borderRadius: \"0.5rem\", // rounded-lg (8px)\n borderWidth: \"1px\",\n\n // Typography\n fontSize: \"0.875rem\", // text-sm (14px)\n fontSizeSmall: \"0.75rem\", // text-xs (12px)\n fontSizeExtraSmall: \"0.625rem\", // 10px\n fontFamily:\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontWeightNormal: \"400\",\n fontWeightMedium: \"500\",\n\n // Focus ring\n focusRingWidth: \"2px\",\n focusRingColor: \"#3b82f6\", // blue-500\n focusRingOpacity: \"0.5\",\n\n // Transitions\n transitionDuration: \"200ms\",\n};\n\n/**\n * Generate CSS custom properties from theme object\n * Prefixes all variables with --fb- to avoid conflicts\n */\nexport function generateCSSVariables(theme: Partial<Theme>): string {\n const mergedTheme = { ...defaultTheme, ...theme };\n\n const cssVars: string[] = [];\n\n // Convert theme object to CSS variables\n Object.entries(mergedTheme).forEach(([key, value]) => {\n // Convert camelCase to kebab-case\n const kebabKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n cssVars.push(` --fb-${kebabKey}: ${value};`);\n });\n\n return cssVars.join(\"\\n\");\n}\n\n/**\n * Inject theme CSS variables into a container element or create a style tag\n */\nexport function injectThemeVariables(\n container: HTMLElement,\n theme: Partial<Theme>,\n): void {\n const cssVariables = generateCSSVariables(theme);\n\n // Check if there's already a theme style tag\n let styleTag = container.querySelector(\n \"style[data-fb-theme]\",\n ) as HTMLStyleElement;\n\n if (!styleTag) {\n styleTag = document.createElement(\"style\");\n styleTag.setAttribute(\"data-fb-theme\", \"true\");\n container.appendChild(styleTag);\n }\n\n // Create CSS rule targeting the container\n styleTag.textContent = `\n [data-fb-root=\"true\"] {\n${cssVariables}\n }\n `;\n}\n\n/**\n * Example theme configurations for documentation\n */\nexport const exampleThemes = {\n default: defaultTheme,\n\n dark: {\n ...defaultTheme,\n primaryColor: \"#60a5fa\", // blue-400\n primaryHoverColor: \"#3b82f6\", // blue-500\n borderColor: \"#4b5563\", // gray-600\n borderHoverColor: \"#6b7280\", // gray-500\n borderFocusColor: \"#60a5fa\", // blue-400\n backgroundColor: \"#1f2937\", // gray-800\n backgroundHoverColor: \"#374151\", // gray-700\n backgroundReadonlyColor: \"#111827\", // gray-900\n textColor: \"#f9fafb\", // gray-50\n textSecondaryColor: \"#9ca3af\", // gray-400\n textPlaceholderColor: \"#6b7280\", // gray-500\n fileUploadBgColor: \"#374151\", // gray-700\n fileUploadBorderColor: \"#4b5563\", // gray-600\n fileUploadTextColor: \"#9ca3af\", // gray-400\n } as Theme,\n\n klein: {\n ...defaultTheme,\n primaryColor: \"#0066cc\",\n primaryHoverColor: \"#0052a3\",\n errorColor: \"#d32f2f\",\n errorHoverColor: \"#c62828\",\n successColor: \"#388e3c\",\n borderColor: \"#e0e0e0\",\n borderHoverColor: \"#bdbdbd\",\n borderFocusColor: \"#0066cc\",\n borderRadius: \"4px\",\n fontSize: \"16px\",\n fontSizeSmall: \"14px\",\n fontFamily: '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n } as Theme,\n};\n","// Style utility functions for applying themed styles to form elements\n\nimport type { State } from \"../types/index.js\";\n\n/**\n * Apply themed input styles to an HTMLInputElement, HTMLTextAreaElement, or HTMLSelectElement\n */\nexport function applyInputStyles(\n element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n state: State,\n className?: string,\n): void {\n element.className = className || \"w-full\";\n element.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n\n // Add interactive hover/focus styles for editable inputs\n if (!state.config.readonly) {\n element.addEventListener(\"focus\", () => {\n element.style.borderColor = \"var(--fb-border-focus-color)\";\n element.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n element.style.outlineOffset = \"0\";\n });\n element.addEventListener(\"blur\", () => {\n element.style.borderColor = \"var(--fb-border-color)\";\n element.style.outline = \"none\";\n });\n element.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== element) {\n element.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n element.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== element) {\n element.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n}\n\n/**\n * Apply themed hint/description styles to a paragraph element\n */\nexport function applyHintStyles(element: HTMLParagraphElement): void {\n element.className = \"mt-1\";\n element.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n}\n\n/**\n * Create a styled add button with theme support\n */\nexport function createAddButton(\n text: string,\n onClick: () => void,\n): HTMLButtonElement {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"mt-2 px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = text;\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = onClick;\n return addBtn;\n}\n\n/**\n * Create a styled remove button with theme support\n */\nexport function createRemoveButton(\n text: string,\n onClick: () => void,\n): HTMLButtonElement {\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = text;\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = onClick;\n return removeBtn;\n}\n\n/**\n * Apply themed action button styles (for external actions in readonly mode)\n */\nexport function applyActionButtonStyles(\n button: HTMLButtonElement,\n isFormLevel: boolean = false,\n): void {\n button.style.cssText = `\n background-color: var(--fb-action-bg-color);\n color: var(--fb-action-text-color);\n border: var(--fb-border-width) solid var(--fb-action-border-color);\n padding: ${isFormLevel ? \"0.5rem 1rem\" : \"0.5rem 0.75rem\"};\n font-size: var(--fb-font-size);\n font-weight: var(--fb-font-weight-medium);\n border-radius: var(--fb-border-radius);\n transition: all var(--fb-transition-duration);\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n `;\n button.addEventListener(\"mouseenter\", () => {\n button.style.backgroundColor = \"var(--fb-action-hover-bg-color)\";\n button.style.borderColor = \"var(--fb-action-hover-border-color)\";\n });\n button.addEventListener(\"mouseleave\", () => {\n button.style.backgroundColor = \"var(--fb-action-bg-color)\";\n button.style.borderColor = \"var(--fb-action-border-color)\";\n });\n}\n","// Component operations registry - maps element types to validation/update functions\n// This registry provides delegation from FormBuilderInstance to component-specific logic\n\nimport type {\n Element,\n ComponentContext,\n ValidationResult,\n ComponentOperations,\n ComponentValidator,\n ComponentUpdater,\n} from \"../types/index.js\";\nimport { validateTextElement, updateTextField } from \"./text.js\";\nimport { validateTextareaElement, updateTextareaField } from \"./textarea.js\";\nimport { validateNumberElement, updateNumberField } from \"./number.js\";\nimport { validateSelectElement, updateSelectField } from \"./select.js\";\nimport { validateSwitcherElement, updateSwitcherField } from \"./switcher.js\";\nimport { validateFileElement, updateFileField } from \"./file.js\";\nimport { validateColourElement, updateColourField } from \"./colour.js\";\nimport { validateSliderElement, updateSliderField } from \"./slider.js\";\nimport { validateContainerElement, updateContainerField } from \"./container.js\";\nimport { validateGroupElement, updateGroupField } from \"./group.js\";\nimport { validateTableElement, updateTableField } from \"./table.js\";\nimport {\n validateRichInputElement,\n updateRichInputField,\n} from \"./richinput.js\";\n\n/**\n * Component operations registry\n * Maps element type to validator and updater functions\n */\nconst componentRegistry: Record<string, ComponentOperations> = {\n text: {\n validate: validateTextElement as ComponentValidator,\n update: updateTextField as ComponentUpdater,\n },\n textarea: {\n validate: validateTextareaElement as ComponentValidator,\n update: updateTextareaField as ComponentUpdater,\n },\n number: {\n validate: validateNumberElement as ComponentValidator,\n update: updateNumberField as ComponentUpdater,\n },\n select: {\n validate: validateSelectElement as ComponentValidator,\n update: updateSelectField as ComponentUpdater,\n },\n switcher: {\n validate: validateSwitcherElement as ComponentValidator,\n update: updateSwitcherField as ComponentUpdater,\n },\n file: {\n validate: validateFileElement as ComponentValidator,\n update: updateFileField as ComponentUpdater,\n },\n files: {\n // Legacy type - delegates to file\n validate: validateFileElement as ComponentValidator,\n update: updateFileField as ComponentUpdater,\n },\n colour: {\n validate: validateColourElement as ComponentValidator,\n update: updateColourField as ComponentUpdater,\n },\n slider: {\n validate: validateSliderElement as ComponentValidator,\n update: updateSliderField as ComponentUpdater,\n },\n container: {\n validate: validateContainerElement as ComponentValidator,\n update: updateContainerField as ComponentUpdater,\n },\n group: {\n // Deprecated type - delegates to container\n validate: validateGroupElement as ComponentValidator,\n update: updateGroupField as ComponentUpdater,\n },\n table: {\n validate: validateTableElement as ComponentValidator,\n update: updateTableField as ComponentUpdater,\n },\n richinput: {\n validate: validateRichInputElement as ComponentValidator,\n update: updateRichInputField as ComponentUpdater,\n },\n};\n\n/**\n * Get component operations for a given element type\n */\nexport function getComponentOperations(\n elementType: string,\n): ComponentOperations | null {\n return componentRegistry[elementType] || null;\n}\n\n/**\n * Validate element using component-specific validator\n * Falls back to legacy implementation if component not yet migrated\n */\nexport function validateElementWithComponent(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult | null {\n const ops = getComponentOperations(element.type);\n if (ops && ops.validate) {\n return ops.validate(element, key, context);\n }\n return null; // Return null to indicate fallback to legacy implementation\n}\n\n/**\n * Update element using component-specific updater\n * Falls back to legacy implementation if component not yet migrated\n */\nexport function updateElementWithComponent(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): boolean {\n const ops = getComponentOperations(element.type);\n if (ops && ops.update) {\n ops.update(element, fieldPath, value, context);\n return true;\n }\n return false; // Return false to indicate fallback to legacy implementation\n}\n","// Form Builder Instance - Encapsulated state management for multi-instance support\n\nimport type {\n Schema,\n Element,\n ContainerElement,\n GroupElement,\n ExternalAction,\n FormData as FormDataResult,\n Config,\n State,\n ComponentContext,\n} from \"../types/index.js\";\nimport { validateSchema } from \"../utils/validation.js\";\nimport { clear } from \"../utils/helpers.js\";\nimport {\n renderElement,\n setContainerValidateElement,\n} from \"../components/index.js\";\nimport { createInstanceState, generateInstanceId } from \"./state.js\";\nimport { injectThemeVariables } from \"../styles/theme.js\";\nimport { applyActionButtonStyles } from \"../utils/styles.js\";\nimport {\n validateElementWithComponent,\n updateElementWithComponent,\n} from \"../components/registry.js\";\nimport { evaluateEnableCondition, getValueByPath } from \"../utils/enable-conditions.js\";\n\n/**\n * FormBuilderInstance - Encapsulates all form state and operations\n * Allows multiple independent forms on the same page without state collisions\n */\nexport class FormBuilderInstance {\n private state: State;\n private instanceId: string;\n\n constructor(config?: Partial<Config>) {\n this.instanceId = generateInstanceId();\n this.state = createInstanceState(config);\n\n // Verbose error tracking: Track instances for memory leak detection\n if (this.state.config.verboseErrors) {\n if (!globalThis.__formBuilderInstances) {\n globalThis.__formBuilderInstances = new Set<string>();\n }\n globalThis.__formBuilderInstances.add(this.instanceId);\n\n // Warn about instance count\n if (globalThis.__formBuilderInstances.size > 10) {\n console.warn(\n `[form-builder] ${globalThis.__formBuilderInstances.size} instances active. ` +\n \"Possible memory leak - ensure you call destroy() when done.\",\n );\n }\n }\n }\n\n /**\n * Get instance ID (useful for debugging and resource prefixing)\n */\n getInstanceId(): string {\n return this.instanceId;\n }\n\n /**\n * Get current state (for advanced use cases)\n */\n getState(): State {\n return this.state;\n }\n\n /**\n * Set the form root element\n */\n setFormRoot(element: HTMLElement): void {\n this.state.formRoot = element;\n }\n\n /**\n * Configure the form builder\n */\n configure(config: Partial<Config>): void {\n Object.assign(this.state.config, config);\n }\n\n /**\n * Set file upload handler\n */\n setUploadHandler(uploadFn: ((file: File) => Promise<string>) | null): void {\n this.state.config.uploadFile = uploadFn;\n }\n\n /**\n * Set file download handler\n */\n setDownloadHandler(\n downloadFn: ((resourceId: string, fileName: string) => void) | null,\n ): void {\n this.state.config.downloadFile = downloadFn;\n }\n\n /**\n * Set thumbnail generation handler\n */\n setThumbnailHandler(\n thumbnailFn: ((resourceId: string) => Promise<string | null>) | null,\n ): void {\n this.state.config.getThumbnail = thumbnailFn;\n }\n\n /**\n * Set action handler\n */\n setActionHandler(\n actionFn:\n | ((value: string, key: string, relatedField: string | null) => void)\n | null,\n ): void {\n this.state.config.actionHandler = actionFn;\n }\n\n /**\n * Set mode (edit or readonly)\n */\n setMode(mode: \"edit\" | \"readonly\"): void {\n this.state.config.readonly = mode === \"readonly\";\n }\n\n /**\n * Set locale\n */\n setLocale(locale: \"en\" | \"ru\"): void {\n if (this.state.config.translations[locale]) {\n this.state.config.locale = locale;\n }\n }\n\n /**\n * Trigger onChange callbacks with debouncing\n * @param fieldPath - Optional field path for field-specific change events\n * @param fieldValue - Optional field value for field-specific change events\n */\n triggerOnChange(fieldPath?: string, fieldValue?: any): void {\n // Skip if in readonly mode or during initial render\n if (this.state.config.readonly) return;\n\n // Clear existing debounce timer\n if (this.state.debounceTimer !== null) {\n clearTimeout(this.state.debounceTimer);\n }\n\n // Set new debounce timer\n this.state.debounceTimer = setTimeout(() => {\n // Get current form data without validation to avoid UI errors\n const formData = this.validateForm(true);\n\n // Re-evaluate conditional fields based on new form data\n this.reevaluateConditionalFields();\n\n // Call onChange callback if configured\n if (this.state.config.onChange) {\n this.state.config.onChange(formData);\n }\n\n // Call onFieldChange callback if configured and field path provided\n if (\n this.state.config.onFieldChange &&\n fieldPath !== undefined &&\n fieldValue !== undefined\n ) {\n this.state.config.onFieldChange(fieldPath, fieldValue, formData);\n }\n\n // Clear timer reference\n this.state.debounceTimer = null;\n }, this.state.config.debounceMs) as unknown as number;\n }\n\n /**\n * Register an external action that will be displayed as a button\n * External actions can be form-level (no related_field) or field-level (with related_field)\n * @param action - External action definition\n */\n registerAction(action: ExternalAction): void {\n if (!action || !action.value) {\n throw new Error(\"Action must have a value property\");\n }\n\n // Initialize externalActions array if not exists\n if (!this.state.externalActions) {\n this.state.externalActions = [];\n }\n\n // Check if action already exists (by value and related_field)\n const existingIndex = this.state.externalActions.findIndex(\n (a) =>\n a.value === action.value && a.related_field === action.related_field,\n );\n\n if (existingIndex >= 0) {\n // Replace existing action\n this.state.externalActions[existingIndex] = action;\n } else {\n // Add new action\n this.state.externalActions.push(action);\n }\n }\n\n /**\n * Find the DOM element corresponding to a field path (instance-scoped)\n */\n private findFormElementByFieldPath(fieldPath: string): HTMLElement | null {\n if (!this.state.formRoot) return null;\n\n // In edit mode, try to find input elements with name attributes\n if (!this.state.config.readonly) {\n // Try exact match first\n let element = this.state.formRoot.querySelector<HTMLElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (element) return element;\n\n // Try with array notation variations\n const variations = [\n fieldPath,\n fieldPath.replace(/\\[(\\d+)\\]/g, \"[$1]\"),\n fieldPath.replace(/\\./g, \"[\") +\n \"]\".repeat((fieldPath.match(/\\./g) || []).length),\n ];\n\n for (const variation of variations) {\n element = this.state.formRoot.querySelector<HTMLElement>(\n `[name=\"${variation}\"]`,\n );\n if (element) return element;\n }\n }\n\n // In readonly mode, or if no input found, look for field wrappers\n const schemaElement = this.findSchemaElement(fieldPath);\n if (!schemaElement) return null;\n\n const fieldWrappers =\n this.state.formRoot.querySelectorAll(\".fb-field-wrapper\");\n for (const wrapper of fieldWrappers) {\n const labelText = schemaElement.label || schemaElement.key;\n const labelElement = wrapper.querySelector(\"label\");\n if (\n labelElement &&\n (labelElement.textContent === labelText ||\n labelElement.textContent === `${labelText}*`)\n ) {\n let fieldElement =\n wrapper.querySelector<HTMLElement>(\".field-placeholder\");\n if (!fieldElement) {\n fieldElement = document.createElement(\"div\");\n fieldElement.className = \"field-placeholder\";\n fieldElement.style.display = \"none\";\n wrapper.appendChild(fieldElement);\n }\n return fieldElement;\n }\n }\n\n return null;\n }\n\n /**\n * Find schema element by field path\n */\n private findSchemaElement(fieldPath: string): Element | null {\n if (!this.state.schema || !this.state.schema.elements) return null;\n\n let currentElements = this.state.schema.elements;\n let foundElement: Element | null = null;\n\n const keys = fieldPath\n .replace(/\\[\\d+\\]/g, \"\")\n .split(\".\")\n .filter(Boolean);\n\n for (const key of keys) {\n foundElement = currentElements.find((el) => el.key === key) || null;\n if (!foundElement) {\n return null;\n }\n if (\"elements\" in foundElement && foundElement.elements) {\n currentElements = foundElement.elements;\n }\n }\n\n return foundElement;\n }\n\n /**\n * Resolve action label from schema or external action\n */\n private resolveActionLabel(\n actionKey: string,\n externalLabel: string | undefined,\n schemaElement: Element | null,\n isTrueFormLevelAction = false,\n ): string {\n if (schemaElement && \"actions\" in schemaElement && schemaElement.actions) {\n const predefinedAction = schemaElement.actions.find(\n (a) => a.key === actionKey,\n );\n if (predefinedAction && predefinedAction.label) {\n return predefinedAction.label;\n }\n }\n\n if (\n isTrueFormLevelAction &&\n this.state.schema &&\n \"actions\" in this.state.schema &&\n (this.state.schema as any).actions\n ) {\n const rootAction = (this.state.schema as any).actions.find(\n (a: any) => a.key === actionKey,\n );\n if (rootAction && rootAction.label) {\n return rootAction.label;\n }\n }\n\n if (externalLabel) {\n return externalLabel;\n }\n\n return actionKey;\n }\n\n /**\n * Render form-level action buttons at the bottom of the form\n */\n private renderFormLevelActions(\n actions: ExternalAction[],\n trueFormLevelActions: ExternalAction[] = [],\n ): void {\n if (!this.state.formRoot) return;\n\n const existingContainer = this.state.formRoot.querySelector(\n \".form-level-actions-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n const actionsContainer = document.createElement(\"div\");\n actionsContainer.className =\n \"form-level-actions-container mt-6 pt-4 flex flex-wrap gap-3 justify-center\";\n actionsContainer.style.cssText = `\n border-top: var(--fb-border-width) solid var(--fb-border-color);\n `;\n\n actions.forEach((action) => {\n const actionBtn = document.createElement(\"button\");\n actionBtn.type = \"button\";\n applyActionButtonStyles(actionBtn, true);\n\n const isTrueFormLevelAction = trueFormLevelActions.includes(action);\n const resolvedLabel = this.resolveActionLabel(\n action.key,\n action.label,\n null,\n isTrueFormLevelAction,\n );\n actionBtn.textContent = resolvedLabel;\n\n actionBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n this.state.config.actionHandler &&\n typeof this.state.config.actionHandler === \"function\"\n ) {\n this.state.config.actionHandler(action.value, action.key, null);\n }\n });\n\n actionsContainer.appendChild(actionBtn);\n });\n\n this.state.formRoot.appendChild(actionsContainer);\n }\n\n /**\n * Render external action buttons for fields\n */\n renderExternalActions(): void {\n if (\n !this.state.externalActions ||\n !Array.isArray(this.state.externalActions)\n )\n return;\n\n const actionsByField = new Map<string, ExternalAction[]>();\n const trueFormLevelActions: ExternalAction[] = [];\n const movedFormLevelActions: ExternalAction[] = [];\n\n this.state.externalActions.forEach((action) => {\n if (!action.key || !action.value) return;\n\n if (!action.related_field) {\n trueFormLevelActions.push(action);\n } else {\n if (!actionsByField.has(action.related_field)) {\n actionsByField.set(action.related_field, []);\n }\n actionsByField.get(action.related_field)!.push(action);\n }\n });\n\n actionsByField.forEach((actions, fieldPath) => {\n const fieldElement = this.findFormElementByFieldPath(fieldPath);\n if (!fieldElement) {\n console.warn(\n `External action: Could not find form element for field \"${fieldPath}\", treating as form-level actions`,\n );\n movedFormLevelActions.push(...actions);\n return;\n }\n\n let wrapper = fieldElement.closest(\".fb-field-wrapper\");\n if (!wrapper) {\n wrapper = fieldElement.parentElement;\n }\n\n if (!wrapper) {\n console.warn(\n `External action: Could not find wrapper for field \"${fieldPath}\"`,\n );\n return;\n }\n\n const existingContainer = wrapper.querySelector(\n \".external-actions-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n const actionsContainer = document.createElement(\"div\");\n actionsContainer.className =\n \"external-actions-container mt-3 flex flex-wrap gap-2\";\n\n const schemaElement = this.findSchemaElement(fieldPath);\n\n actions.forEach((action) => {\n const actionBtn = document.createElement(\"button\");\n actionBtn.type = \"button\";\n applyActionButtonStyles(actionBtn, false);\n\n const resolvedLabel = this.resolveActionLabel(\n action.key,\n action.label,\n schemaElement,\n );\n actionBtn.textContent = resolvedLabel;\n\n actionBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n this.state.config.actionHandler &&\n typeof this.state.config.actionHandler === \"function\"\n ) {\n this.state.config.actionHandler(\n action.value,\n action.key,\n action.related_field,\n );\n }\n });\n\n actionsContainer.appendChild(actionBtn);\n });\n\n wrapper.appendChild(actionsContainer);\n });\n\n const allFormLevelActions = [\n ...trueFormLevelActions,\n ...movedFormLevelActions,\n ];\n if (allFormLevelActions.length > 0) {\n this.renderFormLevelActions(allFormLevelActions, trueFormLevelActions);\n }\n }\n\n /**\n * Handle prefill hint click - updates container fields with hint values\n */\n private handlePrefillHintClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (!target.classList.contains(\"fb-prefill-hint\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Get hint data from attributes\n const hintValuesJson = target.getAttribute(\"data-hint-values\");\n const isRootHint = target.getAttribute(\"data-root-hint\") === \"true\";\n const containerKey = target.getAttribute(\"data-container-key\");\n\n // For root-level hints, containerKey is not required\n if (!hintValuesJson || (!isRootHint && !containerKey)) {\n console.warn(\"Prefill hint missing required data attributes\");\n return;\n }\n\n try {\n const hintValues = JSON.parse(hintValuesJson) as Record<string, any>;\n\n // Update each field in the hint\n for (const fieldKey in hintValues) {\n // For root-level hints, use field key directly; for container hints, prefix with container key\n const fullPath = isRootHint ? fieldKey : `${containerKey}.${fieldKey}`;\n const value = hintValues[fieldKey];\n this.updateField(fullPath, value);\n }\n } catch (error) {\n console.error(\"Error parsing prefill hint values:\", error);\n }\n }\n\n /**\n * Create root-level prefill hints UI\n */\n private createRootPrefillHints(hints: any[]): HTMLElement {\n const hintsContainer = document.createElement(\"div\");\n hintsContainer.className = \"fb-prefill-hints flex flex-wrap gap-2 mb-4\";\n\n hints.forEach((hint) => {\n const hintButton = document.createElement(\"button\");\n hintButton.type = \"button\";\n hintButton.className = \"fb-prefill-hint\";\n\n // Set button text with optional icon\n if (hint.icon) {\n hintButton.textContent = `${hint.icon} ${hint.label}`;\n } else {\n hintButton.textContent = hint.label;\n }\n\n // Store hint data for root-level hints\n hintButton.setAttribute(\"data-hint-values\", JSON.stringify(hint.values));\n hintButton.setAttribute(\"data-root-hint\", \"true\");\n\n hintsContainer.appendChild(hintButton);\n });\n\n return hintsContainer;\n }\n\n /**\n * Render form from schema\n */\n renderForm(\n root: HTMLElement,\n schema: Schema,\n prefill?: Record<string, any>,\n actions?: ExternalAction[],\n ): void {\n const errors = validateSchema(schema);\n if (errors.length > 0) {\n console.error(\"Schema validation errors:\", errors);\n return;\n }\n\n this.state.formRoot = root;\n this.state.schema = schema;\n this.state.externalActions = actions || null;\n\n clear(root);\n\n // Mark root element for theme CSS variables\n root.setAttribute(\"data-fb-root\", \"true\");\n\n // Inject theme CSS variables\n injectThemeVariables(root, this.state.config.theme);\n\n // Create root container (treating schema as implicit container)\n const rootContainer = document.createElement(\"div\");\n rootContainer.className = \"space-y-6\";\n\n // Render root-level prefill hints if specified (edit mode only)\n if (schema.prefillHints && !this.state.config.readonly) {\n const hintsContainer = this.createRootPrefillHints(schema.prefillHints);\n rootContainer.appendChild(hintsContainer);\n }\n\n // Create fields wrapper with column layout support\n const fieldsWrapper = document.createElement(\"div\");\n const columns = schema.columns || 1;\n\n if (columns === 1) {\n fieldsWrapper.className = \"space-y-4\"; // Vertical (default)\n } else {\n fieldsWrapper.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n // Render each element\n schema.elements.forEach((element) => {\n if (element.hidden) {\n return; // Hidden fields don't occupy grid slots\n }\n const block = renderElement(element, {\n path: \"\",\n prefill: prefill || {},\n formData: prefill || {}, // Pass complete root data for enableIf evaluation\n state: this.state,\n instance: this,\n });\n fieldsWrapper.appendChild(block);\n });\n\n rootContainer.appendChild(fieldsWrapper);\n root.appendChild(rootContainer);\n\n // Add global click handler for prefill hints (edit mode only)\n if (!this.state.config.readonly) {\n root.addEventListener(\"click\", this.handlePrefillHintClick.bind(this));\n }\n\n if (\n this.state.config.readonly &&\n this.state.externalActions &&\n Array.isArray(this.state.externalActions)\n ) {\n this.renderExternalActions();\n }\n }\n\n /**\n * Validate form and extract data\n * This is a complete copy of the validateForm logic from form-builder.ts\n * but uses instance state instead of global state\n */\n validateForm(skipValidation = false): FormDataResult {\n if (!this.state.schema || !this.state.formRoot)\n return { valid: true, errors: [], data: {} };\n\n const errors: string[] = [];\n const data: Record<string, any> = {};\n\n // ============================================================================\n // Component delegation validation (all field types now use component registry)\n // ============================================================================\n\n // NOTE: All validateXxxElement functions have been migrated to their respective\n // component files (text.ts, select.ts, file.ts, container.ts, group.ts).\n // They are now called via the component registry pattern.\n\n // Inject validateElement into container component for nested validation\n const validateElement = (\n element: Element,\n ctx: { path: string },\n customScopeRoot: HTMLElement | null = null,\n ): { value: any; spread: boolean } => {\n const key = element.key;\n const scopeRoot = customScopeRoot || this.state.formRoot!;\n\n // All components now use delegation pattern via component registry\n const componentContext: ComponentContext = {\n scopeRoot,\n state: this.state,\n instance: this,\n path: ctx.path,\n skipValidation,\n };\n\n const componentResult = validateElementWithComponent(\n element,\n key,\n componentContext,\n );\n\n if (componentResult !== null) {\n // Component validator handled it - merge errors and return value with spread flag\n errors.push(...componentResult.errors);\n return { value: componentResult.value, spread: !!componentResult.spread };\n }\n\n // Unknown field type\n console.warn(`Unknown field type \"${element.type}\" for key \"${key}\"`);\n return { value: null, spread: false };\n };\n\n // Set up container validation to use this validateElement function\n setContainerValidateElement(validateElement);\n\n this.state.schema.elements.forEach((element) => {\n // Skip conditionally disabled fields (enableIf not met)\n if (element.enableIf) {\n try {\n const shouldEnable = evaluateEnableCondition(\n element.enableIf,\n data,\n );\n if (!shouldEnable) {\n // Field is conditionally disabled, exclude from form data entirely\n return;\n }\n } catch (error) {\n console.error(\n `Error evaluating enableIf for field \"${element.key}\" during validation:`,\n error,\n );\n // Continue validation in case of error (fail-safe)\n }\n }\n\n if (element.hidden) {\n data[element.key] =\n element.default !== undefined ? element.default : null;\n } else {\n const result = validateElement(element, { path: \"\" });\n if (result.spread && result.value !== null && typeof result.value === \"object\") {\n Object.assign(data, result.value);\n } else {\n data[element.key] = result.value;\n }\n }\n });\n\n return {\n valid: errors.length === 0,\n errors,\n data,\n };\n }\n\n /**\n * Get form data\n */\n getFormData(): FormDataResult {\n return this.validateForm(false);\n }\n\n /**\n * Submit form with validation\n */\n submitForm(): FormDataResult {\n const result = this.validateForm(false);\n if (result.valid) {\n if (typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n {\n type: \"formSubmit\",\n data: result.data,\n schema: this.state.schema,\n },\n \"*\",\n );\n }\n }\n return result;\n }\n\n /**\n * Save draft without validation\n */\n saveDraft(): FormDataResult {\n const result = this.validateForm(true);\n if (typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n {\n type: \"formDraft\",\n data: result.data,\n schema: this.state.schema,\n },\n \"*\",\n );\n }\n return result;\n }\n\n /**\n * Clear the form - reset all field values to empty while preserving form structure\n * This is done by re-rendering the form with empty data\n */\n clearForm(): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\"clearForm: Form not initialized. Call renderForm() first.\");\n return;\n }\n\n // Get current schema, form root, and external actions\n const schema = this.state.schema;\n const formRoot = this.state.formRoot;\n const actions = this.state.externalActions;\n\n // Build empty prefill data (only for hidden fields)\n const emptyPrefill = this.buildHiddenFieldsData(schema.elements);\n\n // Re-render the form with empty data, preserving external actions\n this.renderForm(formRoot, schema, emptyPrefill, actions || undefined);\n }\n\n /**\n * Build prefill data for hidden fields only\n * Hidden fields should retain their values when clearing\n * Builds nested objects instead of flattened dotted keys\n */\n private buildHiddenFieldsData(elements: Element[]): Record<string, any> {\n const data: Record<string, any> = {};\n\n for (const element of elements) {\n const key = element.key;\n\n // Only include hidden fields with explicit defaults\n if (element.hidden && element.default !== undefined) {\n data[key] = element.default;\n }\n\n // Recursively process container elements for nested hidden fields\n if (element.type === \"container\" || element.type === \"group\") {\n const containerElement = element as ContainerElement | GroupElement;\n const nestedData = this.buildHiddenFieldsData(\n containerElement.elements,\n );\n\n if (Object.keys(nestedData).length > 0) {\n if (!(key in data)) {\n // No default set - use nested data\n data[key] = nestedData;\n } else if (\n typeof data[key] === \"object\" &&\n data[key] !== null &&\n !Array.isArray(data[key])\n ) {\n // Plain object default - merge nested data into it\n data[key] = { ...data[key], ...nestedData };\n }\n // If data[key] is array or other type, don't overwrite\n }\n }\n }\n\n return data;\n }\n\n /**\n * Build a map from flat output keys (textKey/filesKey) to the richinput schema element info.\n * Used by setFormData to detect flat richinput keys and remap them to their composite values.\n */\n private buildFlatKeyMap(\n elements: Element[],\n ): Map<string, { schemaKey: string; role: \"text\" | \"files\" }> {\n const map = new Map<string, { schemaKey: string; role: \"text\" | \"files\" }>();\n for (const el of elements) {\n if (el.type === \"richinput\" && (el as any).flatOutput) {\n const richEl = el as any;\n const textKey: string = richEl.textKey ?? \"text\";\n const filesKey: string = richEl.filesKey ?? \"files\";\n map.set(textKey, { schemaKey: el.key, role: \"text\" });\n map.set(filesKey, { schemaKey: el.key, role: \"files\" });\n }\n }\n return map;\n }\n\n /**\n * Set form data - update multiple fields without full re-render\n * @param data - Object with field paths and their values\n */\n setFormData(data: Record<string, any>): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\n \"setFormData: Form not initialized. Call renderForm() first.\",\n );\n return;\n }\n\n // Build a map of flat keys -> richinput schema elements (for flatOutput richinputs)\n const flatKeyMap = this.buildFlatKeyMap(this.state.schema.elements);\n\n // Collect flat richinput updates: schemaKey -> { [textKey]: val, [filesKey]: val }\n const flatUpdates = new Map<string, Record<string, any>>();\n\n for (const fieldPath in data) {\n const flatInfo = flatKeyMap.get(fieldPath);\n if (flatInfo) {\n // This key belongs to a flatOutput richinput - collect the flat parts\n if (!flatUpdates.has(flatInfo.schemaKey)) {\n flatUpdates.set(flatInfo.schemaKey, {});\n }\n flatUpdates.get(flatInfo.schemaKey)![fieldPath] = data[fieldPath];\n } else {\n // Normal field - update directly\n this.updateField(fieldPath, data[fieldPath]);\n }\n }\n\n // Apply collected flat richinput updates as composite values\n for (const [schemaKey, compositeValue] of flatUpdates) {\n this.updateField(schemaKey, compositeValue);\n }\n }\n\n /**\n * Update a single field by path without full re-render\n * @param fieldPath - Field path (e.g., \"email\", \"address.city\", \"items[0].name\")\n * @param value - New value for the field\n */\n updateField(fieldPath: string, value: any): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\n \"updateField: Form not initialized. Call renderForm() first.\",\n );\n return;\n }\n\n // Find the schema element for this field\n const schemaElement = this.findSchemaElement(fieldPath);\n if (!schemaElement) {\n console.warn(\n `updateField: Schema element not found for path \"${fieldPath}\"`,\n );\n return;\n }\n\n // Find the DOM element\n const domElement = this.findFormElementByFieldPath(fieldPath);\n if (!domElement) {\n console.warn(\n `updateField: DOM element not found for path \"${fieldPath}\"`,\n );\n return;\n }\n\n // Update based on field type\n this.updateFieldValue(domElement, schemaElement, fieldPath, value);\n\n // Re-evaluate conditional fields (enableIf) after field update\n this.reevaluateConditionalFields();\n\n // Optionally trigger onChange callback\n if (this.state.config.onChange || this.state.config.onFieldChange) {\n this.triggerOnChange(fieldPath, value);\n }\n }\n\n /**\n * Update field value in DOM based on field type\n * Delegates to component-specific updaters via registry\n */\n private updateFieldValue(\n domElement: HTMLElement,\n schemaElement: Element,\n fieldPath: string,\n value: any,\n ): void {\n const componentContext: ComponentContext = {\n scopeRoot: this.state.formRoot!,\n state: this.state,\n instance: this,\n path: \"\",\n };\n\n const handled = updateElementWithComponent(\n schemaElement,\n fieldPath,\n value,\n componentContext,\n );\n\n if (!handled) {\n console.warn(\n `updateField: No updater found for field type \"${schemaElement.type}\" at path \"${fieldPath}\"`,\n );\n }\n }\n\n /**\n * Re-evaluate all conditional fields (enableIf) based on current form data\n * This is called automatically when form data changes (via onChange events)\n */\n private reevaluateConditionalFields(): void {\n if (!this.state.schema || !this.state.formRoot) return;\n\n // Get current form data for condition evaluation\n const formData = this.validateForm(true).data; // Skip validation, just get data\n\n // Recursively check all elements with enableIf\n // currentPath tracks the full path to nested elements (e.g., \"address.city\" or \"items[0].name\")\n const checkElements = (elements: Element[], currentPath: string): void => {\n elements.forEach((element) => {\n // Build full path for this element\n const fullPath = currentPath\n ? `${currentPath}.${element.key}`\n : element.key;\n\n if (element.enableIf) {\n // Find the field wrapper for this element at the specific path\n // For nested elements, we need to find the wrapper within the correct container\n let fieldWrapper: HTMLElement | null = null;\n\n if (currentPath) {\n // Nested element - find within specific container\n const pathMatch = currentPath.match(/^(.+)\\[(\\d+)\\]$/);\n if (pathMatch) {\n // Array container - find the specific container item\n const containerKey = pathMatch[1];\n const containerIndex = pathMatch[2];\n const containerElement = this.state.formRoot!.querySelector(\n `[data-container-item=\"${containerKey}[${containerIndex}]\"]`,\n );\n if (containerElement) {\n fieldWrapper = containerElement.querySelector(\n `[data-field-key=\"${element.key}\"]`,\n );\n }\n } else {\n // Single container - find within container\n const containerElement = this.state.formRoot!.querySelector(\n `[data-container=\"${currentPath}\"]`,\n );\n if (containerElement) {\n fieldWrapper = containerElement.querySelector(\n `[data-field-key=\"${element.key}\"]`,\n );\n }\n }\n } else {\n // Root-level element\n fieldWrapper = this.state.formRoot!.querySelector(\n `[data-field-key=\"${element.key}\"]`,\n );\n }\n\n if (fieldWrapper) {\n const wrapper = fieldWrapper;\n try {\n // Determine container data for relative scope\n let containerData: Record<string, any> | undefined = undefined;\n const scope = element.enableIf!.scope ?? \"relative\";\n\n if (scope === \"relative\" && currentPath) {\n // For relative scope, extract the container data\n containerData = getValueByPath(formData, currentPath);\n }\n\n const shouldEnable = evaluateEnableCondition(\n element.enableIf!,\n formData, // Use complete formData for absolute scope\n containerData, // Use container-specific data for relative scope\n );\n\n const isCurrentlyDisabled =\n wrapper.getAttribute(\"data-conditionally-disabled\") === \"true\";\n\n // Update visibility if state changed\n if (shouldEnable && isCurrentlyDisabled) {\n // Need to show the field - re-render it with correct container context\n const containerPrefill = currentPath\n ? getValueByPath(formData, currentPath)\n : formData;\n const prefillContext =\n containerPrefill && typeof containerPrefill === \"object\"\n ? (containerPrefill as Record<string, any>)\n : {};\n\n const newWrapper = renderElement(element, {\n path: currentPath, // Use container path (empty string for root-level)\n prefill: prefillContext,\n formData: formData, // Pass complete formData for enableIf evaluation\n state: this.state,\n instance: this,\n });\n\n // Replace the disabled wrapper with the new rendered element\n wrapper.parentNode?.replaceChild(newWrapper, wrapper);\n } else if (!shouldEnable && !isCurrentlyDisabled) {\n // Need to hide the field - replace with disabled wrapper\n const disabledWrapper = document.createElement(\"div\");\n disabledWrapper.className = \"fb-field-wrapper-disabled\";\n disabledWrapper.style.display = \"none\";\n disabledWrapper.setAttribute(\"data-field-key\", element.key);\n disabledWrapper.setAttribute(\"data-conditionally-disabled\", \"true\");\n\n wrapper.parentNode?.replaceChild(disabledWrapper, wrapper);\n }\n } catch (error) {\n console.error(\n `Error re-evaluating enableIf for field \"${element.key}\" at path \"${fullPath}\":`,\n error,\n );\n }\n }\n }\n\n // Recursively check nested elements in containers\n if (\n (element.type === \"container\" || element.type === \"group\") &&\n \"elements\" in element &&\n element.elements\n ) {\n const containerData = (formData as any)?.[element.key];\n\n // Handle array containers (multiple items)\n if (Array.isArray(containerData)) {\n // Use actual DOM elements instead of containerData indices\n // (after deletion, DOM indices may be non-sequential)\n const containerItems =\n this.state.formRoot!.querySelectorAll<HTMLElement>(\n `[data-container-item]`,\n );\n const directItems = Array.from(containerItems).filter((el) => {\n const attr =\n el.getAttribute(\"data-container-item\") || \"\";\n if (!attr.startsWith(`${fullPath}[`)) return false;\n // Only direct children, not nested containers\n const suffix = attr.slice(fullPath.length);\n return /^\\[\\d+\\]$/.test(suffix);\n });\n directItems.forEach((el) => {\n const attr =\n el.getAttribute(\"data-container-item\") || \"\";\n checkElements(element.elements!, attr);\n });\n } else {\n // Handle single container (pass accumulated path)\n checkElements(element.elements!, fullPath);\n }\n }\n });\n };\n\n // Initialize with empty path for root-level elements\n checkElements(this.state.schema.elements, \"\");\n }\n\n /**\n * Destroy instance and clean up resources\n */\n destroy(): void {\n // Clear debounce timer\n if (this.state.debounceTimer !== null) {\n clearTimeout(this.state.debounceTimer);\n this.state.debounceTimer = null;\n }\n\n // Clear resource index\n this.state.resourceIndex.clear();\n\n // Clear DOM\n if (this.state.formRoot) {\n clear(this.state.formRoot);\n }\n\n // Nullify references for garbage collection\n this.state.formRoot = null;\n this.state.schema = null;\n this.state.externalActions = null;\n\n // Remove from instance tracking if verbose errors enabled\n if (this.state.config.verboseErrors) {\n globalThis.__formBuilderInstances?.delete(this.instanceId);\n }\n }\n}\n","/**\n * Form Builder - Instance-Based API\n *\n * Zero-dependency JSON Schema form builder library with multi-instance support\n */\n\n// Import the FormBuilderInstance class\nimport { FormBuilderInstance } from \"./instance/FormBuilderInstance.js\";\n\n// Import validation utilities\nimport { validateSchema } from \"./utils/validation.js\";\n\n// Re-export all types for TypeScript consumers\nexport type {\n SelectOption,\n ElementAction,\n BaseElement,\n TextElement,\n TextareaElement,\n NumberElement,\n SelectElement,\n FileElement,\n FilesElement,\n ContainerElement,\n GroupElement,\n RichInputElement,\n Element,\n Schema,\n ExternalAction,\n FormData,\n RenderContext,\n Translations,\n Locale,\n Config,\n ResourceMetadata,\n State,\n} from \"./types/index.js\";\n\n// Re-export theming types and utilities\nexport type { Theme } from \"./styles/theme.js\";\nexport { defaultTheme, exampleThemes } from \"./styles/theme.js\";\n\n/**\n * Factory function for creating new form instances\n *\n * @param config Optional configuration for the instance\n * @returns FormBuilderInstance\n *\n * @example\n * const form = createFormBuilder({\n * uploadFile: async (file) => {\n * // Upload logic\n * return \"resource-id-123\";\n * },\n * downloadFile: (resourceId, fileName) => {\n * // Download logic\n * }\n * });\n *\n * form.renderForm(containerElement, schema, prefillData);\n */\nexport function createFormBuilder(\n config?: Partial<import(\"./types/index.js\").Config>,\n): FormBuilderInstance {\n return new FormBuilderInstance(config);\n}\n\n// Export FormBuilderInstance class for direct instantiation\nexport { FormBuilderInstance };\n\n// Export validation utilities\nexport { validateSchema };\n\n// Default export\nexport default FormBuilderInstance;\n\n// Browser global compatibility\n// Set window.FormBuilder to FormBuilderInstance class for browser usage\nif (typeof window !== \"undefined\") {\n (window as any).FormBuilder = FormBuilderInstance;\n (window as any).createFormBuilder = createFormBuilder;\n (window as any).validateSchema = validateSchema;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/translation.ts","../../src/utils/validation.ts","../../src/utils/helpers.ts","../../src/utils/enable-conditions.ts","../../src/components/text.ts","../../src/components/textarea.ts","../../src/components/number.ts","../../src/components/select.ts","../../src/components/switcher.ts","../../src/components/file.ts","../../src/components/colour.ts","../../src/components/slider.ts","../../src/components/container.ts","../../src/components/group.ts","../../src/components/table.ts","../../src/components/richinput.ts","../../src/components/index.ts","../../src/instance/state.ts","../../src/styles/theme.ts","../../src/utils/styles.ts","../../src/components/registry.ts","../../src/instance/FormBuilderInstance.ts","../../src/index.ts"],"names":["value","key","element","gridContainer","hintText","updateFilesList","range","applyAutoExpand","t","renderElement","validateElement"],"mappings":"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","file":"index.js","sourcesContent":["// Translation utilities\n\nimport type { State } from \"../types/state.js\";\n\n/**\n * Get translated string for a key with optional interpolation\n * @param key Translation key\n * @param state Form state containing locale and translations\n * @param params Optional parameters for interpolation (e.g., {min: 5, max: 10})\n * @returns Translated string with interpolated values, or key if not found\n *\n * @example\n * // Template: \"Minimum {min} items required\"\n * t('minItems', state, { min: 3 }) // => \"Minimum 3 items required\"\n */\nexport function t(\n key: string,\n state: State,\n params?: Record<string, string | number>,\n): string {\n const locale = state.config.locale || \"en\";\n const localeTranslations = state.config.translations[locale];\n const fallbackTranslations = state.config.translations.en;\n\n // Try locale first, then fallback to English, then return key\n let text =\n (localeTranslations as Record<string, string>)?.[key] ||\n (fallbackTranslations as Record<string, string>)?.[key] ||\n key;\n\n // Interpolate {param} placeholders\n if (params) {\n for (const [paramKey, paramValue] of Object.entries(params)) {\n text = text.replace(new RegExp(`\\\\{${paramKey}\\\\}`, \"g\"), String(paramValue));\n }\n }\n\n return text;\n}\n","// Schema validation utilities\n\nimport type { Element } from \"../types/index.js\";\nimport type { State } from \"../types/state.js\";\nimport { t } from \"./translation.js\";\n\n// Helper functions for field hints\nfunction addLengthHint(element: any, parts: string[], state: State): void {\n if (element.minLength != null || element.maxLength != null) {\n if (element.minLength != null && element.maxLength != null) {\n parts.push(\n t(\"hintLengthRange\", state, {\n min: element.minLength,\n max: element.maxLength,\n }),\n );\n } else if (element.maxLength != null) {\n parts.push(t(\"hintMaxLength\", state, { max: element.maxLength }));\n } else if (element.minLength != null) {\n parts.push(t(\"hintMinLength\", state, { min: element.minLength }));\n }\n }\n}\n\nfunction addRangeHint(element: any, parts: string[], state: State): void {\n if (element.min != null || element.max != null) {\n if (element.min != null && element.max != null) {\n parts.push(\n t(\"hintValueRange\", state, { min: element.min, max: element.max }),\n );\n } else if (element.max != null) {\n parts.push(t(\"hintMaxValue\", state, { max: element.max }));\n } else if (element.min != null) {\n parts.push(t(\"hintMinValue\", state, { min: element.min }));\n }\n }\n}\n\nfunction addFileSizeHint(element: any, parts: string[], state: State): void {\n if (element.maxSizeMB) {\n parts.push(t(\"hintMaxSize\", state, { size: element.maxSizeMB }));\n }\n}\n\nfunction addFormatHint(element: any, parts: string[], state: State): void {\n if (element.accept?.extensions) {\n parts.push(\n t(\"hintFormats\", state, {\n formats: element.accept.extensions\n .map((ext: string) => ext.toUpperCase())\n .join(\",\"),\n }),\n );\n }\n}\n\nfunction addPatternHint(element: any, parts: string[], state: State): void {\n if (element.pattern) {\n parts.push(t(\"hintPattern\", state, { pattern: element.pattern }));\n }\n}\n\nexport function makeFieldHint(element: any, state: State): string {\n const parts: string[] = [];\n\n addLengthHint(element, parts, state);\n // Skip range hint for sliders - they visually show the range\n if (element.type !== \"slider\") {\n addRangeHint(element, parts, state);\n }\n addFileSizeHint(element, parts, state);\n addFormatHint(element, parts, state);\n addPatternHint(element, parts, state);\n\n return parts.join(\" • \");\n}\n\nexport function validateSchema(schema: any): string[] {\n const errors: string[] = [];\n\n if (!schema || typeof schema !== \"object\") {\n errors.push(\"Schema must be an object\");\n return errors;\n }\n\n // Version is now optional, defaults to \"0.3\"\n // if (!schema.version) {\n // errors.push(\"Schema missing version\");\n // }\n\n if (!Array.isArray(schema.elements)) {\n errors.push(\"Schema missing elements array\");\n return errors;\n }\n\n // Validate root-level columns property (fail fast on invalid values)\n if (\"columns\" in schema && schema.columns !== undefined) {\n const columns = schema.columns;\n const validColumns = [1, 2, 3, 4];\n if (!Number.isInteger(columns) || !validColumns.includes(columns as number)) {\n errors.push(`schema.columns must be 1, 2, 3, or 4 (got ${columns})`);\n }\n }\n\n // Validate root-level prefillHints (fail fast on invalid field references)\n if (\"prefillHints\" in schema && schema.prefillHints) {\n const prefillHints = schema.prefillHints;\n if (Array.isArray(prefillHints)) {\n prefillHints.forEach((hint: any, hintIndex: number) => {\n if (!hint.label || typeof hint.label !== \"string\") {\n errors.push(\n `schema.prefillHints[${hintIndex}] must have a 'label' property of type string`,\n );\n }\n if (!hint.values || typeof hint.values !== \"object\") {\n errors.push(\n `schema.prefillHints[${hintIndex}] must have a 'values' property of type object`,\n );\n } else {\n // Validate that each field in values exists in root elements\n for (const fieldKey in hint.values) {\n const fieldExists = schema.elements.some(\n (element: Element) => element.key === fieldKey,\n );\n if (!fieldExists) {\n errors.push(\n `schema.prefillHints[${hintIndex}] references non-existent field \"${fieldKey}\"`,\n );\n }\n }\n }\n });\n }\n }\n\n /**\n * Check for key collisions caused by flatOutput richinput elements.\n * When flatOutput is true, the element's textKey and filesKey become sibling output keys,\n * which can collide with other element keys or other flatOutput keys in the same scope.\n */\n function checkFlatOutputCollisions(elements: Element[], scopePath: string): void {\n const allOutputKeys = new Set<string>();\n\n for (const el of elements) {\n if (el.type === \"richinput\" && (el as any).flatOutput) {\n const richEl = el as any;\n const textKey: string = richEl.textKey ?? \"text\";\n const filesKey: string = richEl.filesKey ?? \"files\";\n\n // Check textKey against other element schema keys\n for (const otherEl of elements) {\n if (otherEl === el) continue;\n if (otherEl.key === textKey) {\n errors.push(\n `${scopePath}: RichInput \"${el.key}\" flatOutput textKey \"${textKey}\" collides with element key \"${otherEl.key}\"`,\n );\n }\n if (otherEl.key === filesKey) {\n errors.push(\n `${scopePath}: RichInput \"${el.key}\" flatOutput filesKey \"${filesKey}\" collides with element key \"${otherEl.key}\"`,\n );\n }\n }\n\n // Check against other flatOutput keys already collected\n if (allOutputKeys.has(textKey)) {\n errors.push(\n `${scopePath}: RichInput \"${el.key}\" flatOutput textKey \"${textKey}\" collides with another flatOutput key`,\n );\n }\n if (allOutputKeys.has(filesKey)) {\n errors.push(\n `${scopePath}: RichInput \"${el.key}\" flatOutput filesKey \"${filesKey}\" collides with another flatOutput key`,\n );\n }\n allOutputKeys.add(textKey);\n allOutputKeys.add(filesKey);\n } else {\n // Non-flatOutput element: check its key against accumulated flatOutput keys\n if (allOutputKeys.has(el.key)) {\n errors.push(\n `${scopePath}: Element key \"${el.key}\" collides with a flatOutput richinput key`,\n );\n }\n allOutputKeys.add(el.key);\n }\n }\n }\n\n function validateElements(elements: Element[], path: string): void {\n elements.forEach((element, index) => {\n const elementPath = `${path}[${index}]`;\n\n if (!element.type) {\n errors.push(`${elementPath}: missing type`);\n }\n\n if (!element.key) {\n errors.push(`${elementPath}: missing key`);\n }\n\n // Validate enableIf condition structure\n if (element.enableIf) {\n const enableIf = element.enableIf;\n\n if (!enableIf.key || typeof enableIf.key !== \"string\") {\n errors.push(\n `${elementPath}: enableIf must have a 'key' property of type string`,\n );\n }\n\n // Check that at least one operator is present\n const hasOperator = \"equals\" in enableIf;\n // Future: || \"notEquals\" in enableIf || \"in\" in enableIf || ...\n\n if (!hasOperator) {\n errors.push(\n `${elementPath}: enableIf must have at least one operator (equals, etc.)`,\n );\n }\n }\n\n if (\n element.type === \"group\" &&\n \"elements\" in element &&\n element.elements\n ) {\n validateElements(element.elements, `${elementPath}.elements`);\n }\n\n if (element.type === \"container\" && element.elements) {\n // Validate columns property (fail fast on invalid values)\n if (\"columns\" in element && element.columns !== undefined) {\n const columns = element.columns;\n const validColumns = [1, 2, 3, 4];\n if (\n !Number.isInteger(columns) ||\n !validColumns.includes(columns as number)\n ) {\n errors.push(\n `${elementPath}: columns must be 1, 2, 3, or 4 (got ${columns})`,\n );\n }\n }\n\n // Validate prefillHints (fail fast on invalid field references)\n if (\"prefillHints\" in element && element.prefillHints) {\n const prefillHints = element.prefillHints;\n if (Array.isArray(prefillHints)) {\n prefillHints.forEach((hint, hintIndex) => {\n if (!hint.label || typeof hint.label !== \"string\") {\n errors.push(\n `${elementPath}: prefillHints[${hintIndex}] must have a 'label' property of type string`,\n );\n }\n if (!hint.values || typeof hint.values !== \"object\") {\n errors.push(\n `${elementPath}: prefillHints[${hintIndex}] must have a 'values' property of type object`,\n );\n } else {\n // Validate that each field in values exists in container elements\n for (const fieldKey in hint.values) {\n const fieldExists = element.elements.some(\n (childElement) => childElement.key === fieldKey,\n );\n if (!fieldExists) {\n errors.push(\n `container \"${element.key}\": prefillHints[${hintIndex}] references non-existent field \"${fieldKey}\"`,\n );\n }\n }\n }\n });\n }\n }\n\n validateElements(element.elements, `${elementPath}.elements`);\n checkFlatOutputCollisions(element.elements, `${elementPath}.elements`);\n }\n\n if (element.type === \"select\" && element.options) {\n const defaultValue = element.default;\n if (\n defaultValue !== undefined &&\n defaultValue !== null &&\n defaultValue !== \"\"\n ) {\n const hasMatchingOption = element.options.some(\n (opt) => opt.value === defaultValue,\n );\n if (!hasMatchingOption) {\n errors.push(\n `${elementPath}: default \"${defaultValue}\" not in options`,\n );\n }\n }\n }\n });\n }\n\n if (Array.isArray(schema.elements)) {\n validateElements(schema.elements, \"elements\");\n checkFlatOutputCollisions(schema.elements, \"elements\");\n }\n return errors;\n}\n","// Utility helper functions\n\nexport function isPlainObject(obj: any): obj is Record<string, any> {\n return obj && typeof obj === \"object\" && obj.constructor === Object;\n}\n\n/**\n * Escape HTML special characters to prevent XSS\n * Use when inserting user-controlled or translated content via innerHTML\n */\nexport function escapeHtml(text: string): string {\n const div = document.createElement(\"div\");\n div.textContent = text;\n return div.innerHTML;\n}\n\nexport function pathJoin(base: string, key: string): string {\n return base ? `${base}.${key}` : key;\n}\n\nexport function pretty(obj: any): string {\n return JSON.stringify(obj, null, 2);\n}\n\nexport function clear(node: HTMLElement): void {\n while (node.firstChild) node.removeChild(node.firstChild);\n}\n\n/**\n * Format a file size in bytes to a human-readable string\n * e.g. 2400000 -> \"2.3 MB\", 512 -> \"512 B\"\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Serialize a value for storage in a hidden input's value attribute.\n * Objects/arrays → JSON string, null/undefined → \"\", primitives → String().\n */\nexport function serializeHiddenValue(value: any): string {\n if (value === null || value === undefined) return \"\";\n return typeof value === \"object\" ? JSON.stringify(value) : String(value);\n}\n\n/**\n * Deserialize a hidden input's value attribute back to its original type.\n * Empty string → null, JSON-parseable → parsed value, otherwise → raw string.\n */\nexport function deserializeHiddenValue(raw: string): any {\n if (raw === \"\") return null;\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/**\n * Create a hidden input element for a hidden form field.\n */\nexport function createHiddenInput(name: string, value: any): HTMLInputElement {\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n input.name = name;\n input.setAttribute(\"data-hidden-field\", \"true\");\n input.value = serializeHiddenValue(value);\n return input;\n}\n","// Enable condition evaluation utilities\n\nimport type { EnableCondition } from \"../types/index.js\";\n\n/**\n * Get value from nested object path\n * Supports nested paths: \"address.city\"\n * Supports array indices: \"items[0].name\", \"contacts[1].email\"\n * @param data - Form data object\n * @param path - Dot notation path with optional array indices\n * @returns The value at the path, or undefined if not found\n */\nexport function getValueByPath(data: any, path: string): any {\n if (!data || typeof data !== \"object\") {\n return undefined;\n }\n\n // Split path by dots, but preserve array indices\n // \"items[0].name\" -> [\"items\", \"[0]\", \"name\"]\n // \"address.city\" -> [\"address\", \"city\"]\n const segments = path.match(/[^.[\\]]+|\\[\\d+\\]/g);\n\n if (!segments || segments.length === 0) {\n return undefined;\n }\n\n let current = data;\n\n for (const segment of segments) {\n if (current === undefined || current === null) {\n return undefined;\n }\n\n // Handle array index notation: [0], [1], etc.\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n const index = parseInt(segment.slice(1, -1), 10);\n if (!Array.isArray(current) || isNaN(index)) {\n return undefined;\n }\n current = current[index];\n } else {\n // Handle object property\n current = current[segment];\n }\n }\n\n return current;\n}\n\n/**\n * Evaluate an enable condition against form data\n * @param condition - Enable condition to evaluate\n * @param formData - Root form data (for absolute scope)\n * @param containerData - Container instance data (for relative scope, optional)\n * @returns true if condition is met (field should be enabled), false otherwise\n */\nexport function evaluateEnableCondition(\n condition: EnableCondition,\n formData: Record<string, any>,\n containerData?: Record<string, any>,\n): boolean {\n if (!condition || !condition.key) {\n // Invalid condition structure - fail fast\n throw new Error(\"Invalid enableIf condition: must have a 'key' property\");\n }\n\n // Determine scope (default: \"relative\" - breaking change in v0.2.9)\n const scope = condition.scope ?? \"relative\";\n\n // Select data source based on scope\n let dataSource: Record<string, any>;\n if (scope === \"relative\") {\n // Use container data if available, otherwise fall back to root form data\n dataSource = containerData ?? formData;\n } else if (scope === \"absolute\") {\n // Always use root form data\n dataSource = formData;\n } else {\n // Invalid scope value - fail fast\n throw new Error(\n `Invalid enableIf scope: must be \"relative\" or \"absolute\" (got \"${scope}\")`,\n );\n }\n\n // Get value at the specified path\n const actualValue = getValueByPath(dataSource, condition.key);\n\n // Evaluate equals operator (initial implementation)\n if (\"equals\" in condition) {\n // Use strict equality for primitives, deep comparison for objects/arrays\n return deepEqual(actualValue, condition.equals);\n }\n\n // Future operators will be added here:\n // if (\"notEquals\" in condition) { ... }\n // if (\"in\" in condition) { ... }\n // if (\"exists\" in condition) { ... }\n // if (\"greaterThan\" in condition) { ... }\n // if (\"lessThan\" in condition) { ... }\n // if (\"and\" in condition) { ... }\n // if (\"or\" in condition) { ... }\n\n // No recognized operator - fail fast\n throw new Error(\n `Invalid enableIf condition: no recognized operator (equals, etc.)`,\n );\n}\n\n/**\n * Deep equality check for condition evaluation\n * Handles primitives, objects, and arrays\n * Protects against circular references using JSON.stringify with fallback to reference equality\n */\nfunction deepEqual(a: any, b: any): boolean {\n // Strict equality for primitives and same reference\n if (a === b) return true;\n\n // Handle null/undefined\n if (a == null || b == null) return a === b;\n\n // Type mismatch\n if (typeof a !== typeof b) return false;\n\n // For objects and arrays, use JSON comparison with circular reference protection\n if (typeof a === \"object\" && typeof b === \"object\") {\n try {\n return JSON.stringify(a) === JSON.stringify(b);\n } catch (e) {\n // Circular reference detected, fall back to reference equality\n if (\n e instanceof TypeError &&\n ((e as TypeError).message.includes(\"circular\") ||\n (e as TypeError).message.includes(\"cyclic\"))\n ) {\n console.warn(\n \"deepEqual: Circular reference detected in enableIf comparison, using reference equality\",\n );\n return a === b;\n }\n // Re-throw other errors\n throw e;\n }\n }\n\n // Fallback to strict equality for other types\n return a === b;\n}\n","// Text component rendering, validation, and update functions\n\nimport type {\n TextElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { t } from \"../utils/translation.js\";\n\n// Helper to build and update character counter for text/textarea fields\nexport function createCharCounter(\n element: TextElement,\n input: HTMLInputElement | HTMLTextAreaElement,\n isTextarea: boolean = false,\n): HTMLElement {\n const counter = document.createElement(\"span\");\n counter.className = \"char-counter\";\n counter.style.cssText = `\n position: absolute;\n ${isTextarea ? \"bottom: 8px\" : \"top: 50%; transform: translateY(-50%)\"};\n right: 10px;\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n pointer-events: none;\n background: var(--fb-background-color);\n padding: 0 4px;\n `;\n\n const updateCounter = (): void => {\n const len = input.value.length;\n const min = element.minLength;\n const max = element.maxLength;\n\n // Only show counter if min or max is defined\n if (min == null && max == null) {\n counter.textContent = \"\";\n return;\n }\n\n if (len === 0 || (min != null && len < min)) {\n // Empty or below minimum: show range\n if (min != null && max != null) {\n counter.textContent = `${min}-${max}`;\n } else if (max != null) {\n counter.textContent = `≤${max}`;\n } else if (min != null) {\n counter.textContent = `≥${min}`;\n }\n counter.style.color = \"var(--fb-text-secondary-color)\";\n } else if (max != null && len > max) {\n // Over maximum: show in red\n counter.textContent = `${len}/${max}`;\n counter.style.color = \"var(--fb-error-color)\";\n } else {\n // Within valid range: show current/max\n if (max != null) {\n counter.textContent = `${len}/${max}`;\n } else {\n counter.textContent = `${len}`;\n }\n counter.style.color = \"var(--fb-text-secondary-color)\";\n }\n };\n\n input.addEventListener(\"input\", updateCounter);\n updateCounter(); // Initial state\n\n return counter;\n}\n\nexport function renderTextElement(\n element: TextElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n\n // Wrapper for input + counter\n const inputWrapper = document.createElement(\"div\");\n inputWrapper.style.cssText = \"position: relative;\";\n\n const textInput = document.createElement(\"input\");\n textInput.type = \"text\";\n textInput.className = \"w-full rounded-lg\";\n textInput.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n padding-right: 60px;\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n width: 100%;\n box-sizing: border-box;\n `;\n textInput.name = pathKey;\n textInput.placeholder = element.placeholder || \"Введите текст\";\n textInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n textInput.readOnly = state.config.readonly;\n\n // Add focus styles via event listeners (CSS variables)\n if (!state.config.readonly) {\n textInput.addEventListener(\"focus\", () => {\n textInput.style.borderColor = \"var(--fb-border-focus-color)\";\n textInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n textInput.style.outlineOffset = \"0\";\n });\n textInput.addEventListener(\"blur\", () => {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n textInput.style.outline = \"none\";\n });\n textInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n textInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = textInput.value === \"\" ? null : textInput.value;\n ctx.instance.triggerOnChange(pathKey, value);\n };\n textInput.addEventListener(\"blur\", handleChange);\n textInput.addEventListener(\"input\", handleChange);\n }\n\n inputWrapper.appendChild(textInput);\n\n // Add character counter inside the input (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.minLength != null || element.maxLength != null)) {\n const counter = createCharCounter(element, textInput, false);\n inputWrapper.appendChild(counter);\n }\n\n wrapper.appendChild(inputWrapper);\n}\n\nexport function renderMultipleTextElement(\n element: TextElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-text-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addTextItem(value: string = \"\", index: number = -1): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-text-item flex items-center gap-2\";\n\n // Input container for relative positioning of counter\n const inputContainer = document.createElement(\"div\");\n inputContainer.style.cssText = \"position: relative; flex: 1;\";\n\n const textInput = document.createElement(\"input\");\n textInput.type = \"text\";\n textInput.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n padding-right: 60px;\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n width: 100%;\n box-sizing: border-box;\n `;\n textInput.placeholder = element.placeholder || t(\"placeholderText\", state);\n textInput.value = value;\n textInput.readOnly = state.config.readonly;\n\n // Add focus styles via event listeners\n if (!state.config.readonly) {\n textInput.addEventListener(\"focus\", () => {\n textInput.style.borderColor = \"var(--fb-border-focus-color)\";\n textInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n textInput.style.outlineOffset = \"0\";\n });\n textInput.addEventListener(\"blur\", () => {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n textInput.style.outline = \"none\";\n });\n textInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n textInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = textInput.value === \"\" ? null : textInput.value;\n ctx.instance.triggerOnChange(textInput.name, value);\n };\n textInput.addEventListener(\"blur\", handleChange);\n textInput.addEventListener(\"input\", handleChange);\n }\n\n inputContainer.appendChild(textInput);\n\n // Add character counter (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.minLength != null || element.maxLength != null)) {\n const counter = createCharCounter(element, textInput, false);\n inputContainer.appendChild(counter);\n }\n\n itemWrapper.appendChild(inputContainer);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-text-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-text-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addTextItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-text-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addTextItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate text input field and return extracted value with errors\n */\nexport function validateTextElement(\n element: TextElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate text input value\n const validateTextInput = (\n input: HTMLInputElement | HTMLTextAreaElement,\n val: string,\n fieldKey: string,\n ): void => {\n let hasError = false;\n const { state } = context;\n\n if (!skipValidation && val) {\n if (\n element.minLength !== undefined &&\n element.minLength !== null &&\n val.length < element.minLength\n ) {\n const msg = t(\"minLength\", state, { min: element.minLength });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n } else if (\n element.maxLength !== undefined &&\n element.maxLength !== null &&\n val.length > element.maxLength\n ) {\n const msg = t(\"maxLength\", state, { max: element.maxLength });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n } else if (element.pattern) {\n try {\n const re = new RegExp(element.pattern);\n if (!re.test(val)) {\n const msg = t(\"patternMismatch\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n }\n } catch {\n const msg = t(\"invalidPattern\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n }\n }\n }\n\n if (!hasError) {\n markValidity(input, null);\n }\n };\n\n if (element.multiple) {\n // Multiple text fields (array)\n const inputs = scopeRoot.querySelectorAll<\n HTMLInputElement | HTMLTextAreaElement\n >(`[name^=\"${key}[\"]`);\n const values: Array<string | null> = [];\n const rawValues: string[] = [];\n\n inputs.forEach((input, index) => {\n const val = input?.value ?? \"\";\n rawValues.push(val);\n values.push(val === \"\" ? null : val);\n validateTextInput(input, val, `${key}[${index}]`);\n });\n\n // Validate count\n if (!skipValidation) {\n const { state } = context;\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = rawValues.filter((v) => v.trim() !== \"\");\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single text field\n const input = scopeRoot.querySelector<\n HTMLInputElement | HTMLTextAreaElement\n >(`[name$=\"${key}\"]`);\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n const msg = t(\"required\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n if (input) {\n validateTextInput(input, val, key);\n }\n return { value: val === \"\" ? null : val, errors };\n }\n}\n\n/**\n * Update text field value in DOM without re-render\n */\nexport function updateTextField(\n element: TextElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple text fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateTextField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<\n HTMLInputElement | HTMLTextAreaElement\n >(`[name^=\"${fieldPath}[\"]`);\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n input.value = value[index] != null ? String(value[index]) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateTextField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single text field\n const input = scopeRoot.querySelector<\n HTMLInputElement | HTMLTextAreaElement\n >(`[name=\"${fieldPath}\"]`);\n if (input) {\n input.value = value != null ? String(value) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// Textarea component rendering, validation, and update functions\n\nimport type {\n TextareaElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { validateTextElement, updateTextField, createCharCounter } from \"./text.js\";\nimport { t } from \"../utils/translation.js\";\n\n/**\n * Applies auto-expand behavior to a textarea element.\n * The textarea starts as a single-line input and grows vertically as content is added.\n */\nfunction applyAutoExpand(textarea: HTMLTextAreaElement): void {\n textarea.style.overflow = \"hidden\";\n textarea.style.resize = \"none\";\n\n // Set initial rows based on content line count (correct pre-DOM sizing)\n const lineCount = (textarea.value.match(/\\n/g) || []).length + 1;\n textarea.rows = Math.max(1, lineCount);\n\n const resize = (): void => {\n // Guard: only resize when element is in the document (scrollHeight is unreliable otherwise)\n if (!textarea.isConnected) return;\n textarea.style.height = \"0\";\n textarea.style.height = `${textarea.scrollHeight}px`;\n };\n\n textarea.addEventListener(\"input\", resize);\n\n // Post-render resize: handles line wrapping that rows alone can't account for\n setTimeout(() => {\n if (textarea.isConnected) resize();\n }, 0);\n}\n\nexport function renderTextareaElement(\n element: TextareaElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n\n // Wrapper for textarea + counter\n const textareaWrapper = document.createElement(\"div\");\n textareaWrapper.style.cssText = \"position: relative;\";\n\n const textareaInput = document.createElement(\"textarea\");\n textareaInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\";\n textareaInput.style.cssText = \"padding-bottom: 24px;\"; // Space for counter\n textareaInput.name = pathKey;\n textareaInput.placeholder = element.placeholder || \"Введите текст\";\n textareaInput.rows = element.rows || 4;\n textareaInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n textareaInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = textareaInput.value === \"\" ? null : textareaInput.value;\n ctx.instance.triggerOnChange(pathKey, value);\n };\n textareaInput.addEventListener(\"blur\", handleChange);\n textareaInput.addEventListener(\"input\", handleChange);\n }\n\n // Apply auto-expand: explicitly when autoExpand is set, or always in readonly mode\n if (element.autoExpand || state.config.readonly) {\n applyAutoExpand(textareaInput);\n }\n\n textareaWrapper.appendChild(textareaInput);\n\n // Add character counter inside the textarea (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.minLength != null || element.maxLength != null)) {\n const counter = createCharCounter(element as any, textareaInput, true);\n textareaWrapper.appendChild(counter);\n }\n\n wrapper.appendChild(textareaWrapper);\n}\n\nexport function renderMultipleTextareaElement(\n element: TextareaElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-textarea-item\");\n items.forEach((item, index) => {\n const textarea = item.querySelector(\"textarea\");\n if (textarea) {\n textarea.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addTextareaItem(\n value: string = \"\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-textarea-item\";\n\n // Textarea container for relative positioning of counter\n const textareaContainer = document.createElement(\"div\");\n textareaContainer.style.cssText = \"position: relative;\";\n\n const textareaInput = document.createElement(\"textarea\");\n textareaInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\";\n textareaInput.style.cssText = \"padding-bottom: 24px;\"; // Space for counter\n textareaInput.placeholder = element.placeholder || t(\"placeholderText\", state);\n textareaInput.rows = element.rows || 4;\n textareaInput.value = value;\n textareaInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value =\n textareaInput.value === \"\" ? null : textareaInput.value;\n ctx.instance.triggerOnChange(textareaInput.name, value);\n };\n textareaInput.addEventListener(\"blur\", handleChange);\n textareaInput.addEventListener(\"input\", handleChange);\n }\n\n // Apply auto-expand: explicitly when autoExpand is set, or always in readonly mode\n if (element.autoExpand || state.config.readonly) {\n applyAutoExpand(textareaInput);\n }\n\n textareaContainer.appendChild(textareaInput);\n\n // Add character counter (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.minLength != null || element.maxLength != null)) {\n const counter = createCharCounter(element as any, textareaInput, true);\n textareaContainer.appendChild(counter);\n }\n\n itemWrapper.appendChild(textareaContainer);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-textarea-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn mt-1 px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-textarea-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addTextareaItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-textarea-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addTextareaItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate textarea element - delegates to text validator since they share validation logic\n */\nexport function validateTextareaElement(\n element: TextareaElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n // Textarea shares validation logic with text (minLength, maxLength, pattern)\n return validateTextElement(element as any, key, context);\n}\n\n/**\n * Update textarea field - delegates to text updater since they share update logic,\n * then triggers resize on autoExpand textareas.\n */\nexport function updateTextareaField(\n element: TextareaElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n // Textarea shares update logic with text\n updateTextField(element as any, fieldPath, value, context);\n\n // After updating value, trigger resize on autoExpand textareas.\n // autoExpand is active when element.autoExpand is true or in readonly mode.\n const { scopeRoot, state } = context;\n const shouldAutoExpand = element.autoExpand || state.config.readonly;\n if (!shouldAutoExpand) return;\n\n if (element.multiple) {\n const textareas = scopeRoot.querySelectorAll<HTMLTextAreaElement>(\n `textarea[name^=\"${fieldPath}[\"]`,\n );\n textareas.forEach((textarea) => {\n textarea.dispatchEvent(new Event(\"input\"));\n });\n } else {\n const textarea = scopeRoot.querySelector<HTMLTextAreaElement>(\n `textarea[name=\"${fieldPath}\"]`,\n );\n if (textarea) {\n textarea.dispatchEvent(new Event(\"input\"));\n }\n }\n}\n","// Number component rendering, validation, and update functions\n\nimport type {\n NumberElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { t } from \"../utils/translation.js\";\n\n// Helper to create range hint for number fields\nfunction createNumberRangeHint(\n element: NumberElement,\n input: HTMLInputElement,\n): HTMLElement {\n const hint = document.createElement(\"span\");\n hint.className = \"number-range-hint\";\n hint.style.cssText = `\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n right: 10px;\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n pointer-events: none;\n background: var(--fb-background-color);\n padding: 0 4px;\n `;\n\n const min = element.min;\n const max = element.max;\n\n // Build static range text\n let rangeText = \"\";\n if (min != null && max != null) {\n rangeText = `${min} – ${max}`;\n } else if (max != null) {\n rangeText = `≤${max}`;\n } else if (min != null) {\n rangeText = `≥${min}`;\n }\n\n hint.textContent = rangeText;\n\n // Update color based on validation (red if out of range)\n const updateColor = (): void => {\n const val = input.value ? parseFloat(input.value) : null;\n if (val != null) {\n const belowMin = min != null && val < min;\n const aboveMax = max != null && val > max;\n hint.style.color = belowMin || aboveMax\n ? \"var(--fb-error-color)\"\n : \"var(--fb-text-secondary-color)\";\n } else {\n hint.style.color = \"var(--fb-text-secondary-color)\";\n }\n };\n\n input.addEventListener(\"input\", updateColor);\n updateColor();\n\n return hint;\n}\n\nexport function renderNumberElement(\n element: NumberElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n\n // Wrapper for input + counter\n const inputWrapper = document.createElement(\"div\");\n inputWrapper.style.cssText = \"position: relative;\";\n\n const numberInput = document.createElement(\"input\");\n numberInput.type = \"number\";\n numberInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n numberInput.style.cssText = \"padding-right: 60px; width: 100%; box-sizing: border-box;\";\n numberInput.name = pathKey;\n numberInput.placeholder = element.placeholder || \"0\";\n if (element.min !== undefined) numberInput.min = element.min.toString();\n if (element.max !== undefined) numberInput.max = element.max.toString();\n if (element.step !== undefined) numberInput.step = element.step.toString();\n numberInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n numberInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = numberInput.value ? parseFloat(numberInput.value) : null;\n ctx.instance.triggerOnChange(pathKey, value);\n };\n numberInput.addEventListener(\"blur\", handleChange);\n numberInput.addEventListener(\"input\", handleChange);\n }\n\n inputWrapper.appendChild(numberInput);\n\n // Add value counter inside the input (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.min != null || element.max != null)) {\n const counter = createNumberRangeHint(element, numberInput);\n inputWrapper.appendChild(counter);\n }\n\n wrapper.appendChild(inputWrapper);\n}\n\nexport function renderMultipleNumberElement(\n element: NumberElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-number-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addNumberItem(\n value: string | number = \"\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-number-item flex items-center gap-2\";\n\n // Input container for relative positioning of counter\n const inputContainer = document.createElement(\"div\");\n inputContainer.style.cssText = \"position: relative; flex: 1;\";\n\n const numberInput = document.createElement(\"input\");\n numberInput.type = \"number\";\n numberInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n numberInput.style.cssText = \"padding-right: 60px; width: 100%; box-sizing: border-box;\";\n numberInput.placeholder = element.placeholder || \"0\";\n if (element.min !== undefined) numberInput.min = element.min.toString();\n if (element.max !== undefined) numberInput.max = element.max.toString();\n if (element.step !== undefined) numberInput.step = element.step.toString();\n numberInput.value = value.toString();\n numberInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const val = numberInput.value ? parseFloat(numberInput.value) : null;\n ctx.instance.triggerOnChange(numberInput.name, val);\n };\n numberInput.addEventListener(\"blur\", handleChange);\n numberInput.addEventListener(\"input\", handleChange);\n }\n\n inputContainer.appendChild(numberInput);\n\n // Add value counter (only if min/max defined and not readonly)\n if (!state.config.readonly && (element.min != null || element.max != null)) {\n const counter = createNumberRangeHint(element, numberInput);\n inputContainer.appendChild(counter);\n }\n\n itemWrapper.appendChild(inputContainer);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-number-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-number-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addNumberItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-number-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addNumberItem(value as string | number));\n updateAddButton();\n updateRemoveButtons();\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate number input field and return extracted value with errors\n */\nexport function validateNumberElement(\n element: NumberElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate number value\n const validateNumberInput = (\n input: HTMLInputElement,\n v: number,\n fieldKey: string,\n ): void => {\n let hasError = false;\n const { state } = context;\n\n if (\n !skipValidation &&\n element.min !== undefined &&\n element.min !== null &&\n v < element.min\n ) {\n const msg = t(\"minValue\", state, { min: element.min });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n } else if (\n !skipValidation &&\n element.max !== undefined &&\n element.max !== null &&\n v > element.max\n ) {\n const msg = t(\"maxValue\", state, { max: element.max });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n hasError = true;\n }\n\n if (!hasError) {\n markValidity(input, null);\n }\n };\n\n if (element.multiple) {\n // Multiple number fields (array)\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: (number | null)[] = [];\n\n inputs.forEach((input, index) => {\n const raw = input?.value ?? \"\";\n if (raw === \"\") {\n values.push(null);\n markValidity(input, null);\n return;\n }\n\n const v = parseFloat(raw);\n if (!skipValidation && !Number.isFinite(v)) {\n const msg = t(\"notANumber\", context.state);\n errors.push(`${key}[${index}]: ${msg}`);\n markValidity(input, msg);\n values.push(null);\n return;\n }\n\n validateNumberInput(input, v, `${key}[${index}]`);\n const d = Number.isInteger(element.decimals ?? 0)\n ? (element.decimals ?? 0)\n : 0;\n values.push(Number(v.toFixed(d)));\n });\n\n // Validate count\n if (!skipValidation) {\n const { state } = context;\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v !== null);\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single number field\n const input = scopeRoot.querySelector<HTMLInputElement>(`[name$=\"${key}\"]`);\n const raw = input?.value ?? \"\";\n const { state } = context;\n\n if (!skipValidation && element.required && raw === \"\") {\n const msg = t(\"required\", state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n if (raw === \"\") {\n markValidity(input, null);\n return { value: null, errors };\n }\n\n const v = parseFloat(raw);\n if (!skipValidation && !Number.isFinite(v)) {\n const msg = t(\"notANumber\", state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n validateNumberInput(input!, v, key);\n const d = Number.isInteger(element.decimals ?? 0)\n ? (element.decimals ?? 0)\n : 0;\n return { value: Number(v.toFixed(d)), errors };\n }\n}\n\n/**\n * Update number field value in DOM without re-render\n */\nexport function updateNumberField(\n element: NumberElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple number fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateNumberField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n input.value = value[index] != null ? String(value[index]) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateNumberField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single number field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (input) {\n input.value = value != null ? String(value) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// Select component rendering functions\n\nimport type {\n SelectElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { t } from \"../utils/translation.js\";\n\nexport function renderSelectElement(\n element: SelectElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const selectInput = document.createElement(\"select\");\n selectInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n selectInput.name = pathKey;\n selectInput.disabled = state.config.readonly;\n\n (element.options || []).forEach((option) => {\n const optionEl = document.createElement(\"option\");\n optionEl.value = option.value;\n optionEl.textContent = option.label;\n if ((ctx.prefill[element.key] || element.default) === option.value) {\n optionEl.selected = true;\n }\n selectInput.appendChild(optionEl);\n });\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(pathKey, selectInput.value);\n };\n selectInput.addEventListener(\"change\", handleChange);\n }\n\n wrapper.appendChild(selectInput);\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const selectHint = document.createElement(\"p\");\n selectHint.className = \"text-xs text-gray-500 mt-1\";\n selectHint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(selectHint);\n }\n}\n\nexport function renderMultipleSelectElement(\n element: SelectElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || element.options?.[0]?.value || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-select-item\");\n items.forEach((item, index) => {\n const select = item.querySelector(\"select\");\n if (select) {\n select.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addSelectItem(value: string = \"\", index: number = -1): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-select-item flex items-center gap-2\";\n\n const selectInput = document.createElement(\"select\");\n selectInput.className =\n \"flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n selectInput.disabled = state.config.readonly;\n\n // Add options\n (element.options || []).forEach((option) => {\n const optionElement = document.createElement(\"option\");\n optionElement.value = option.value;\n optionElement.textContent = option.label;\n if (value === option.value) {\n optionElement.selected = true;\n }\n selectInput.appendChild(optionElement);\n });\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(selectInput.name, selectInput.value);\n };\n selectInput.addEventListener(\"change\", handleChange);\n }\n\n itemWrapper.appendChild(selectInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-select-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(item);\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-select-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n const defaultValue =\n element.default || element.options?.[0]?.value || \"\";\n values.push(defaultValue);\n addSelectItem(defaultValue);\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-select-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addSelectItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate select field and return extracted value with errors\n */\nexport function validateSelectElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate multiple count\n const validateMultipleCount = (\n key: string,\n values: string[],\n element: Element,\n filterFn: (v: string) => boolean,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n\n const filteredValues = values.filter(filterFn);\n const minCount = \"minCount\" in element ? (element.minCount ?? 1) : 1;\n const maxCount =\n \"maxCount\" in element ? (element.maxCount ?? Infinity) : Infinity;\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n };\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple select fields\n const inputs = scopeRoot.querySelectorAll<HTMLSelectElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: string[] = [];\n\n inputs.forEach((input) => {\n const val = input?.value ?? \"\";\n values.push(val);\n markValidity(input, null);\n });\n\n validateMultipleCount(key, values, element, (v) => v !== \"\");\n return { value: values, errors };\n } else {\n // Single select field\n const input = scopeRoot.querySelector<HTMLSelectElement>(\n `[name$=\"${key}\"]`,\n );\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n const msg = t(\"required\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n } else {\n markValidity(input, null);\n }\n\n return { value: val === \"\" ? null : val, errors };\n }\n}\n\n/**\n * Update select field value in DOM without re-render\n */\nexport function updateSelectField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple select fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateSelectField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const selects = scopeRoot.querySelectorAll<HTMLSelectElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n selects.forEach((select, index) => {\n if (index < value.length) {\n select.value = value[index] != null ? String(value[index]) : \"\";\n\n // Update selected option\n const options = select.querySelectorAll(\"option\");\n options.forEach((option) => {\n option.selected = option.value === String(value[index]);\n });\n\n select.classList.remove(\"invalid\");\n select.title = \"\";\n }\n });\n\n if (value.length !== selects.length) {\n console.warn(\n `updateSelectField: Multiple field \"${fieldPath}\" has ${selects.length} selects but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single select field\n const select = scopeRoot.querySelector<HTMLSelectElement>(\n `[name=\"${fieldPath}\"]`,\n );\n\n if (select) {\n select.value = value != null ? String(value) : \"\";\n\n // Update selected option\n const options = select.querySelectorAll(\"option\");\n options.forEach((option) => {\n option.selected = option.value === String(value);\n });\n\n select.classList.remove(\"invalid\");\n select.title = \"\";\n }\n }\n}\n","// Switcher component — segmented control / button group\n\nimport type {\n SwitcherElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { t } from \"../utils/translation.js\";\n\n// ============================================================================\n// Styling helpers\n// ============================================================================\n\n/**\n * Apply selected-state styles to a switcher button.\n * Selected: primary colour background with white text.\n */\nfunction applySelectedStyle(btn: HTMLButtonElement): void {\n btn.style.backgroundColor = \"var(--fb-primary-color)\";\n btn.style.color = \"#ffffff\";\n btn.style.borderColor = \"var(--fb-primary-color)\";\n}\n\n/**\n * Apply unselected-state styles to a switcher button.\n */\nfunction applyUnselectedStyle(btn: HTMLButtonElement): void {\n btn.style.backgroundColor = \"transparent\";\n btn.style.color = \"var(--fb-text-color)\";\n btn.style.borderColor = \"var(--fb-border-color)\";\n}\n\n/**\n * Build the segmented button group for a single switcher.\n * Returns the group wrapper element.\n *\n * @param element - Schema element\n * @param currentValue - Currently selected option value\n * @param hiddenInput - Hidden input to keep in sync\n * @param readonly - Whether the control is read-only\n * @param onChange - Called whenever the selection changes (edit mode only)\n */\nfunction buildSegmentedGroup(\n element: SwitcherElement,\n currentValue: string,\n hiddenInput: HTMLInputElement,\n readonly: boolean,\n onChange: ((value: string) => void) | null,\n): HTMLDivElement {\n const options = element.options || [];\n\n const group = document.createElement(\"div\");\n group.className = \"fb-switcher-group\";\n group.style.cssText = `\n display: inline-flex;\n flex-direction: row;\n flex-wrap: nowrap;\n `;\n\n const buttons: HTMLButtonElement[] = [];\n\n options.forEach((option, index) => {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"fb-switcher-btn\";\n btn.dataset.value = option.value;\n btn.textContent = option.label;\n\n // Base styles\n btn.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n font-size: var(--fb-font-size);\n border-width: var(--fb-border-width);\n border-style: solid;\n cursor: ${readonly ? \"default\" : \"pointer\"};\n transition: background-color var(--fb-transition-duration), color var(--fb-transition-duration), border-color var(--fb-transition-duration);\n white-space: nowrap;\n line-height: 1.25;\n outline: none;\n `;\n\n // Segmented border-radius: first, middle, last\n if (options.length === 1) {\n btn.style.borderRadius = \"var(--fb-border-radius)\";\n } else if (index === 0) {\n btn.style.borderRadius =\n \"var(--fb-border-radius) 0 0 var(--fb-border-radius)\";\n btn.style.borderRightWidth = \"0\";\n } else if (index === options.length - 1) {\n btn.style.borderRadius =\n \"0 var(--fb-border-radius) var(--fb-border-radius) 0\";\n } else {\n btn.style.borderRadius = \"0\";\n btn.style.borderRightWidth = \"0\";\n }\n\n // Initial state\n if (option.value === currentValue) {\n applySelectedStyle(btn);\n } else {\n applyUnselectedStyle(btn);\n }\n\n if (!readonly) {\n btn.addEventListener(\"click\", () => {\n // Update hidden input\n hiddenInput.value = option.value;\n\n // Update all button styles in this group\n buttons.forEach((b) => {\n if (b.dataset.value === option.value) {\n applySelectedStyle(b);\n } else {\n applyUnselectedStyle(b);\n }\n });\n\n if (onChange) {\n onChange(option.value);\n }\n });\n\n // Hover effect (only on unselected buttons)\n btn.addEventListener(\"mouseenter\", () => {\n if (hiddenInput.value !== option.value) {\n btn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n }\n });\n btn.addEventListener(\"mouseleave\", () => {\n if (hiddenInput.value !== option.value) {\n btn.style.backgroundColor = \"transparent\";\n }\n });\n }\n\n buttons.push(btn);\n group.appendChild(btn);\n });\n\n return group;\n}\n\n// ============================================================================\n// Single-mode renderer\n// ============================================================================\n\nexport function renderSwitcherElement(\n element: SwitcherElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const initialValue =\n String(ctx.prefill[element.key] ?? element.default ?? \"\");\n\n // Hidden input stores the value for form data extraction\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n hiddenInput.value = initialValue;\n\n const readonly = state.config.readonly;\n\n const onChange =\n !readonly && ctx.instance\n ? (value: string) => {\n ctx.instance.triggerOnChange(pathKey, value);\n }\n : null;\n\n const group = buildSegmentedGroup(\n element,\n initialValue,\n hiddenInput,\n readonly,\n onChange,\n );\n\n wrapper.appendChild(hiddenInput);\n wrapper.appendChild(group);\n\n // Hint (edit mode only)\n if (!readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Multiple-mode renderer\n// ============================================================================\n\nexport function renderMultipleSwitcherElement(\n element: SwitcherElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n // Pad to minimum count\n while (values.length < minCount) {\n values.push(element.default || element.options?.[0]?.value || \"\");\n }\n\n const readonly = state.config.readonly;\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-switcher-item\");\n items.forEach((item, index) => {\n const input = item.querySelector<HTMLInputElement>(\"input[type=hidden]\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addSwitcherItem(value: string = \"\", index: number = -1): HTMLElement {\n const currentIndex =\n index === -1 ? container.children.length : index;\n const itemPathKey = `${pathKey}[${currentIndex}]`;\n\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-switcher-item flex items-center gap-2\";\n\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = itemPathKey;\n hiddenInput.value = value;\n itemWrapper.appendChild(hiddenInput);\n\n const onChange =\n !readonly && ctx.instance\n ? (val: string) => {\n ctx.instance.triggerOnChange(hiddenInput.name, val);\n }\n : null;\n\n const group = buildSegmentedGroup(\n element,\n value,\n hiddenInput,\n readonly,\n onChange,\n );\n itemWrapper.appendChild(group);\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (readonly) return;\n const items = container.querySelectorAll(\".multiple-switcher-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n (removeBtn as HTMLButtonElement).style.backgroundColor =\n \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n (removeBtn as HTMLButtonElement).style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as HTMLElement,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-switcher-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n const defaultValue =\n element.default || element.options?.[0]?.value || \"\";\n values.push(defaultValue);\n addSwitcherItem(defaultValue);\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\n \".add-switcher-btn\",\n ) as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addSwitcherItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Hint (edit mode only)\n if (!readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate switcher field and return extracted value with errors.\n * Mirrors select validation logic — reads from hidden <input> elements.\n */\nexport function validateSwitcherElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n const validateMultipleCount = (\n fieldKey: string,\n values: string[],\n el: Element,\n filterFn: (v: string) => boolean,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n\n const filteredValues = values.filter(filterFn);\n const minCount = \"minCount\" in el ? (el.minCount ?? 1) : 1;\n const maxCount =\n \"maxCount\" in el ? (el.maxCount ?? Infinity) : Infinity;\n\n if (el.required && filteredValues.length === 0) {\n errors.push(`${fieldKey}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${fieldKey}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${fieldKey}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n };\n\n const validOptionValues = new Set(\n \"options\" in element\n ? (element as SwitcherElement).options.map((o) => o.value)\n : [],\n );\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple switcher fields — hidden inputs named pathKey[0], pathKey[1], …\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `input[type=\"hidden\"][name^=\"${key}[\"]`,\n );\n const values: string[] = [];\n\n inputs.forEach((input) => {\n const val = input?.value ?? \"\";\n values.push(val);\n\n if (!skipValidation && val !== \"\" && !validOptionValues.has(val)) {\n const msg = t(\"invalidOption\", context.state);\n markValidity(input, msg);\n errors.push(`${key}: ${msg}`);\n } else {\n markValidity(input, null);\n }\n });\n\n validateMultipleCount(key, values, element, (v) => v !== \"\");\n return { value: values, errors };\n } else {\n // Single switcher field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"hidden\"][name$=\"${key}\"]`,\n );\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n const msg = t(\"required\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n if (!skipValidation && val !== \"\" && !validOptionValues.has(val)) {\n const msg = t(\"invalidOption\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(input, msg);\n return { value: null, errors };\n }\n\n markValidity(input, null);\n return { value: val === \"\" ? null : val, errors };\n }\n}\n\n// ============================================================================\n// DOM Update (setFormData / updateField support)\n// ============================================================================\n\n/**\n * Update switcher field value in the DOM without re-render.\n * Updates the hidden input value and refreshes button visual states.\n */\nexport function updateSwitcherField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (\"multiple\" in element && element.multiple) {\n if (!Array.isArray(value)) {\n console.warn(\n `updateSwitcherField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `input[type=\"hidden\"][name^=\"${fieldPath}[\"]`,\n );\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n const newVal = value[index] != null ? String(value[index]) : \"\";\n input.value = newVal;\n\n // Sync button visual state\n const group = input.parentElement?.querySelector(\".fb-switcher-group\");\n if (group) {\n group\n .querySelectorAll<HTMLButtonElement>(\".fb-switcher-btn\")\n .forEach((btn) => {\n if (btn.dataset.value === newVal) {\n applySelectedStyle(btn);\n } else {\n applyUnselectedStyle(btn);\n }\n });\n }\n\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateSwitcherField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"hidden\"][name=\"${fieldPath}\"]`,\n );\n\n if (input) {\n const newVal = value != null ? String(value) : \"\";\n input.value = newVal;\n\n // Sync button visual state\n const group = input.parentElement?.querySelector(\".fb-switcher-group\");\n if (group) {\n group\n .querySelectorAll<HTMLButtonElement>(\".fb-switcher-btn\")\n .forEach((btn) => {\n if (btn.dataset.value === newVal) {\n applySelectedStyle(btn);\n } else {\n applyUnselectedStyle(btn);\n }\n });\n }\n\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// File component rendering functions and helpers\n\nimport type {\n FileElement,\n FilesElement,\n RenderContext,\n ResourceMetadata,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport type { State } from \"../types/state.js\";\nimport { t } from \"../utils/translation.js\";\nimport { clear, escapeHtml, pathJoin } from \"../utils/helpers.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\n\n// File upload dependencies\ninterface FileDeps {\n picker: HTMLInputElement;\n fileUploadHandler: () => void;\n dragHandler: (files: FileList) => void;\n}\n\n// Constraints for multi-file upload handlers\ninterface FileUploadConstraints {\n maxCount: number;\n allowedExtensions: string[];\n maxSize: number; // in MB; Infinity means no limit\n}\n\n// Helper: Extract allowed file extensions from accept field\nexport function getAllowedExtensions(\n accept: string | { extensions: string[] } | undefined,\n): string[] {\n if (!accept) return [];\n if (typeof accept === \"object\" && Array.isArray(accept.extensions)) {\n return accept.extensions.map((ext) => ext.toLowerCase());\n }\n if (typeof accept === \"string\") {\n return accept\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.startsWith(\".\"))\n .map((s) => s.substring(1).toLowerCase());\n }\n return [];\n}\n\n// Helper: Check if a file's extension is in the allowed list\nexport function isFileExtensionAllowed(\n fileName: string,\n allowedExtensions: string[],\n): boolean {\n if (allowedExtensions.length === 0) return true;\n const ext = fileName.split(\".\").pop()?.toLowerCase() || \"\";\n return allowedExtensions.includes(ext);\n}\n\n// Helper: Check if a file exceeds the max size limit (maxSizeMB in MB, Infinity = no limit)\nexport function isFileSizeAllowed(file: File, maxSizeMB: number): boolean {\n if (maxSizeMB === Infinity) return true;\n return file.size <= maxSizeMB * 1024 * 1024;\n}\n\n// Helper: Render local image file preview\nfunction renderLocalImagePreview(\n container: HTMLElement,\n file: File,\n fileName: string,\n state: State,\n): void {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = fileName || t(\"previewAlt\", state);\n\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(file);\n container.appendChild(img);\n}\n\n// Helper: Render local video file preview\nfunction renderLocalVideoPreview(\n container: HTMLElement,\n file: File,\n videoType: string,\n resourceId: string,\n state: State,\n deps: FileDeps | null,\n): HTMLElement {\n const videoUrl = URL.createObjectURL(file);\n\n // Remove all conflicting handlers to prevent interference with video controls\n container.onclick = null;\n\n // Remove drag and drop event listeners by cloning the element\n const newContainer = container.cloneNode(false) as HTMLElement;\n if (container.parentNode) {\n container.parentNode.replaceChild(newContainer, container);\n }\n\n newContainer.innerHTML = `\n <div class=\"relative group h-full\">\n <video class=\"w-full h-full object-contain\" controls preload=\"auto\" muted src=\"${videoUrl}\">\n ${escapeHtml(t(\"videoNotSupported\", state))}\n </video>\n <div class=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity z-10 flex gap-1\">\n <button class=\"bg-red-600 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs delete-file-btn\">\n ${escapeHtml(t(\"removeElement\", state))}\n </button>\n <button class=\"bg-gray-800 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs change-file-btn\">\n ${escapeHtml(t(\"changeButton\", state))}\n </button>\n </div>\n </div>\n `;\n\n attachVideoButtonHandlers(newContainer, resourceId, state, deps);\n return newContainer;\n}\n\n// Helper: Attach video button handlers\nfunction attachVideoButtonHandlers(\n container: HTMLElement,\n resourceId: string,\n state: State,\n deps: FileDeps | null,\n): void {\n const changeBtn = container.querySelector(\n \".change-file-btn\",\n ) as HTMLButtonElement;\n if (changeBtn) {\n changeBtn.onclick = (e) => {\n e.stopPropagation();\n if (deps?.picker) {\n deps.picker.click();\n }\n };\n }\n\n const deleteBtn = container.querySelector(\n \".delete-file-btn\",\n ) as HTMLButtonElement;\n if (deleteBtn) {\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n handleVideoDelete(container, resourceId, state, deps);\n };\n }\n}\n\n// Helper: Handle video delete action\nfunction handleVideoDelete(\n container: HTMLElement,\n resourceId: string,\n state: State,\n deps: FileDeps | null,\n): void {\n state.resourceIndex.delete(resourceId);\n\n const hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (hiddenInput) {\n hiddenInput.value = \"\";\n }\n\n if (deps?.fileUploadHandler) {\n container.onclick = deps.fileUploadHandler;\n }\n if (deps?.dragHandler) {\n setupDragAndDrop(container, deps.dragHandler);\n }\n\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${escapeHtml(t(\"clickDragText\", state))}</div>\n </div>\n `;\n}\n\n// Helper: Render uploaded video preview\nfunction renderUploadedVideoPreview(\n container: HTMLElement,\n thumbnailUrl: string,\n _videoType: string,\n state: State,\n): void {\n const video = document.createElement(\"video\");\n video.className = \"w-full h-full object-contain\";\n video.controls = true;\n video.preload = \"metadata\";\n video.muted = true;\n video.src = thumbnailUrl;\n\n video.appendChild(\n document.createTextNode(t(\"videoNotSupported\", state)),\n );\n container.appendChild(video);\n}\n\n// Helper: Render delete button and setup handler\nfunction renderDeleteButton(\n container: HTMLElement,\n resourceId: string,\n state: State,\n): void {\n addDeleteButton(container, state, () => {\n state.resourceIndex.delete(resourceId);\n\n const hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (hiddenInput) {\n hiddenInput.value = \"\";\n }\n\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${escapeHtml(t(\"clickDragText\", state))}</div>\n </div>\n `;\n });\n}\n\n// Helper: Render local file preview (image, video, or document)\nasync function renderLocalFilePreview(\n container: HTMLElement,\n meta: ResourceMetadata,\n fileName: string,\n resourceId: string,\n isReadonly: boolean,\n state: State,\n deps: FileDeps | null,\n): Promise<void> {\n if (!meta.file || !(meta.file instanceof File)) {\n return;\n }\n\n if (meta.type && meta.type.startsWith(\"image/\")) {\n renderLocalImagePreview(container, meta.file, fileName, state);\n } else if (meta.type && meta.type.startsWith(\"video/\")) {\n const newContainer = renderLocalVideoPreview(\n container,\n meta.file,\n meta.type,\n resourceId,\n state,\n deps,\n );\n container = newContainer;\n } else {\n container.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\"><div class=\"text-2xl mb-2\">📁</div><div class=\"text-sm\">${escapeHtml(fileName)}</div></div>`;\n }\n\n // Add delete button for edit mode (except for videos which have custom buttons)\n if (!isReadonly && !(meta.type && meta.type.startsWith(\"video/\"))) {\n renderDeleteButton(container, resourceId, state);\n }\n}\n\n// Helper: Render uploaded file preview via getThumbnail\nasync function renderUploadedFilePreview(\n container: HTMLElement,\n resourceId: string,\n fileName: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): Promise<void> {\n if (!state.config.getThumbnail) {\n setEmptyFileContainer(container, state);\n return;\n }\n\n try {\n const thumbnailUrl = await state.config.getThumbnail(resourceId);\n\n if (thumbnailUrl) {\n clear(container);\n\n if (meta && meta.type && meta.type.startsWith(\"video/\")) {\n renderUploadedVideoPreview(container, thumbnailUrl, meta.type, state);\n } else {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = fileName || t(\"previewAlt\", state);\n img.src = thumbnailUrl;\n container.appendChild(img);\n }\n } else {\n setEmptyFileContainer(container, state);\n }\n } catch (error) {\n console.error(\"Failed to get thumbnail:\", error);\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${escapeHtml(fileName || t(\"previewUnavailable\", state))}</div>\n </div>\n `;\n }\n}\n\n// Render single file preview container\nexport async function renderFilePreview(\n container: HTMLElement,\n resourceId: string,\n state: State,\n options: {\n fileName?: string;\n isReadonly?: boolean;\n deps?: FileDeps | null;\n } = {},\n): Promise<void> {\n const { fileName = \"\", isReadonly = false, deps = null } = options;\n\n // Runtime validation for dependencies when not in readonly mode\n if (\n !isReadonly &&\n deps &&\n (!deps.picker || !deps.fileUploadHandler || !deps.dragHandler)\n ) {\n throw new Error(\n \"renderFilePreview: missing deps {picker, fileUploadHandler, dragHandler}\",\n );\n }\n\n clear(container);\n\n if (isReadonly) {\n container.classList.add(\"cursor-pointer\");\n }\n\n const meta = state.resourceIndex.get(resourceId);\n\n if (meta && meta.file && meta.file instanceof File) {\n await renderLocalFilePreview(\n container,\n meta,\n fileName,\n resourceId,\n isReadonly,\n state,\n deps,\n );\n } else {\n await renderUploadedFilePreview(\n container,\n resourceId,\n fileName,\n meta,\n state,\n );\n }\n}\n\n// Render file preview for readonly mode\nexport async function renderFilePreviewReadonly(\n resourceId: string,\n state: State,\n fileName?: string,\n): Promise<HTMLElement> {\n const meta = state.resourceIndex.get(resourceId);\n const actualFileName =\n fileName || meta?.name || resourceId.split(\"/\").pop() || \"file\";\n\n // Determine if this looks like a PSD file (should be treated as download, not preview)\n const isPSD = actualFileName.toLowerCase().match(/\\.psd$/);\n\n // Individual file result container\n const fileResult = document.createElement(\"div\");\n fileResult.className = isPSD ? \"space-y-2\" : \"space-y-3\";\n\n // Preview container - compact for PSD files, large for others\n const previewContainer = document.createElement(\"div\");\n if (isPSD) {\n // Compact container for PSD files\n previewContainer.className =\n \"bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity flex items-center p-3 max-w-sm\";\n } else {\n // Large container for images/videos\n previewContainer.className =\n \"bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity\";\n }\n\n // Determine if this looks like an image file (excluding PSD files)\n const isImage =\n !isPSD &&\n (meta?.type?.startsWith(\"image/\") ||\n actualFileName.toLowerCase().match(/\\.(jpg|jpeg|png|gif|webp)$/));\n\n // Determine if this looks like a video file\n const isVideo =\n meta?.type?.startsWith(\"video/\") ||\n actualFileName.toLowerCase().match(/\\.(mp4|webm|avi|mov)$/);\n\n if (isImage) {\n // Image preview - try getThumbnail first\n if (state.config.getThumbnail) {\n try {\n const thumbnailUrl = await state.config.getThumbnail(resourceId);\n if (thumbnailUrl) {\n previewContainer.innerHTML = `<img src=\"${thumbnailUrl}\" alt=\"${escapeHtml(actualFileName)}\" class=\"w-full h-auto\">`;\n } else {\n // Fallback to icon if getThumbnail returns null/undefined\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } catch (error) {\n console.warn(\"getThumbnail failed for\", resourceId, error);\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } else if (isVideo) {\n // Video preview - try getThumbnail for video URL\n if (state.config.getThumbnail) {\n try {\n const videoUrl = await state.config.getThumbnail(resourceId);\n if (videoUrl) {\n previewContainer.innerHTML = `\n <div class=\"relative group\">\n <video class=\"w-full h-auto\" controls preload=\"auto\" muted src=\"${videoUrl}\">\n ${escapeHtml(t(\"videoNotSupported\", state))}\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-20 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center pointer-events-none\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-3\">\n <svg class=\"w-8 h-8 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } catch (error) {\n console.warn(\"getThumbnail failed for video\", resourceId, error);\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div></div></div>`;\n }\n } else {\n // Other file types - special handling for PSD files\n const fileIcon = isPSD ? \"🎨\" : \"📁\";\n const fileDescription = isPSD ? \"PSD File\" : \"Document\";\n\n if (isPSD) {\n // Compact horizontal layout for PSD files\n previewContainer.innerHTML = `\n <div class=\"flex items-center space-x-3\">\n <div class=\"text-3xl text-gray-400\">${fileIcon}</div>\n <div class=\"flex-1 min-w-0\">\n <div class=\"text-sm font-medium text-gray-900 truncate\">${escapeHtml(actualFileName)}</div>\n <div class=\"text-xs text-gray-500\">${fileDescription}</div>\n </div>\n </div>\n `;\n } else {\n // Large centered layout for other documents\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">${fileIcon}</div><div class=\"text-sm\">${escapeHtml(actualFileName)}</div><div class=\"text-xs text-gray-500 mt-1\">${fileDescription}</div></div></div>`;\n }\n }\n\n // File name (only show for non-PSD files since PSD files show name inline)\n const fileNameElement = document.createElement(\"p\");\n fileNameElement.className = isPSD\n ? \"hidden\"\n : \"text-sm font-medium text-gray-900 text-center\";\n fileNameElement.textContent = actualFileName;\n\n // Download button\n const downloadButton = document.createElement(\"button\");\n downloadButton.className =\n \"w-full px-3 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\";\n downloadButton.textContent = t(\"downloadButton\", state);\n downloadButton.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (state.config.downloadFile) {\n state.config.downloadFile(resourceId, actualFileName);\n } else {\n forceDownload(resourceId, actualFileName, state);\n }\n };\n\n fileResult.appendChild(previewContainer);\n fileResult.appendChild(fileNameElement);\n fileResult.appendChild(downloadButton);\n\n return fileResult;\n}\n\n// Render resource pills for files\nexport function renderResourcePills(\n container: HTMLElement,\n rids: string[] | null,\n state: State,\n onRemove: ((rid: string) => void) | null,\n hint?: string,\n countInfo?: string,\n): void {\n clear(container);\n\n // Build combined hint line: \"Нажмите или перетащите файлы • ≤5МБ • PNG,JPG • 0 файлов (0-10)\"\n const buildHintLine = (): string => {\n const parts: string[] = [t(\"clickDragTextMultiple\", state)];\n if (hint) parts.push(hint);\n if (countInfo) parts.push(countInfo);\n return parts.join(\" • \");\n };\n\n // Show initial placeholder only if this is the first render (no previous grid)\n const isInitialRender = !container.classList.contains(\"grid\");\n\n if ((!rids || rids.length === 0) && isInitialRender) {\n // Create grid container\n const gridContainer = document.createElement(\"div\");\n gridContainer.className = \"grid grid-cols-4 gap-3 mb-3\";\n\n // Create 4 placeholder slots\n for (let i = 0; i < 4; i++) {\n const slot = document.createElement(\"div\");\n slot.className =\n \"aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors\";\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"w-12 h-12 text-gray-400\");\n svg.setAttribute(\"fill\", \"currentColor\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n\n const path = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"path\",\n );\n path.setAttribute(\n \"d\",\n \"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\",\n );\n\n svg.appendChild(path);\n slot.appendChild(svg);\n\n // Add click handler to each slot\n slot.onclick = () => {\n // Look for file input\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n\n gridContainer.appendChild(slot);\n }\n\n // Add combined hint text\n const hintText = document.createElement(\"div\");\n hintText.className = \"text-center text-xs text-gray-500 mt-2\";\n hintText.textContent = buildHintLine();\n\n container.appendChild(gridContainer);\n container.appendChild(hintText);\n return;\n }\n\n // Create grid container\n const gridContainer = document.createElement(\"div\");\n gridContainer.className = \"files-list grid grid-cols-4 gap-3\";\n\n // Calculate how many slots we need\n const currentImagesCount = rids ? rids.length : 0;\n const rowsNeeded = Math.floor(currentImagesCount / 4) + 1;\n const slotsNeeded = rowsNeeded * 4;\n\n // Add all slots (filled and empty)\n for (let i = 0; i < slotsNeeded; i++) {\n const slot = document.createElement(\"div\");\n\n if (rids && i < rids.length) {\n // Filled slot with preview\n const rid = rids[i];\n const meta = state.resourceIndex.get(rid);\n slot.className =\n \"resource-pill aspect-square bg-gray-100 rounded-lg overflow-hidden relative group border border-gray-300\";\n slot.dataset.resourceId = rid;\n\n // Add image, video, or file content\n renderThumbnailForResource(slot, rid, meta, state).catch((err) => {\n console.error(\"Failed to render thumbnail:\", err);\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <div class=\"text-2xl mb-1\">📁</div>\n <div class=\"text-xs\">${escapeHtml(t(\"previewError\", state))}</div>\n </div>`;\n });\n\n // Add remove button overlay\n if (onRemove) {\n const overlay = document.createElement(\"div\");\n overlay.className =\n \"absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\";\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.className = \"bg-red-600 text-white px-2 py-1 rounded text-xs\";\n removeBtn.textContent = t(\"removeElement\", state);\n removeBtn.onclick = (e) => {\n e.stopPropagation();\n onRemove(rid);\n };\n\n overlay.appendChild(removeBtn);\n slot.appendChild(overlay);\n }\n } else {\n // Empty slot placeholder\n slot.className =\n \"aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded-lg flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors\";\n slot.innerHTML =\n '<svg class=\"w-12 h-12 text-gray-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/></svg>';\n slot.onclick = () => {\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n }\n\n gridContainer.appendChild(slot);\n }\n\n container.appendChild(gridContainer);\n\n // Add combined hint text below grid\n const hintText = document.createElement(\"div\");\n hintText.className = \"text-center text-xs text-gray-500 mt-2\";\n hintText.textContent = buildHintLine();\n container.appendChild(hintText);\n}\n\n// Helper function to render thumbnail error UI\nfunction renderThumbnailError(\n slot: HTMLElement,\n state: State,\n iconSize: string = \"w-12 h-12\",\n): void {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"${escapeHtml(iconSize)} text-red-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/>\n </svg>\n <div class=\"text-xs mt-1 text-red-600\">${escapeHtml(t(\"previewError\", state))}</div>\n </div>`;\n}\n\n// Render thumbnail for resource\nasync function renderThumbnailForResource(\n slot: HTMLElement,\n rid: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): Promise<void> {\n // Add image, video, or file content\n if (meta && meta.type?.startsWith(\"image/\")) {\n if (meta.file && meta.file instanceof File) {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = meta.name;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n slot.appendChild(img);\n } else if (state.config.getThumbnail) {\n try {\n const url = await state.config.getThumbnail(rid);\n if (url) {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = meta.name;\n img.src = url;\n slot.appendChild(img);\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n </div>`;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onThumbnailError) {\n state.config.onThumbnailError(err, rid);\n }\n // Show error state in UI\n renderThumbnailError(slot, state);\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n </div>`;\n }\n } else if (meta && meta.type?.startsWith(\"video/\")) {\n if (meta.file && meta.file instanceof File) {\n const videoUrl = URL.createObjectURL(meta.file);\n slot.innerHTML = `\n <div class=\"relative group h-full w-full\">\n <video class=\"w-full h-full object-contain\" preload=\"metadata\" muted src=\"${videoUrl}\">\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-30 flex items-center justify-center\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-1\">\n <svg class=\"w-4 h-4 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else if (state.config.getThumbnail) {\n try {\n const videoUrl = await state.config.getThumbnail(rid);\n if (videoUrl) {\n slot.innerHTML = `\n <div class=\"relative group h-full w-full\">\n <video class=\"w-full h-full object-contain\" preload=\"metadata\" muted src=\"${videoUrl}\">\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-30 flex items-center justify-center\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-1\">\n <svg class=\"w-4 h-4 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n <div class=\"text-xs mt-1\">${escapeHtml(meta?.name || \"Video\")}</div>\n </div>`;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onThumbnailError) {\n state.config.onThumbnailError(err, rid);\n }\n // Show error state in UI\n renderThumbnailError(slot, state, \"w-8 h-8\");\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n <div class=\"text-xs mt-1\">${escapeHtml(meta?.name || \"Video\")}</div>\n </div>`;\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <div class=\"text-2xl mb-1\">📁</div>\n <div class=\"text-xs\">${escapeHtml(meta?.name || \"File\")}</div>\n </div>`;\n }\n}\n\n// Helper functions\nfunction setEmptyFileContainer(\n fileContainer: HTMLElement,\n state: State,\n hint?: string,\n): void {\n const hintHtml = hint\n ? `<div class=\"text-xs text-gray-500 mt-1\">${escapeHtml(hint)}</div>`\n : \"\";\n fileContainer.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${escapeHtml(t(\"clickDragText\", state))}</div>\n ${hintHtml}\n </div>\n `;\n}\n\nfunction showFileError(\n container: HTMLElement,\n message: string,\n): void {\n // Remove any existing error\n const existing = container\n .closest(\".space-y-2\")\n ?.querySelector(\".file-error-message\");\n if (existing) existing.remove();\n\n const errorEl = document.createElement(\"div\");\n errorEl.className = \"file-error-message error-message\";\n errorEl.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n errorEl.textContent = message;\n container.closest(\".space-y-2\")?.appendChild(errorEl);\n}\n\nfunction clearFileError(container: HTMLElement): void {\n const existing = container\n .closest(\".space-y-2\")\n ?.querySelector(\".file-error-message\");\n if (existing) existing.remove();\n}\n\nasync function handleFileSelect(\n file: File,\n container: HTMLElement,\n fieldName: string,\n state: State,\n deps: FileDeps | null = null,\n instance?: any,\n allowedExtensions: string[] = [],\n maxSizeMB: number = Infinity,\n): Promise<void> {\n if (!isFileExtensionAllowed(file.name, allowedExtensions)) {\n const formats = allowedExtensions.join(\", \");\n showFileError(\n container,\n t(\"invalidFileExtension\", state, { name: file.name, formats }),\n );\n return;\n }\n\n if (!isFileSizeAllowed(file, maxSizeMB)) {\n showFileError(\n container,\n t(\"fileTooLarge\", state, { name: file.name, maxSize: maxSizeMB }),\n );\n return;\n }\n\n clearFileError(container);\n\n let rid: string;\n\n // If uploadHandler is configured, use it to upload the file\n if (state.config.uploadFile) {\n try {\n rid = await state.config.uploadFile(file);\n if (typeof rid !== \"string\") {\n throw new Error(\"Upload handler must return a string resource ID\");\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onUploadError) {\n state.config.onUploadError(err, file);\n }\n throw new Error(`File upload failed: ${err.message}`);\n }\n } else {\n throw new Error(\n \"No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()\",\n );\n }\n\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file, // Store the file object for local preview\n });\n\n // Create hidden input to store the resource ID\n let hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (!hiddenInput) {\n hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = fieldName;\n container.parentElement?.appendChild(hiddenInput);\n }\n hiddenInput.value = rid;\n\n renderFilePreview(container, rid, state, {\n fileName: file.name,\n isReadonly: false,\n deps,\n }).catch(console.error);\n\n // Trigger onChange after file upload completes\n if (instance && !state.config.readonly) {\n instance.triggerOnChange(fieldName, rid);\n }\n}\n\nfunction setupDragAndDrop(\n element: HTMLElement,\n dropHandler: (files: FileList) => void,\n): void {\n element.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n element.classList.add(\"border-blue-500\", \"bg-blue-50\");\n });\n\n element.addEventListener(\"dragleave\", (e) => {\n e.preventDefault();\n element.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n });\n\n element.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n element.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n if (e.dataTransfer?.files) {\n dropHandler(e.dataTransfer.files);\n }\n });\n}\n\nfunction addDeleteButton(\n container: HTMLElement,\n state: State,\n onDelete: () => void,\n): void {\n // Remove existing overlay if any\n const existingOverlay = container.querySelector(\".delete-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n\n // Create overlay with center delete button\n const overlay = document.createElement(\"div\");\n overlay.className =\n \"delete-overlay absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\";\n\n const deleteBtn = document.createElement(\"button\");\n deleteBtn.className =\n \"bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700 transition-colors\";\n deleteBtn.textContent = t(\"removeElement\", state);\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n onDelete();\n };\n\n overlay.appendChild(deleteBtn);\n container.appendChild(overlay);\n}\n\nasync function uploadSingleFile(file: File, state: State): Promise<string> {\n if (state.config.uploadFile) {\n try {\n const rid = await state.config.uploadFile(file);\n if (typeof rid !== \"string\") {\n throw new Error(\"Upload handler must return a string resource ID\");\n }\n return rid;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onUploadError) {\n state.config.onUploadError(err, file);\n }\n throw new Error(`File upload failed: ${err.message}`);\n }\n } else {\n throw new Error(\n \"No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()\",\n );\n }\n}\n\nasync function forceDownload(\n resourceId: string,\n fileName: string,\n state: State,\n): Promise<void> {\n try {\n // Try to get URL from dedicated download handler first, then fall back to thumbnail handler\n let fileUrl: string | null = null;\n\n if (state.config.getDownloadUrl) {\n fileUrl = state.config.getDownloadUrl(resourceId);\n } else if (state.config.getThumbnail) {\n fileUrl = await state.config.getThumbnail(resourceId);\n }\n\n if (fileUrl) {\n const finalUrl = fileUrl.startsWith(\"http\")\n ? fileUrl\n : new URL(fileUrl, window.location.href).href;\n\n const response = await fetch(finalUrl);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const blob = await response.blob();\n downloadBlob(blob, fileName);\n } else {\n throw new Error(\"No download URL available for resource\");\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onDownloadError) {\n state.config.onDownloadError(err, resourceId, fileName);\n }\n console.error(`File download failed for ${fileName}:`, err);\n throw err;\n }\n}\n\nfunction downloadBlob(blob: Blob, fileName: string): void {\n try {\n const blobUrl = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = blobUrl;\n link.download = fileName;\n link.style.display = \"none\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n setTimeout(() => {\n URL.revokeObjectURL(blobUrl);\n }, 100);\n } catch (error) {\n throw new Error(`Blob download failed: ${(error as Error).message}`);\n }\n}\n\nfunction addPrefillFilesToIndex(initialFiles: string[], state: State): void {\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n if (!state.resourceIndex.has(resourceId)) {\n const filename = resourceId.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(resourceId, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n });\n }\n}\n\nfunction handleInitialFileData(\n initial: string,\n fileContainer: HTMLElement,\n pathKey: string,\n fileWrapper: HTMLElement,\n state: State,\n deps: FileDeps,\n): void {\n // Add prefill data to resourceIndex\n if (!state.resourceIndex.has(initial)) {\n const filename = initial.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(initial, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n\n renderFilePreview(fileContainer, initial, state, {\n fileName: initial,\n isReadonly: false,\n deps,\n }).catch(console.error);\n\n // Create hidden input to store the prefilled resource ID\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n hiddenInput.value = initial;\n fileWrapper.appendChild(hiddenInput);\n}\n\nfunction setupFilesDropHandler(\n filesContainer: HTMLElement,\n initialFiles: string[],\n state: State,\n updateCallback: () => void,\n constraints: FileUploadConstraints,\n pathKey?: string,\n instance?: any,\n): void {\n setupDragAndDrop(filesContainer, async (files) => {\n const allFiles = Array.from(files);\n\n // Step 1: filter by extension\n const rejectedByExtension = allFiles.filter(\n (f) => !isFileExtensionAllowed(f.name, constraints.allowedExtensions),\n );\n const afterExtension = allFiles.filter((f) =>\n isFileExtensionAllowed(f.name, constraints.allowedExtensions),\n );\n\n // Step 2: filter by size\n const rejectedBySize = afterExtension.filter(\n (f) => !isFileSizeAllowed(f, constraints.maxSize),\n );\n const validFiles = afterExtension.filter((f) =>\n isFileSizeAllowed(f, constraints.maxSize),\n );\n\n // Step 3: slice by remaining capacity\n const remaining =\n constraints.maxCount === Infinity\n ? validFiles.length\n : Math.max(0, constraints.maxCount - initialFiles.length);\n const arr = validFiles.slice(0, remaining);\n const skippedByCount = validFiles.length - arr.length;\n\n // Build combined error message\n const errorParts: string[] = [];\n if (rejectedByExtension.length > 0) {\n const formats = constraints.allowedExtensions.join(\", \");\n const names = rejectedByExtension.map((f) => f.name).join(\", \");\n errorParts.push(\n t(\"invalidFileExtension\", state, { name: names, formats }),\n );\n }\n if (rejectedBySize.length > 0) {\n const names = rejectedBySize.map((f) => f.name).join(\", \");\n errorParts.push(\n t(\"fileTooLarge\", state, { name: names, maxSize: constraints.maxSize }),\n );\n }\n if (skippedByCount > 0) {\n errorParts.push(\n t(\"filesLimitExceeded\", state, {\n skipped: skippedByCount,\n max: constraints.maxCount,\n }),\n );\n }\n\n if (errorParts.length > 0) {\n showFileError(filesContainer, errorParts.join(\" • \"));\n } else {\n clearFileError(filesContainer);\n }\n\n for (const file of arr) {\n const rid = await uploadSingleFile(file, state);\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file: undefined,\n });\n initialFiles.push(rid);\n }\n updateCallback();\n\n // Trigger onChange after all files are uploaded\n if (instance && pathKey && !state.config.readonly) {\n instance.triggerOnChange(pathKey, initialFiles);\n }\n });\n}\n\nfunction setupFilesPickerHandler(\n filesPicker: HTMLInputElement,\n initialFiles: string[],\n state: State,\n updateCallback: () => void,\n constraints: FileUploadConstraints,\n pathKey?: string,\n instance?: any,\n): void {\n filesPicker.onchange = async () => {\n if (filesPicker.files) {\n const allFiles = Array.from(filesPicker.files);\n\n // Step 1: filter by extension\n const rejectedByExtension = allFiles.filter(\n (f) => !isFileExtensionAllowed(f.name, constraints.allowedExtensions),\n );\n const afterExtension = allFiles.filter((f) =>\n isFileExtensionAllowed(f.name, constraints.allowedExtensions),\n );\n\n // Step 2: filter by size\n const rejectedBySize = afterExtension.filter(\n (f) => !isFileSizeAllowed(f, constraints.maxSize),\n );\n const validFiles = afterExtension.filter((f) =>\n isFileSizeAllowed(f, constraints.maxSize),\n );\n\n // Step 3: slice by remaining capacity\n const remaining =\n constraints.maxCount === Infinity\n ? validFiles.length\n : Math.max(0, constraints.maxCount - initialFiles.length);\n const arr = validFiles.slice(0, remaining);\n const skippedByCount = validFiles.length - arr.length;\n\n // Build combined error message\n const errorParts: string[] = [];\n if (rejectedByExtension.length > 0) {\n const formats = constraints.allowedExtensions.join(\", \");\n const names = rejectedByExtension.map((f) => f.name).join(\", \");\n errorParts.push(\n t(\"invalidFileExtension\", state, { name: names, formats }),\n );\n }\n if (rejectedBySize.length > 0) {\n const names = rejectedBySize.map((f) => f.name).join(\", \");\n errorParts.push(\n t(\"fileTooLarge\", state, {\n name: names,\n maxSize: constraints.maxSize,\n }),\n );\n }\n if (skippedByCount > 0) {\n errorParts.push(\n t(\"filesLimitExceeded\", state, {\n skipped: skippedByCount,\n max: constraints.maxCount,\n }),\n );\n }\n\n const wrapper =\n filesPicker.closest(\".space-y-2\") || filesPicker.parentElement;\n if (errorParts.length > 0 && wrapper) {\n showFileError(wrapper as HTMLElement, errorParts.join(\" • \"));\n } else if (wrapper) {\n clearFileError(wrapper as HTMLElement);\n }\n\n for (const file of arr) {\n const rid = await uploadSingleFile(file, state);\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file: undefined,\n });\n initialFiles.push(rid);\n }\n }\n updateCallback();\n filesPicker.value = \"\";\n\n // Trigger onChange after all files are uploaded\n if (instance && pathKey && !state.config.readonly) {\n instance.triggerOnChange(pathKey, initialFiles);\n }\n };\n}\n\n// Component rendering functions\nexport function renderFileElement(\n element: FileElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n if (state.config.readonly) {\n // Readonly mode: use common preview function\n const initial = ctx.prefill[element.key];\n if (initial) {\n renderFilePreviewReadonly(initial as string, state)\n .then((filePreview) => {\n wrapper.appendChild(filePreview);\n })\n .catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n const emptyState = document.createElement(\"div\");\n emptyState.className =\n \"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\";\n emptyState.innerHTML = `<div class=\"text-center\">${escapeHtml(t(\"previewUnavailable\", state))}</div>`;\n wrapper.appendChild(emptyState);\n });\n } else {\n const emptyState = document.createElement(\"div\");\n emptyState.className =\n \"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\";\n emptyState.innerHTML = `<div class=\"text-center\">${escapeHtml(t(\"noFileSelected\", state))}</div>`;\n wrapper.appendChild(emptyState);\n }\n } else {\n // Edit mode: normal file input\n const fileWrapper = document.createElement(\"div\");\n fileWrapper.className = \"space-y-2\";\n\n const picker = document.createElement(\"input\");\n picker.type = \"file\";\n picker.name = pathKey;\n picker.style.display = \"none\";\n if (element.accept) {\n picker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const fileContainer = document.createElement(\"div\");\n fileContainer.className =\n \"file-preview-container w-full aspect-square max-w-xs bg-gray-100 rounded-lg overflow-hidden relative group cursor-pointer\";\n\n const initial = ctx.prefill[element.key];\n const allowedExts = getAllowedExtensions(element.accept);\n const maxSizeMB = element.maxSize ?? Infinity;\n\n // Set up click and drag handlers\n const fileUploadHandler = () => picker.click();\n const dragHandler = (files: FileList) => {\n if (files.length > 0) {\n const deps = { picker, fileUploadHandler, dragHandler };\n handleFileSelect(\n files[0],\n fileContainer,\n pathKey,\n state,\n deps,\n ctx.instance,\n allowedExts,\n maxSizeMB,\n );\n }\n };\n\n // Handle initial prefill data\n if (initial) {\n handleInitialFileData(\n initial as string,\n fileContainer,\n pathKey,\n fileWrapper,\n state,\n {\n picker,\n fileUploadHandler,\n dragHandler,\n },\n );\n } else {\n const hint = makeFieldHint(element, state);\n setEmptyFileContainer(fileContainer, state, hint);\n }\n\n fileContainer.onclick = fileUploadHandler;\n setupDragAndDrop(fileContainer, dragHandler);\n\n picker.onchange = () => {\n if (picker.files && picker.files.length > 0) {\n const deps = { picker, fileUploadHandler, dragHandler };\n handleFileSelect(\n picker.files[0],\n fileContainer,\n pathKey,\n state,\n deps,\n ctx.instance,\n allowedExts,\n maxSizeMB,\n );\n }\n };\n\n fileWrapper.appendChild(fileContainer);\n fileWrapper.appendChild(picker);\n\n wrapper.appendChild(fileWrapper);\n }\n}\n\nexport function renderFilesElement(\n element: FilesElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n if (state.config.readonly) {\n // Readonly mode: render as results list\n const resultsWrapper = document.createElement(\"div\");\n resultsWrapper.className = \"space-y-4\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n renderFilePreviewReadonly(resourceId, state)\n .then((filePreview) => {\n resultsWrapper.appendChild(filePreview);\n })\n .catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n });\n });\n } else {\n resultsWrapper.innerHTML = `<div class=\"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\"><div class=\"text-center\">${escapeHtml(t(\"noFilesSelected\", state))}</div></div>`;\n }\n\n wrapper.appendChild(resultsWrapper);\n } else {\n // Edit mode: normal files input\n const filesWrapper = document.createElement(\"div\");\n filesWrapper.className = \"space-y-2\";\n\n const filesPicker = document.createElement(\"input\");\n filesPicker.type = \"file\";\n filesPicker.name = pathKey;\n filesPicker.multiple = true;\n filesPicker.style.display = \"none\";\n if (element.accept) {\n filesPicker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const filesContainer = document.createElement(\"div\");\n filesContainer.className =\n \"border-2 border-dashed border-gray-300 rounded-lg p-3 hover:border-gray-400 transition-colors\";\n\n const list = document.createElement(\"div\");\n list.className = \"files-list\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n // Add prefill files to resourceIndex\n addPrefillFilesToIndex(initialFiles, state);\n\n const filesFieldHint = makeFieldHint(element, state);\n const filesConstraints: FileUploadConstraints = {\n maxCount: Infinity,\n allowedExtensions: getAllowedExtensions(element.accept),\n maxSize: element.maxSize ?? Infinity,\n };\n\n function updateFilesList(): void {\n renderResourcePills(\n list,\n initialFiles,\n state,\n (ridToRemove) => {\n const index = initialFiles.indexOf(ridToRemove);\n if (index > -1) {\n initialFiles.splice(index, 1);\n }\n updateFilesList();\n },\n filesFieldHint,\n );\n }\n\n // Initial render\n updateFilesList();\n\n setupFilesDropHandler(\n filesContainer,\n initialFiles,\n state,\n updateFilesList,\n filesConstraints,\n pathKey,\n ctx.instance,\n );\n setupFilesPickerHandler(\n filesPicker,\n initialFiles,\n state,\n updateFilesList,\n filesConstraints,\n pathKey,\n ctx.instance,\n );\n\n filesContainer.appendChild(list);\n filesWrapper.appendChild(filesContainer);\n filesWrapper.appendChild(filesPicker);\n\n wrapper.appendChild(filesWrapper);\n }\n}\n\nexport function renderMultipleFileElement(\n element: FileElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const minFiles = element.minCount ?? 0;\n const maxFiles = element.maxCount ?? Infinity;\n\n if (state.config.readonly) {\n // Readonly mode: render as results list\n const resultsWrapper = document.createElement(\"div\");\n resultsWrapper.className = \"space-y-4\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n renderFilePreviewReadonly(resourceId, state)\n .then((filePreview) => {\n resultsWrapper.appendChild(filePreview);\n })\n .catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n });\n });\n } else {\n resultsWrapper.innerHTML = `<div class=\"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\"><div class=\"text-center\">${escapeHtml(t(\"noFilesSelected\", state))}</div></div>`;\n }\n\n wrapper.appendChild(resultsWrapper);\n } else {\n // Edit mode: multiple file input with min/max validation\n const filesWrapper = document.createElement(\"div\");\n filesWrapper.className = \"space-y-2\";\n\n const filesPicker = document.createElement(\"input\");\n filesPicker.type = \"file\";\n filesPicker.name = pathKey;\n filesPicker.multiple = true;\n filesPicker.style.display = \"none\";\n if (element.accept) {\n filesPicker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const filesContainer = document.createElement(\"div\");\n filesContainer.className = \"files-list space-y-2\";\n\n filesWrapper.appendChild(filesPicker);\n filesWrapper.appendChild(filesContainer);\n\n const initialFiles = Array.isArray(ctx.prefill[element.key])\n ? [...(ctx.prefill[element.key] as string[])]\n : [];\n\n // Add initial files to resource index\n addPrefillFilesToIndex(initialFiles, state);\n\n const multipleFilesHint = makeFieldHint(element, state);\n const multipleConstraints: FileUploadConstraints = {\n maxCount: maxFiles,\n allowedExtensions: getAllowedExtensions(element.accept),\n maxSize: element.maxSize ?? Infinity,\n };\n\n // Build count info string: \"0 файлов (0-10)\"\n const buildCountInfo = (): string => {\n const countText =\n initialFiles.length === 1\n ? t(\"fileCountSingle\", state, { count: initialFiles.length })\n : t(\"fileCountPlural\", state, { count: initialFiles.length });\n const minMaxText =\n minFiles > 0 || maxFiles < Infinity\n ? ` ${t(\"fileCountRange\", state, { min: minFiles, max: maxFiles })}`\n : \"\";\n return countText + minMaxText;\n };\n\n const updateFilesDisplay = (): void => {\n renderResourcePills(\n filesContainer,\n initialFiles,\n state,\n (index) => {\n initialFiles.splice(initialFiles.indexOf(index), 1);\n updateFilesDisplay();\n },\n multipleFilesHint,\n buildCountInfo(),\n );\n };\n\n // Set up drag and drop\n setupFilesDropHandler(\n filesContainer,\n initialFiles,\n state,\n updateFilesDisplay,\n multipleConstraints,\n pathKey,\n ctx.instance,\n );\n\n // Set up file picker\n setupFilesPickerHandler(\n filesPicker,\n initialFiles,\n state,\n updateFilesDisplay,\n multipleConstraints,\n pathKey,\n ctx.instance,\n );\n\n // Initial display\n updateFilesDisplay();\n\n wrapper.appendChild(filesWrapper);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate file field and return extracted value with errors\n */\nexport function validateFileElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation, path } = context;\n\n const isMultipleField =\n element.type === \"files\" ||\n (\"multiple\" in element && Boolean((element as FileElement).multiple));\n\n // Helper to validate file count\n const validateFileCount = (\n key: string,\n resourceIds: string[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n\n const minFiles = \"minCount\" in element ? (element.minCount ?? 0) : 0;\n const maxFiles =\n \"maxCount\" in element ? (element.maxCount ?? Infinity) : Infinity;\n\n if (element.required && resourceIds.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (resourceIds.length < minFiles) {\n errors.push(`${key}: ${t(\"minFiles\", state, { min: minFiles })}`);\n }\n if (resourceIds.length > maxFiles) {\n errors.push(`${key}: ${t(\"maxFiles\", state, { max: maxFiles })}`);\n }\n };\n\n // Helper to validate file extensions for a list of resource IDs\n const validateFileExtensions = (\n key: string,\n resourceIds: string[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n const acceptField =\n \"accept\" in element ? (element as FileElement).accept : undefined;\n const allowedExtensions = getAllowedExtensions(acceptField);\n if (allowedExtensions.length === 0) return;\n const formats = allowedExtensions.join(\", \");\n for (const rid of resourceIds) {\n const meta = state.resourceIndex.get(rid);\n const fileName = meta?.name ?? rid;\n if (!isFileExtensionAllowed(fileName, allowedExtensions)) {\n errors.push(\n `${key}: ${t(\"invalidFileExtension\", state, { name: fileName, formats })}`,\n );\n }\n }\n };\n\n // Helper to validate file sizes for a list of resource IDs\n const validateFileSizes = (\n key: string,\n resourceIds: string[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n const maxSizeMB =\n \"maxSize\" in element ? ((element as FileElement).maxSize ?? Infinity) : Infinity;\n if (maxSizeMB === Infinity) return;\n for (const rid of resourceIds) {\n const meta = state.resourceIndex.get(rid);\n if (!meta) continue;\n if (meta.size > maxSizeMB * 1024 * 1024) {\n errors.push(\n `${key}: ${t(\"fileTooLarge\", state, { name: meta.name, maxSize: maxSizeMB })}`,\n );\n }\n }\n };\n\n if (isMultipleField) {\n // Multiple file fields\n const fullKey = pathJoin(path, key);\n const pickerInput = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"file\"][name=\"${fullKey}\"]`,\n );\n const filesWrapper = pickerInput?.closest(\".space-y-2\");\n const container = filesWrapper?.querySelector(\".files-list\") || null;\n\n const resourceIds: string[] = [];\n if (container) {\n const pills = container.querySelectorAll<HTMLElement>(\".resource-pill\");\n pills.forEach((pill) => {\n const resourceId = pill.dataset.resourceId;\n if (resourceId) {\n resourceIds.push(resourceId);\n }\n });\n }\n\n validateFileCount(key, resourceIds, element);\n validateFileExtensions(key, resourceIds, element);\n validateFileSizes(key, resourceIds, element);\n return { value: resourceIds, errors };\n } else {\n // Single file field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[name$=\"${key}\"][type=\"hidden\"]`,\n );\n const rid = input?.value ?? \"\";\n\n if (!skipValidation && element.required && rid === \"\") {\n errors.push(`${key}: ${t(\"required\", context.state)}`);\n return { value: null, errors };\n }\n\n if (!skipValidation && rid !== \"\") {\n validateFileExtensions(key, [rid], element);\n validateFileSizes(key, [rid], element);\n }\n\n return { value: rid || null, errors };\n }\n}\n\n/**\n * Update file field value in DOM without re-render\n */\nexport function updateFileField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot, state } = context;\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple file fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateFileField: Expected array for multiple file field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update resource IDs in state\n value.forEach((resourceId) => {\n if (resourceId && typeof resourceId === \"string\") {\n if (!state.resourceIndex.has(resourceId)) {\n const filename = resourceId.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(resourceId, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n }\n });\n\n // Note: Updating the file previews would require re-rendering\n console.info(\n `updateFileField: Multiple file field \"${fieldPath}\" updated. Preview update requires re-render.`,\n );\n } else {\n // Single file field\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `input[name=\"${fieldPath}\"][type=\"hidden\"]`,\n );\n\n if (!hiddenInput) {\n console.warn(\n `updateFileField: Hidden input not found for file field \"${fieldPath}\"`,\n );\n return;\n }\n\n // Update hidden input value\n hiddenInput.value = value != null ? String(value) : \"\";\n\n // If value is a resource ID, update the resource index\n if (value && typeof value === \"string\") {\n if (!state.resourceIndex.has(value)) {\n // Add to resource index if not present\n const filename = value.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(value, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n\n // Note: Updating the file preview would require re-rendering\n // This method only updates the underlying data\n console.info(\n `updateFileField: File field \"${fieldPath}\" updated. Preview update requires re-render.`,\n );\n }\n }\n}\n","// Colour component rendering, validation, and update functions\n\nimport type {\n BaseElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { t } from \"../utils/translation.js\";\n\nexport interface ColourElement extends BaseElement {\n type: \"colour\";\n placeholder?: string;\n multiple?: boolean;\n minCount?: number;\n maxCount?: number;\n}\n\n/**\n * Normalize colour value to uppercase hex format (#RRGGBB)\n * HTML color input always returns lowercase, we standardize to uppercase\n */\nfunction normalizeColourValue(value: string): string {\n if (!value) return \"#000000\";\n return value.toUpperCase();\n}\n\n/**\n * Validate hex colour format (#RRGGBB or #RGB)\n */\nfunction isValidHexColour(value: string): boolean {\n return /^#[0-9A-F]{6}$/i.test(value) || /^#[0-9A-F]{3}$/i.test(value);\n}\n\n/**\n * Convert 3-digit hex to 6-digit hex (#RGB → #RRGGBB)\n */\nfunction expandHexColour(value: string): string {\n if (/^#[0-9A-F]{3}$/i.test(value)) {\n const r = value[1];\n const g = value[2];\n const b = value[3];\n return `#${r}${r}${g}${g}${b}${b}`.toUpperCase();\n }\n return value.toUpperCase();\n}\n\n/**\n * Create readonly colour UI (swatch + hex text)\n * Shared helper to eliminate duplication between single and multiple modes\n */\nfunction createReadonlyColourUI(value: string): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.className = \"flex items-center gap-2\";\n\n const normalizedValue = normalizeColourValue(value);\n\n const swatch = document.createElement(\"div\");\n swatch.style.cssText = `\n width: 32px;\n height: 32px;\n border-radius: var(--fb-border-radius);\n border: var(--fb-border-width) solid var(--fb-border-color);\n background-color: ${normalizedValue};\n `;\n\n const hexText = document.createElement(\"span\");\n hexText.style.cssText = `\n font-size: var(--fb-font-size);\n color: var(--fb-text-color);\n font-family: var(--fb-font-family-mono, monospace);\n `;\n hexText.textContent = normalizedValue;\n\n container.appendChild(swatch);\n container.appendChild(hexText);\n\n return container;\n}\n\n/**\n * Create edit mode colour picker UI (swatch + hex input + hidden colour picker)\n * Shared helper to eliminate duplication between single and multiple modes\n */\nfunction createEditColourUI(\n value: string,\n pathKey: string,\n ctx: RenderContext,\n): HTMLDivElement {\n const normalizedValue = normalizeColourValue(value);\n\n const pickerWrapper = document.createElement(\"div\");\n pickerWrapper.className = \"colour-picker-wrapper\";\n pickerWrapper.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n `;\n\n // Colour swatch preview\n const swatch = document.createElement(\"div\");\n swatch.className = \"colour-swatch\";\n swatch.style.cssText = `\n width: 40px;\n height: 40px;\n border-radius: var(--fb-border-radius);\n border: var(--fb-border-width) solid var(--fb-border-color);\n background-color: ${normalizedValue};\n cursor: pointer;\n transition: border-color var(--fb-transition-duration) ease-in-out;\n flex-shrink: 0;\n `;\n\n // Hex value text input\n const hexInput = document.createElement(\"input\");\n hexInput.type = \"text\";\n hexInput.className = \"colour-hex-input\";\n hexInput.name = pathKey;\n hexInput.value = normalizedValue;\n hexInput.placeholder = \"#000000\";\n hexInput.style.cssText = `\n width: 100px;\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: var(--fb-background-color);\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family-mono, monospace);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n\n // Hidden native colour picker\n const colourInput = document.createElement(\"input\");\n colourInput.type = \"color\";\n colourInput.className = \"colour-picker-hidden\";\n colourInput.value = normalizedValue.toLowerCase();\n colourInput.style.cssText = `\n position: absolute;\n opacity: 0;\n pointer-events: none;\n `;\n\n // Event handlers for hex input\n hexInput.addEventListener(\"input\", () => {\n const inputValue = hexInput.value.trim();\n if (isValidHexColour(inputValue)) {\n const expanded = expandHexColour(inputValue);\n swatch.style.backgroundColor = expanded;\n colourInput.value = expanded.toLowerCase();\n hexInput.classList.remove(\"invalid\");\n\n if (ctx.instance) {\n ctx.instance.triggerOnChange(pathKey, expanded);\n }\n } else {\n hexInput.classList.add(\"invalid\");\n }\n });\n\n hexInput.addEventListener(\"blur\", () => {\n const inputValue = hexInput.value.trim();\n if (isValidHexColour(inputValue)) {\n const expanded = expandHexColour(inputValue);\n hexInput.value = expanded;\n swatch.style.backgroundColor = expanded;\n colourInput.value = expanded.toLowerCase();\n hexInput.classList.remove(\"invalid\");\n }\n });\n\n // Event handlers for native colour picker\n colourInput.addEventListener(\"change\", () => {\n const normalized = normalizeColourValue(colourInput.value);\n hexInput.value = normalized;\n swatch.style.backgroundColor = normalized;\n\n if (ctx.instance) {\n ctx.instance.triggerOnChange(pathKey, normalized);\n }\n });\n\n // Swatch click - trigger native colour picker\n swatch.addEventListener(\"click\", () => {\n colourInput.click();\n });\n\n // Hover effects for swatch\n swatch.addEventListener(\"mouseenter\", () => {\n swatch.style.borderColor = \"var(--fb-border-hover-color)\";\n });\n swatch.addEventListener(\"mouseleave\", () => {\n swatch.style.borderColor = \"var(--fb-border-color)\";\n });\n\n // Focus styles for hex input\n hexInput.addEventListener(\"focus\", () => {\n hexInput.style.borderColor = \"var(--fb-border-focus-color)\";\n hexInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n hexInput.style.outlineOffset = \"0\";\n });\n hexInput.addEventListener(\"blur\", () => {\n hexInput.style.borderColor = \"var(--fb-border-color)\";\n hexInput.style.outline = \"none\";\n });\n hexInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== hexInput) {\n hexInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n hexInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== hexInput) {\n hexInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n\n // Assemble the composite picker\n pickerWrapper.appendChild(swatch);\n pickerWrapper.appendChild(hexInput);\n pickerWrapper.appendChild(colourInput);\n\n return pickerWrapper;\n}\n\nexport function renderColourElement(\n element: ColourElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const initialValue =\n (ctx.prefill[element.key] as string) || element.default || \"#000000\";\n\n if (state.config.readonly) {\n // Readonly mode: use shared helper\n const readonlyUI = createReadonlyColourUI(initialValue);\n wrapper.appendChild(readonlyUI);\n } else {\n // Edit mode: use shared helper\n const editUI = createEditColourUI(initialValue, pathKey, ctx);\n wrapper.appendChild(editUI);\n }\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const colourHint = document.createElement(\"p\");\n colourHint.className = \"mt-1\";\n colourHint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n colourHint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(colourHint);\n }\n}\n\nexport function renderMultipleColourElement(\n element: ColourElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"#000000\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-colour-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addColourItem(\n value: string = \"#000000\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-colour-item flex items-center gap-2\";\n\n if (state.config.readonly) {\n // Readonly mode: use shared helper\n const readonlyUI = createReadonlyColourUI(value);\n // Extract children from readonlyUI to add to itemWrapper\n while (readonlyUI.firstChild) {\n itemWrapper.appendChild(readonlyUI.firstChild);\n }\n } else {\n // Edit mode: use shared helper\n // For multiple mode, we need to pass a temporary pathKey that will be updated by updateIndices\n const tempPathKey = `${pathKey}[${container.children.length}]`;\n const editUI = createEditColourUI(value, tempPathKey, ctx);\n // Add flex: 1 to the wrapper for multiple mode layout\n editUI.style.flex = \"1\";\n itemWrapper.appendChild(editUI);\n }\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-colour-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-colour-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n const defaultColour = element.default || \"#000000\";\n values.push(defaultColour);\n addColourItem(defaultColour);\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-colour-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addColourItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"mt-1\";\n hint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate colour input field and return extracted value with errors\n */\nexport function validateColourElement(\n element: ColourElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate colour value\n const validateColourValue = (\n input: HTMLInputElement,\n val: string,\n fieldKey: string,\n ): string => {\n const { state } = context;\n if (!val) {\n if (!skipValidation && element.required) {\n const msg = t(\"required\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n return \"\";\n }\n markValidity(input, null);\n return \"\";\n }\n\n const normalized = normalizeColourValue(val);\n if (!skipValidation && !isValidHexColour(normalized)) {\n const msg = t(\"invalidHexColour\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(input, msg);\n return val;\n }\n\n markValidity(input, null);\n return normalized;\n };\n\n if (element.multiple) {\n // Multiple colour fields (array)\n // Look for hex input fields for this specific field (by name pattern)\n const hexInputs =\n scopeRoot.querySelectorAll<HTMLInputElement>(`[name^=\"${key}[\"].colour-hex-input`);\n const values: string[] = [];\n\n hexInputs.forEach((input, index) => {\n const val = input?.value ?? \"\";\n const validated = validateColourValue(input, val, `${key}[${index}]`);\n values.push(validated);\n });\n\n // Validate count\n if (!skipValidation) {\n const { state } = context;\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v !== \"\");\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single colour field\n // Look for hex input field (text input with class colour-hex-input)\n const hexInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${key}\"].colour-hex-input`,\n );\n const val = hexInput?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n const msg = t(\"required\", context.state);\n errors.push(`${key}: ${msg}`);\n markValidity(hexInput, msg);\n return { value: \"\", errors };\n }\n\n const validated = validateColourValue(hexInput!, val, key);\n return { value: validated, errors };\n }\n}\n\n/**\n * Update colour field value in DOM without re-render\n */\nexport function updateColourField(\n element: ColourElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple colour fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateColourField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const hexInputs =\n scopeRoot.querySelectorAll<HTMLInputElement>(`[name^=\"${fieldPath}[\"].colour-hex-input`);\n\n hexInputs.forEach((hexInput, index) => {\n if (index < value.length) {\n const normalized = normalizeColourValue(value[index]);\n hexInput.value = normalized;\n hexInput.classList.remove(\"invalid\");\n hexInput.title = \"\";\n\n // Update swatch and hidden colour input\n const wrapper = hexInput.closest(\".colour-picker-wrapper\");\n if (wrapper) {\n const swatch = wrapper.querySelector<HTMLElement>(\".colour-swatch\");\n const colourInput = wrapper.querySelector<HTMLInputElement>(\n \".colour-picker-hidden\",\n );\n if (swatch) {\n swatch.style.backgroundColor = normalized;\n }\n if (colourInput) {\n colourInput.value = normalized.toLowerCase();\n }\n }\n }\n });\n\n if (value.length !== hexInputs.length) {\n console.warn(\n `updateColourField: Multiple field \"${fieldPath}\" has ${hexInputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single colour field\n const hexInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"].colour-hex-input`,\n );\n if (hexInput) {\n const normalized = normalizeColourValue(value);\n hexInput.value = normalized;\n hexInput.classList.remove(\"invalid\");\n hexInput.title = \"\";\n\n // Update swatch and hidden colour input\n const wrapper = hexInput.closest(\".colour-picker-wrapper\");\n if (wrapper) {\n const swatch = wrapper.querySelector<HTMLElement>(\".colour-swatch\");\n const colourInput = wrapper.querySelector<HTMLInputElement>(\n \".colour-picker-hidden\",\n );\n if (swatch) {\n swatch.style.backgroundColor = normalized;\n }\n if (colourInput) {\n colourInput.value = normalized.toLowerCase();\n }\n }\n }\n }\n}\n","// Slider component rendering, validation, and update functions\n\nimport type {\n SliderElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { t } from \"../utils/translation.js\";\n\n/**\n * Convert position (0-1) to exponential value\n * Useful for values like volume, frequency that span orders of magnitude\n */\nfunction positionToExponential(\n position: number,\n min: number,\n max: number,\n): number {\n if (min <= 0) {\n throw new Error(\"Exponential scale requires min > 0\");\n }\n const logMin = Math.log(min);\n const logMax = Math.log(max);\n return Math.exp(logMin + position * (logMax - logMin));\n}\n\n/**\n * Convert exponential value to position (0-1)\n */\nfunction exponentialToPosition(\n value: number,\n min: number,\n max: number,\n): number {\n if (min <= 0) {\n throw new Error(\"Exponential scale requires min > 0\");\n }\n const logMin = Math.log(min);\n const logMax = Math.log(max);\n const logValue = Math.log(value);\n return (logValue - logMin) / (logMax - logMin);\n}\n\n/**\n * Align value to step\n */\nfunction alignToStep(value: number, step: number): number {\n return Math.round(value / step) * step;\n}\n\n/**\n * Create slider UI with value display\n */\nfunction createSliderUI(\n value: number,\n pathKey: string,\n element: SliderElement,\n ctx: RenderContext,\n readonly: boolean,\n): HTMLDivElement {\n const container = document.createElement(\"div\");\n container.className = \"slider-container\";\n\n // Main row: slider section + value display\n const mainRow = document.createElement(\"div\");\n mainRow.className = \"flex items-start gap-3\";\n\n // Slider section (track + labels)\n const sliderSection = document.createElement(\"div\");\n sliderSection.className = \"flex-1\";\n\n // HTML5 range input\n const slider = document.createElement(\"input\");\n slider.type = \"range\";\n slider.name = pathKey;\n slider.className = \"slider-input w-full\";\n slider.disabled = readonly;\n\n // For exponential scale, we use 0-1000 internal steps for smooth control\n const scale = element.scale || \"linear\";\n const min = element.min;\n const max = element.max;\n const step = element.step ?? 1;\n\n if (scale === \"exponential\") {\n // Validate min > 0 for exponential scale\n if (min <= 0) {\n throw new Error(\n `Slider \"${element.key}\": exponential scale requires min > 0 (got ${min})`,\n );\n }\n // Internal range 0-1000 for smooth exponential control\n slider.min = \"0\";\n slider.max = \"1000\";\n slider.step = \"1\";\n const position = exponentialToPosition(value, min, max);\n slider.value = (position * 1000).toString();\n } else {\n // Linear scale - direct mapping\n slider.min = min.toString();\n slider.max = max.toString();\n slider.step = step.toString();\n slider.value = value.toString();\n }\n\n // Styling for slider\n slider.style.cssText = `\n height: 6px;\n border-radius: 3px;\n background: linear-gradient(\n to right,\n var(--fb-primary-color) 0%,\n var(--fb-primary-color) ${((value - min) / (max - min)) * 100}%,\n var(--fb-border-color) ${((value - min) / (max - min)) * 100}%,\n var(--fb-border-color) 100%\n );\n outline: none;\n transition: background 0.1s ease-in-out;\n cursor: ${readonly ? \"not-allowed\" : \"pointer\"};\n opacity: ${readonly ? \"0.6\" : \"1\"};\n `;\n\n // Add slider to section\n sliderSection.appendChild(slider);\n\n // Min/max labels under the slider track\n const labelsRow = document.createElement(\"div\");\n labelsRow.className = \"flex justify-between\";\n labelsRow.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n margin-top: 4px;\n `;\n\n const minLabel = document.createElement(\"span\");\n minLabel.textContent = min.toString();\n const maxLabel = document.createElement(\"span\");\n maxLabel.textContent = max.toString();\n\n labelsRow.appendChild(minLabel);\n labelsRow.appendChild(maxLabel);\n sliderSection.appendChild(labelsRow);\n\n // Value display (separate from slider section)\n const valueDisplay = document.createElement(\"span\");\n valueDisplay.className = \"slider-value\";\n valueDisplay.style.cssText = `\n min-width: 60px;\n text-align: right;\n font-size: var(--fb-font-size);\n color: var(--fb-text-color);\n font-family: var(--fb-font-family-mono, monospace);\n font-weight: 500;\n padding-top: 2px;\n `;\n valueDisplay.textContent = value.toFixed(step < 1 ? 2 : 0);\n\n mainRow.appendChild(sliderSection);\n mainRow.appendChild(valueDisplay);\n container.appendChild(mainRow);\n\n // Event handlers for edit mode\n if (!readonly) {\n const updateValue = () => {\n let displayValue: number;\n\n if (scale === \"exponential\") {\n const position = parseFloat(slider.value) / 1000;\n displayValue = positionToExponential(position, min, max);\n displayValue = alignToStep(displayValue, step);\n // Clamp to min/max\n displayValue = Math.max(min, Math.min(max, displayValue));\n } else {\n displayValue = parseFloat(slider.value);\n displayValue = alignToStep(displayValue, step);\n }\n\n valueDisplay.textContent = displayValue.toFixed(step < 1 ? 2 : 0);\n\n // Update background gradient\n const percentage = ((displayValue - min) / (max - min)) * 100;\n slider.style.background = `linear-gradient(\n to right,\n var(--fb-primary-color) 0%,\n var(--fb-primary-color) ${percentage}%,\n var(--fb-border-color) ${percentage}%,\n var(--fb-border-color) 100%\n )`;\n\n // Trigger onChange event\n if (ctx.instance) {\n ctx.instance.triggerOnChange(pathKey, displayValue);\n }\n };\n\n slider.addEventListener(\"input\", updateValue);\n slider.addEventListener(\"change\", updateValue);\n }\n\n return container;\n}\n\nexport function renderSliderElement(\n element: SliderElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Validate required properties (FAIL FAST)\n if (element.min === undefined || element.min === null) {\n throw new Error(`Slider field \"${element.key}\" requires \"min\" property`);\n }\n if (element.max === undefined || element.max === null) {\n throw new Error(`Slider field \"${element.key}\" requires \"max\" property`);\n }\n if (element.min >= element.max) {\n throw new Error(\n `Slider field \"${element.key}\": min (${element.min}) must be less than max (${element.max})`,\n );\n }\n\n const state = ctx.state;\n const defaultValue =\n element.default !== undefined\n ? element.default\n : (element.min + element.max) / 2;\n const initialValue = (ctx.prefill[element.key] as number) ?? defaultValue;\n\n const sliderUI = createSliderUI(\n initialValue,\n pathKey,\n element,\n ctx,\n state.config.readonly,\n );\n wrapper.appendChild(sliderUI);\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"mt-1\";\n hint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\nexport function renderMultipleSliderElement(\n element: SliderElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Validate required properties (FAIL FAST)\n if (element.min === undefined || element.min === null) {\n throw new Error(`Slider field \"${element.key}\" requires \"min\" property`);\n }\n if (element.max === undefined || element.max === null) {\n throw new Error(`Slider field \"${element.key}\" requires \"max\" property`);\n }\n if (element.min >= element.max) {\n throw new Error(\n `Slider field \"${element.key}\": min (${element.min}) must be less than max (${element.max})`,\n );\n }\n\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n const defaultValue =\n element.default !== undefined\n ? element.default\n : (element.min + element.max) / 2;\n\n while (values.length < minCount) {\n values.push(defaultValue);\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-3\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-slider-item\");\n items.forEach((item, index) => {\n const slider = item.querySelector(\"input[type=range]\");\n if (slider) {\n slider.setAttribute(\"name\", `${pathKey}[${index}]`);\n }\n });\n }\n\n function addSliderItem(\n value: number = defaultValue,\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-slider-item flex items-start gap-2\";\n\n // Create slider UI\n const tempPathKey = `${pathKey}[${container.children.length}]`;\n const sliderUI = createSliderUI(\n value,\n tempPathKey,\n element,\n ctx,\n state.config.readonly,\n );\n sliderUI.style.flex = \"1\";\n itemWrapper.appendChild(sliderUI);\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-slider-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n margin-top: 8px;\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n // Add row with button and count indicator (edit mode only)\n let addRow: HTMLDivElement | null = null;\n let countDisplay: HTMLSpanElement | null = null;\n\n if (!state.config.readonly) {\n addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-slider-btn px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = \"+\";\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(defaultValue);\n addSliderItem(defaultValue);\n updateAddButton();\n updateRemoveButtons();\n };\n\n countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n addRow.appendChild(addBtn);\n addRow.appendChild(countDisplay);\n wrapper.appendChild(addRow);\n }\n\n function updateAddButton(): void {\n if (!addRow || !countDisplay) return;\n\n const addBtn = addRow.querySelector(\".add-slider-btn\") as HTMLButtonElement;\n if (addBtn) {\n const disabled = values.length >= maxCount;\n addBtn.disabled = disabled;\n addBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n addBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n }\n\n countDisplay.textContent = `${values.length}/${maxCount === Infinity ? \"∞\" : maxCount}`;\n }\n\n // Render initial items\n values.forEach((value) => addSliderItem(value as number));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint (only in edit mode)\n if (!state.config.readonly) {\n const hint = document.createElement(\"p\");\n hint.className = \"mt-1\";\n hint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n hint.textContent = makeFieldHint(element, state);\n wrapper.appendChild(hint);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate slider input field and return extracted value with errors\n */\nexport function validateSliderElement(\n element: SliderElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Validate schema properties (FAIL FAST)\n if (element.min === undefined || element.min === null) {\n throw new Error(\n `Slider validation: field \"${key}\" requires \"min\" property`,\n );\n }\n if (element.max === undefined || element.max === null) {\n throw new Error(\n `Slider validation: field \"${key}\" requires \"max\" property`,\n );\n }\n\n const min = element.min;\n const max = element.max;\n const step = element.step ?? 1;\n const scale = element.scale || \"linear\";\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n // Insert error after the slider container\n const sliderContainer = input.closest(\".slider-container\");\n if (sliderContainer && sliderContainer.nextSibling) {\n sliderContainer.parentNode?.insertBefore(\n errorElement,\n sliderContainer.nextSibling,\n );\n } else if (sliderContainer) {\n sliderContainer.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to extract and validate slider value\n const validateSliderValue = (\n slider: HTMLInputElement,\n fieldKey: string,\n ): number | null => {\n const { state } = context;\n const rawValue = slider.value;\n if (!rawValue) {\n if (!skipValidation && element.required) {\n const msg = t(\"required\", state);\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(slider, msg);\n return null;\n }\n markValidity(slider, null);\n return null;\n }\n\n let value: number;\n\n if (scale === \"exponential\") {\n const position = parseFloat(rawValue) / 1000;\n value = positionToExponential(position, min, max);\n value = alignToStep(value, step);\n } else {\n value = parseFloat(rawValue);\n value = alignToStep(value, step);\n }\n\n // Validate range\n if (!skipValidation) {\n if (value < min) {\n const msg = t(\"minValue\", state, { min });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(slider, msg);\n return value;\n }\n if (value > max) {\n const msg = t(\"maxValue\", state, { max });\n errors.push(`${fieldKey}: ${msg}`);\n markValidity(slider, msg);\n return value;\n }\n }\n\n markValidity(slider, null);\n return value;\n };\n\n if (element.multiple) {\n // Multiple slider fields (array)\n const sliders = scopeRoot.querySelectorAll<HTMLInputElement>(\n `input[type=\"range\"][name^=\"${key}[\"]`,\n );\n const values: (number | null)[] = [];\n\n sliders.forEach((slider, index) => {\n const value = validateSliderValue(slider, `${key}[${index}]`);\n values.push(value);\n });\n\n // Validate count\n if (!skipValidation) {\n const { state } = context;\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v !== null);\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minCount })}`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxCount })}`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single slider field\n const slider = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"range\"][name=\"${key}\"]`,\n );\n\n if (!slider) {\n if (!skipValidation && element.required) {\n errors.push(`${key}: ${t(\"required\", context.state)}`);\n }\n return { value: null, errors };\n }\n\n const value = validateSliderValue(slider, key);\n return { value, errors };\n }\n}\n\n/**\n * Update slider field value in DOM without re-render\n */\nexport function updateSliderField(\n element: SliderElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n const min = element.min;\n const max = element.max;\n const step = element.step ?? 1;\n const scale = element.scale || \"linear\";\n\n if (element.multiple) {\n // Multiple slider fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateSliderField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const sliders = scopeRoot.querySelectorAll<HTMLInputElement>(\n `input[type=\"range\"][name^=\"${fieldPath}[\"]`,\n );\n\n sliders.forEach((slider, index) => {\n if (index < value.length && value[index] !== null) {\n const numValue = Number(value[index]);\n\n if (scale === \"exponential\") {\n const position = exponentialToPosition(numValue, min, max);\n slider.value = (position * 1000).toString();\n } else {\n slider.value = numValue.toString();\n }\n\n // Update value display\n const sliderContainer = slider.closest(\".slider-container\");\n if (sliderContainer) {\n const valueDisplay = sliderContainer.querySelector(\".slider-value\");\n if (valueDisplay) {\n valueDisplay.textContent = numValue.toFixed(step < 1 ? 2 : 0);\n }\n\n // Update background gradient\n const percentage = ((numValue - min) / (max - min)) * 100;\n slider.style.background = `linear-gradient(\n to right,\n var(--fb-primary-color) 0%,\n var(--fb-primary-color) ${percentage}%,\n var(--fb-border-color) ${percentage}%,\n var(--fb-border-color) 100%\n )`;\n }\n\n slider.classList.remove(\"invalid\");\n slider.title = \"\";\n }\n });\n\n if (value.length !== sliders.length) {\n console.warn(\n `updateSliderField: Multiple field \"${fieldPath}\" has ${sliders.length} sliders but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single slider field\n const slider = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"range\"][name=\"${fieldPath}\"]`,\n );\n\n if (slider && value !== null && value !== undefined) {\n const numValue = Number(value);\n\n if (scale === \"exponential\") {\n const position = exponentialToPosition(numValue, min, max);\n slider.value = (position * 1000).toString();\n } else {\n slider.value = numValue.toString();\n }\n\n // Update value display\n const sliderContainer = slider.closest(\".slider-container\");\n if (sliderContainer) {\n const valueDisplay = sliderContainer.querySelector(\".slider-value\");\n if (valueDisplay) {\n valueDisplay.textContent = numValue.toFixed(step < 1 ? 2 : 0);\n }\n\n // Update background gradient\n const percentage = ((numValue - min) / (max - min)) * 100;\n slider.style.background = `linear-gradient(\n to right,\n var(--fb-primary-color) 0%,\n var(--fb-primary-color) ${percentage}%,\n var(--fb-border-color) ${percentage}%,\n var(--fb-border-color) 100%\n )`;\n }\n\n slider.classList.remove(\"invalid\");\n slider.title = \"\";\n }\n }\n}\n","// Container component rendering functions\n\nimport type {\n ContainerElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { pathJoin, isPlainObject, createHiddenInput } from \"../utils/helpers.js\";\nimport { evaluateEnableCondition } from \"../utils/enable-conditions.js\";\nimport { t } from \"../utils/translation.js\";\n\n/**\n * Extract default values from container child elements.\n * Used to pre-populate prefill context for enableIf evaluation.\n */\nfunction extractChildDefaults(elements: Element[]): Record<string, any> {\n const defaults: Record<string, any> = {};\n for (const child of elements) {\n if (\"default\" in child && child.default !== undefined) {\n defaults[child.key] = child.default;\n }\n }\n return defaults;\n}\n\n/**\n * Merge defaults with prefill data, giving precedence to prefill values.\n */\nfunction mergeWithDefaults(\n prefill: Record<string, any>,\n defaults: Record<string, any>,\n): Record<string, any> {\n return { ...defaults, ...prefill };\n}\n\n// Helper: Extract current root-level form data from DOM\nfunction extractRootFormData(formRoot: HTMLElement): Record<string, any> {\n const data: Record<string, any> = {};\n\n // Get all root-level inputs (inputs not inside containers)\n const inputs = formRoot.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n 'input, select, textarea'\n );\n\n inputs.forEach(input => {\n const fieldName = input.getAttribute('name');\n if (fieldName && !fieldName.includes('[') && !fieldName.includes('.')) {\n // Root-level field (no array indices or dots in name)\n if (input instanceof HTMLSelectElement) {\n data[fieldName] = input.value;\n } else if (input instanceof HTMLInputElement) {\n if (input.type === 'checkbox') {\n data[fieldName] = input.checked;\n } else if (input.type === 'radio') {\n if (input.checked) {\n data[fieldName] = input.value;\n }\n } else {\n data[fieldName] = input.value;\n }\n } else if (input instanceof HTMLTextAreaElement) {\n data[fieldName] = input.value;\n }\n }\n });\n\n return data;\n}\n\n// Forward declaration - will be imported from components/index.ts\n// This creates a circular dependency that will be resolved at runtime\nlet renderElementFunc:\n | ((element: any, ctx: RenderContext) => HTMLElement)\n | null = null;\n\n// Export setter for renderElement function (called from components/index.ts)\nexport function setRenderElement(\n fn: (element: any, ctx: RenderContext) => HTMLElement,\n): void {\n renderElementFunc = fn;\n}\n\nfunction renderElement(element: any, ctx: RenderContext): HTMLElement {\n if (!renderElementFunc) {\n throw new Error(\n \"renderElement not initialized. Import from components/index.ts\",\n );\n }\n return renderElementFunc(element, ctx);\n}\n\n/**\n * Render prefill hints chips under container title (edit mode only)\n * Returns the hints container element to be inserted at appropriate position\n */\nfunction createPrefillHints(\n element: ContainerElement,\n pathKey: string,\n): HTMLElement | null {\n if (!element.prefillHints || element.prefillHints.length === 0) {\n return null;\n }\n\n const hintsContainer = document.createElement(\"div\");\n hintsContainer.className = \"fb-prefill-hints flex flex-wrap gap-2 mb-4\";\n\n element.prefillHints.forEach((hint, index) => {\n const hintButton = document.createElement(\"button\");\n hintButton.type = \"button\";\n hintButton.className = \"fb-prefill-hint\";\n hintButton.textContent = hint.label;\n\n // Store hint data as JSON in data attribute\n hintButton.setAttribute(\"data-hint-values\", JSON.stringify(hint.values));\n hintButton.setAttribute(\"data-container-key\", pathKey);\n hintButton.setAttribute(\"data-hint-index\", String(index));\n\n hintsContainer.appendChild(hintButton);\n });\n\n return hintsContainer;\n}\n\nexport function renderSingleContainerElement(\n element: ContainerElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Container wrapper (label is already added outside by renderElement)\n const containerWrap = document.createElement(\"div\");\n containerWrap.className = \"border border-gray-200 rounded-lg p-4 bg-gray-50\";\n containerWrap.setAttribute(\"data-container\", pathKey);\n\n const itemsWrap = document.createElement(\"div\");\n const columns = element.columns || 1;\n if (columns === 1) {\n itemsWrap.className = \"space-y-4\"; // Vertical layout (default)\n } else {\n itemsWrap.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n // Render prefill hints BEFORE items (edit mode only)\n if (!ctx.state.config.readonly) {\n const hintsElement = createPrefillHints(element, pathKey);\n if (hintsElement) {\n containerWrap.appendChild(hintsElement);\n }\n }\n\n // Single object container\n // Extract defaults from child elements for enableIf evaluation\n const childDefaults = extractChildDefaults(element.elements);\n const containerPrefill = (ctx.prefill?.[element.key] as Record<string, any>) || {};\n const mergedPrefill = mergeWithDefaults(containerPrefill, childDefaults);\n\n const subCtx: RenderContext = {\n path: pathJoin(ctx.path, element.key),\n prefill: mergedPrefill, // Merged prefill with defaults for enableIf evaluation\n formData: ctx.formData ?? ctx.prefill, // Complete root data for enableIf evaluation\n state: ctx.state,\n };\n element.elements.forEach((child) => {\n if (child.hidden || child.type === \"hidden\") {\n const prefillVal = (containerPrefill as Record<string, any>)[child.key] ?? child.default ?? null;\n itemsWrap.appendChild(createHiddenInput(pathJoin(subCtx.path, child.key), prefillVal));\n } else {\n itemsWrap.appendChild(renderElement(child, subCtx));\n }\n });\n containerWrap.appendChild(itemsWrap);\n\n wrapper.appendChild(containerWrap);\n}\n\nexport function renderMultipleContainerElement(\n element: ContainerElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n _pathKey: string,\n): void {\n const state = ctx.state;\n // Container wrapper (label is already added outside by renderElement)\n const containerWrap = document.createElement(\"div\");\n containerWrap.className = \"border border-gray-200 rounded-lg p-4 bg-gray-50\";\n\n // Count indicator (will be placed next to add button)\n const countDisplay = document.createElement(\"span\");\n countDisplay.className = \"text-sm text-gray-500\";\n\n const itemsWrap = document.createElement(\"div\");\n itemsWrap.className = \"space-y-4\";\n\n // Render prefill hints AFTER header but BEFORE items (edit mode only)\n if (!ctx.state.config.readonly) {\n const hintsElement = createPrefillHints(element, element.key);\n if (hintsElement) {\n containerWrap.appendChild(hintsElement);\n }\n }\n\n const min = element.minCount ?? 0;\n const max = element.maxCount ?? Infinity;\n const pre = Array.isArray(ctx.prefill?.[element.key])\n ? (ctx.prefill[element.key] as Array<Record<string, any>>)\n : null;\n\n // Extract defaults from child elements once for reuse in all rendering paths\n const childDefaults = extractChildDefaults(element.elements);\n\n const countItems = (): number =>\n itemsWrap.querySelectorAll(\":scope > .containerItem\").length;\n\n const createAddButton = (): HTMLButtonElement => {\n const add = document.createElement(\"button\");\n add.type = \"button\";\n add.className = \"add-container-btn px-3 py-1 rounded\";\n add.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n add.textContent = \"+\";\n add.addEventListener(\"mouseenter\", () => {\n add.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n add.addEventListener(\"mouseleave\", () => {\n add.style.backgroundColor = \"transparent\";\n });\n add.onclick = () => {\n if (countItems() < max) {\n const idx = countItems();\n // Extract current form data from DOM for enableIf evaluation\n const currentFormData = state.formRoot ? extractRootFormData(state.formRoot) : {};\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: childDefaults, // Defaults for enableIf evaluation\n formData: currentFormData, // Current root data from DOM for enableIf\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n // Create child wrapper with column layout support\n const childWrapper = document.createElement(\"div\");\n const columns = element.columns || 1;\n if (columns === 1) {\n childWrapper.className = \"space-y-4\"; // Vertical layout (default)\n } else {\n childWrapper.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n element.elements.forEach((child) => {\n if (child.hidden || child.type === \"hidden\") {\n // New rows (added via \"+\") use child.default only — never stale prefill values.\n childWrapper.appendChild(createHiddenInput(pathJoin(subCtx.path, child.key), child.default ?? null));\n } else {\n childWrapper.appendChild(renderElement(child, subCtx));\n }\n });\n\n item.appendChild(childWrapper);\n\n // Only add remove button in edit mode\n if (!state.config.readonly) {\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className = \"absolute top-2 right-2 px-2 py-1 rounded\";\n rem.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n rem.textContent = \"✕\";\n rem.addEventListener(\"mouseenter\", () => {\n rem.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n rem.addEventListener(\"mouseleave\", () => {\n rem.style.backgroundColor = \"transparent\";\n });\n rem.onclick = () => handleRemoveItem(item);\n item.style.position = \"relative\";\n item.appendChild(rem);\n }\n\n itemsWrap.appendChild(item);\n updateAddButton();\n }\n };\n return add;\n };\n\n const updateAddButton = (): void => {\n const currentCount = countItems();\n const existingAddBtn = containerWrap.querySelector(\n \".add-container-btn\",\n ) as HTMLButtonElement;\n if (existingAddBtn) {\n existingAddBtn.disabled = currentCount >= max;\n existingAddBtn.style.opacity = currentCount >= max ? \"0.5\" : \"1\";\n existingAddBtn.style.pointerEvents =\n currentCount >= max ? \"none\" : \"auto\";\n }\n countDisplay.textContent = `${currentCount}/${max === Infinity ? \"∞\" : max}`;\n };\n\n const handleRemoveItem = (item: HTMLElement): void => {\n item.remove();\n updateAddButton();\n };\n\n // Pre-fill initial items\n if (pre && Array.isArray(pre)) {\n pre.forEach((prefillObj, idx) => {\n // Merge defaults with prefill data (prefill takes precedence)\n const mergedPrefill = mergeWithDefaults(prefillObj || {}, childDefaults);\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: mergedPrefill, // Merged prefill with defaults for enableIf\n formData: ctx.formData ?? ctx.prefill, // Complete root data for enableIf\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n // Create child wrapper with column layout support\n const childWrapper = document.createElement(\"div\");\n const columns = element.columns || 1;\n if (columns === 1) {\n childWrapper.className = \"space-y-4\"; // Vertical layout (default)\n } else {\n childWrapper.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n element.elements.forEach((child) => {\n if (child.hidden || child.type === \"hidden\") {\n const prefillVal = (prefillObj as Record<string, any>)?.[child.key] ?? child.default ?? null;\n childWrapper.appendChild(createHiddenInput(pathJoin(subCtx.path, child.key), prefillVal));\n } else {\n childWrapper.appendChild(renderElement(child, subCtx));\n }\n });\n\n item.appendChild(childWrapper);\n\n // Only add remove button in edit mode\n if (!state.config.readonly) {\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className = \"absolute top-2 right-2 px-2 py-1 rounded\";\n rem.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n rem.textContent = \"✕\";\n rem.addEventListener(\"mouseenter\", () => {\n rem.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n rem.addEventListener(\"mouseleave\", () => {\n rem.style.backgroundColor = \"transparent\";\n });\n rem.onclick = () => handleRemoveItem(item);\n item.style.position = \"relative\";\n item.appendChild(rem);\n }\n\n itemsWrap.appendChild(item);\n });\n }\n\n // Ensure minimum items\n if (!state.config.readonly) {\n while (countItems() < min) {\n const idx = countItems();\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: childDefaults, // Defaults for enableIf evaluation\n formData: ctx.formData ?? ctx.prefill, // Complete root data for enableIf\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n // Create child wrapper with column layout support\n const childWrapper = document.createElement(\"div\");\n const columns = element.columns || 1;\n if (columns === 1) {\n childWrapper.className = \"space-y-4\"; // Vertical layout (default)\n } else {\n childWrapper.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n element.elements.forEach((child) => {\n if (child.hidden || child.type === \"hidden\") {\n // Min items are empty rows — use child.default only, no prefill\n childWrapper.appendChild(createHiddenInput(pathJoin(subCtx.path, child.key), child.default ?? null));\n } else {\n childWrapper.appendChild(renderElement(child, subCtx));\n }\n });\n\n item.appendChild(childWrapper);\n\n // Remove button - but disabled if we're at minimum\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className = \"absolute top-2 right-2 px-2 py-1 rounded\";\n rem.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n rem.textContent = \"✕\";\n rem.addEventListener(\"mouseenter\", () => {\n rem.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n rem.addEventListener(\"mouseleave\", () => {\n rem.style.backgroundColor = \"transparent\";\n });\n rem.onclick = () => {\n if (countItems() > min) {\n handleRemoveItem(item);\n }\n };\n item.style.position = \"relative\";\n item.appendChild(rem);\n\n itemsWrap.appendChild(item);\n }\n }\n\n containerWrap.appendChild(itemsWrap);\n\n // Add \"Add Element\" button with count indicator at the bottom (edit mode only)\n if (!state.config.readonly) {\n const addRow = document.createElement(\"div\");\n addRow.className = \"flex items-center gap-3 mt-2\";\n addRow.appendChild(createAddButton());\n addRow.appendChild(countDisplay);\n containerWrap.appendChild(addRow);\n }\n\n updateAddButton();\n\n wrapper.appendChild(containerWrap);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n// Forward declaration for validateElement - will be set from FormBuilderInstance\nlet validateElementFunc:\n | ((\n element: Element,\n ctx: { path: string },\n customScopeRoot?: HTMLElement | null,\n ) => { value: any; spread: boolean })\n | null = null;\n\n// Export setter for validateElement function\nexport function setValidateElement(\n fn: (\n element: Element,\n ctx: { path: string },\n customScopeRoot?: HTMLElement | null,\n ) => { value: any; spread: boolean },\n): void {\n validateElementFunc = fn;\n}\n\nfunction validateElement(\n element: Element,\n ctx: { path: string },\n customScopeRoot?: HTMLElement | null,\n): { value: any; spread: boolean } {\n if (!validateElementFunc) {\n throw new Error(\n \"validateElement not initialized. Should be set from FormBuilderInstance\",\n );\n }\n return validateElementFunc(element, ctx, customScopeRoot);\n}\n\n/**\n * Validate container field and return extracted value with errors\n */\nexport function validateContainerElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation, path } = context;\n\n if (!(\"elements\" in element)) {\n return { value: null, errors };\n }\n\n // Helper to validate container count\n const validateContainerCount = (\n key: string,\n items: any[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n const { state } = context;\n\n const minItems = \"minCount\" in element ? (element.minCount ?? 0) : 0;\n const maxItems =\n \"maxCount\" in element ? (element.maxCount ?? Infinity) : Infinity;\n\n if (element.required && items.length === 0) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n if (items.length < minItems) {\n errors.push(`${key}: ${t(\"minItems\", state, { min: minItems })}`);\n }\n if (items.length > maxItems) {\n errors.push(`${key}: ${t(\"maxItems\", state, { max: maxItems })}`);\n }\n };\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple containers\n const items: any[] = [];\n const allContainerWrappers = scopeRoot.querySelectorAll<HTMLElement>(\n \"[data-container-item]\",\n );\n const containerWrappers = Array.from(allContainerWrappers).filter((el) => {\n const attr = el.getAttribute(\"data-container-item\") || \"\";\n if (!attr.startsWith(`${key}[`)) return false;\n // Strict match: only direct key[N], not key_extra[N] or key[0].nested[0]\n const suffix = attr.slice(key.length);\n return /^\\[\\d+\\]$/.test(suffix);\n });\n containerWrappers.forEach((itemContainer) => {\n const itemData: Record<string, any> = {};\n // Extract real index from DOM attribute (indices may be non-sequential after deletion)\n const containerAttr =\n itemContainer.getAttribute(\"data-container-item\") || \"\";\n const indexMatch = containerAttr.match(/\\[(\\d+)\\]$/);\n const domIndex = indexMatch ? parseInt(indexMatch[1], 10) : 0;\n\n element.elements.forEach((child: any) => {\n // Check enableIf condition for child element (relative to container data)\n if (child.enableIf) {\n try {\n const rootFormData = context.instance?.getState().formRoot\n ? extractRootFormData(context.instance.getState().formRoot!)\n : {};\n const shouldEnable = evaluateEnableCondition(\n child.enableIf,\n rootFormData, // Root form data for absolute scope\n itemData, // Container data for relative scope\n );\n if (!shouldEnable) {\n // Field is conditionally disabled, exclude from container data entirely\n return;\n }\n } catch (error) {\n console.error(\n `Error evaluating enableIf for field \"${child.key}\" in container \"${key}[${domIndex}]\":`,\n error,\n );\n // Continue validation in case of error (fail-safe)\n }\n }\n\n const childKey = `${key}[${domIndex}].${child.key}`;\n const childResult = validateElement(\n { ...child, key: childKey } as Element,\n { path },\n itemContainer,\n );\n if (childResult.spread && childResult.value !== null && typeof childResult.value === \"object\") {\n Object.assign(itemData, childResult.value);\n } else {\n itemData[child.key] = childResult.value;\n }\n });\n items.push(itemData);\n });\n\n validateContainerCount(key, items, element);\n return { value: items, errors };\n } else {\n // Single container\n const containerData: Record<string, any> = {};\n const containerContainer =\n scopeRoot.querySelector<HTMLElement>(`[data-container=\"${key}\"]`) ||\n scopeRoot;\n\n element.elements.forEach((child: any) => {\n // Check enableIf condition for child element (relative to container data)\n if (child.enableIf) {\n try {\n const rootFormData = context.instance?.getState().formRoot\n ? extractRootFormData(context.instance.getState().formRoot!)\n : {};\n const shouldEnable = evaluateEnableCondition(\n child.enableIf,\n rootFormData, // Root form data for absolute scope\n containerData, // Container data for relative scope\n );\n if (!shouldEnable) {\n // Field is conditionally disabled, exclude from container data entirely\n return;\n }\n } catch (error) {\n console.error(\n `Error evaluating enableIf for field \"${child.key}\" in container \"${key}\":`,\n error,\n );\n // Continue validation in case of error (fail-safe)\n }\n }\n\n {\n const childKey = `${key}.${child.key}`;\n const childResult = validateElement(\n { ...child, key: childKey } as Element,\n { path },\n containerContainer,\n );\n if (childResult.spread && childResult.value !== null && typeof childResult.value === \"object\") {\n Object.assign(containerData, childResult.value);\n } else {\n containerData[child.key] = childResult.value;\n }\n }\n });\n\n return { value: containerData, errors };\n }\n}\n\n/**\n * Update container field value in DOM without re-render\n */\nexport function updateContainerField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { instance, scopeRoot } = context;\n\n if (!(\"elements\" in element)) {\n return;\n }\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple containers\n if (!Array.isArray(value)) {\n console.warn(\n `updateContainerField: Expected array for multiple container field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update nested fields for each item\n value.forEach((itemValue, index) => {\n if (isPlainObject(itemValue)) {\n element.elements.forEach((childElement) => {\n const childPath = `${fieldPath}[${index}].${childElement.key}`;\n\n // Handle flatOutput richinput children: the item value has flat keys instead of the schema key\n if (childElement.type === \"richinput\" && (childElement as any).flatOutput) {\n const richChild = childElement as any;\n const textKey: string = richChild.textKey ?? \"text\";\n const filesKey: string = richChild.filesKey ?? \"files\";\n const containerValue = itemValue as Record<string, any>;\n const compositeValue: Record<string, any> = {};\n if (textKey in containerValue) compositeValue[textKey] = containerValue[textKey];\n if (filesKey in containerValue) compositeValue[filesKey] = containerValue[filesKey];\n if (Object.keys(compositeValue).length > 0) {\n instance.updateField(childPath, compositeValue);\n }\n } else {\n const childValue = (itemValue as Record<string, any>)[childElement.key];\n if (childValue !== undefined) {\n instance.updateField(childPath, childValue);\n }\n }\n });\n }\n });\n\n const existingContainers = scopeRoot.querySelectorAll(\n `[data-container-item^=\"${fieldPath}[\"]`,\n );\n if (value.length !== existingContainers.length) {\n console.warn(\n `updateContainerField: Multiple container field \"${fieldPath}\" item count mismatch. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single container\n if (!isPlainObject(value)) {\n console.warn(\n `updateContainerField: Expected object for container field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update nested fields\n element.elements.forEach((childElement) => {\n const childPath = `${fieldPath}.${childElement.key}`;\n\n // Handle flatOutput richinput children: the container value has flat keys instead of the schema key\n if (childElement.type === \"richinput\" && (childElement as any).flatOutput) {\n const richChild = childElement as any;\n const textKey: string = richChild.textKey ?? \"text\";\n const filesKey: string = richChild.filesKey ?? \"files\";\n const containerValue = value as Record<string, any>;\n const compositeValue: Record<string, any> = {};\n if (textKey in containerValue) compositeValue[textKey] = containerValue[textKey];\n if (filesKey in containerValue) compositeValue[filesKey] = containerValue[filesKey];\n if (Object.keys(compositeValue).length > 0) {\n instance.updateField(childPath, compositeValue);\n }\n } else {\n const childValue = (value as Record<string, any>)[childElement.key];\n if (childValue !== undefined) {\n instance.updateField(childPath, childValue);\n }\n }\n });\n }\n}\n","// Group component - compatibility layer that delegates to container\n// Translates legacy GroupElement (with repeat: {min, max}) to ContainerElement (with multiple: true, minCount, maxCount)\n\nimport type {\n GroupElement,\n ContainerElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { isPlainObject } from \"../utils/helpers.js\";\nimport {\n renderSingleContainerElement,\n renderMultipleContainerElement,\n validateContainerElement,\n updateContainerField,\n} from \"./container.js\";\n\n// Export setter for renderElement function (called from components/index.ts)\n// This is a no-op since group now delegates to container (which has its own setRenderElement)\nexport function setRenderElement(\n _fn: (element: any, ctx: RenderContext) => HTMLElement,\n): void {\n // No-op: container handles renderElement initialization\n}\n\n/**\n * Renders a group element by translating it to a ContainerElement\n * and delegating to container rendering functions.\n *\n * This maintains backward compatibility with the legacy group type\n * while eliminating code duplication.\n *\n * @deprecated Use type: \"container\" with multiple: true instead of type: \"group\" with repeat: {min, max}\n */\nexport function renderGroupElement(\n element: GroupElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Log deprecation warning once per element\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated and will be removed in a future version. ` +\n `Please use type: \"container\" with multiple: true instead. ` +\n `Field key: \"${element.key}\"`,\n );\n }\n\n // Translate GroupElement → ContainerElement\n const containerElement: ContainerElement = {\n type: \"container\",\n key: element.key,\n label: element.label,\n description: element.description,\n hint: element.hint,\n required: element.required,\n hidden: element.hidden,\n default: element.default,\n actions: element.actions,\n elements: element.elements,\n // Translate repeat pattern to multiple pattern\n multiple: !!(element.repeat && isPlainObject(element.repeat)),\n minCount: element.repeat?.min,\n maxCount: element.repeat?.max,\n };\n\n // Delegate to container implementation\n if (containerElement.multiple) {\n renderMultipleContainerElement(containerElement, ctx, wrapper, pathKey);\n } else {\n renderSingleContainerElement(containerElement, ctx, wrapper, pathKey);\n }\n}\n\n// Legacy exports for backward compatibility (not used internally)\nexport { renderGroupElement as renderRepeatableGroup };\nexport { renderGroupElement as renderSingleGroup };\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Helper to translate GroupElement to ContainerElement\n */\nfunction translateGroupToContainer(element: Element): ContainerElement {\n const groupElement = element as GroupElement;\n return {\n type: \"container\",\n key: groupElement.key,\n label: groupElement.label,\n description: groupElement.description,\n hint: groupElement.hint,\n required: groupElement.required,\n hidden: groupElement.hidden,\n default: groupElement.default,\n actions: groupElement.actions,\n elements: groupElement.elements,\n // Translate repeat pattern to multiple pattern\n multiple: !!(groupElement.repeat && isPlainObject(groupElement.repeat)),\n minCount: groupElement.repeat?.min,\n maxCount: groupElement.repeat?.max,\n };\n}\n\n/**\n * Validate group field by delegating to container validation\n * @deprecated Use validateContainerElement with type: \"container\" instead\n */\nexport function validateGroupElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n // Log deprecation warning\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated. ` +\n `Please use type: \"container\" instead. Field key: \"${key}\"`,\n );\n }\n\n // Translate group to container and delegate\n const containerElement = translateGroupToContainer(element);\n return validateContainerElement(containerElement, key, context);\n}\n\n/**\n * Update group field by delegating to container update\n * @deprecated Use updateContainerField with type: \"container\" instead\n */\nexport function updateGroupField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n // Log deprecation warning\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated. ` +\n `Please use type: \"container\" instead. Field path: \"${fieldPath}\"`,\n );\n }\n\n // Translate group to container and delegate\n const containerElement = translateGroupToContainer(element);\n return updateContainerField(containerElement, fieldPath, value, context);\n}\n","// Table component rendering, validation, and update functions\n\nimport type {\n TableElement,\n TableMerge,\n TableData,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { t } from \"../utils/translation.js\";\n\n// ---------------------------------------------------------------------------\n// Legacy merge migration (row/col/rowspan/colspan → top/left/bottom/right)\n// ---------------------------------------------------------------------------\n\ninterface LegacyMerge {\n row: number;\n col: number;\n rowspan: number;\n colspan: number;\n}\n\nfunction isLegacyMerge(m: unknown): m is LegacyMerge {\n return (\n m !== null &&\n typeof m === \"object\" &&\n \"row\" in (m as object) &&\n \"col\" in (m as object) &&\n \"rowspan\" in (m as object) &&\n \"colspan\" in (m as object)\n );\n}\n\nfunction isValidMergeShape(m: unknown): m is TableMerge {\n if (m === null || typeof m !== \"object\") return false;\n const o = m as Record<string, unknown>;\n return (\n typeof o.top === \"number\" &&\n typeof o.left === \"number\" &&\n typeof o.bottom === \"number\" &&\n typeof o.right === \"number\"\n );\n}\n\nfunction migrateMerge(m: unknown): TableMerge | null {\n if (isLegacyMerge(m)) {\n return {\n top: m.row,\n left: m.col,\n bottom: m.row + m.rowspan - 1,\n right: m.col + m.colspan - 1,\n };\n }\n if (isValidMergeShape(m)) return m;\n return null;\n}\n\nfunction migrateMerges(merges: unknown[]): TableMerge[] {\n return merges.map(migrateMerge).filter((m): m is TableMerge => m !== null);\n}\n\n// ---------------------------------------------------------------------------\n// Internal data model helpers\n// ---------------------------------------------------------------------------\n\nfunction createEmptyCells(rows: number, cols: number): string[][] {\n return Array.from({ length: rows }, () =>\n Array.from({ length: cols }, () => \"\"),\n );\n}\n\n/**\n * Validate that merges don't overlap and are within bounds.\n * Returns an error string, or null if valid.\n */\nfunction validateMerges(\n merges: TableMerge[],\n rows: number,\n cols: number,\n): string | null {\n for (let i = 0; i < merges.length; i++) {\n const a = merges[i];\n if (\n a.top < 0 ||\n a.left < 0 ||\n a.bottom >= rows ||\n a.right >= cols ||\n a.top > a.bottom ||\n a.left > a.right\n )\n return `Merge ${i} out of bounds`;\n for (let j = i + 1; j < merges.length; j++) {\n const b = merges[j];\n if (\n a.top <= b.bottom &&\n a.bottom >= b.top &&\n a.left <= b.right &&\n a.right >= b.left\n )\n return `Merges ${i} and ${j} overlap`;\n }\n }\n return null;\n}\n\n/**\n * Check whether a given cell is \"shadowed\" (covered by a merge starting\n * at a different cell). Returns the owning merge if shadowed, null otherwise.\n */\nfunction getShadowingMerge(\n row: number,\n col: number,\n merges: TableMerge[],\n): TableMerge | null {\n for (const m of merges) {\n if (m.top === row && m.left === col) {\n return null; // This cell *is* the merge origin, not shadowed\n }\n if (\n row >= m.top &&\n row <= m.bottom &&\n col >= m.left &&\n col <= m.right\n ) {\n return m;\n }\n }\n return null;\n}\n\n/**\n * Find the merge that starts at (row, col), if any.\n */\nfunction getMergeAt(\n row: number,\n col: number,\n merges: TableMerge[],\n): TableMerge | null {\n return merges.find((m) => m.top === row && m.left === col) ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Selection state — held per-table in a closure\n// ---------------------------------------------------------------------------\n\ninterface SelectionState {\n anchor: { row: number; col: number } | null;\n focus: { row: number; col: number } | null;\n dragging: boolean;\n}\n\nfunction selectionRange(\n sel: SelectionState,\n): { r1: number; c1: number; r2: number; c2: number } | null {\n if (!sel.anchor) return null;\n const focus = sel.focus ?? sel.anchor;\n return {\n r1: Math.min(sel.anchor.row, focus.row),\n c1: Math.min(sel.anchor.col, focus.col),\n r2: Math.max(sel.anchor.row, focus.row),\n c2: Math.max(sel.anchor.col, focus.col),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Overlay button factory\n// ---------------------------------------------------------------------------\n\ninterface OverlayButtonOptions {\n label: string;\n title: string;\n size: number;\n color: string;\n textColor: string;\n onClick: (e: MouseEvent) => void;\n}\n\nfunction makeOverlayCircleBtn(opts: OverlayButtonOptions): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.textContent = opts.label;\n btn.title = opts.title;\n btn.style.cssText = `\n position: absolute;\n width: ${opts.size}px;\n height: ${opts.size}px;\n border-radius: 50%;\n border: none;\n background: ${opts.color};\n color: ${opts.textColor};\n font-size: ${Math.floor(opts.size * 0.6)}px;\n line-height: ${opts.size}px;\n text-align: center;\n cursor: pointer;\n z-index: 10;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 4px rgba(0,0,0,0.2);\n transition: transform 0.1s, opacity 0.1s;\n pointer-events: all;\n `;\n btn.addEventListener(\"mouseenter\", () => {\n btn.style.transform = \"scale(1.15)\";\n });\n btn.addEventListener(\"mouseleave\", () => {\n btn.style.transform = \"scale(1)\";\n });\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n opts.onClick(e);\n });\n return btn;\n}\n\n// ---------------------------------------------------------------------------\n// Readonly renderer\n// ---------------------------------------------------------------------------\n\nfunction renderReadonlyTable(data: TableData, wrapper: HTMLElement): void {\n const { cells, merges = [] } = data;\n if (cells.length === 0) return;\n\n const numCols = cells[0].length;\n\n const tableEl = document.createElement(\"table\");\n tableEl.style.cssText = `\n width: 100%;\n border-collapse: collapse;\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n color: var(--fb-text-color);\n `;\n\n cells.forEach((rowData, rIdx) => {\n const section =\n rIdx === 0\n ? tableEl.createTHead()\n : tableEl.tBodies[0] ?? tableEl.createTBody();\n\n const tr = section.insertRow();\n\n for (let cIdx = 0; cIdx < numCols; cIdx++) {\n if (getShadowingMerge(rIdx, cIdx, merges)) {\n continue;\n }\n\n const merge = getMergeAt(rIdx, cIdx, merges);\n const td = document.createElement(rIdx === 0 ? \"th\" : \"td\");\n\n if (merge) {\n const rowspan = merge.bottom - merge.top + 1;\n const colspan = merge.right - merge.left + 1;\n if (rowspan > 1) td.rowSpan = rowspan;\n if (colspan > 1) td.colSpan = colspan;\n }\n\n td.textContent = rowData[cIdx] ?? \"\";\n td.style.cssText = `\n padding: 6px 10px;\n border: var(--fb-border-width) solid var(--fb-border-color);\n text-align: left;\n vertical-align: top;\n ${rIdx === 0 ? \"background-color: var(--fb-background-hover-color); font-weight: 600;\" : \"\"}\n `;\n\n tr.appendChild(td);\n }\n });\n\n const scrollWrapper = document.createElement(\"div\");\n scrollWrapper.style.cssText = \"overflow-x: auto; max-width: 100%;\";\n scrollWrapper.appendChild(tableEl);\n wrapper.appendChild(scrollWrapper);\n}\n\n// ---------------------------------------------------------------------------\n// Edit renderer helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Activate contenteditable on a cell's content span.\n */\nfunction startCellEditing(\n span: HTMLSpanElement,\n r: number,\n c: number,\n getCells: () => string[][],\n persistValue: () => void,\n selectCell: (row: number, col: number) => void,\n): void {\n if (span.contentEditable === \"true\") return;\n\n span.contentEditable = \"true\";\n span.focus();\n\n // Place cursor at end\n const domRange = document.createRange();\n const winSel = window.getSelection();\n domRange.selectNodeContents(span);\n domRange.collapse(false);\n winSel?.removeAllRanges();\n winSel?.addRange(domRange);\n\n function commit(): void {\n span.contentEditable = \"inherit\";\n const cells = getCells();\n if (cells[r]) {\n cells[r][c] = span.textContent ?? \"\";\n }\n persistValue();\n }\n\n function onKeyDown(e: KeyboardEvent): void {\n const cells = getCells();\n const numCols = cells[0]?.length ?? 0;\n\n if (e.key === \"Escape\") {\n span.contentEditable = \"inherit\";\n span.textContent = cells[r]?.[c] ?? \"\";\n span.removeEventListener(\"keydown\", onKeyDown);\n span.removeEventListener(\"blur\", onBlur);\n return;\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n commit();\n span.removeEventListener(\"keydown\", onKeyDown);\n span.removeEventListener(\"blur\", onBlur);\n const nextRow = r + 1 < cells.length ? r + 1 : r;\n selectCell(nextRow, c);\n return;\n }\n if (e.key === \"Tab\") {\n e.preventDefault();\n e.stopPropagation();\n commit();\n span.removeEventListener(\"keydown\", onKeyDown);\n span.removeEventListener(\"blur\", onBlur);\n let nr = r;\n let nc = e.shiftKey ? c - 1 : c + 1;\n if (nc < 0) {\n nc = numCols - 1;\n nr = Math.max(0, r - 1);\n }\n if (nc >= numCols) {\n nc = 0;\n nr = Math.min(cells.length - 1, r + 1);\n }\n selectCell(nr, nc);\n }\n }\n\n function onBlur(): void {\n if (span.contentEditable === \"true\") {\n commit();\n span.removeEventListener(\"keydown\", onKeyDown);\n span.removeEventListener(\"blur\", onBlur);\n }\n }\n\n span.addEventListener(\"keydown\", onKeyDown);\n span.addEventListener(\"blur\", onBlur);\n}\n\n// ---------------------------------------------------------------------------\n// Loading overlay helpers\n// ---------------------------------------------------------------------------\n\nfunction ensureSpinKeyframes(): void {\n if (document.getElementById(\"fb-spin-keyframes\")) return;\n const style = document.createElement(\"style\");\n style.id = \"fb-spin-keyframes\";\n style.textContent = `@keyframes fb-spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n}\n\nfunction showLoadingOverlay(\n parent: HTMLElement,\n text: string,\n): HTMLElement {\n ensureSpinKeyframes();\n const overlay = document.createElement(\"div\");\n overlay.className = \"fb-table-loading-overlay\";\n overlay.style.cssText = `\n position: absolute; top: 0; left: 0; right: 0; bottom: 0;\n background: rgba(255,255,255,0.8); display: flex;\n align-items: center; justify-content: center; flex-direction: column;\n gap: 8px; z-index: 100;\n `;\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = `\n width: 24px; height: 24px; border: 3px solid var(--fb-border-color, #ccc);\n border-top-color: var(--fb-primary-color, #0066cc); border-radius: 50%;\n animation: fb-spin 0.8s linear infinite;\n `;\n const label = document.createElement(\"span\");\n label.textContent = text;\n label.style.cssText = `font-size: var(--fb-font-size-small, 12px); color: var(--fb-text-color, #333);`;\n overlay.appendChild(spinner);\n overlay.appendChild(label);\n parent.appendChild(overlay);\n return overlay;\n}\n\n// ---------------------------------------------------------------------------\n// Edit renderer\n// ---------------------------------------------------------------------------\n\nfunction renderEditTable(\n element: TableElement,\n initialData: TableData,\n pathKey: string,\n ctx: RenderContext,\n wrapper: HTMLElement,\n): void {\n const state = ctx.state;\n const instance = ctx.instance;\n const mergeAllowed = element.mergeAllowed !== false;\n const cellsKey = element.fieldNames?.cells ?? \"cells\";\n const mergesKey = element.fieldNames?.merges ?? \"merges\";\n\n // Mutable model (captured by all inner functions via closure)\n const cells: string[][] =\n initialData.cells.length > 0\n ? initialData.cells.map((r) => [...r])\n : createEmptyCells(element.rows ?? 3, element.columns ?? 3);\n let merges: TableMerge[] =\n initialData.merges ? [...initialData.merges] : [];\n\n const sel: SelectionState = { anchor: null, focus: null, dragging: false };\n\n // Hidden input carries the serialised value for getFormData\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n hiddenInput.value = JSON.stringify({ [cellsKey]: cells, [mergesKey]: merges });\n wrapper.appendChild(hiddenInput);\n\n function persistValue(): void {\n hiddenInput.value = JSON.stringify({ [cellsKey]: cells, [mergesKey]: merges });\n if (instance) {\n instance.triggerOnChange(pathKey, { [cellsKey]: cells, [mergesKey]: merges });\n }\n }\n\n // Fix #1: expose update callback so updateTableField can sync closure state\n (hiddenInput as HTMLInputElement & { _applyExternalUpdate?: (data: TableData) => void })\n ._applyExternalUpdate = (data: TableData) => {\n cells.length = 0;\n data.cells.forEach((row) => cells.push([...row]));\n merges.length = 0;\n if (data.merges) {\n data.merges.forEach((m) => merges.push({ ...m }));\n }\n sel.anchor = null;\n sel.focus = null;\n persistValue();\n rebuild();\n };\n\n // ---- DOM containers ----\n // Outer wrapper has padding so overlay (+) buttons are not clipped\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.style.cssText =\n \"position: relative; padding: 20px 20px 20px 24px; overflow-x: auto; max-width: 100%;\";\n\n const tableEl = document.createElement(\"table\");\n tableEl.style.cssText = `\n border-collapse: collapse;\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n color: var(--fb-text-color);\n table-layout: fixed;\n `;\n\n tableWrapper.appendChild(tableEl);\n\n // ---- File import (shared logic for button click and drag-and-drop) ----\n const acceptExts = element.importAccept?.map((ext) => `.${ext.toLowerCase()}`) ?? [];\n\n async function importFile(file: File): Promise<void> {\n if (!state.config.parseTableFile) return;\n\n // Validate extension if importAccept is specified\n if (acceptExts.length > 0) {\n const ext = file.name.toLowerCase().replace(/^.*(\\.[^.]+)$/, \"$1\");\n if (!acceptExts.includes(ext)) return;\n }\n\n const overlay = showLoadingOverlay(\n tableWrapper,\n t(\"tableImporting\", state),\n );\n\n try {\n const result = await state.config.parseTableFile(file);\n const importedCells = result.cells;\n const importedMerges = result.merges ?? [];\n\n if (importedMerges.length > 0) {\n const err = validateMerges(\n importedMerges,\n importedCells.length,\n importedCells[0]?.length ?? 0,\n );\n if (err) throw new Error(err);\n }\n\n cells.length = 0;\n importedCells.forEach((row) => cells.push([...row]));\n merges.length = 0;\n importedMerges.forEach((m) => merges.push({ ...m }));\n\n sel.anchor = null;\n sel.focus = null;\n persistValue();\n rebuild();\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : String(e);\n console.error(\n t(\"tableImportError\", state).replace(\"{error}\", errMsg),\n );\n } finally {\n overlay.remove();\n }\n }\n\n // Import button (paperclip icon in the top-left buffer of tableWrapper)\n if (element.importAccept && state.config.parseTableFile) {\n const importBtn = document.createElement(\"button\");\n importBtn.type = \"button\";\n importBtn.title = t(\"tableImportFile\", state);\n importBtn.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\"/></svg>`;\n importBtn.style.cssText = `\n position: absolute; top: 2px; left: 2px;\n width: 20px; height: 20px;\n padding: 0;\n display: flex; align-items: center; justify-content: center;\n color: var(--fb-text-color, #999);\n border: none;\n background: transparent;\n cursor: pointer;\n z-index: 2;\n `;\n importBtn.addEventListener(\"mouseenter\", () => {\n importBtn.style.color = \"var(--fb-primary-color, #0066cc)\";\n });\n importBtn.addEventListener(\"mouseleave\", () => {\n importBtn.style.color = \"var(--fb-text-color, #999)\";\n });\n\n const importInput = document.createElement(\"input\");\n importInput.type = \"file\";\n importInput.accept = acceptExts.join(\",\");\n importInput.style.display = \"none\";\n tableWrapper.appendChild(importInput);\n\n importBtn.addEventListener(\"click\", () => {\n importInput.click();\n });\n\n importInput.addEventListener(\"change\", () => {\n const file = importInput.files?.[0];\n if (file) importFile(file);\n importInput.value = \"\";\n });\n\n tableWrapper.appendChild(importBtn);\n\n // Drag-and-drop on tableWrapper\n let dragCounter = 0;\n tableWrapper.addEventListener(\"dragenter\", (e: DragEvent) => {\n e.preventDefault();\n dragCounter++;\n if (dragCounter === 1) {\n tableWrapper.style.outline = \"2px dashed var(--fb-primary-color, #0066cc)\";\n tableWrapper.style.outlineOffset = \"-2px\";\n }\n });\n tableWrapper.addEventListener(\"dragover\", (e: DragEvent) => {\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n });\n tableWrapper.addEventListener(\"dragleave\", (e: DragEvent) => {\n e.preventDefault();\n dragCounter--;\n if (dragCounter <= 0) {\n dragCounter = 0;\n tableWrapper.style.outline = \"\";\n tableWrapper.style.outlineOffset = \"\";\n }\n });\n tableWrapper.addEventListener(\"drop\", (e: DragEvent) => {\n e.preventDefault();\n dragCounter = 0;\n tableWrapper.style.outline = \"\";\n tableWrapper.style.outlineOffset = \"\";\n const file = e.dataTransfer?.files?.[0];\n if (file) importFile(file);\n });\n }\n\n wrapper.appendChild(tableWrapper);\n\n // ---- Context menu (floating panel for merge/split) ----\n // Appended to wrapper (inside the form root) so destroy() cleans it up.\n const contextMenu = document.createElement(\"div\");\n contextMenu.style.cssText = `\n position: fixed;\n display: none;\n background: white;\n border: 1px solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n padding: 4px;\n z-index: 1000;\n gap: 4px;\n flex-direction: column;\n `;\n wrapper.appendChild(contextMenu);\n\n function makeContextMenuBtn(label: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.textContent = label;\n btn.style.cssText = `\n padding: 4px 10px;\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-color);\n border: 1px solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background: transparent;\n cursor: pointer;\n white-space: nowrap;\n text-align: left;\n `;\n btn.addEventListener(\"mouseenter\", () => {\n btn.style.background = \"var(--fb-background-hover-color)\";\n });\n btn.addEventListener(\"mouseleave\", () => {\n btn.style.background = \"transparent\";\n });\n btn.addEventListener(\"click\", () => {\n hideContextMenu();\n onClick();\n });\n return btn;\n }\n\n function showContextMenu(x: number, y: number): void {\n if (!mergeAllowed) return;\n contextMenu.innerHTML = \"\";\n contextMenu.style.display = \"flex\";\n\n const range = selectionRange(sel);\n const isMultiCell = range && (range.r1 !== range.r2 || range.c1 !== range.c2);\n const isSingleMerged = sel.anchor && getMergeAt(sel.anchor.row, sel.anchor.col, merges);\n\n if (isMultiCell) {\n contextMenu.appendChild(\n makeContextMenuBtn(t(\"tableMergeCells\", state), mergeCells),\n );\n }\n if (isSingleMerged) {\n contextMenu.appendChild(\n makeContextMenuBtn(t(\"tableSplitCell\", state), splitCell),\n );\n }\n\n if (!contextMenu.firstChild) {\n hideContextMenu();\n return;\n }\n\n // Position near click\n const menuWidth = 140;\n const menuHeight = contextMenu.children.length * 32 + 8;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const left = x + menuWidth > vw ? x - menuWidth : x;\n const top = y + menuHeight > vh ? y - menuHeight : y;\n\n contextMenu.style.left = `${left}px`;\n contextMenu.style.top = `${top}px`;\n }\n\n function hideContextMenu(): void {\n contextMenu.style.display = \"none\";\n }\n\n // Close context menu on outside click (auto-cleanup when DOM disconnected)\n const menuDismissCtrl = new AbortController();\n document.addEventListener(\"mousedown\", (e) => {\n if (!wrapper.isConnected) {\n menuDismissCtrl.abort();\n return;\n }\n if (!contextMenu.contains(e.target as Node)) {\n hideContextMenu();\n }\n }, { signal: menuDismissCtrl.signal });\n\n // ---- Update selection visuals without rebuilding DOM ----\n function applySelectionStyles(): void {\n const range = selectionRange(sel);\n const allTds =\n tableEl.querySelectorAll<HTMLTableCellElement>(\"td[data-row]\");\n allTds.forEach((td) => {\n const r = parseInt(td.getAttribute(\"data-row\") || \"0\", 10);\n const c = parseInt(td.getAttribute(\"data-col\") || \"0\", 10);\n const isAnchor =\n sel.anchor !== null &&\n sel.anchor.row === r &&\n sel.anchor.col === c;\n const inRange =\n range !== null &&\n r >= range.r1 &&\n r <= range.r2 &&\n c >= range.c1 &&\n c <= range.c2;\n\n td.style.outline = isAnchor\n ? \"2px solid var(--fb-primary-color, #0066cc)\"\n : \"\";\n td.style.outlineOffset = isAnchor ? \"-2px\" : \"\";\n\n // Preserve header background\n if (r === 0) {\n td.style.backgroundColor = \"var(--fb-background-hover-color)\";\n } else {\n td.style.backgroundColor =\n inRange && !isAnchor ? \"rgba(0,102,204,0.08)\" : \"\";\n }\n });\n\n }\n\n // ---- selectCell: set anchor, update styles, focus table ----\n function selectCell(row: number, col: number): void {\n sel.anchor = { row, col };\n sel.focus = null;\n applySelectionStyles();\n tableEl.focus();\n }\n\n // ---- editCell: focus the span inside a cell for immediate editing ----\n function editCell(row: number, col: number): void {\n const td = tableEl.querySelector<HTMLTableCellElement>(\n `td[data-row=\"${row}\"][data-col=\"${col}\"]`,\n );\n if (!td) return;\n const span = td.querySelector(\"span\");\n if (!span) return;\n sel.anchor = { row, col };\n sel.focus = null;\n applySelectionStyles();\n startCellEditing(span, row, col, () => cells, persistValue, selectCell);\n }\n\n // ---- Row / Column operations ----\n function addRow(afterIndex?: number): void {\n const numCols =\n cells.length > 0 ? cells[0].length : element.columns ?? 3;\n const newRow = Array<string>(numCols).fill(\"\");\n const insertAt = afterIndex !== undefined ? afterIndex + 1 : cells.length;\n cells.splice(insertAt, 0, newRow);\n\n // Adjust merges for rows after insertion\n merges = merges.map((m) => {\n if (m.top >= insertAt) {\n return { ...m, top: m.top + 1, bottom: m.bottom + 1 };\n }\n if (m.top < insertAt && m.bottom >= insertAt) {\n return { ...m, bottom: m.bottom + 1 };\n }\n return m;\n });\n\n persistValue();\n rebuild();\n }\n\n function removeRow(targetRow?: number): void {\n if (cells.length <= 1) return;\n const rowToRemove =\n targetRow !== undefined\n ? targetRow\n : sel.anchor\n ? sel.anchor.row\n : cells.length - 1;\n\n merges = merges\n .map((m) => {\n if (m.top === rowToRemove && m.bottom === rowToRemove) return null;\n if (m.top === rowToRemove) {\n // Merge starts at removed row: keep top (now points to next row), shrink bottom\n return { ...m, bottom: m.bottom - 1 };\n }\n if (m.bottom === rowToRemove) {\n return { ...m, bottom: m.bottom - 1 };\n }\n if (m.top < rowToRemove && m.bottom > rowToRemove) {\n return { ...m, bottom: m.bottom - 1 };\n }\n if (m.top > rowToRemove) {\n return { ...m, top: m.top - 1, bottom: m.bottom - 1 };\n }\n return m;\n })\n .filter((m): m is TableMerge => m !== null);\n\n cells.splice(rowToRemove, 1);\n if (sel.anchor && sel.anchor.row >= cells.length) {\n sel.anchor = { row: cells.length - 1, col: sel.anchor.col };\n }\n persistValue();\n rebuild();\n }\n\n function addColumn(afterIndex?: number): void {\n const insertAt = afterIndex !== undefined ? afterIndex + 1 : cells[0]?.length ?? 0;\n cells.forEach((row) => row.splice(insertAt, 0, \"\"));\n\n // Adjust merges for columns after insertion\n merges = merges.map((m) => {\n if (m.left >= insertAt) {\n return { ...m, left: m.left + 1, right: m.right + 1 };\n }\n if (m.left < insertAt && m.right >= insertAt) {\n return { ...m, right: m.right + 1 };\n }\n return m;\n });\n\n persistValue();\n rebuild();\n }\n\n function removeColumn(targetCol?: number): void {\n if (cells.length === 0 || cells[0].length <= 1) return;\n const colToRemove =\n targetCol !== undefined\n ? targetCol\n : sel.anchor\n ? sel.anchor.col\n : cells[0].length - 1;\n\n merges = merges\n .map((m) => {\n if (m.left === colToRemove && m.right === colToRemove) return null;\n if (m.left === colToRemove) {\n // Merge starts at removed col: keep left (now points to next col), shrink right\n return { ...m, right: m.right - 1 };\n }\n if (m.right === colToRemove) {\n return { ...m, right: m.right - 1 };\n }\n if (m.left < colToRemove && m.right > colToRemove) {\n return { ...m, right: m.right - 1 };\n }\n if (m.left > colToRemove) {\n return { ...m, left: m.left - 1, right: m.right - 1 };\n }\n return m;\n })\n .filter((m): m is TableMerge => m !== null);\n\n cells.forEach((row) => row.splice(colToRemove, 1));\n if (sel.anchor && sel.anchor.col >= cells[0].length) {\n sel.anchor = { row: sel.anchor.row, col: cells[0].length - 1 };\n }\n persistValue();\n rebuild();\n }\n\n // ---- Merge logic ----\n function mergeCells(): void {\n if (!mergeAllowed) return;\n const range = selectionRange(sel);\n if (!range) return;\n const { r1, c1, r2, c2 } = range;\n if (r1 === r2 && c1 === c2) return;\n\n // Remove any merge that overlaps with the selection\n merges = merges.filter((m) => {\n const overlaps =\n m.top <= r2 && m.bottom >= r1 && m.left <= c2 && m.right >= c1;\n return !overlaps;\n });\n\n // Clear shadowed cells; keep anchor text\n const anchorText = cells[r1][c1];\n for (let r = r1; r <= r2; r++) {\n for (let c = c1; c <= c2; c++) {\n if (r !== r1 || c !== c1) {\n cells[r][c] = \"\";\n }\n }\n }\n cells[r1][c1] = anchorText;\n\n const newMerge: TableMerge = { top: r1, left: c1, bottom: r2, right: c2 };\n const testMerges = [...merges, newMerge];\n const err = validateMerges(testMerges, cells.length, cells[0]?.length ?? 0);\n if (err) {\n console.warn(\"Merge validation failed:\", err);\n return;\n }\n\n merges.push(newMerge);\n sel.anchor = { row: r1, col: c1 };\n sel.focus = null;\n persistValue();\n rebuild();\n }\n\n function splitCell(): void {\n if (!mergeAllowed) return;\n if (!sel.anchor) return;\n const { row, col } = sel.anchor;\n const mIdx = merges.findIndex((m) => m.top === row && m.left === col);\n if (mIdx === -1) return;\n\n merges.splice(mIdx, 1);\n sel.focus = null;\n persistValue();\n rebuild();\n }\n\n // ---- Full re-render of table DOM ----\n function rebuild(): void {\n tableEl.innerHTML = \"\";\n\n const numRows = cells.length;\n const numCols = numRows > 0 ? cells[0].length : 0;\n const range = selectionRange(sel);\n\n // Header row (row 0) — rendered as regular td rows but styled distinctly\n for (let rIdx = 0; rIdx < numRows; rIdx++) {\n const section =\n rIdx === 0\n ? tableEl.tHead ?? tableEl.createTHead()\n : tableEl.tBodies[0] ?? tableEl.createTBody();\n\n const tr = section.insertRow();\n\n for (let cIdx = 0; cIdx < numCols; cIdx++) {\n if (getShadowingMerge(rIdx, cIdx, merges)) {\n continue;\n }\n\n const merge = getMergeAt(rIdx, cIdx, merges);\n const td = document.createElement(\"td\");\n td.setAttribute(\"data-row\", String(rIdx));\n td.setAttribute(\"data-col\", String(cIdx));\n\n if (merge) {\n const rowspan = merge.bottom - merge.top + 1;\n const colspan = merge.right - merge.left + 1;\n if (rowspan > 1) td.rowSpan = rowspan;\n if (colspan > 1) td.colSpan = colspan;\n }\n\n const inRange =\n range !== null &&\n rIdx >= range.r1 &&\n rIdx <= range.r2 &&\n cIdx >= range.c1 &&\n cIdx <= range.c2;\n\n const isAnchor =\n sel.anchor !== null &&\n sel.anchor.row === rIdx &&\n sel.anchor.col === cIdx;\n\n td.style.cssText = [\n \"border: var(--fb-border-width) solid var(--fb-border-color);\",\n \"padding: 4px 8px;\",\n \"min-width: 80px;\",\n \"vertical-align: top;\",\n \"cursor: text;\",\n \"position: relative;\",\n rIdx === 0\n ? \"background-color: var(--fb-background-hover-color); font-weight: 600;\"\n : \"\",\n inRange && !isAnchor\n ? \"background-color: rgba(0,102,204,0.08);\"\n : \"\",\n isAnchor\n ? \"outline: 2px solid var(--fb-primary-color, #0066cc); outline-offset: -2px;\"\n : \"\",\n ].join(\" \");\n\n const content = document.createElement(\"span\");\n content.textContent = cells[rIdx][cIdx];\n content.style.cssText =\n \"display: block; min-height: 1.4em; white-space: pre-wrap; word-break: break-word; outline: none;\";\n td.appendChild(content);\n\n // Capture loop variables for event listeners\n const capturedR = rIdx;\n const capturedC = cIdx;\n\n // Single click → edit cell immediately\n td.addEventListener(\"mousedown\", (e) => {\n // If clicking on overlay button, let it handle itself\n if ((e.target as HTMLElement).tagName === \"BUTTON\") return;\n // If already editing this cell, don't interfere\n if ((e.target as HTMLElement).contentEditable === \"true\") return;\n // If any span is editing and we click another cell, blur will commit\n\n // Right-click inside existing selection → preserve selection for context menu\n if (e.button === 2) {\n const range = selectionRange(sel);\n if (\n range &&\n capturedR >= range.r1 &&\n capturedR <= range.r2 &&\n capturedC >= range.c1 &&\n capturedC <= range.c2\n ) {\n return; // Don't reset selection\n }\n }\n\n if (e.shiftKey && sel.anchor) {\n e.preventDefault();\n sel.focus = { row: capturedR, col: capturedC };\n sel.dragging = false;\n applySelectionStyles();\n } else {\n // Start drag selection\n sel.anchor = { row: capturedR, col: capturedC };\n sel.focus = null;\n sel.dragging = true;\n applySelectionStyles();\n }\n });\n\n td.addEventListener(\"mouseup\", (e) => {\n if ((e.target as HTMLElement).tagName === \"BUTTON\") return;\n if (sel.dragging) {\n sel.dragging = false;\n // If selection is single cell (no drag range), start editing\n const currentRange = selectionRange(sel);\n const isSingleCell =\n !currentRange ||\n (currentRange.r1 === currentRange.r2 &&\n currentRange.c1 === currentRange.c2);\n if (isSingleCell) {\n editCell(capturedR, capturedC);\n }\n }\n });\n\n td.addEventListener(\"mousemove\", (e) => {\n if (sel.dragging && e.buttons === 1) {\n const currentAnchor = sel.anchor;\n if (\n currentAnchor &&\n (currentAnchor.row !== capturedR || currentAnchor.col !== capturedC)\n ) {\n sel.focus = { row: capturedR, col: capturedC };\n applySelectionStyles();\n }\n }\n });\n\n // Right-click for context menu\n td.addEventListener(\"contextmenu\", (e) => {\n if (!mergeAllowed) return;\n const currentRange = selectionRange(sel);\n const isMulti =\n currentRange &&\n (currentRange.r1 !== currentRange.r2 || currentRange.c1 !== currentRange.c2);\n const isMerged = sel.anchor && getMergeAt(sel.anchor.row, sel.anchor.col, merges);\n if (isMulti || isMerged) {\n e.preventDefault();\n showContextMenu(e.clientX, e.clientY);\n }\n });\n\n tr.appendChild(td);\n }\n }\n\n // ---- Hover overlay (+) buttons for insert row/column ----\n buildInsertOverlays();\n\n // Table keyboard handler — replaced on each rebuild\n tableEl.setAttribute(\"tabindex\", \"0\");\n tableEl.onkeydown = (e: KeyboardEvent) => {\n const editing = tableEl.querySelector(\"[contenteditable='true']\");\n if (editing) return;\n\n const anchor = sel.anchor;\n if (!anchor) return;\n\n const numRows2 = cells.length;\n const numCols2 = numRows2 > 0 ? cells[0].length : 0;\n\n const navDeltas: Record<string, [number, number]> = {\n ArrowUp: [-1, 0],\n ArrowDown: [1, 0],\n ArrowLeft: [0, -1],\n ArrowRight: [0, 1],\n };\n\n if (navDeltas[e.key]) {\n e.preventDefault();\n const [dr, dc] = navDeltas[e.key];\n const newRow = Math.max(0, Math.min(numRows2 - 1, anchor.row + dr));\n const newCol = Math.max(0, Math.min(numCols2 - 1, anchor.col + dc));\n if (e.shiftKey) {\n sel.focus = { row: newRow, col: newCol };\n applySelectionStyles();\n } else {\n selectCell(newRow, newCol);\n }\n return;\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n editCell(anchor.row, anchor.col);\n return;\n }\n\n if (e.key === \"Tab\") {\n e.preventDefault();\n const numCols3 = cells[0]?.length ?? 0;\n let nr = anchor.row;\n let nc = e.shiftKey ? anchor.col - 1 : anchor.col + 1;\n if (nc < 0) {\n nc = numCols3 - 1;\n nr = Math.max(0, nr - 1);\n }\n if (nc >= numCols3) {\n nc = 0;\n nr = Math.min(cells.length - 1, nr + 1);\n }\n selectCell(nr, nc);\n return;\n }\n\n if (mergeAllowed && e.key === \"m\" && e.ctrlKey && !e.shiftKey) {\n e.preventDefault();\n mergeCells();\n return;\n }\n\n if (mergeAllowed && e.key === \"M\" && e.ctrlKey && e.shiftKey) {\n e.preventDefault();\n splitCell();\n }\n };\n\n // ---- Copy: export selected cells as TSV + clean HTML ----\n tableEl.oncopy = (e: ClipboardEvent) => {\n const range = selectionRange(sel);\n if (!range) return;\n e.preventDefault();\n\n const { r1, c1, r2, c2 } = range;\n const tsvRows: string[] = [];\n const htmlRows: string[] = [];\n\n for (let r = r1; r <= r2; r++) {\n const tsvCols: string[] = [];\n const htmlCols: string[] = [];\n for (let c = c1; c <= c2; c++) {\n const val = cells[r]?.[c] ?? \"\";\n tsvCols.push(val);\n const escaped = val\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n htmlCols.push(`<td>${escaped}</td>`);\n }\n tsvRows.push(tsvCols.join(\"\\t\"));\n htmlRows.push(`<tr>${htmlCols.join(\"\")}</tr>`);\n }\n\n const tsvText = tsvRows.join(\"\\n\");\n const htmlText = `<table>${htmlRows.join(\"\")}</table>`;\n\n e.clipboardData?.setData(\"text/plain\", tsvText);\n e.clipboardData?.setData(\"text/html\", htmlText);\n };\n\n // ---- Paste: parse TSV from clipboard into cells ----\n tableEl.onpaste = (e: ClipboardEvent) => {\n const anchor = sel.anchor;\n if (!anchor) return;\n\n const text = e.clipboardData?.getData(\"text/plain\") ?? \"\";\n const isMultiCell =\n text.includes(\"\\t\") ||\n text.split(/\\r?\\n/).filter((l) => l).length > 1;\n\n // Single-value paste while editing → let browser handle it natively\n const editing =\n tableEl.querySelector<HTMLElement>(\"[contenteditable='true']\");\n if (editing && !isMultiCell) return;\n\n e.preventDefault();\n\n // If editing, commit current cell and exit edit mode\n if (editing) {\n editing.contentEditable = \"inherit\";\n const r = parseInt(\n editing.closest(\"td\")?.getAttribute(\"data-row\") ?? \"0\",\n 10,\n );\n const c = parseInt(\n editing.closest(\"td\")?.getAttribute(\"data-col\") ?? \"0\",\n 10,\n );\n if (cells[r]) {\n cells[r][c] = editing.textContent ?? \"\";\n }\n }\n if (!text.trim()) return;\n\n const pasteRows = text.split(/\\r?\\n/).map((line) => line.split(\"\\t\"));\n // Remove trailing empty row (common in spreadsheet copies)\n if (\n pasteRows.length > 1 &&\n pasteRows[pasteRows.length - 1].length === 1 &&\n pasteRows[pasteRows.length - 1][0] === \"\"\n ) {\n pasteRows.pop();\n }\n\n const startR = anchor.row;\n const startC = anchor.col;\n\n // Expand table if paste data exceeds current size\n const neededRows = startR + pasteRows.length;\n while (cells.length < neededRows) {\n cells.push(Array<string>(cells[0]?.length ?? 1).fill(\"\"));\n }\n const maxPasteCols = Math.max(...pasteRows.map((r) => r.length));\n const neededCols = startC + maxPasteCols;\n if (cells[0] && neededCols > cells[0].length) {\n const extraCols = neededCols - cells[0].length;\n cells.forEach((row) => {\n for (let i = 0; i < extraCols; i++) row.push(\"\");\n });\n }\n\n for (let pr = 0; pr < pasteRows.length; pr++) {\n for (let pc = 0; pc < pasteRows[pr].length; pc++) {\n const tr = startR + pr;\n const tc = startC + pc;\n if (cells[tr]) {\n cells[tr][tc] = pasteRows[pr][pc];\n }\n }\n }\n\n persistValue();\n rebuild();\n };\n }\n\n // ---- Unified hover overlay (+) buttons for inserting rows/columns ----\n // One floating button for columns, one for rows. Positioned via mousemove\n // on the wrapper (includes padding buffer zone).\n const insertColBtn = makeOverlayCircleBtn({\n label: \"+\",\n title: t(\"tableAddColumn\", state),\n size: 20,\n color: \"var(--fb-primary-color, #0066cc)\",\n textColor: \"white\",\n onClick: () => {\n const afterIdx = parseInt(insertColBtn.dataset.afterCol ?? \"0\", 10);\n addColumn(afterIdx);\n },\n });\n insertColBtn.style.position = \"absolute\";\n insertColBtn.style.display = \"none\";\n tableWrapper.appendChild(insertColBtn);\n\n const insertRowBtn = makeOverlayCircleBtn({\n label: \"+\",\n title: t(\"tableAddRow\", state),\n size: 20,\n color: \"var(--fb-primary-color, #0066cc)\",\n textColor: \"white\",\n onClick: () => {\n const afterIdx = parseInt(insertRowBtn.dataset.afterRow ?? \"0\", 10);\n addRow(afterIdx);\n },\n });\n insertRowBtn.style.position = \"absolute\";\n insertRowBtn.style.display = \"none\";\n tableWrapper.appendChild(insertRowBtn);\n\n // Overlay (×) buttons for columns and rows — recreated on each rebuild\n let colRemoveBtns: HTMLButtonElement[] = [];\n let rowRemoveBtns: HTMLButtonElement[] = [];\n\n // (+) to add column at end (shown in right buffer)\n const addLastColBtn = makeOverlayCircleBtn({\n label: \"+\",\n title: t(\"tableAddColumn\", state),\n size: 20,\n color: \"var(--fb-primary-color, #0066cc)\",\n textColor: \"white\",\n onClick: () => addColumn(),\n });\n addLastColBtn.style.position = \"absolute\";\n addLastColBtn.style.display = \"none\";\n tableWrapper.appendChild(addLastColBtn);\n\n // (+) to add row at end (shown in bottom buffer)\n const addLastRowBtn = makeOverlayCircleBtn({\n label: \"+\",\n title: t(\"tableAddRow\", state),\n size: 20,\n color: \"var(--fb-primary-color, #0066cc)\",\n textColor: \"white\",\n onClick: () => addRow(),\n });\n addLastRowBtn.style.position = \"absolute\";\n addLastRowBtn.style.display = \"none\";\n tableWrapper.appendChild(addLastRowBtn);\n\n function buildInsertOverlays(): void {\n // Clear previous remove buttons\n colRemoveBtns.forEach((b) => b.remove());\n colRemoveBtns = [];\n rowRemoveBtns.forEach((b) => b.remove());\n rowRemoveBtns = [];\n\n const numCols = cells.length > 0 ? cells[0].length : 0;\n const numRows = cells.length;\n\n // Create column (×) remove buttons — positioned dynamically on mousemove\n if (numCols > 1) {\n const headerCells = Array.from(\n tableEl.querySelectorAll<HTMLTableCellElement>(\"thead td[data-col]\"),\n );\n for (const hc of headerCells) {\n const colIdx = parseInt(hc.getAttribute(\"data-col\") ?? \"0\", 10);\n const btn = makeOverlayCircleBtn({\n label: \"×\",\n title: t(\"tableRemoveColumn\", state),\n size: 16,\n color: \"var(--fb-error-color, #dc3545)\",\n textColor: \"white\",\n onClick: () => removeColumn(colIdx),\n });\n btn.setAttribute(\"data-action\", \"remove-col\");\n btn.setAttribute(\"data-col\", String(colIdx));\n btn.style.position = \"absolute\";\n btn.style.display = \"none\";\n tableWrapper.appendChild(btn);\n colRemoveBtns.push(btn);\n }\n }\n\n // Create row (×) remove buttons — positioned dynamically on mousemove\n if (numRows > 1) {\n const allRowElements = [\n ...(tableEl.tHead ? Array.from(tableEl.tHead.rows) : []),\n ...(tableEl.tBodies[0] ? Array.from(tableEl.tBodies[0].rows) : []),\n ].filter((r) => r.querySelector(\"td[data-row]\"));\n for (const rowEl of allRowElements) {\n const firstTd = rowEl.querySelector<HTMLTableCellElement>(\"td[data-row]\");\n if (!firstTd) continue;\n const rowIdx = parseInt(firstTd.getAttribute(\"data-row\") ?? \"0\", 10);\n const btn = makeOverlayCircleBtn({\n label: \"×\",\n title: t(\"tableRemoveRow\", state),\n size: 16,\n color: \"var(--fb-error-color, #dc3545)\",\n textColor: \"white\",\n onClick: () => removeRow(rowIdx),\n });\n btn.setAttribute(\"data-action\", \"remove-row\");\n btn.setAttribute(\"data-row\", String(rowIdx));\n btn.style.position = \"absolute\";\n btn.style.display = \"none\";\n tableWrapper.appendChild(btn);\n rowRemoveBtns.push(btn);\n }\n }\n\n // ---- Buffer zone overlay positioning helpers ----\n function updateTopZoneOverlays(\n mx: number, wr: DOMRect, tblR: DOMRect, scrollL: number, active: boolean,\n ): void {\n const headerCells = active\n ? Array.from(tableEl.querySelectorAll<HTMLTableCellElement>(\"thead td[data-col]\"))\n : [];\n\n let closestColIdx = -1;\n let closestColDist = Infinity;\n let closestBorderX = -1;\n let closestAfterCol = -1;\n let closestBorderDist = Infinity;\n\n for (let i = 0; i < headerCells.length; i++) {\n const cellRect = headerCells[i].getBoundingClientRect();\n const centerX = (cellRect.left + cellRect.right) / 2;\n const dist = Math.abs(mx - centerX);\n if (dist < closestColDist) {\n closestColDist = dist;\n closestColIdx = i;\n }\n const borderDist = Math.abs(mx - cellRect.right);\n if (borderDist < closestBorderDist && borderDist < 20) {\n closestBorderDist = borderDist;\n closestBorderX = cellRect.right - wr.left + scrollL;\n closestAfterCol = parseInt(headerCells[i].getAttribute(\"data-col\") ?? \"0\", 10);\n }\n }\n\n colRemoveBtns.forEach((btn, idx) => {\n if (!active || idx !== closestColIdx) {\n btn.style.display = \"none\";\n return;\n }\n const cellRect = headerCells[idx].getBoundingClientRect();\n const centerX = (cellRect.left + cellRect.right) / 2 - wr.left + scrollL;\n btn.style.left = `${centerX - 8}px`;\n btn.style.top = \"2px\";\n btn.style.display = \"flex\";\n });\n\n if (active && closestAfterCol >= 0) {\n insertColBtn.style.display = \"flex\";\n insertColBtn.style.left = `${closestBorderX - 10}px`;\n insertColBtn.style.top = `${tblR.top - wr.top - 10}px`;\n insertColBtn.dataset.afterCol = String(closestAfterCol);\n } else {\n insertColBtn.style.display = \"none\";\n }\n }\n\n function updateLeftZoneOverlays(\n my: number, wr: DOMRect, tblR: DOMRect, scrollL: number, active: boolean,\n ): void {\n const allRowEls: HTMLTableRowElement[] = [];\n if (active) {\n if (tableEl.tHead) {\n for (const row of Array.from(tableEl.tHead.rows)) {\n if (row.querySelector(\"td[data-row]\")) allRowEls.push(row);\n }\n }\n if (tableEl.tBodies[0]) {\n for (const row of Array.from(tableEl.tBodies[0].rows)) {\n if (row.querySelector(\"td[data-row]\")) allRowEls.push(row);\n }\n }\n }\n\n let closestRowIdx = -1;\n let closestRowDist = Infinity;\n let closestBorderY = -1;\n let closestAfterRow = -1;\n let closestRowBorderDist = Infinity;\n\n for (let i = 0; i < allRowEls.length; i++) {\n const trRect = allRowEls[i].getBoundingClientRect();\n const centerY = (trRect.top + trRect.bottom) / 2;\n const dist = Math.abs(my - centerY);\n if (dist < closestRowDist) {\n closestRowDist = dist;\n closestRowIdx = i;\n }\n const borderDist = Math.abs(my - trRect.bottom);\n if (borderDist < closestRowBorderDist && borderDist < 14) {\n closestRowBorderDist = borderDist;\n closestBorderY = trRect.bottom - wr.top;\n const firstTd = allRowEls[i].querySelector(\"td[data-row]\");\n closestAfterRow = parseInt(firstTd?.getAttribute(\"data-row\") ?? \"0\", 10);\n }\n }\n\n rowRemoveBtns.forEach((btn, idx) => {\n if (!active || idx !== closestRowIdx) {\n btn.style.display = \"none\";\n return;\n }\n const trRect = allRowEls[idx].getBoundingClientRect();\n const centerY = (trRect.top + trRect.bottom) / 2 - wr.top;\n btn.style.left = \"4px\";\n btn.style.top = `${centerY - 8}px`;\n btn.style.display = \"flex\";\n });\n\n if (active && closestAfterRow >= 0) {\n insertRowBtn.style.display = \"flex\";\n insertRowBtn.style.top = `${closestBorderY - 10}px`;\n insertRowBtn.style.left = `${tblR.left - wr.left + scrollL - 10}px`;\n insertRowBtn.dataset.afterRow = String(closestAfterRow);\n } else {\n insertRowBtn.style.display = \"none\";\n }\n }\n\n // Unified mousemove handler (rAF-throttled for performance)\n let rafPending = false;\n tableWrapper.onmousemove = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === \"BUTTON\" && target.parentElement === tableWrapper) return;\n\n if (rafPending) return;\n rafPending = true;\n const mx = e.clientX;\n const my = e.clientY;\n\n requestAnimationFrame(() => {\n rafPending = false;\n const wr = tableWrapper.getBoundingClientRect();\n const tblR = tableEl.getBoundingClientRect();\n const scrollL = tableWrapper.scrollLeft;\n\n const inTopZone = my >= wr.top && my < tblR.top + 4;\n const inLeftZone = mx >= wr.left && mx < tblR.left + 4;\n const visibleRight = Math.min(tblR.right, wr.right);\n const inRightZone = mx > visibleRight - 20 && mx <= wr.right;\n const inBottomZone = my > tblR.bottom - 4 && my <= wr.bottom + 20;\n\n updateTopZoneOverlays(mx, wr, tblR, scrollL, inTopZone);\n updateLeftZoneOverlays(my, wr, tblR, scrollL, inLeftZone);\n\n addLastColBtn.style.display = inRightZone ? \"flex\" : \"none\";\n if (inRightZone) {\n addLastColBtn.style.left = `${wr.right - wr.left + scrollL - 20}px`;\n addLastColBtn.style.top = `${(tblR.top + tblR.bottom) / 2 - wr.top - 10}px`;\n }\n\n addLastRowBtn.style.display = inBottomZone ? \"flex\" : \"none\";\n if (inBottomZone) {\n const visibleCenterX = (wr.left + wr.right) / 2 - wr.left + scrollL;\n addLastRowBtn.style.left = `${visibleCenterX - 10}px`;\n addLastRowBtn.style.top = `${tblR.bottom - wr.top - 10}px`;\n }\n });\n };\n\n tableWrapper.onmouseleave = () => {\n colRemoveBtns.forEach((btn) => { btn.style.display = \"none\"; });\n rowRemoveBtns.forEach((btn) => { btn.style.display = \"none\"; });\n insertColBtn.style.display = \"none\";\n insertRowBtn.style.display = \"none\";\n addLastColBtn.style.display = \"none\";\n addLastRowBtn.style.display = \"none\";\n };\n }\n\n // Initial render\n rebuild();\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nfunction defaultTableData(element: TableElement): TableData {\n return {\n cells: createEmptyCells(element.rows ?? 3, element.columns ?? 3),\n merges: [],\n };\n}\n\nfunction isTableData(v: unknown): v is TableData {\n return (\n v !== null &&\n typeof v === \"object\" &&\n \"cells\" in (v as object) &&\n Array.isArray((v as TableData).cells)\n );\n}\n\n/**\n * Check if value has table data using custom field names\n */\nfunction isTableDataWithFieldNames(\n v: unknown,\n cellsKey: string,\n): boolean {\n return (\n v !== null &&\n typeof v === \"object\" &&\n cellsKey in (v as object) &&\n Array.isArray((v as Record<string, unknown>)[cellsKey])\n );\n}\n\nexport function renderTableElement(\n element: TableElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const rawPrefill = ctx.prefill[element.key];\n const cellsKey = element.fieldNames?.cells ?? \"cells\";\n const mergesKey = element.fieldNames?.merges ?? \"merges\";\n\n let initialData: TableData;\n\n if (isTableData(rawPrefill)) {\n initialData = {\n cells: rawPrefill.cells,\n merges: rawPrefill.merges ? migrateMerges(rawPrefill.merges) : [],\n };\n } else if (\n rawPrefill &&\n isTableDataWithFieldNames(rawPrefill, cellsKey)\n ) {\n // Map custom field names to standard internal format\n const rawMerges = (rawPrefill as Record<string, unknown>)[mergesKey] as unknown[] | undefined;\n initialData = {\n cells: (rawPrefill as Record<string, unknown>)[cellsKey] as string[][],\n merges: rawMerges ? migrateMerges(rawMerges) : [],\n };\n } else if (isTableData(element.default)) {\n initialData = {\n cells: element.default.cells,\n merges: element.default.merges ? migrateMerges(element.default.merges) : [],\n };\n } else if (element.default && isTableDataWithFieldNames(element.default, cellsKey)) {\n const rawMerges = (element.default as Record<string, unknown>)[mergesKey] as unknown[] | undefined;\n initialData = {\n cells: (element.default as Record<string, unknown>)[cellsKey] as string[][],\n merges: rawMerges ? migrateMerges(rawMerges) : [],\n };\n } else {\n initialData = defaultTableData(element);\n }\n\n // Validate merges in prefill data\n if (initialData.merges && initialData.merges.length > 0) {\n const rows = initialData.cells.length;\n const cols = rows > 0 ? initialData.cells[0].length : 0;\n const err = validateMerges(initialData.merges, rows, cols);\n if (err) {\n console.warn(`Table \"${element.key}\": invalid prefill merges stripped (${err})`);\n initialData = { ...initialData, merges: [] };\n }\n }\n\n if (state.config.readonly) {\n renderReadonlyTable(initialData, wrapper);\n } else {\n renderEditTable(element, initialData, pathKey, ctx, wrapper);\n }\n}\n\nexport function validateTableElement(\n element: TableElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const { scopeRoot, skipValidation } = context;\n const errors: string[] = [];\n const cellsKey = element.fieldNames?.cells ?? \"cells\";\n\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${key}\"]`,\n );\n if (!hiddenInput) {\n // Readonly mode: no hidden input\n return { value: null, errors };\n }\n\n let value: Record<string, unknown> | null = null;\n try {\n value = JSON.parse(hiddenInput.value) as Record<string, unknown>;\n } catch {\n errors.push(`${key}: invalid table data`);\n return { value: null, errors };\n }\n\n if (!skipValidation && element.required) {\n const cells = value[cellsKey] as string[][] | undefined;\n const hasContent = cells?.some((row) =>\n row.some((cell) => cell.trim() !== \"\"),\n );\n if (!hasContent) {\n errors.push(`${key}: ${t(\"required\", context.state)}`);\n }\n }\n\n return { value, errors };\n}\n\nexport function updateTableField(\n element: TableElement,\n fieldPath: string,\n value: unknown,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n const cellsKey = element.fieldNames?.cells ?? \"cells\";\n const mergesKey = element.fieldNames?.merges ?? \"merges\";\n\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]`,\n ) as (HTMLInputElement & { _applyExternalUpdate?: (data: TableData) => void }) | null;\n if (!hiddenInput) {\n console.warn(\n `updateTableField: no hidden input found for \"${fieldPath}\". Re-render to reflect new data.`,\n );\n return;\n }\n\n // Normalize value with custom field names to internal TableData (+ legacy merge migration)\n let tableData: TableData | null = null;\n if (isTableData(value)) {\n tableData = {\n cells: value.cells,\n merges: value.merges ? migrateMerges(value.merges) : [],\n };\n } else if (value && isTableDataWithFieldNames(value, cellsKey)) {\n const rawMerges = (value as Record<string, unknown>)[mergesKey] as unknown[] | undefined;\n tableData = {\n cells: (value as Record<string, unknown>)[cellsKey] as string[][],\n merges: rawMerges ? migrateMerges(rawMerges) : [],\n };\n }\n\n if (tableData && hiddenInput._applyExternalUpdate) {\n hiddenInput._applyExternalUpdate(tableData);\n } else {\n hiddenInput.value = JSON.stringify(value);\n }\n}\n","// RichInput component - composite textarea + file attachments + @mention support\n\nimport type {\n RichInputElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n ResourceMetadata,\n} from \"../types/index.js\";\nimport type { State } from \"../types/state.js\";\nimport { t } from \"../utils/translation.js\";\nimport { escapeHtml, clear, formatFileSize } from \"../utils/helpers.js\";\nimport { createCharCounter } from \"./text.js\";\nimport {\n getAllowedExtensions,\n isFileExtensionAllowed,\n isFileSizeAllowed,\n} from \"./file.js\";\n\n// ---------------------------------------------------------------------------\n// Data model\n// ---------------------------------------------------------------------------\n\ninterface RichInputValue {\n text: string | null;\n files: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Auto-expand helper (mirrors textarea.ts pattern)\n// ---------------------------------------------------------------------------\n\nfunction applyAutoExpand(\n textarea: HTMLTextAreaElement,\n backdrop: HTMLElement | null,\n): void {\n textarea.style.overflow = \"hidden\";\n textarea.style.resize = \"none\";\n\n const lineCount = (textarea.value.match(/\\n/g) || []).length + 1;\n textarea.rows = Math.max(3, lineCount);\n\n const resize = (): void => {\n if (!textarea.isConnected) return;\n textarea.style.height = \"0\";\n textarea.style.height = `${textarea.scrollHeight}px`;\n // Sync backdrop height\n if (backdrop) {\n backdrop.style.height = `${textarea.scrollHeight}px`;\n }\n };\n\n textarea.addEventListener(\"input\", resize);\n\n setTimeout(() => {\n if (textarea.isConnected) resize();\n }, 0);\n}\n\n// ---------------------------------------------------------------------------\n// File display helpers\n// ---------------------------------------------------------------------------\n\nfunction buildFileLabels(\n files: string[],\n state: State,\n): Map<string, string> {\n const labels = new Map<string, string>();\n const nameCount = new Map<string, number>();\n\n for (const rid of files) {\n const meta = state.resourceIndex.get(rid);\n const name = meta?.name ?? rid;\n nameCount.set(name, (nameCount.get(name) ?? 0) + 1);\n }\n\n for (const rid of files) {\n const meta = state.resourceIndex.get(rid);\n const name = meta?.name ?? rid;\n if ((nameCount.get(name) ?? 1) > 1 && meta) {\n labels.set(rid, `${name} (${formatFileSize(meta.size)})`);\n } else {\n labels.set(rid, name);\n }\n }\n\n return labels;\n}\n\nfunction isImageMeta(meta: ResourceMetadata | undefined): boolean {\n if (!meta) return false;\n return meta.type.startsWith(\"image/\");\n}\n\n// ---------------------------------------------------------------------------\n// Mention matching helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build a label→rid map from the current files array.\n * Uses disambiguated labels (from buildFileLabels) so that duplicate\n * filenames get unique mention keys like \"image.png (1.2 MB)\".\n */\nfunction buildNameToRid(\n files: string[],\n state: State,\n): Map<string, string> {\n const labels = buildFileLabels(files, state);\n const map = new Map<string, string>();\n for (const rid of files) {\n const label = labels.get(rid);\n if (label) map.set(label, rid);\n }\n return map;\n}\n\n/**\n * Format a mention for insertion into text.\n * Names with spaces or quotes get quoted: @\"name with spaces\"\n * Names without spaces: @name\n */\nfunction formatMention(name: string): string {\n if (/\\s/.test(name) || name.includes('\"')) {\n return `@\"${name.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n }\n return `@${name}`;\n}\n\n/**\n * Token found by scanning text for @-patterns (quoted and unquoted).\n */\ninterface AtToken {\n start: number;\n end: number;\n raw: string;\n name: string;\n}\n\n/**\n * Scan text for all @-tokens.\n * Unquoted: @word (no whitespace in name)\n * Quoted: @\"name with spaces\" (backslash-escaped quotes inside)\n * Boundary: @ must be at start or preceded by whitespace;\n * token must be followed by whitespace or end.\n */\nfunction findAtTokens(text: string): AtToken[] {\n const tokens: AtToken[] = [];\n const len = text.length;\n let i = 0;\n\n while (i < len) {\n if (text[i] === \"@\") {\n if (i > 0 && !/\\s/.test(text[i - 1])) {\n i++;\n continue;\n }\n\n const start = i;\n i++; // skip @\n\n if (i < len && text[i] === '\"') {\n // Quoted mention: @\"...\"\n i++; // skip opening \"\n let name = \"\";\n while (i < len && text[i] !== '\"') {\n if (text[i] === \"\\\\\" && i + 1 < len) {\n name += text[i + 1];\n i += 2;\n } else {\n name += text[i];\n i++;\n }\n }\n if (i < len && text[i] === '\"') {\n i++; // skip closing \"\n if (i >= len || /\\s/.test(text[i])) {\n tokens.push({ start, end: i, raw: text.slice(start, i), name });\n }\n }\n } else if (i < len && !/\\s/.test(text[i])) {\n // Unquoted mention: @word\n const wordStart = i;\n while (i < len && !/\\s/.test(text[i])) {\n i++;\n }\n const name = text.slice(wordStart, i);\n tokens.push({ start, end: i, raw: text.slice(start, i), name });\n }\n } else {\n i++;\n }\n }\n\n return tokens;\n}\n\n/**\n * Find all @mentions in text matched against known file names.\n * Supports both @name and @\"name with spaces\" forms.\n */\nfunction findMentions(\n text: string,\n nameToRid: Map<string, string>,\n): { start: number; end: number; name: string; rid: string }[] {\n if (nameToRid.size === 0) return [];\n\n const tokens = findAtTokens(text);\n const results: { start: number; end: number; name: string; rid: string }[] =\n [];\n\n for (const token of tokens) {\n const rid = nameToRid.get(token.name);\n if (rid) {\n results.push({\n start: token.start,\n end: token.end,\n name: token.name,\n rid,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Replace @filename with @resourceId in text for submission.\n */\nfunction replaceFilenamesWithRids(\n text: string,\n nameToRid: Map<string, string>,\n): string {\n const mentions = findMentions(text, nameToRid);\n if (mentions.length === 0) return text;\n\n let result = \"\";\n let lastIdx = 0;\n for (const m of mentions) {\n result += text.slice(lastIdx, m.start);\n result += `@${m.rid}`;\n lastIdx = m.end;\n }\n result += text.slice(lastIdx);\n return result;\n}\n\n/**\n * Replace @resourceId with @label in text for display in edit mode.\n * Uses disambiguated labels so duplicate filenames get unique mentions.\n * Resource IDs are always unquoted; output uses quoted form when label has spaces.\n */\nfunction replaceRidsWithFilenames(\n text: string,\n files: string[],\n state: State,\n): string {\n const labels = buildFileLabels(files, state);\n const ridToLabel = new Map<string, string>();\n for (const rid of files) {\n const label = labels.get(rid);\n if (label) ridToLabel.set(rid, label);\n }\n\n const tokens = findAtTokens(text);\n if (tokens.length === 0) return text;\n\n let result = \"\";\n let lastIdx = 0;\n for (const token of tokens) {\n result += text.slice(lastIdx, token.start);\n const label = ridToLabel.get(token.name);\n if (label) {\n result += formatMention(label);\n } else {\n result += token.raw;\n }\n lastIdx = token.end;\n }\n result += text.slice(lastIdx);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Thumbnail rendering (for a single file thumb slot)\n// ---------------------------------------------------------------------------\n\nfunction renderThumbContent(\n thumb: HTMLElement,\n rid: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): void {\n clear(thumb);\n\n if (meta?.file && isImageMeta(meta)) {\n const img = document.createElement(\"img\");\n img.alt = meta.name;\n img.style.cssText =\n \"width: 100%; height: 100%; object-fit: cover; display: block;\";\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n thumb.appendChild(img);\n } else if (state.config.getThumbnail) {\n state.config\n .getThumbnail(rid)\n .then((url) => {\n if (!url || !thumb.isConnected) return;\n const img = document.createElement(\"img\");\n img.alt = meta?.name ?? rid;\n img.src = url;\n img.style.cssText =\n \"width: 100%; height: 100%; object-fit: cover; display: block;\";\n clear(thumb);\n thumb.appendChild(img);\n })\n .catch((err: Error) => {\n state.config.onThumbnailError?.(err, rid);\n });\n const placeholder = document.createElement(\"div\");\n placeholder.style.cssText =\n \"width: 100%; height: 100%; background: var(--fb-background-hover-color, #f3f4f6); display: flex; align-items: center; justify-content: center;\";\n placeholder.innerHTML =\n '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>';\n thumb.appendChild(placeholder);\n } else {\n const icon = document.createElement(\"div\");\n icon.style.cssText =\n \"width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 2px; box-sizing: border-box;\";\n icon.innerHTML =\n '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>';\n if (meta?.name) {\n const nameEl = document.createElement(\"span\");\n nameEl.style.cssText =\n \"font-size: 9px; text-align: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 44px; color: var(--fb-text-color, #111827);\";\n nameEl.textContent = meta.name;\n icon.appendChild(nameEl);\n }\n thumb.appendChild(icon);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hover preview rendering (for mention tooltip — image only)\n// ---------------------------------------------------------------------------\n\nfunction renderImagePreview(\n hoverEl: HTMLElement,\n rid: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): void {\n clear(hoverEl);\n\n if (meta?.file && isImageMeta(meta)) {\n const img = document.createElement(\"img\");\n img.alt = meta.name;\n img.style.cssText =\n \"max-width: 120px; max-height: 120px; object-fit: contain; display: block;\";\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n hoverEl.appendChild(img);\n } else if (state.config.getThumbnail) {\n state.config\n .getThumbnail(rid)\n .then((url) => {\n if (!url || !hoverEl.isConnected) return;\n const img = document.createElement(\"img\");\n img.alt = meta?.name ?? rid;\n img.src = url;\n img.style.cssText =\n \"max-width: 120px; max-height: 120px; object-fit: contain; display: block;\";\n clear(hoverEl);\n hoverEl.appendChild(img);\n })\n .catch((err: Error) => {\n state.config.onThumbnailError?.(err, rid);\n });\n }\n // If no image and no getThumbnail, render nothing (mention tooltip stays compact)\n}\n\n// ---------------------------------------------------------------------------\n// Portal tooltip positioning helper\n// ---------------------------------------------------------------------------\n\nfunction positionPortalTooltip(tooltip: HTMLElement, anchor: HTMLElement): void {\n const rect = anchor.getBoundingClientRect();\n const ttRect = tooltip.getBoundingClientRect();\n const left = Math.max(\n 4,\n Math.min(\n rect.left + rect.width / 2 - ttRect.width / 2,\n window.innerWidth - ttRect.width - 4,\n ),\n );\n const topAbove = rect.top - ttRect.height - 8;\n const topBelow = rect.bottom + 8;\n const top = topAbove >= 4 ? topAbove : topBelow;\n tooltip.style.left = `${left}px`;\n tooltip.style.top = `${Math.max(4, top)}px`;\n}\n\n// ---------------------------------------------------------------------------\n// Mention tooltip (shown on @mention hover in backdrop — image preview only)\n// ---------------------------------------------------------------------------\n\nfunction showMentionTooltip(\n anchor: HTMLElement,\n rid: string,\n state: State,\n): HTMLElement {\n const meta = state.resourceIndex.get(rid);\n const tooltip = document.createElement(\"div\");\n tooltip.className = \"fb-richinput-portal-tooltip fb-richinput-mention-tooltip\";\n tooltip.style.cssText = `\n position: fixed;\n z-index: 99999;\n background: #fff;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n padding: 4px;\n pointer-events: none;\n min-width: 60px;\n max-width: 140px;\n `;\n\n const preview = document.createElement(\"div\");\n preview.style.cssText =\n \"min-height: 60px; max-height: 120px; display: flex; align-items: center; justify-content: center;\";\n renderImagePreview(preview, rid, meta, state);\n tooltip.appendChild(preview);\n\n document.body.appendChild(tooltip);\n positionPortalTooltip(tooltip, anchor);\n\n return tooltip;\n}\n\n// ---------------------------------------------------------------------------\n// File tooltip (shown on file chip hover — full filename + action buttons)\n// ---------------------------------------------------------------------------\n\ninterface FileTooltipOptions {\n rid: string;\n state: State;\n isReadonly: boolean;\n onMention?: () => void;\n onRemove?: () => void;\n}\n\nfunction showFileTooltip(\n anchor: HTMLElement,\n opts: FileTooltipOptions,\n): HTMLElement {\n const { rid, state, isReadonly, onMention, onRemove } = opts;\n const meta = state.resourceIndex.get(rid);\n const filename = meta?.name ?? rid;\n\n const tooltip = document.createElement(\"div\");\n tooltip.className = \"fb-richinput-portal-tooltip fb-richinput-file-tooltip\";\n tooltip.style.cssText = `\n position: fixed;\n z-index: 99999;\n background: #fff;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n padding: 4px;\n pointer-events: auto;\n min-width: 80px;\n max-width: 260px;\n `;\n\n // Image preview area\n const preview = document.createElement(\"div\");\n preview.style.cssText =\n \"min-height: 60px; max-height: 120px; display: flex; align-items: center; justify-content: center;\";\n renderImagePreview(preview, rid, meta, state);\n tooltip.appendChild(preview);\n\n // Full filename (no truncation)\n const nameEl = document.createElement(\"div\");\n nameEl.style.cssText =\n \"padding: 4px 6px 2px; font-size: 12px; color: var(--fb-text-color, #111827); word-break: break-word; border-top: 1px solid var(--fb-border-color, #d1d5db);\";\n nameEl.textContent = filename;\n tooltip.appendChild(nameEl);\n\n // Action buttons row\n const actionsRow = document.createElement(\"div\");\n actionsRow.style.cssText =\n \"display: flex; align-items: center; gap: 2px; padding: 3px 4px 2px; border-top: 1px solid var(--fb-border-color, #d1d5db); justify-content: center;\";\n\n const btnStyle =\n \"background: none; border: none; cursor: pointer; padding: 3px 5px; border-radius: 4px; color: var(--fb-text-muted-color, #6b7280); display: flex; align-items: center; transition: background 0.1s, color 0.1s;\";\n const btnHoverIn = (btn: HTMLButtonElement): void => {\n btn.style.background = \"var(--fb-background-hover-color, #f3f4f6)\";\n btn.style.color = \"var(--fb-text-color, #111827)\";\n };\n const btnHoverOut = (btn: HTMLButtonElement): void => {\n btn.style.background = \"none\";\n btn.style.color = \"var(--fb-text-muted-color, #6b7280)\";\n };\n\n // Order: mention, download, open, bin\n\n // Mention button (edit-only, first)\n if (!isReadonly && onMention) {\n const mentionBtn = document.createElement(\"button\");\n mentionBtn.type = \"button\";\n mentionBtn.title = \"Mention\";\n mentionBtn.style.cssText = btnStyle;\n mentionBtn.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-3.92 7.94\"/></svg>';\n mentionBtn.addEventListener(\"mouseenter\", () => btnHoverIn(mentionBtn));\n mentionBtn.addEventListener(\"mouseleave\", () => btnHoverOut(mentionBtn));\n mentionBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n onMention();\n tooltip.remove();\n });\n actionsRow.appendChild(mentionBtn);\n }\n\n // Download button\n if (state.config.downloadFile) {\n const dlBtn = document.createElement(\"button\");\n dlBtn.type = \"button\";\n dlBtn.title = \"Download\";\n dlBtn.style.cssText = btnStyle;\n dlBtn.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>';\n dlBtn.addEventListener(\"mouseenter\", () => btnHoverIn(dlBtn));\n dlBtn.addEventListener(\"mouseleave\", () => btnHoverOut(dlBtn));\n dlBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n state.config.downloadFile?.(rid, filename);\n });\n actionsRow.appendChild(dlBtn);\n }\n\n // Open in new window button\n const hasOpenUrl = !!(state.config.getDownloadUrl ?? state.config.getThumbnail);\n if (hasOpenUrl) {\n const openBtn = document.createElement(\"button\");\n openBtn.type = \"button\";\n openBtn.title = \"Open in new window\";\n openBtn.style.cssText = btnStyle;\n openBtn.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg>';\n openBtn.addEventListener(\"mouseenter\", () => btnHoverIn(openBtn));\n openBtn.addEventListener(\"mouseleave\", () => btnHoverOut(openBtn));\n openBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (state.config.getDownloadUrl) {\n const url = state.config.getDownloadUrl(rid);\n if (url) {\n window.open(url, \"_blank\");\n } else {\n // fallback to thumbnail\n state.config.getThumbnail?.(rid).then((thumbUrl) => {\n if (thumbUrl) window.open(thumbUrl, \"_blank\");\n }).catch(() => { /* ignore */ });\n }\n } else {\n state.config.getThumbnail?.(rid).then((url) => {\n if (url) window.open(url, \"_blank\");\n }).catch(() => { /* ignore */ });\n }\n });\n actionsRow.appendChild(openBtn);\n }\n\n // Bin/trash button (edit-only, last)\n if (!isReadonly && onRemove) {\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.title = \"Remove\";\n removeBtn.style.cssText = btnStyle;\n removeBtn.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/></svg>';\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.background = \"var(--fb-background-hover-color, #f3f4f6)\";\n removeBtn.style.color = \"var(--fb-error-color, #ef4444)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => btnHoverOut(removeBtn));\n removeBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n tooltip.remove();\n onRemove();\n });\n actionsRow.appendChild(removeBtn);\n }\n\n const hasActions = actionsRow.children.length > 0;\n if (hasActions) {\n tooltip.appendChild(actionsRow);\n }\n\n document.body.appendChild(tooltip);\n positionPortalTooltip(tooltip, anchor);\n\n return tooltip;\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip hide helper with delay (so mouse can travel from chip to tooltip)\n// ---------------------------------------------------------------------------\n\ninterface TooltipHandle {\n element: HTMLElement | null;\n hideTimer: ReturnType<typeof setTimeout> | null;\n}\n\nfunction createTooltipHandle(): TooltipHandle {\n return { element: null, hideTimer: null };\n}\n\nfunction scheduleHideTooltip(handle: TooltipHandle, delayMs = 150): void {\n if (handle.hideTimer !== null) return;\n handle.hideTimer = setTimeout(() => {\n handle.hideTimer = null;\n if (handle.element) {\n handle.element.remove();\n handle.element = null;\n }\n }, delayMs);\n}\n\nfunction cancelHideTooltip(handle: TooltipHandle): void {\n if (handle.hideTimer !== null) {\n clearTimeout(handle.hideTimer);\n handle.hideTimer = null;\n }\n}\n\nfunction removePortalTooltip(tooltip: HTMLElement | null): null {\n if (tooltip) tooltip.remove();\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// @mention dropdown\n// ---------------------------------------------------------------------------\n\ninterface DropdownState {\n open: boolean;\n query: string;\n triggerPos: number;\n selectedIndex: number;\n}\n\n/**\n * Find the @trigger position. Allows spaces in the query so filenames\n * with spaces (e.g. \"photo 2026-03-06.jpeg\") work properly.\n * Walks backward from cursor to find the last @ preceded by whitespace or at start.\n *\n * Rules:\n * - `@mention` as first symbol → valid\n * - `\\s@mention` (space/tab/newline before @) → valid\n * - `char@not`, `@@not`, `.@not` → invalid (non-whitespace before @)\n */\nfunction getAtTrigger(\n textarea: HTMLTextAreaElement,\n): { query: string; pos: number } | null {\n const cursorPos = textarea.selectionStart ?? 0;\n const textBefore = textarea.value.slice(0, cursorPos);\n\n // Find the last @ that is at position 0 or preceded by whitespace (\\s)\n for (let i = textBefore.length - 1; i >= 0; i--) {\n if (textBefore[i] === \"@\") {\n if (i === 0 || /\\s/.test(textBefore[i - 1])) {\n let query = textBefore.slice(i + 1);\n // Strip leading quote if user is typing a quoted mention\n if (query.startsWith('\"')) {\n query = query.slice(1);\n }\n return { query, pos: i };\n }\n // @ preceded by non-whitespace — not a valid trigger, stop searching\n return null;\n }\n }\n return null;\n}\n\nfunction filterFilesForDropdown(\n query: string,\n files: string[],\n labels: Map<string, string>,\n): string[] {\n const lq = query.toLowerCase();\n return files.filter((rid) => {\n const label = labels.get(rid) ?? rid;\n return label.toLowerCase().includes(lq);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Common style constants\n// ---------------------------------------------------------------------------\n\nconst TEXTAREA_FONT =\n \"font-size: var(--fb-font-size, 14px); font-family: var(--fb-font-family, inherit); line-height: 1.6;\";\nconst TEXTAREA_PADDING = \"padding: 12px 52px 12px 14px;\"; // right padding for paperclip\n\n// ---------------------------------------------------------------------------\n// Edit mode renderer\n// ---------------------------------------------------------------------------\n\nfunction renderEditMode(\n element: RichInputElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n initialValue: RichInputValue,\n): void {\n const state = ctx.state;\n\n // Closure state\n const files: string[] = [...initialValue.files];\n\n const dropdownState: DropdownState = {\n open: false,\n query: \"\",\n triggerPos: -1,\n selectedIndex: 0,\n };\n\n const docListenerCtrl = new AbortController();\n\n // ---------------------------------------------------------------------------\n // Hidden input (stores JSON for getFormData())\n // ---------------------------------------------------------------------------\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n\n function getCurrentValue(): Record<string, string | string[] | null> {\n const rawText = textarea.value;\n const nameToRid = buildNameToRid(files, state);\n const submissionText = rawText\n ? replaceFilenamesWithRids(rawText, nameToRid)\n : null;\n const textKey = element.textKey ?? \"text\";\n const filesKey = element.filesKey ?? \"files\";\n return {\n [textKey]: rawText === \"\" ? null : submissionText,\n [filesKey]: [...files],\n };\n }\n\n function writeHidden(): void {\n hiddenInput.value = JSON.stringify(getCurrentValue());\n }\n\n // ---------------------------------------------------------------------------\n // Outer container (chat-like rounded card)\n // ---------------------------------------------------------------------------\n const outerDiv = document.createElement(\"div\");\n outerDiv.className = \"fb-richinput-wrapper\";\n outerDiv.style.cssText = `\n position: relative;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 16px;\n background: var(--fb-background-color, #f9fafb);\n transition: box-shadow 0.15s, border-color 0.15s;\n `;\n\n // Focus-within ring\n outerDiv.addEventListener(\"focusin\", () => {\n outerDiv.style.borderColor = \"var(--fb-primary-color, #0066cc)\";\n outerDiv.style.boxShadow =\n \"0 0 0 2px color-mix(in srgb, var(--fb-primary-color, #0066cc) 25%, transparent)\";\n });\n outerDiv.addEventListener(\"focusout\", () => {\n outerDiv.style.borderColor = \"var(--fb-border-color, #d1d5db)\";\n outerDiv.style.boxShadow = \"none\";\n });\n\n // ---------------------------------------------------------------------------\n // Upload error display\n // ---------------------------------------------------------------------------\n const errorEl = document.createElement(\"div\");\n errorEl.className = \"fb-richinput-error\";\n errorEl.style.cssText =\n \"display: none; color: var(--fb-error-color, #ef4444); font-size: var(--fb-font-size-small, 12px); padding: 4px 14px 8px;\";\n\n let errorTimer: ReturnType<typeof setTimeout> | null = null;\n\n function showUploadError(message: string): void {\n errorEl.textContent = message;\n errorEl.style.display = \"block\";\n if (errorTimer) clearTimeout(errorTimer);\n errorTimer = setTimeout(() => {\n errorEl.style.display = \"none\";\n errorEl.textContent = \"\";\n errorTimer = null;\n }, 5000);\n }\n\n function validateFileForUpload(file: File): boolean {\n const allowedExtensions = getAllowedExtensions(element.accept);\n if (!isFileExtensionAllowed(file.name, allowedExtensions)) {\n const formats = allowedExtensions.join(\", \");\n showUploadError(\n t(\"invalidFileExtension\", state, { name: file.name, formats }),\n );\n return false;\n }\n\n const maxSizeMB = element.maxSize ?? Infinity;\n if (!isFileSizeAllowed(file, maxSizeMB)) {\n showUploadError(\n t(\"fileTooLarge\", state, {\n name: file.name,\n maxSize: maxSizeMB,\n }),\n );\n return false;\n }\n\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // Drag and drop\n // ---------------------------------------------------------------------------\n let dragCounter = 0;\n\n outerDiv.addEventListener(\"dragenter\", (e) => {\n e.preventDefault();\n dragCounter++;\n outerDiv.style.borderColor = \"var(--fb-primary-color, #0066cc)\";\n outerDiv.style.boxShadow =\n \"0 0 0 2px color-mix(in srgb, var(--fb-primary-color, #0066cc) 25%, transparent)\";\n });\n\n outerDiv.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n });\n\n outerDiv.addEventListener(\"dragleave\", (e) => {\n e.preventDefault();\n dragCounter--;\n if (dragCounter <= 0) {\n dragCounter = 0;\n outerDiv.style.borderColor = \"var(--fb-border-color, #d1d5db)\";\n outerDiv.style.boxShadow = \"none\";\n }\n });\n\n outerDiv.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n dragCounter = 0;\n outerDiv.style.borderColor = \"var(--fb-border-color, #d1d5db)\";\n outerDiv.style.boxShadow = \"none\";\n\n const droppedFiles = e.dataTransfer?.files;\n if (!droppedFiles || !state.config.uploadFile) return;\n\n const maxFiles = element.maxFiles ?? Infinity;\n for (let i = 0; i < droppedFiles.length; i++) {\n if (files.length >= maxFiles) {\n showUploadError(\n t(\"filesLimitExceeded\", state, {\n skipped: droppedFiles.length - i,\n max: maxFiles,\n }),\n );\n break;\n }\n if (!validateFileForUpload(droppedFiles[i])) continue;\n uploadFile(droppedFiles[i]);\n }\n });\n\n // ---------------------------------------------------------------------------\n // Files row (inside container, at top)\n // ---------------------------------------------------------------------------\n const filesRow = document.createElement(\"div\");\n filesRow.className = \"fb-richinput-files\";\n filesRow.style.cssText =\n \"display: none; flex-wrap: wrap; gap: 6px; padding: 10px 14px 0; align-items: center;\";\n\n // Hidden file picker\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.multiple = true;\n fileInput.style.display = \"none\";\n\n if (element.accept) {\n if (typeof element.accept === \"string\") {\n fileInput.accept = element.accept;\n } else {\n fileInput.accept = element.accept.extensions\n .map((ext) => (ext.startsWith(\".\") ? ext : `.${ext}`))\n .join(\",\");\n }\n }\n\n // ---------------------------------------------------------------------------\n // Textarea area (with highlight backdrop)\n // ---------------------------------------------------------------------------\n const textareaArea = document.createElement(\"div\");\n textareaArea.style.cssText = \"position: relative;\";\n\n // Highlight backdrop - renders behind textarea with @mentions highlighted\n const backdrop = document.createElement(\"div\");\n backdrop.className = \"fb-richinput-backdrop\";\n backdrop.style.cssText = `\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n ${TEXTAREA_PADDING}\n ${TEXTAREA_FONT}\n white-space: pre-wrap;\n word-break: break-word;\n color: transparent;\n pointer-events: none;\n overflow: hidden;\n border-radius: inherit;\n box-sizing: border-box;\n z-index: 2;\n `;\n\n const textarea = document.createElement(\"textarea\");\n textarea.name = `${pathKey}__text`;\n textarea.placeholder =\n element.placeholder || t(\"richinputPlaceholder\", state);\n // Convert any @resourceId references to @filename for display\n const rawInitialText = initialValue.text ?? \"\";\n textarea.value = rawInitialText\n ? replaceRidsWithFilenames(rawInitialText, files, state)\n : \"\";\n textarea.style.cssText = `\n width: 100%;\n ${TEXTAREA_PADDING}\n ${TEXTAREA_FONT}\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n color: var(--fb-text-color, #111827);\n box-sizing: border-box;\n position: relative;\n z-index: 1;\n caret-color: var(--fb-text-color, #111827);\n `;\n applyAutoExpand(textarea, backdrop);\n\n // Sync scroll\n textarea.addEventListener(\"scroll\", () => {\n backdrop.scrollTop = textarea.scrollTop;\n });\n\n // Mention hover tooltip (event delegation on backdrop marks)\n let mentionTooltip: HTMLElement | null = null;\n\n backdrop.addEventListener(\"mouseover\", (e: MouseEvent) => {\n const mark = (e.target as HTMLElement).closest?.(\"mark\") as HTMLElement | null;\n if (!mark?.dataset.rid) return;\n mentionTooltip = removePortalTooltip(mentionTooltip);\n mentionTooltip = showMentionTooltip(mark, mark.dataset.rid, state);\n });\n\n backdrop.addEventListener(\"mouseout\", (e: MouseEvent) => {\n const mark = (e.target as HTMLElement).closest?.(\"mark\") as HTMLElement | null;\n if (!mark) return;\n // Check if we moved to another mark or outside\n const related = e.relatedTarget as HTMLElement | null;\n if (related?.closest?.(\"mark\")) return; // moved to another mark\n mentionTooltip = removePortalTooltip(mentionTooltip);\n });\n\n // Forward mousedown on marks to the textarea for cursor placement\n backdrop.addEventListener(\"mousedown\", (e: MouseEvent) => {\n const mark = (e.target as HTMLElement).closest?.(\"mark\") as HTMLElement | null;\n if (!mark) return;\n mentionTooltip = removePortalTooltip(mentionTooltip);\n // Temporarily disable mark pointer-events\n const marks = backdrop.querySelectorAll<HTMLElement>(\"mark\");\n marks.forEach((m) => (m.style.pointerEvents = \"none\"));\n // Find the element underneath (should be textarea)\n const under = document.elementFromPoint(e.clientX, e.clientY);\n if (under) {\n under.dispatchEvent(\n new MouseEvent(\"mousedown\", {\n bubbles: true,\n cancelable: true,\n view: window,\n clientX: e.clientX,\n clientY: e.clientY,\n button: e.button,\n buttons: e.buttons,\n detail: e.detail,\n }),\n );\n }\n // Restore pointer-events on mouseup\n document.addEventListener(\n \"mouseup\",\n () => {\n marks.forEach((m) => (m.style.pointerEvents = \"auto\"));\n },\n { once: true },\n );\n });\n\n /** Re-render the highlight backdrop to match textarea content. */\n function updateBackdrop(): void {\n const text = textarea.value;\n const nameToRid = buildNameToRid(files, state);\n const tokens = findAtTokens(text);\n\n if (tokens.length === 0) {\n backdrop.innerHTML = escapeHtml(text) + \"\\n\";\n return;\n }\n\n // Classify each token as resolved or unresolved\n let html = \"\";\n let lastIdx = 0;\n for (const token of tokens) {\n html += escapeHtml(text.slice(lastIdx, token.start));\n const rid = nameToRid.get(token.name);\n if (rid) {\n // Resolved mention — blue highlight\n html += `<mark data-rid=\"${escapeHtml(rid)}\" style=\"background: color-mix(in srgb, var(--fb-primary-color, #0066cc) 15%, transparent); color: transparent; border-radius: 8px; padding: 0; border: none; box-shadow: 0 0 0 2px color-mix(in srgb, var(--fb-primary-color, #0066cc) 15%, transparent), 0 0 0 3px color-mix(in srgb, var(--fb-primary-color, #0066cc) 30%, transparent); box-decoration-break: clone; -webkit-box-decoration-break: clone; pointer-events: auto; cursor: text;\">${escapeHtml(text.slice(token.start, token.end))}</mark>`;\n } else {\n // Unresolved mention — red wavy underline (MS Word style)\n html += `<mark style=\"color: transparent; background: none; padding: 0; border: none; text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: rgba(239, 68, 68, 0.45); text-underline-offset: 2px;\">${escapeHtml(text.slice(token.start, token.end))}</mark>`;\n }\n lastIdx = token.end;\n }\n html += escapeHtml(text.slice(lastIdx));\n backdrop.innerHTML = html + \"\\n\";\n }\n\n // Paperclip button (inside textarea area, bottom-right)\n const paperclipBtn = document.createElement(\"button\");\n paperclipBtn.type = \"button\";\n paperclipBtn.title = t(\"richinputAttachFile\", state);\n paperclipBtn.style.cssText = `\n position: absolute;\n right: 10px;\n bottom: 10px;\n z-index: 2;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 8px;\n background: transparent;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--fb-text-muted-color, #9ca3af);\n transition: color 0.15s, background 0.15s;\n `;\n paperclipBtn.innerHTML =\n '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"/></svg>';\n paperclipBtn.addEventListener(\"mouseenter\", () => {\n paperclipBtn.style.color = \"var(--fb-primary-color, #0066cc)\";\n paperclipBtn.style.background = \"var(--fb-background-hover-color, #f3f4f6)\";\n });\n paperclipBtn.addEventListener(\"mouseleave\", () => {\n paperclipBtn.style.color = \"var(--fb-text-muted-color, #9ca3af)\";\n paperclipBtn.style.background = \"transparent\";\n });\n paperclipBtn.addEventListener(\"click\", () => {\n const maxFiles = element.maxFiles ?? Infinity;\n if (files.length >= maxFiles) {\n showUploadError(\n t(\"filesLimitExceeded\", state, { skipped: 1, max: maxFiles }),\n );\n return;\n }\n fileInput.click();\n });\n\n // ---------------------------------------------------------------------------\n // Dropdown element\n // ---------------------------------------------------------------------------\n const dropdown = document.createElement(\"div\");\n dropdown.className = \"fb-richinput-dropdown\";\n dropdown.style.cssText = `\n display: none;\n position: absolute;\n bottom: 100%;\n left: 0;\n z-index: 1000;\n background: #fff;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: var(--fb-border-radius, 6px);\n box-shadow: 0 4px 12px rgba(0,0,0,0.12);\n min-width: 180px;\n max-width: 320px;\n max-height: 200px;\n overflow-y: auto;\n margin-bottom: 4px;\n ${TEXTAREA_FONT}\n `;\n\n function buildFileLabelsFromClosure(): Map<string, string> {\n return buildFileLabels(files, state);\n }\n\n function renderDropdownItems(filtered: string[]): void {\n clear(dropdown);\n const labels = buildFileLabelsFromClosure();\n\n if (filtered.length === 0) {\n dropdown.style.display = \"none\";\n dropdownState.open = false;\n return;\n }\n\n filtered.forEach((rid, idx) => {\n const meta = state.resourceIndex.get(rid);\n const item = document.createElement(\"div\");\n item.className = \"fb-richinput-dropdown-item\";\n item.dataset.rid = rid;\n item.style.cssText = `\n padding: 5px 10px;\n cursor: pointer;\n color: var(--fb-text-color, #111827);\n background: ${idx === dropdownState.selectedIndex ? \"var(--fb-background-hover-color, #f3f4f6)\" : \"transparent\"};\n display: flex;\n align-items: center;\n gap: 8px;\n `;\n\n // Small preview thumbnail\n const thumb = document.createElement(\"div\");\n thumb.style.cssText =\n \"width: 24px; height: 24px; border-radius: 4px; overflow: hidden; flex-shrink: 0; background: var(--fb-background-hover-color, #f3f4f6); display: flex; align-items: center; justify-content: center;\";\n if (meta?.file && isImageMeta(meta)) {\n const img = document.createElement(\"img\");\n img.style.cssText =\n \"width: 100%; height: 100%; object-fit: cover; display: block;\";\n const reader = new FileReader();\n reader.onload = (ev) => {\n img.src = (ev.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n thumb.appendChild(img);\n } else if (state.config.getThumbnail) {\n state.config\n .getThumbnail(rid)\n .then((url) => {\n if (!url || !thumb.isConnected) return;\n const img = document.createElement(\"img\");\n img.style.cssText =\n \"width: 100%; height: 100%; object-fit: cover; display: block;\";\n img.src = url;\n clear(thumb);\n thumb.appendChild(img);\n })\n .catch(() => {\n /* ignore */\n });\n thumb.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>';\n } else {\n thumb.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>';\n }\n item.appendChild(thumb);\n\n // Filename label\n const nameSpan = document.createElement(\"span\");\n nameSpan.style.cssText =\n \"overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\";\n nameSpan.textContent = labels.get(rid) ?? rid;\n item.appendChild(nameSpan);\n\n dropdown.appendChild(item);\n });\n\n // Single mouseenter on dropdown — update highlight without re-rendering\n dropdown.onmousemove = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest?.(\n \".fb-richinput-dropdown-item\",\n ) as HTMLElement | null;\n if (!target) return;\n const newIdx = filtered.indexOf(target.dataset.rid ?? \"\");\n if (newIdx === -1 || newIdx === dropdownState.selectedIndex) return;\n // Update styles directly without re-rendering\n const items = dropdown.querySelectorAll<HTMLElement>(\n \".fb-richinput-dropdown-item\",\n );\n items.forEach((el, i) => {\n el.style.background =\n i === newIdx\n ? \"var(--fb-background-hover-color, #f3f4f6)\"\n : \"transparent\";\n });\n dropdownState.selectedIndex = newIdx;\n };\n\n // Single mousedown on dropdown — insert mention\n dropdown.onmousedown = (e: MouseEvent) => {\n e.preventDefault(); // keep textarea focus\n e.stopPropagation();\n const target = (e.target as HTMLElement).closest?.(\n \".fb-richinput-dropdown-item\",\n ) as HTMLElement | null;\n if (!target?.dataset.rid) return;\n insertMention(target.dataset.rid);\n };\n\n dropdown.style.display = \"block\";\n dropdownState.open = true;\n }\n\n function openDropdown(): void {\n const trigger = getAtTrigger(textarea);\n if (!trigger) {\n closeDropdown();\n return;\n }\n dropdownState.query = trigger.query;\n dropdownState.triggerPos = trigger.pos;\n dropdownState.selectedIndex = 0;\n\n const labels = buildFileLabelsFromClosure();\n const filtered = filterFilesForDropdown(trigger.query, files, labels);\n renderDropdownItems(filtered);\n }\n\n function closeDropdown(): void {\n dropdown.style.display = \"none\";\n dropdownState.open = false;\n }\n\n function insertMention(rid: string): void {\n const labels = buildFileLabelsFromClosure();\n const label = labels.get(rid) ?? state.resourceIndex.get(rid)?.name ?? rid;\n const cursorPos = textarea.selectionStart ?? 0;\n const before = textarea.value.slice(0, dropdownState.triggerPos);\n const after = textarea.value.slice(cursorPos);\n const mention = `${formatMention(label)} `;\n textarea.value = `${before}${mention}${after}`;\n const newPos = before.length + mention.length;\n textarea.setSelectionRange(newPos, newPos);\n textarea.dispatchEvent(new Event(\"input\"));\n closeDropdown();\n }\n\n // Textarea events\n textarea.addEventListener(\"input\", () => {\n updateBackdrop();\n writeHidden();\n ctx.instance?.triggerOnChange(pathKey, getCurrentValue());\n if (files.length > 0) {\n openDropdown();\n } else {\n closeDropdown();\n }\n });\n\n /** Update highlight styles on dropdown items without re-rendering DOM. */\n function updateDropdownHighlight(): void {\n const items = dropdown.querySelectorAll<HTMLElement>(\n \".fb-richinput-dropdown-item\",\n );\n items.forEach((el, i) => {\n el.style.background =\n i === dropdownState.selectedIndex\n ? \"var(--fb-background-hover-color, #f3f4f6)\"\n : \"transparent\";\n });\n }\n\n textarea.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (!dropdownState.open) return;\n const labels = buildFileLabelsFromClosure();\n const filtered = filterFilesForDropdown(\n dropdownState.query,\n files,\n labels,\n );\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n dropdownState.selectedIndex = Math.min(\n dropdownState.selectedIndex + 1,\n filtered.length - 1,\n );\n updateDropdownHighlight();\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n dropdownState.selectedIndex = Math.max(\n dropdownState.selectedIndex - 1,\n 0,\n );\n updateDropdownHighlight();\n } else if (e.key === \"Enter\" && filtered.length > 0) {\n e.preventDefault();\n insertMention(filtered[dropdownState.selectedIndex]);\n } else if (e.key === \"Escape\") {\n closeDropdown();\n }\n });\n\n // Close dropdown on outside click\n document.addEventListener(\n \"click\",\n (e: MouseEvent) => {\n if (\n !outerDiv.contains(e.target as Node) &&\n !dropdown.contains(e.target as Node)\n ) {\n closeDropdown();\n }\n },\n { signal: docListenerCtrl.signal },\n );\n\n // ---------------------------------------------------------------------------\n // Files row rendering\n // ---------------------------------------------------------------------------\n\n function renderFilesRow(): void {\n clear(filesRow);\n\n if (files.length === 0) {\n filesRow.style.display = \"none\";\n return;\n }\n filesRow.style.display = \"flex\";\n\n files.forEach((rid) => {\n const meta = state.resourceIndex.get(rid);\n\n const thumbWrapper = document.createElement(\"div\");\n thumbWrapper.className = \"fb-richinput-file-thumb\";\n thumbWrapper.style.cssText = `\n position: relative;\n width: 48px;\n height: 48px;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n cursor: pointer;\n background: #fff;\n `;\n\n const thumbInner = document.createElement(\"div\");\n thumbInner.style.cssText =\n \"width: 48px; height: 48px; border-radius: inherit; overflow: hidden;\";\n renderThumbContent(thumbInner, rid, meta, state);\n thumbWrapper.appendChild(thumbInner);\n\n // File tooltip with delayed hide so mouse can travel from chip to tooltip\n const tooltipHandle = createTooltipHandle();\n\n const doMention = (): void => {\n const cursorPos = textarea.selectionStart ?? textarea.value.length;\n const labels = buildFileLabelsFromClosure();\n const label = labels.get(rid) ?? meta?.name ?? rid;\n const before = textarea.value.slice(0, cursorPos);\n const after = textarea.value.slice(cursorPos);\n const prefix =\n before.length > 0 && !/[\\s\\n]$/.test(before) ? \"\\n\" : \"\";\n const mention = `${prefix}${formatMention(label)} `;\n textarea.value = `${before}${mention}${after}`;\n const newPos = cursorPos + mention.length;\n textarea.setSelectionRange(newPos, newPos);\n textarea.focus();\n textarea.dispatchEvent(new Event(\"input\"));\n };\n\n const doRemove = (): void => {\n const idx = files.indexOf(rid);\n if (idx !== -1) files.splice(idx, 1);\n renderFilesRow();\n updateBackdrop();\n writeHidden();\n ctx.instance?.triggerOnChange(pathKey, getCurrentValue());\n };\n\n thumbWrapper.addEventListener(\"mouseenter\", () => {\n cancelHideTooltip(tooltipHandle);\n if (!tooltipHandle.element) {\n tooltipHandle.element = showFileTooltip(thumbWrapper, {\n rid,\n state,\n isReadonly: false,\n onMention: doMention,\n onRemove: doRemove,\n });\n // Keep tooltip visible when mouse moves into it\n tooltipHandle.element.addEventListener(\"mouseenter\", () => {\n cancelHideTooltip(tooltipHandle);\n });\n tooltipHandle.element.addEventListener(\"mouseleave\", () => {\n scheduleHideTooltip(tooltipHandle);\n });\n }\n });\n\n thumbWrapper.addEventListener(\"mouseleave\", () => {\n scheduleHideTooltip(tooltipHandle);\n });\n\n filesRow.appendChild(thumbWrapper);\n });\n }\n\n // Shared upload function (used by file picker and drag-and-drop)\n function uploadFile(file: File): void {\n if (!state.config.uploadFile) return;\n\n const tempId = `temp-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n state.resourceIndex.set(tempId, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file,\n });\n files.push(tempId);\n renderFilesRow();\n\n // Mark loading\n const thumbs = filesRow.querySelectorAll<HTMLElement>(\n \".fb-richinput-file-thumb\",\n );\n const loadingThumb = thumbs[thumbs.length - 1];\n if (loadingThumb) loadingThumb.style.opacity = \"0.5\";\n\n state.config\n .uploadFile(file)\n .then((resourceId: string) => {\n const idx = files.indexOf(tempId);\n if (idx !== -1) files[idx] = resourceId;\n state.resourceIndex.delete(tempId);\n state.resourceIndex.set(resourceId, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file,\n });\n renderFilesRow();\n updateBackdrop();\n writeHidden();\n ctx.instance?.triggerOnChange(pathKey, getCurrentValue());\n })\n .catch((err: Error) => {\n const idx = files.indexOf(tempId);\n if (idx !== -1) files.splice(idx, 1);\n state.resourceIndex.delete(tempId);\n renderFilesRow();\n state.config.onUploadError?.(err, file);\n });\n }\n\n // File picker change handler\n fileInput.addEventListener(\"change\", () => {\n const selected = fileInput.files;\n if (!selected || selected.length === 0) return;\n const maxFiles = element.maxFiles ?? Infinity;\n for (let i = 0; i < selected.length; i++) {\n if (files.length >= maxFiles) {\n showUploadError(\n t(\"filesLimitExceeded\", state, {\n skipped: selected.length - i,\n max: maxFiles,\n }),\n );\n break;\n }\n if (!validateFileForUpload(selected[i])) continue;\n uploadFile(selected[i]);\n }\n fileInput.value = \"\";\n });\n\n // ---------------------------------------------------------------------------\n // Assemble\n // ---------------------------------------------------------------------------\n textareaArea.appendChild(backdrop);\n textareaArea.appendChild(textarea);\n textareaArea.appendChild(paperclipBtn);\n textareaArea.appendChild(dropdown);\n\n outerDiv.appendChild(filesRow);\n outerDiv.appendChild(textareaArea);\n outerDiv.appendChild(errorEl);\n\n // Character counter (only when min/maxLength defined)\n if (element.minLength != null || element.maxLength != null) {\n const counterRow = document.createElement(\"div\");\n counterRow.style.cssText =\n \"position: relative; padding: 2px 14px 6px; text-align: right;\";\n const counter = createCharCounter(element as any, textarea, false);\n counter.style.cssText = `\n position: static;\n display: inline-block;\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n pointer-events: none;\n `;\n counterRow.appendChild(counter);\n outerDiv.appendChild(counterRow);\n }\n\n outerDiv.appendChild(hiddenInput);\n outerDiv.appendChild(fileInput);\n\n writeHidden();\n updateBackdrop();\n\n // External update callback\n (\n hiddenInput as HTMLInputElement & {\n _applyExternalUpdate?: (value: RichInputValue) => void;\n }\n )._applyExternalUpdate = (value: RichInputValue) => {\n // Convert any @resourceId references to @filename for display\n const rawText = value.text ?? \"\";\n textarea.value = rawText\n ? replaceRidsWithFilenames(rawText, files, state)\n : \"\";\n textarea.dispatchEvent(new Event(\"input\"));\n files.length = 0;\n for (const rid of value.files) files.push(rid);\n renderFilesRow();\n updateBackdrop();\n writeHidden();\n };\n\n wrapper.appendChild(outerDiv);\n renderFilesRow();\n\n // Cleanup\n const observer = new MutationObserver(() => {\n if (!outerDiv.isConnected) {\n docListenerCtrl.abort();\n mentionTooltip = removePortalTooltip(mentionTooltip);\n observer.disconnect();\n }\n });\n if (outerDiv.parentElement) {\n observer.observe(outerDiv.parentElement, { childList: true });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Readonly mode renderer\n// ---------------------------------------------------------------------------\n\nfunction renderReadonlyMode(\n _element: RichInputElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n _pathKey: string,\n value: RichInputValue,\n): void {\n const state = ctx.state;\n const { text, files } = value;\n\n // In submitted data text has @resourceId — map back to filenames for display\n const ridToName = new Map<string, string>();\n for (const rid of files) {\n const meta = state.resourceIndex.get(rid);\n if (meta?.name) ridToName.set(rid, meta.name);\n }\n\n // File previews (read-only) — shown at top\n if (files.length > 0) {\n const filesRow = document.createElement(\"div\");\n filesRow.style.cssText =\n \"display: flex; flex-wrap: wrap; gap: 6px; padding-bottom: 8px;\";\n\n files.forEach((rid) => {\n const meta = state.resourceIndex.get(rid);\n\n const thumbWrapper = document.createElement(\"div\");\n thumbWrapper.style.cssText = `\n position: relative;\n width: 48px; height: 48px;\n border: 1px solid var(--fb-border-color, #d1d5db);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n background: #fff;\n cursor: default;\n `;\n\n const thumbInner = document.createElement(\"div\");\n thumbInner.style.cssText =\n \"width: 48px; height: 48px; border-radius: inherit; overflow: hidden;\";\n renderThumbContent(thumbInner, rid, meta, state);\n thumbWrapper.appendChild(thumbInner);\n\n const tooltipHandle = createTooltipHandle();\n thumbWrapper.addEventListener(\"mouseenter\", () => {\n cancelHideTooltip(tooltipHandle);\n if (!tooltipHandle.element) {\n tooltipHandle.element = showFileTooltip(thumbWrapper, {\n rid,\n state,\n isReadonly: true,\n });\n tooltipHandle.element.addEventListener(\"mouseenter\", () => {\n cancelHideTooltip(tooltipHandle);\n });\n tooltipHandle.element.addEventListener(\"mouseleave\", () => {\n scheduleHideTooltip(tooltipHandle);\n });\n }\n });\n thumbWrapper.addEventListener(\"mouseleave\", () => {\n scheduleHideTooltip(tooltipHandle);\n });\n\n filesRow.appendChild(thumbWrapper);\n });\n\n wrapper.appendChild(filesRow);\n }\n\n if (text) {\n const textDiv = document.createElement(\"div\");\n textDiv.style.cssText = `\n ${TEXTAREA_FONT}\n color: var(--fb-text-color, #111827);\n white-space: pre-wrap;\n word-break: break-word;\n `;\n\n // Match @resourceId or @filename or @\"quoted name\" patterns using token scanner\n const tokens = findAtTokens(text);\n const resolvedTokens = tokens.filter(\n (tok) =>\n ridToName.has(tok.name) ||\n [...ridToName.values()].includes(tok.name),\n );\n\n if (resolvedTokens.length === 0) {\n textDiv.textContent = text;\n } else {\n let lastIndex = 0;\n\n for (const token of resolvedTokens) {\n if (token.start > lastIndex) {\n textDiv.appendChild(\n document.createTextNode(text.slice(lastIndex, token.start)),\n );\n }\n const span = document.createElement(\"span\");\n span.style.cssText = `\n display: inline;\n background: color-mix(in srgb, var(--fb-primary-color, #0066cc) 15%, transparent);\n color: var(--fb-primary-color, #0066cc);\n border-radius: 8px;\n padding: 1px 6px;\n font-weight: 500;\n cursor: default;\n `;\n // Display filename even if data has @resourceId\n const rid = ridToName.has(token.name)\n ? token.name\n : [...ridToName.entries()].find(([, n]) => n === token.name)?.[0];\n const displayName = ridToName.get(token.name) ?? token.name;\n span.textContent = `@${displayName}`;\n\n // Tooltip on mention hover\n if (rid) {\n let spanTooltip: HTMLElement | null = null;\n const mentionRid = rid;\n span.addEventListener(\"mouseenter\", () => {\n spanTooltip = removePortalTooltip(spanTooltip);\n spanTooltip = showMentionTooltip(span, mentionRid, state);\n });\n span.addEventListener(\"mouseleave\", () => {\n spanTooltip = removePortalTooltip(spanTooltip);\n });\n }\n\n textDiv.appendChild(span);\n lastIndex = token.end;\n }\n if (lastIndex < text.length) {\n textDiv.appendChild(document.createTextNode(text.slice(lastIndex)));\n }\n }\n\n wrapper.appendChild(textDiv);\n }\n\n if (!text && files.length === 0) {\n const empty = document.createElement(\"div\");\n empty.style.cssText =\n \"color: var(--fb-text-muted-color, #6b7280); font-size: var(--fb-font-size, 14px);\";\n empty.textContent = \"—\";\n wrapper.appendChild(empty);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function renderRichInputElement(\n element: RichInputElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n\n const textKey = element.textKey ?? \"text\";\n const filesKey = element.filesKey ?? \"files\";\n let initialValue: RichInputValue;\n\n if (element.flatOutput) {\n // Flat output mode: text and files are sibling keys in the parent scope\n const textVal = ctx.prefill[textKey];\n const filesVal = ctx.prefill[filesKey];\n initialValue = {\n text: typeof textVal === \"string\" ? textVal : null,\n files: Array.isArray(filesVal) ? (filesVal as string[]) : [],\n };\n } else {\n const rawPrefill = ctx.prefill[element.key];\n if (rawPrefill && typeof rawPrefill === \"object\" && !Array.isArray(rawPrefill)) {\n const obj = rawPrefill as Record<string, unknown>;\n // Accept both custom keys and default keys (custom keys take priority)\n const textVal = obj[textKey] ?? obj[\"text\"];\n const filesVal = obj[filesKey] ?? obj[\"files\"];\n initialValue = {\n text: typeof textVal === \"string\" ? textVal : null,\n files: Array.isArray(filesVal) ? (filesVal as string[]) : [],\n };\n } else if (typeof rawPrefill === \"string\") {\n initialValue = { text: rawPrefill || null, files: [] };\n } else {\n initialValue = { text: null, files: [] };\n }\n }\n\n // Backfill resourceIndex for prefilled files not already tracked (Finding 2)\n for (const rid of initialValue.files) {\n if (!state.resourceIndex.has(rid)) {\n state.resourceIndex.set(rid, {\n name: rid,\n type: \"application/octet-stream\",\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n }\n\n if (state.config.readonly) {\n renderReadonlyMode(element, ctx, wrapper, pathKey, initialValue);\n } else {\n if (!state.config.uploadFile) {\n throw new Error(\n `RichInput field \"${element.key}\" requires uploadFile handler in config`,\n );\n }\n renderEditMode(element, ctx, wrapper, pathKey, initialValue);\n }\n}\n\nexport function validateRichInputElement(\n element: RichInputElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const { scopeRoot, state, skipValidation } = context;\n const errors: string[] = [];\n const textKey = element.textKey ?? \"text\";\n const filesKey = element.filesKey ?? \"files\";\n\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${key}\"]`,\n );\n if (!hiddenInput) {\n return { value: null, errors };\n }\n\n let rawValue: Record<string, unknown> = {};\n try {\n const parsed = JSON.parse(hiddenInput.value) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n rawValue = parsed as Record<string, unknown>;\n } else {\n errors.push(`${key}: invalid richinput data`);\n return { value: null, errors };\n }\n } catch {\n errors.push(`${key}: invalid richinput data`);\n return { value: null, errors };\n }\n\n const textVal = rawValue[textKey];\n const filesVal = rawValue[filesKey];\n const text = textVal === null || typeof textVal === \"string\" ? textVal : null;\n const files = Array.isArray(filesVal) ? (filesVal as string[]) : [];\n\n // Return value with the element's configured keys (textKey/filesKey)\n const value: Record<string, string | string[] | null> = {\n [textKey]: text ?? null,\n [filesKey]: files,\n };\n\n if (!skipValidation) {\n const textEmpty = !text || (text as string).trim() === \"\";\n const filesEmpty = files.length === 0;\n\n if (element.required && textEmpty && filesEmpty) {\n errors.push(`${key}: ${t(\"required\", state)}`);\n }\n\n if (!textEmpty && text) {\n if (element.minLength != null && text.length < element.minLength) {\n errors.push(\n `${key}: ${t(\"minLength\", state, { min: element.minLength })}`,\n );\n }\n if (element.maxLength != null && text.length > element.maxLength) {\n errors.push(\n `${key}: ${t(\"maxLength\", state, { max: element.maxLength })}`,\n );\n }\n }\n\n if (element.maxFiles != null && files.length > element.maxFiles) {\n errors.push(\n `${key}: ${t(\"maxFiles\", state, { max: element.maxFiles })}`,\n );\n }\n }\n\n return { value, errors, spread: !!element.flatOutput };\n}\n\nexport function updateRichInputField(\n element: RichInputElement,\n fieldPath: string,\n value: unknown,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]`,\n ) as\n | (HTMLInputElement & {\n _applyExternalUpdate?: (v: RichInputValue) => void;\n })\n | null;\n\n if (!hiddenInput) {\n console.warn(\n `updateRichInputField: no hidden input found for \"${fieldPath}\". Re-render to reflect new data.`,\n );\n return;\n }\n\n // Normalize incoming value: accept both default keys {text,files}\n // and custom keys {[textKey],[filesKey]}\n let normalized: RichInputValue | null = null;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const textKey = element.textKey ?? \"text\";\n const filesKey = element.filesKey ?? \"files\";\n const textVal = obj[textKey] ?? obj[\"text\"];\n const filesVal = obj[filesKey] ?? obj[\"files\"];\n if (textVal !== undefined || filesVal !== undefined) {\n normalized = {\n text: typeof textVal === \"string\" ? textVal : null,\n files: Array.isArray(filesVal) ? (filesVal as string[]) : [],\n };\n }\n }\n\n if (normalized && hiddenInput._applyExternalUpdate) {\n hiddenInput._applyExternalUpdate(normalized);\n } else if (normalized) {\n hiddenInput.value = JSON.stringify(normalized);\n }\n}\n","// Component registry and main renderElement dispatcher\n\nimport type { Element, RenderContext } from \"../types/index.js\";\nimport { pathJoin } from \"../utils/helpers.js\";\nimport { t } from \"../utils/translation.js\";\nimport { evaluateEnableCondition } from \"../utils/enable-conditions.js\";\nimport { renderTextElement, renderMultipleTextElement } from \"./text.js\";\nimport {\n renderTextareaElement,\n renderMultipleTextareaElement,\n} from \"./textarea.js\";\nimport { renderNumberElement, renderMultipleNumberElement } from \"./number.js\";\nimport { renderSelectElement, renderMultipleSelectElement } from \"./select.js\";\nimport {\n renderSwitcherElement,\n renderMultipleSwitcherElement,\n} from \"./switcher.js\";\nimport {\n renderFileElement,\n renderFilesElement,\n renderMultipleFileElement,\n} from \"./file.js\";\nimport { renderColourElement, renderMultipleColourElement } from \"./colour.js\";\nimport { renderSliderElement, renderMultipleSliderElement } from \"./slider.js\";\nimport {\n renderSingleContainerElement,\n renderMultipleContainerElement,\n setRenderElement as setContainerRenderElement,\n setValidateElement as setContainerValidateElement,\n} from \"./container.js\";\nimport {\n renderGroupElement,\n setRenderElement as setGroupRenderElement,\n} from \"./group.js\";\nimport { renderTableElement } from \"./table.js\";\nimport { renderRichInputElement } from \"./richinput.js\";\n\n// Tooltip management\nfunction showTooltip(tooltipId: string, button: HTMLElement): void {\n const tooltip = document.getElementById(tooltipId);\n if (!tooltip) return;\n\n const isCurrentlyVisible = !tooltip.classList.contains(\"hidden\");\n\n // Hide all tooltips first\n document.querySelectorAll('[id^=\"tooltip-\"]').forEach((t) => {\n t.classList.add(\"hidden\");\n });\n\n // If the tooltip was already visible, keep it hidden (toggle behavior)\n if (isCurrentlyVisible) {\n return;\n }\n\n // Position the tooltip intelligently\n const rect = button.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Ensure tooltip is appended to body for proper positioning\n if (tooltip && tooltip.parentElement !== document.body) {\n document.body.appendChild(tooltip);\n }\n\n // Show tooltip temporarily to measure its size\n tooltip.style.visibility = \"hidden\";\n tooltip.style.position = \"fixed\";\n tooltip.classList.remove(\"hidden\");\n const tooltipRect = tooltip.getBoundingClientRect();\n tooltip.classList.add(\"hidden\");\n tooltip.style.visibility = \"visible\";\n\n let left = rect.left;\n let top = rect.bottom + 5;\n\n // Adjust horizontal position if tooltip would go off-screen\n if (left + tooltipRect.width > viewportWidth) {\n left = rect.right - tooltipRect.width;\n }\n\n // Adjust vertical position if tooltip would go off-screen\n if (top + tooltipRect.height > viewportHeight) {\n top = rect.top - tooltipRect.height - 5;\n }\n\n // Ensure tooltip doesn't go off the left edge\n if (left < 10) {\n left = 10;\n }\n\n // Ensure tooltip doesn't go off the top edge\n if (top < 10) {\n top = rect.bottom + 5;\n }\n\n tooltip.style.left = `${left}px`;\n tooltip.style.top = `${top}px`;\n\n // Show the tooltip\n tooltip.classList.remove(\"hidden\");\n\n // Hide after 25 seconds\n setTimeout(() => {\n tooltip.classList.add(\"hidden\");\n }, 25000);\n}\n\n// Close tooltips when clicking outside\nif (typeof document !== \"undefined\") {\n document.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n const isInfoButton =\n target.closest(\"button\") && (target.closest(\"button\") as any).onclick;\n const isTooltip = target.closest('[id^=\"tooltip-\"]');\n\n if (!isInfoButton && !isTooltip) {\n document.querySelectorAll('[id^=\"tooltip-\"]').forEach((tooltip) => {\n tooltip.classList.add(\"hidden\");\n });\n }\n });\n}\n\n// Helper: Determine if element should be disabled based on enableIf\nfunction shouldDisableElement(\n element: Element,\n ctx: RenderContext,\n): boolean {\n if (!element.enableIf) {\n return false;\n }\n\n try {\n const rootFormData = ctx.formData ?? ctx.prefill ?? {};\n const scope = element.enableIf.scope ?? \"relative\";\n\n // For relative scope inside containers, use ctx.prefill directly\n // (it contains merged defaults from container rendering)\n // For absolute scope, containerData is not used by evaluateEnableCondition\n const containerData: Record<string, any> | undefined =\n scope === \"relative\" && ctx.path\n ? (ctx.prefill as Record<string, any>)\n : undefined;\n\n const shouldEnable = evaluateEnableCondition(\n element.enableIf,\n rootFormData,\n containerData,\n );\n\n return !shouldEnable;\n } catch (error) {\n // FAIL FAST: Log error and render field (fail-safe approach)\n console.error(\n `Error evaluating enableIf for field \"${element.key}\":`,\n error,\n );\n }\n\n return false;\n}\n\n// Helper: Extract current value from DOM for a field at given path\nfunction extractDOMValue(fieldPath: string, formRoot: HTMLElement): any {\n // Try to find input/select/textarea elements with matching name attribute\n const input = formRoot.querySelector<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n `[name=\"${fieldPath}\"]`\n );\n\n if (!input) {\n return undefined;\n }\n\n // Extract value based on input type\n if (input instanceof HTMLSelectElement) {\n return input.value;\n } else if (input instanceof HTMLInputElement) {\n if (input.type === 'checkbox') {\n return input.checked;\n } else if (input.type === 'radio') {\n const checked = formRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]:checked`\n );\n return checked ? checked.value : undefined;\n } else {\n return input.value;\n }\n } else if (input instanceof HTMLTextAreaElement) {\n return input.value;\n }\n\n return undefined;\n}\n\n// Helper: Re-evaluate enableIf for a field wrapper\nfunction reevaluateEnableIf(\n wrapper: HTMLElement,\n element: Element,\n ctx: RenderContext,\n): void {\n if (!element.enableIf) {\n return;\n }\n\n const formRoot = ctx.state.formRoot;\n if (!formRoot) {\n console.error(`Cannot re-evaluate enableIf: formRoot is null`);\n return;\n }\n\n const condition = element.enableIf;\n const scope = condition.scope ?? \"relative\";\n\n // Build data objects for evaluation\n let rootFormData: Record<string, any> = {};\n const containerData: Record<string, any> = {};\n\n // For root-level fields (empty ctx.path), relative scope behaves like absolute\n // because there's no container to be relative to\n const effectiveScope = (!ctx.path || ctx.path === \"\") ? \"absolute\" : scope;\n\n if (effectiveScope === \"relative\" && ctx.path) {\n // Extract container-local data from DOM\n // Parse container path to get all fields in this container\n const containerMatch = ctx.path.match(/^(.+)\\[(\\d+)\\]$/);\n\n if (containerMatch) {\n const containerKey = containerMatch[1];\n const containerIndex = parseInt(containerMatch[2], 10);\n const containerItemElement = formRoot.querySelector<HTMLElement>(\n `[data-container-item=\"${containerKey}[${containerIndex}]\"]`\n );\n\n if (containerItemElement) {\n // Extract all field values from this container instance\n const inputs = containerItemElement.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n 'input, select, textarea'\n );\n\n inputs.forEach(input => {\n const fieldName = input.getAttribute('name');\n if (fieldName) {\n // Extract the field key (last part after the last dot)\n const fieldKeyMatch = fieldName.match(/\\.([^.[\\]]+)$/);\n if (fieldKeyMatch) {\n const fieldKey = fieldKeyMatch[1];\n\n // Extract value based on input type\n if (input instanceof HTMLSelectElement) {\n containerData[fieldKey] = input.value;\n } else if (input instanceof HTMLInputElement) {\n if (input.type === 'checkbox') {\n containerData[fieldKey] = input.checked;\n } else if (input.type === 'radio') {\n if (input.checked) {\n containerData[fieldKey] = input.value;\n }\n } else {\n containerData[fieldKey] = input.value;\n }\n } else if (input instanceof HTMLTextAreaElement) {\n containerData[fieldKey] = input.value;\n }\n }\n }\n });\n }\n }\n } else {\n // For absolute scope, extract root-level data from DOM\n // Get the specific field value we need for the condition\n const dependencyKey = condition.key;\n const dependencyValue = extractDOMValue(dependencyKey, formRoot);\n\n if (dependencyValue !== undefined) {\n rootFormData[dependencyKey] = dependencyValue;\n } else {\n // Fall back to ctx.formData if we can't extract from DOM\n rootFormData = ctx.formData ?? ctx.prefill;\n }\n }\n\n // Evaluate the condition\n try {\n const shouldEnable = evaluateEnableCondition(\n condition,\n rootFormData,\n containerData,\n );\n\n // Update visibility\n if (shouldEnable) {\n // Show the field\n wrapper.style.display = '';\n wrapper.classList.remove('fb-field-wrapper-disabled');\n wrapper.removeAttribute('data-conditionally-disabled');\n } else {\n // Hide the field\n wrapper.style.display = 'none';\n wrapper.classList.add('fb-field-wrapper-disabled');\n wrapper.setAttribute('data-conditionally-disabled', 'true');\n }\n } catch (error) {\n console.error(`Error re-evaluating enableIf for field \"${element.key}\":`, error);\n }\n}\n\n// Helper: Set up change listeners for enableIf dependencies\nfunction setupEnableIfListeners(\n wrapper: HTMLElement,\n element: Element,\n ctx: RenderContext,\n): void {\n if (!element.enableIf) {\n return;\n }\n\n const formRoot = ctx.state.formRoot;\n if (!formRoot) {\n console.error(`Cannot setup enableIf listeners: formRoot is null`);\n return;\n }\n\n const condition = element.enableIf;\n const scope = condition.scope ?? \"relative\";\n const dependencyKey = condition.key;\n\n // Determine the dependency field path\n let dependencyFieldPath: string;\n\n if (scope === \"relative\" && ctx.path) {\n // For relative scope, dependency is in the same container\n dependencyFieldPath = `${ctx.path}.${dependencyKey}`;\n } else {\n // For absolute scope, dependency is at root level\n dependencyFieldPath = dependencyKey;\n }\n\n // Find the dependency field input\n const dependencyInput = formRoot.querySelector<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n `[name=\"${dependencyFieldPath}\"]`\n );\n\n if (!dependencyInput) {\n // Dependency field not found - might be rendered later\n // Set up a mutation observer to watch for it\n const observer = new MutationObserver(() => {\n const input = formRoot.querySelector<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n `[name=\"${dependencyFieldPath}\"]`\n );\n if (input) {\n // Found the dependency field, attach listener\n input.addEventListener('change', () => {\n reevaluateEnableIf(wrapper, element, ctx);\n });\n input.addEventListener('input', () => {\n reevaluateEnableIf(wrapper, element, ctx);\n });\n observer.disconnect();\n }\n });\n\n observer.observe(formRoot, {\n childList: true,\n subtree: true,\n });\n\n return;\n }\n\n // Attach change/input listeners\n dependencyInput.addEventListener('change', () => {\n reevaluateEnableIf(wrapper, element, ctx);\n });\n\n dependencyInput.addEventListener('input', () => {\n reevaluateEnableIf(wrapper, element, ctx);\n });\n}\n\n// Helper: Create field label with required indicator\nfunction createFieldLabel(element: Element): HTMLLabelElement {\n const title = document.createElement(\"label\");\n title.className = \"text-sm font-medium text-gray-900\";\n title.textContent = element.label || element.key;\n\n if (element.required) {\n const req = document.createElement(\"span\");\n req.className = \"text-red-500 ml-1\";\n req.textContent = \"*\";\n title.appendChild(req);\n }\n\n return title;\n}\n\n// Helper: Create info button with tooltip\nfunction createInfoButton(element: Element): HTMLButtonElement {\n const infoBtn = document.createElement(\"button\");\n infoBtn.type = \"button\";\n infoBtn.className = \"ml-2 text-gray-400 hover:text-gray-600\";\n infoBtn.innerHTML =\n '<svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>';\n\n const tooltipId = `tooltip-${element.key}-${Math.random().toString(36).substr(2, 9)}`;\n const tooltip = document.createElement(\"div\");\n tooltip.id = tooltipId;\n tooltip.className =\n \"hidden absolute z-50 bg-gray-200 text-gray-900 text-sm rounded-lg p-3 max-w-sm border border-gray-300 shadow-lg\";\n tooltip.style.position = \"fixed\";\n tooltip.textContent =\n element.description || element.hint || \"Field information\";\n document.body.appendChild(tooltip);\n\n infoBtn.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n showTooltip(tooltipId, infoBtn);\n };\n\n return infoBtn;\n}\n\n// Helper: Create label container with title and optional info button\nfunction createLabelContainer(element: Element): HTMLDivElement {\n const label = document.createElement(\"div\");\n label.className = \"flex items-center mb-2\";\n\n const title = createFieldLabel(element);\n label.appendChild(title);\n\n if (element.description || element.hint) {\n const infoBtn = createInfoButton(element);\n label.appendChild(infoBtn);\n }\n\n return label;\n}\n\n// Helper: Dispatch to appropriate renderer based on element type and multiple property\nfunction dispatchToRenderer(\n element: Element,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const isMultiple = \"multiple\" in element && element.multiple;\n\n switch (element.type) {\n case \"text\":\n if (isMultiple) {\n renderMultipleTextElement(element, ctx, wrapper, pathKey);\n } else {\n renderTextElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"textarea\":\n if (isMultiple) {\n renderMultipleTextareaElement(element, ctx, wrapper, pathKey);\n } else {\n renderTextareaElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"number\":\n if (isMultiple) {\n renderMultipleNumberElement(element, ctx, wrapper, pathKey);\n } else {\n renderNumberElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"select\":\n if (isMultiple) {\n renderMultipleSelectElement(element, ctx, wrapper, pathKey);\n } else {\n renderSelectElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"switcher\":\n if (isMultiple) {\n renderMultipleSwitcherElement(element, ctx, wrapper, pathKey);\n } else {\n renderSwitcherElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"file\":\n if (isMultiple) {\n renderMultipleFileElement(element, ctx, wrapper, pathKey);\n } else {\n renderFileElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"files\":\n renderFilesElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"colour\":\n if (isMultiple) {\n renderMultipleColourElement(element, ctx, wrapper, pathKey);\n } else {\n renderColourElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"slider\":\n if (isMultiple) {\n renderMultipleSliderElement(element, ctx, wrapper, pathKey);\n } else {\n renderSliderElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"group\":\n renderGroupElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"container\":\n if (isMultiple) {\n renderMultipleContainerElement(element, ctx, wrapper, pathKey);\n } else {\n renderSingleContainerElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"table\":\n renderTableElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"richinput\":\n renderRichInputElement(element, ctx, wrapper, pathKey);\n break;\n\n default: {\n const unsupported = document.createElement(\"div\");\n unsupported.className = \"text-red-500 text-sm\";\n unsupported.textContent = t(\"unsupportedFieldType\", ctx.state, { type: (element as any).type });\n wrapper.appendChild(unsupported);\n }\n }\n}\n\n// Main renderElement function - dispatcher to component-specific renderers\nexport function renderElement(\n element: Element,\n ctx: RenderContext,\n): HTMLElement {\n const initiallyDisabled = shouldDisableElement(element, ctx);\n\n // Create wrapper\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"mb-6 fb-field-wrapper\";\n wrapper.setAttribute(\"data-field-key\", element.key);\n\n // Create label container\n const label = createLabelContainer(element);\n wrapper.appendChild(label);\n\n // Dispatch to appropriate renderer\n const pathKey = pathJoin(ctx.path, element.key);\n dispatchToRenderer(element, ctx, wrapper, pathKey);\n\n if (initiallyDisabled) {\n wrapper.style.display = \"none\";\n wrapper.classList.add(\"fb-field-wrapper-disabled\");\n wrapper.setAttribute(\"data-conditionally-disabled\", \"true\");\n }\n\n // Set up enableIf change listeners after rendering\n setupEnableIfListeners(wrapper, element, ctx);\n\n // Actions are now only rendered via external actions system in renderExternalActions()\n // element.actions are only used for label lookup, not direct rendering\n\n return wrapper;\n}\n\n// Initialize circular dependencies\n// Container and Group components need renderElement for nested rendering\nsetContainerRenderElement(renderElement);\nsetGroupRenderElement(renderElement);\n\n// Export setter for container validation (will be called from FormBuilderInstance)\nexport { setContainerValidateElement };\n\n// Export all component renderers for potential direct use\nexport {\n renderTextElement,\n renderMultipleTextElement,\n renderTextareaElement,\n renderMultipleTextareaElement,\n renderNumberElement,\n renderMultipleNumberElement,\n renderSelectElement,\n renderMultipleSelectElement,\n renderSwitcherElement,\n renderMultipleSwitcherElement,\n renderFileElement,\n renderFilesElement,\n renderMultipleFileElement,\n renderColourElement,\n renderMultipleColourElement,\n renderSliderElement,\n renderMultipleSliderElement,\n renderSingleContainerElement,\n renderMultipleContainerElement,\n renderGroupElement,\n renderTableElement,\n renderRichInputElement,\n};\n","// Instance state factory for Form Builder\n// Creates isolated state objects for each FormBuilderInstance\n\nimport type { State, Config } from \"../types/index.js\";\n\n/**\n * Default configuration for new instances\n */\nexport const defaultConfig: Config = {\n uploadFile: null,\n downloadFile: null,\n getThumbnail: null,\n getDownloadUrl: null,\n actionHandler: null,\n onChange: null,\n onFieldChange: null,\n onThumbnailError: null,\n onUploadError: null,\n onDownloadError: null,\n debounceMs: 300,\n verboseErrors: false,\n enableFilePreview: true,\n maxPreviewSize: \"200px\",\n readonly: false,\n parseTableFile: null,\n locale: \"en\",\n translations: {\n en: {\n // UI texts\n removeElement: \"Remove\",\n clickDragText: \"Click or drag file\",\n clickDragTextMultiple: \"Click or drag files\",\n noFileSelected: \"No file selected\",\n noFilesSelected: \"No files selected\",\n downloadButton: \"Download\",\n changeButton: \"Change\",\n placeholderText: \"Enter text\",\n previewAlt: \"Preview\",\n previewUnavailable: \"Preview unavailable\",\n previewError: \"Preview error\",\n videoNotSupported: \"Your browser does not support the video tag.\",\n // Field hints\n hintLengthRange: \"{min}-{max} chars\",\n hintMaxLength: \"≤{max} chars\",\n hintMinLength: \"≥{min} chars\",\n hintValueRange: \"{min}-{max}\",\n hintMaxValue: \"≤{max}\",\n hintMinValue: \"≥{min}\",\n hintMaxSize: \"≤{size}MB\",\n hintFormats: \"{formats}\",\n hintRequired: \"Required\",\n hintOptional: \"Optional\",\n hintPattern: \"Format: {pattern}\",\n fileCountSingle: \"{count} file\",\n fileCountPlural: \"{count} files\",\n fileCountRange: \"({min}-{max})\",\n // Validation errors\n required: \"Required\",\n minItems: \"Minimum {min} items required\",\n maxItems: \"Maximum {max} items allowed\",\n minLength: \"Minimum {min} characters\",\n maxLength: \"Maximum {max} characters\",\n minValue: \"Must be at least {min}\",\n maxValue: \"Must be at most {max}\",\n patternMismatch: \"Invalid format\",\n invalidPattern: \"Invalid pattern in schema\",\n notANumber: \"Must be a number\",\n invalidHexColour: \"Invalid hex color\",\n minFiles: \"Minimum {min} files required\",\n maxFiles: \"Maximum {max} files allowed\",\n invalidFileExtension:\n 'File \"{name}\" has unsupported format. Allowed: {formats}',\n fileTooLarge: 'File \"{name}\" exceeds maximum size of {maxSize}MB',\n filesLimitExceeded:\n \"{skipped} file(s) skipped: maximum {max} files allowed\",\n unsupportedFieldType: \"Unsupported field type: {type}\",\n invalidOption: \"Invalid option\",\n tableAddRow: \"Add row\",\n tableAddColumn: \"Add column\",\n tableRemoveRow: \"Remove row\",\n tableRemoveColumn: \"Remove column\",\n tableMergeCells: \"Merge cells (Ctrl+M)\",\n tableSplitCell: \"Split cell (Ctrl+Shift+M)\",\n tableImportFile: \"Import\",\n tableImporting: \"Importing...\",\n tableImportError: \"Import failed: {error}\",\n richinputPlaceholder: \"Type text...\",\n richinputAttachFile: \"Attach file\",\n richinputMention: \"Mention\",\n richinputRemoveFile: \"Remove\",\n },\n ru: {\n // UI texts\n removeElement: \"Удалить\",\n clickDragText: \"Нажмите или перетащите файл\",\n clickDragTextMultiple: \"Нажмите или перетащите файлы\",\n noFileSelected: \"Файл не выбран\",\n noFilesSelected: \"Нет файлов\",\n downloadButton: \"Скачать\",\n changeButton: \"Изменить\",\n placeholderText: \"Введите текст\",\n previewAlt: \"Предпросмотр\",\n previewUnavailable: \"Предпросмотр недоступен\",\n previewError: \"Ошибка предпросмотра\",\n videoNotSupported: \"Ваш браузер не поддерживает видео.\",\n // Field hints\n hintLengthRange: \"{min}-{max} символов\",\n hintMaxLength: \"≤{max} символов\",\n hintMinLength: \"≥{min} символов\",\n hintValueRange: \"{min}-{max}\",\n hintMaxValue: \"≤{max}\",\n hintMinValue: \"≥{min}\",\n hintMaxSize: \"≤{size}МБ\",\n hintFormats: \"{formats}\",\n hintRequired: \"Обязательное\",\n hintOptional: \"Необязательное\",\n hintPattern: \"Формат: {pattern}\",\n fileCountSingle: \"{count} файл\",\n fileCountPlural: \"{count} файлов\",\n fileCountRange: \"({min}-{max})\",\n // Validation errors\n required: \"Обязательное поле\",\n minItems: \"Минимум {min} элементов\",\n maxItems: \"Максимум {max} элементов\",\n minLength: \"Минимум {min} символов\",\n maxLength: \"Максимум {max} символов\",\n minValue: \"Значение должно быть не менее {min}\",\n maxValue: \"Значение должно быть не более {max}\",\n patternMismatch: \"Неверный формат\",\n invalidPattern: \"Неверный паттерн в схеме\",\n notANumber: \"Должно быть числом\",\n invalidHexColour: \"Неверный формат цвета\",\n minFiles: \"Минимум {min} файлов\",\n maxFiles: \"Максимум {max} файлов\",\n invalidFileExtension:\n 'Файл \"{name}\" имеет неподдерживаемый формат. Допустимые: {formats}',\n fileTooLarge:\n 'Файл \"{name}\" превышает максимальный размер {maxSize}МБ',\n filesLimitExceeded:\n \"{skipped} файл(ов) пропущено: максимум {max} файлов\",\n unsupportedFieldType: \"Неподдерживаемый тип поля: {type}\",\n invalidOption: \"Недопустимое значение\",\n tableAddRow: \"Добавить строку\",\n tableAddColumn: \"Добавить столбец\",\n tableRemoveRow: \"Удалить строку\",\n tableRemoveColumn: \"Удалить столбец\",\n tableMergeCells: \"Объединить ячейки (Ctrl+M)\",\n tableSplitCell: \"Разделить ячейку (Ctrl+Shift+M)\",\n tableImportFile: \"Импорт\",\n tableImporting: \"Импорт...\",\n tableImportError: \"Ошибка импорта: {error}\",\n richinputPlaceholder: \"Введите текст...\",\n richinputAttachFile: \"Прикрепить файл\",\n richinputMention: \"Упомянуть\",\n richinputRemoveFile: \"Удалить\",\n },\n },\n theme: {},\n};\n\n/**\n * Create a new isolated state object for a FormBuilderInstance\n * Uses deep merge for translations to preserve default en/ru fallbacks\n */\nexport function createInstanceState(config?: Partial<Config>): State {\n // Deep merge translations to preserve default locales as fallbacks\n const mergedTranslations = {\n ...defaultConfig.translations,\n };\n\n // Merge user-provided translations on top of defaults\n if (config?.translations) {\n for (const [locale, userTranslations] of Object.entries(\n config.translations,\n )) {\n mergedTranslations[locale] = {\n ...((defaultConfig.translations as Record<string, object>)[locale] ||\n {}),\n ...userTranslations,\n };\n }\n }\n\n return {\n schema: null,\n formRoot: null,\n resourceIndex: new Map(),\n externalActions: null,\n version: \"1.0.0\",\n config: {\n ...defaultConfig,\n ...config,\n translations: mergedTranslations,\n },\n debounceTimer: null,\n prefill: {},\n };\n}\n\n/**\n * Generate unique instance ID for resource prefixing\n */\nexport function generateInstanceId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 9);\n return `inst-${timestamp}-${random}`;\n}\n","// Theme configuration and CSS custom properties\n// Provides a centralized theming system using CSS variables\n\nexport interface Theme {\n // Colors\n primaryColor: string;\n primaryHoverColor: string;\n errorColor: string;\n errorHoverColor: string;\n successColor: string;\n borderColor: string;\n borderHoverColor: string;\n borderFocusColor: string;\n backgroundColor: string;\n backgroundHoverColor: string;\n backgroundReadonlyColor: string;\n textColor: string;\n textSecondaryColor: string;\n textPlaceholderColor: string;\n textDisabledColor: string;\n\n // Button colors\n buttonBgColor: string;\n buttonTextColor: string;\n buttonBorderColor: string;\n buttonHoverBgColor: string;\n buttonHoverBorderColor: string;\n\n // Action button colors\n actionBgColor: string;\n actionTextColor: string;\n actionBorderColor: string;\n actionHoverBgColor: string;\n actionHoverBorderColor: string;\n\n // File upload colors\n fileUploadBgColor: string;\n fileUploadBorderColor: string;\n fileUploadTextColor: string;\n fileUploadHoverBorderColor: string;\n\n // Spacing\n inputPaddingX: string;\n inputPaddingY: string;\n borderRadius: string;\n borderWidth: string;\n\n // Typography\n fontSize: string;\n fontSizeSmall: string;\n fontSizeExtraSmall: string;\n fontFamily: string;\n fontWeightNormal: string;\n fontWeightMedium: string;\n\n // Focus ring\n focusRingWidth: string;\n focusRingColor: string;\n focusRingOpacity: string;\n\n // Transitions\n transitionDuration: string;\n}\n\nexport const defaultTheme: Theme = {\n // Colors - matching Tailwind defaults\n primaryColor: \"#3b82f6\", // blue-500\n primaryHoverColor: \"#2563eb\", // blue-600\n errorColor: \"#ef4444\", // red-500\n errorHoverColor: \"#dc2626\", // red-600\n successColor: \"#10b981\", // green-500\n borderColor: \"#d1d5db\", // gray-300\n borderHoverColor: \"#9ca3af\", // gray-400\n borderFocusColor: \"#3b82f6\", // blue-500\n backgroundColor: \"#ffffff\", // white\n backgroundHoverColor: \"#f9fafb\", // gray-50\n backgroundReadonlyColor: \"#f3f4f6\", // gray-100\n textColor: \"#1f2937\", // gray-800\n textSecondaryColor: \"#6b7280\", // gray-500\n textPlaceholderColor: \"#9ca3af\", // gray-400\n textDisabledColor: \"#d1d5db\", // gray-300\n\n // Button colors\n buttonBgColor: \"#3b82f6\", // blue-500\n buttonTextColor: \"#ffffff\", // white\n buttonBorderColor: \"#2563eb\", // blue-600\n buttonHoverBgColor: \"#2563eb\", // blue-600\n buttonHoverBorderColor: \"#1d4ed8\", // blue-700\n\n // Action button colors\n actionBgColor: \"#ffffff\", // white\n actionTextColor: \"#374151\", // gray-700\n actionBorderColor: \"#e5e7eb\", // gray-200\n actionHoverBgColor: \"#f9fafb\", // gray-50\n actionHoverBorderColor: \"#d1d5db\", // gray-300\n\n // File upload colors\n fileUploadBgColor: \"#f3f4f6\", // gray-100\n fileUploadBorderColor: \"#d1d5db\", // gray-300\n fileUploadTextColor: \"#9ca3af\", // gray-400\n fileUploadHoverBorderColor: \"#3b82f6\", // blue-500\n\n // Spacing\n inputPaddingX: \"0.75rem\", // 3 (12px)\n inputPaddingY: \"0.5rem\", // 2 (8px)\n borderRadius: \"0.5rem\", // rounded-lg (8px)\n borderWidth: \"1px\",\n\n // Typography\n fontSize: \"0.875rem\", // text-sm (14px)\n fontSizeSmall: \"0.75rem\", // text-xs (12px)\n fontSizeExtraSmall: \"0.625rem\", // 10px\n fontFamily:\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontWeightNormal: \"400\",\n fontWeightMedium: \"500\",\n\n // Focus ring\n focusRingWidth: \"2px\",\n focusRingColor: \"#3b82f6\", // blue-500\n focusRingOpacity: \"0.5\",\n\n // Transitions\n transitionDuration: \"200ms\",\n};\n\n/**\n * Generate CSS custom properties from theme object\n * Prefixes all variables with --fb- to avoid conflicts\n */\nexport function generateCSSVariables(theme: Partial<Theme>): string {\n const mergedTheme = { ...defaultTheme, ...theme };\n\n const cssVars: string[] = [];\n\n // Convert theme object to CSS variables\n Object.entries(mergedTheme).forEach(([key, value]) => {\n // Convert camelCase to kebab-case\n const kebabKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n cssVars.push(` --fb-${kebabKey}: ${value};`);\n });\n\n return cssVars.join(\"\\n\");\n}\n\n/**\n * Inject theme CSS variables into a container element or create a style tag\n */\nexport function injectThemeVariables(\n container: HTMLElement,\n theme: Partial<Theme>,\n): void {\n const cssVariables = generateCSSVariables(theme);\n\n // Check if there's already a theme style tag\n let styleTag = container.querySelector(\n \"style[data-fb-theme]\",\n ) as HTMLStyleElement;\n\n if (!styleTag) {\n styleTag = document.createElement(\"style\");\n styleTag.setAttribute(\"data-fb-theme\", \"true\");\n container.appendChild(styleTag);\n }\n\n // Create CSS rule targeting the container\n styleTag.textContent = `\n [data-fb-root=\"true\"] {\n${cssVariables}\n }\n `;\n}\n\n/**\n * Example theme configurations for documentation\n */\nexport const exampleThemes = {\n default: defaultTheme,\n\n dark: {\n ...defaultTheme,\n primaryColor: \"#60a5fa\", // blue-400\n primaryHoverColor: \"#3b82f6\", // blue-500\n borderColor: \"#4b5563\", // gray-600\n borderHoverColor: \"#6b7280\", // gray-500\n borderFocusColor: \"#60a5fa\", // blue-400\n backgroundColor: \"#1f2937\", // gray-800\n backgroundHoverColor: \"#374151\", // gray-700\n backgroundReadonlyColor: \"#111827\", // gray-900\n textColor: \"#f9fafb\", // gray-50\n textSecondaryColor: \"#9ca3af\", // gray-400\n textPlaceholderColor: \"#6b7280\", // gray-500\n fileUploadBgColor: \"#374151\", // gray-700\n fileUploadBorderColor: \"#4b5563\", // gray-600\n fileUploadTextColor: \"#9ca3af\", // gray-400\n } as Theme,\n\n klein: {\n ...defaultTheme,\n primaryColor: \"#0066cc\",\n primaryHoverColor: \"#0052a3\",\n errorColor: \"#d32f2f\",\n errorHoverColor: \"#c62828\",\n successColor: \"#388e3c\",\n borderColor: \"#e0e0e0\",\n borderHoverColor: \"#bdbdbd\",\n borderFocusColor: \"#0066cc\",\n borderRadius: \"4px\",\n fontSize: \"16px\",\n fontSizeSmall: \"14px\",\n fontFamily: '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n } as Theme,\n};\n","// Style utility functions for applying themed styles to form elements\n\nimport type { State } from \"../types/index.js\";\n\n/**\n * Apply themed input styles to an HTMLInputElement, HTMLTextAreaElement, or HTMLSelectElement\n */\nexport function applyInputStyles(\n element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n state: State,\n className?: string,\n): void {\n element.className = className || \"w-full\";\n element.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n\n // Add interactive hover/focus styles for editable inputs\n if (!state.config.readonly) {\n element.addEventListener(\"focus\", () => {\n element.style.borderColor = \"var(--fb-border-focus-color)\";\n element.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n element.style.outlineOffset = \"0\";\n });\n element.addEventListener(\"blur\", () => {\n element.style.borderColor = \"var(--fb-border-color)\";\n element.style.outline = \"none\";\n });\n element.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== element) {\n element.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n element.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== element) {\n element.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n}\n\n/**\n * Apply themed hint/description styles to a paragraph element\n */\nexport function applyHintStyles(element: HTMLParagraphElement): void {\n element.className = \"mt-1\";\n element.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n}\n\n/**\n * Create a styled add button with theme support\n */\nexport function createAddButton(\n text: string,\n onClick: () => void,\n): HTMLButtonElement {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"mt-2 px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = text;\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = onClick;\n return addBtn;\n}\n\n/**\n * Create a styled remove button with theme support\n */\nexport function createRemoveButton(\n text: string,\n onClick: () => void,\n): HTMLButtonElement {\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = text;\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = onClick;\n return removeBtn;\n}\n\n/**\n * Apply themed action button styles (for external actions in readonly mode)\n */\nexport function applyActionButtonStyles(\n button: HTMLButtonElement,\n isFormLevel: boolean = false,\n): void {\n button.style.cssText = `\n background-color: var(--fb-action-bg-color);\n color: var(--fb-action-text-color);\n border: var(--fb-border-width) solid var(--fb-action-border-color);\n padding: ${isFormLevel ? \"0.5rem 1rem\" : \"0.5rem 0.75rem\"};\n font-size: var(--fb-font-size);\n font-weight: var(--fb-font-weight-medium);\n border-radius: var(--fb-border-radius);\n transition: all var(--fb-transition-duration);\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n `;\n button.addEventListener(\"mouseenter\", () => {\n button.style.backgroundColor = \"var(--fb-action-hover-bg-color)\";\n button.style.borderColor = \"var(--fb-action-hover-border-color)\";\n });\n button.addEventListener(\"mouseleave\", () => {\n button.style.backgroundColor = \"var(--fb-action-bg-color)\";\n button.style.borderColor = \"var(--fb-action-border-color)\";\n });\n}\n","// Component operations registry - maps element types to validation/update functions\n// This registry provides delegation from FormBuilderInstance to component-specific logic\n\nimport type {\n Element,\n ComponentContext,\n ValidationResult,\n ComponentOperations,\n ComponentValidator,\n ComponentUpdater,\n} from \"../types/index.js\";\nimport { validateTextElement, updateTextField } from \"./text.js\";\nimport { validateTextareaElement, updateTextareaField } from \"./textarea.js\";\nimport { validateNumberElement, updateNumberField } from \"./number.js\";\nimport { validateSelectElement, updateSelectField } from \"./select.js\";\nimport { validateSwitcherElement, updateSwitcherField } from \"./switcher.js\";\nimport { validateFileElement, updateFileField } from \"./file.js\";\nimport { validateColourElement, updateColourField } from \"./colour.js\";\nimport { validateSliderElement, updateSliderField } from \"./slider.js\";\nimport { validateContainerElement, updateContainerField } from \"./container.js\";\nimport { validateGroupElement, updateGroupField } from \"./group.js\";\nimport { validateTableElement, updateTableField } from \"./table.js\";\nimport {\n validateRichInputElement,\n updateRichInputField,\n} from \"./richinput.js\";\nimport {\n serializeHiddenValue,\n deserializeHiddenValue,\n} from \"../utils/helpers.js\";\n\n/**\n * Validate a hidden-type field by reading from its DOM <input type=\"hidden\"> element.\n */\nfunction validateHiddenElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const { scopeRoot } = context;\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"hidden\"][data-hidden-field=\"true\"][name=\"${key}\"]`,\n );\n const raw = input?.value ?? \"\";\n if (raw === \"\") {\n const defaultVal = \"default\" in element ? element.default : null;\n return { value: defaultVal !== undefined ? defaultVal : null, errors: [] };\n }\n return { value: deserializeHiddenValue(raw), errors: [] };\n}\n\n/**\n * Update a hidden-type field by setting its DOM <input type=\"hidden\"> element value.\n */\nfunction updateHiddenField(\n _element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"hidden\"][data-hidden-field=\"true\"][name=\"${fieldPath}\"]`,\n );\n if (!input) return;\n input.value = serializeHiddenValue(value);\n}\n\n/**\n * Component operations registry\n * Maps element type to validator and updater functions\n */\nconst componentRegistry: Record<string, ComponentOperations> = {\n text: {\n validate: validateTextElement as ComponentValidator,\n update: updateTextField as ComponentUpdater,\n },\n textarea: {\n validate: validateTextareaElement as ComponentValidator,\n update: updateTextareaField as ComponentUpdater,\n },\n number: {\n validate: validateNumberElement as ComponentValidator,\n update: updateNumberField as ComponentUpdater,\n },\n select: {\n validate: validateSelectElement as ComponentValidator,\n update: updateSelectField as ComponentUpdater,\n },\n switcher: {\n validate: validateSwitcherElement as ComponentValidator,\n update: updateSwitcherField as ComponentUpdater,\n },\n file: {\n validate: validateFileElement as ComponentValidator,\n update: updateFileField as ComponentUpdater,\n },\n files: {\n // Legacy type - delegates to file\n validate: validateFileElement as ComponentValidator,\n update: updateFileField as ComponentUpdater,\n },\n colour: {\n validate: validateColourElement as ComponentValidator,\n update: updateColourField as ComponentUpdater,\n },\n slider: {\n validate: validateSliderElement as ComponentValidator,\n update: updateSliderField as ComponentUpdater,\n },\n container: {\n validate: validateContainerElement as ComponentValidator,\n update: updateContainerField as ComponentUpdater,\n },\n group: {\n // Deprecated type - delegates to container\n validate: validateGroupElement as ComponentValidator,\n update: updateGroupField as ComponentUpdater,\n },\n table: {\n validate: validateTableElement as ComponentValidator,\n update: updateTableField as ComponentUpdater,\n },\n richinput: {\n validate: validateRichInputElement as ComponentValidator,\n update: updateRichInputField as ComponentUpdater,\n },\n hidden: {\n // Legacy type: `type: \"hidden\"` — reads/writes DOM <input type=\"hidden\"> element\n validate: validateHiddenElement as ComponentValidator,\n update: updateHiddenField as ComponentUpdater,\n },\n};\n\n/**\n * Get component operations for a given element type\n */\nexport function getComponentOperations(\n elementType: string,\n): ComponentOperations | null {\n return componentRegistry[elementType] || null;\n}\n\n/**\n * Validate element using component-specific validator\n * Falls back to legacy implementation if component not yet migrated\n */\nexport function validateElementWithComponent(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult | null {\n const ops = getComponentOperations(element.type);\n if (ops && ops.validate) {\n return ops.validate(element, key, context);\n }\n return null; // Return null to indicate fallback to legacy implementation\n}\n\n/**\n * Update element using component-specific updater\n * Falls back to legacy implementation if component not yet migrated\n */\nexport function updateElementWithComponent(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): boolean {\n const ops = getComponentOperations(element.type);\n if (ops && ops.update) {\n ops.update(element, fieldPath, value, context);\n return true;\n }\n return false; // Return false to indicate fallback to legacy implementation\n}\n","// Form Builder Instance - Encapsulated state management for multi-instance support\n\nimport type {\n Schema,\n Element,\n ContainerElement,\n GroupElement,\n ExternalAction,\n FormData as FormDataResult,\n Config,\n State,\n ComponentContext,\n} from \"../types/index.js\";\nimport { validateSchema } from \"../utils/validation.js\";\nimport { clear, createHiddenInput, deserializeHiddenValue } from \"../utils/helpers.js\";\nimport {\n renderElement,\n setContainerValidateElement,\n} from \"../components/index.js\";\nimport { createInstanceState, generateInstanceId } from \"./state.js\";\nimport { injectThemeVariables } from \"../styles/theme.js\";\nimport { applyActionButtonStyles } from \"../utils/styles.js\";\nimport {\n validateElementWithComponent,\n updateElementWithComponent,\n} from \"../components/registry.js\";\nimport { evaluateEnableCondition, getValueByPath } from \"../utils/enable-conditions.js\";\n\n/**\n * FormBuilderInstance - Encapsulates all form state and operations\n * Allows multiple independent forms on the same page without state collisions\n */\nexport class FormBuilderInstance {\n private state: State;\n private instanceId: string;\n\n constructor(config?: Partial<Config>) {\n this.instanceId = generateInstanceId();\n this.state = createInstanceState(config);\n\n // Verbose error tracking: Track instances for memory leak detection\n if (this.state.config.verboseErrors) {\n if (!globalThis.__formBuilderInstances) {\n globalThis.__formBuilderInstances = new Set<string>();\n }\n globalThis.__formBuilderInstances.add(this.instanceId);\n\n // Warn about instance count\n if (globalThis.__formBuilderInstances.size > 10) {\n console.warn(\n `[form-builder] ${globalThis.__formBuilderInstances.size} instances active. ` +\n \"Possible memory leak - ensure you call destroy() when done.\",\n );\n }\n }\n }\n\n /**\n * Get instance ID (useful for debugging and resource prefixing)\n */\n getInstanceId(): string {\n return this.instanceId;\n }\n\n /**\n * Get current state (for advanced use cases)\n */\n getState(): State {\n return this.state;\n }\n\n /**\n * Set the form root element\n */\n setFormRoot(element: HTMLElement): void {\n this.state.formRoot = element;\n }\n\n /**\n * Configure the form builder\n */\n configure(config: Partial<Config>): void {\n Object.assign(this.state.config, config);\n }\n\n /**\n * Set file upload handler\n */\n setUploadHandler(uploadFn: ((file: File) => Promise<string>) | null): void {\n this.state.config.uploadFile = uploadFn;\n }\n\n /**\n * Set file download handler\n */\n setDownloadHandler(\n downloadFn: ((resourceId: string, fileName: string) => void) | null,\n ): void {\n this.state.config.downloadFile = downloadFn;\n }\n\n /**\n * Set thumbnail generation handler\n */\n setThumbnailHandler(\n thumbnailFn: ((resourceId: string) => Promise<string | null>) | null,\n ): void {\n this.state.config.getThumbnail = thumbnailFn;\n }\n\n /**\n * Set action handler\n */\n setActionHandler(\n actionFn:\n | ((value: string, key: string, relatedField: string | null) => void)\n | null,\n ): void {\n this.state.config.actionHandler = actionFn;\n }\n\n /**\n * Set mode (edit or readonly)\n */\n setMode(mode: \"edit\" | \"readonly\"): void {\n this.state.config.readonly = mode === \"readonly\";\n }\n\n /**\n * Set locale\n */\n setLocale(locale: \"en\" | \"ru\"): void {\n if (this.state.config.translations[locale]) {\n this.state.config.locale = locale;\n }\n }\n\n /**\n * Trigger onChange callbacks with debouncing\n * @param fieldPath - Optional field path for field-specific change events\n * @param fieldValue - Optional field value for field-specific change events\n */\n triggerOnChange(fieldPath?: string, fieldValue?: any): void {\n // Skip if in readonly mode or during initial render\n if (this.state.config.readonly) return;\n\n // Clear existing debounce timer\n if (this.state.debounceTimer !== null) {\n clearTimeout(this.state.debounceTimer);\n }\n\n // Set new debounce timer\n this.state.debounceTimer = setTimeout(() => {\n // Get current form data without validation to avoid UI errors\n const formData = this.validateForm(true);\n\n // Re-evaluate conditional fields based on new form data\n this.reevaluateConditionalFields();\n\n // Call onChange callback if configured\n if (this.state.config.onChange) {\n this.state.config.onChange(formData);\n }\n\n // Call onFieldChange callback if configured and field path provided\n if (\n this.state.config.onFieldChange &&\n fieldPath !== undefined &&\n fieldValue !== undefined\n ) {\n this.state.config.onFieldChange(fieldPath, fieldValue, formData);\n }\n\n // Clear timer reference\n this.state.debounceTimer = null;\n }, this.state.config.debounceMs) as unknown as number;\n }\n\n /**\n * Register an external action that will be displayed as a button\n * External actions can be form-level (no related_field) or field-level (with related_field)\n * @param action - External action definition\n */\n registerAction(action: ExternalAction): void {\n if (!action || !action.value) {\n throw new Error(\"Action must have a value property\");\n }\n\n // Initialize externalActions array if not exists\n if (!this.state.externalActions) {\n this.state.externalActions = [];\n }\n\n // Check if action already exists (by value and related_field)\n const existingIndex = this.state.externalActions.findIndex(\n (a) =>\n a.value === action.value && a.related_field === action.related_field,\n );\n\n if (existingIndex >= 0) {\n // Replace existing action\n this.state.externalActions[existingIndex] = action;\n } else {\n // Add new action\n this.state.externalActions.push(action);\n }\n }\n\n /**\n * Find the DOM element corresponding to a field path (instance-scoped)\n */\n private findFormElementByFieldPath(fieldPath: string): HTMLElement | null {\n if (!this.state.formRoot) return null;\n\n // In edit mode, try to find input elements with name attributes\n if (!this.state.config.readonly) {\n // Try exact match first\n let element = this.state.formRoot.querySelector<HTMLElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (element) return element;\n\n // Try with array notation variations\n const variations = [\n fieldPath,\n fieldPath.replace(/\\[(\\d+)\\]/g, \"[$1]\"),\n fieldPath.replace(/\\./g, \"[\") +\n \"]\".repeat((fieldPath.match(/\\./g) || []).length),\n ];\n\n for (const variation of variations) {\n element = this.state.formRoot.querySelector<HTMLElement>(\n `[name=\"${variation}\"]`,\n );\n if (element) return element;\n }\n }\n\n // In readonly mode, or if no input found, look for field wrappers\n const schemaElement = this.findSchemaElement(fieldPath);\n if (!schemaElement) return null;\n\n const fieldWrappers =\n this.state.formRoot.querySelectorAll(\".fb-field-wrapper\");\n for (const wrapper of fieldWrappers) {\n const labelText = schemaElement.label || schemaElement.key;\n const labelElement = wrapper.querySelector(\"label\");\n if (\n labelElement &&\n (labelElement.textContent === labelText ||\n labelElement.textContent === `${labelText}*`)\n ) {\n let fieldElement =\n wrapper.querySelector<HTMLElement>(\".field-placeholder\");\n if (!fieldElement) {\n fieldElement = document.createElement(\"div\");\n fieldElement.className = \"field-placeholder\";\n fieldElement.style.display = \"none\";\n wrapper.appendChild(fieldElement);\n }\n return fieldElement;\n }\n }\n\n return null;\n }\n\n /**\n * Find schema element by field path\n */\n private findSchemaElement(fieldPath: string): Element | null {\n if (!this.state.schema || !this.state.schema.elements) return null;\n\n let currentElements = this.state.schema.elements;\n let foundElement: Element | null = null;\n\n const keys = fieldPath\n .replace(/\\[\\d+\\]/g, \"\")\n .split(\".\")\n .filter(Boolean);\n\n for (const key of keys) {\n foundElement = currentElements.find((el) => el.key === key) || null;\n if (!foundElement) {\n return null;\n }\n if (\"elements\" in foundElement && foundElement.elements) {\n currentElements = foundElement.elements;\n }\n }\n\n return foundElement;\n }\n\n /**\n * Resolve action label from schema or external action\n */\n private resolveActionLabel(\n actionKey: string,\n externalLabel: string | undefined,\n schemaElement: Element | null,\n isTrueFormLevelAction = false,\n ): string {\n if (schemaElement && \"actions\" in schemaElement && schemaElement.actions) {\n const predefinedAction = schemaElement.actions.find(\n (a) => a.key === actionKey,\n );\n if (predefinedAction && predefinedAction.label) {\n return predefinedAction.label;\n }\n }\n\n if (\n isTrueFormLevelAction &&\n this.state.schema &&\n \"actions\" in this.state.schema &&\n (this.state.schema as any).actions\n ) {\n const rootAction = (this.state.schema as any).actions.find(\n (a: any) => a.key === actionKey,\n );\n if (rootAction && rootAction.label) {\n return rootAction.label;\n }\n }\n\n if (externalLabel) {\n return externalLabel;\n }\n\n return actionKey;\n }\n\n /**\n * Render form-level action buttons at the bottom of the form\n */\n private renderFormLevelActions(\n actions: ExternalAction[],\n trueFormLevelActions: ExternalAction[] = [],\n ): void {\n if (!this.state.formRoot) return;\n\n const existingContainer = this.state.formRoot.querySelector(\n \".form-level-actions-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n const actionsContainer = document.createElement(\"div\");\n actionsContainer.className =\n \"form-level-actions-container mt-6 pt-4 flex flex-wrap gap-3 justify-center\";\n actionsContainer.style.cssText = `\n border-top: var(--fb-border-width) solid var(--fb-border-color);\n `;\n\n actions.forEach((action) => {\n const actionBtn = document.createElement(\"button\");\n actionBtn.type = \"button\";\n applyActionButtonStyles(actionBtn, true);\n\n const isTrueFormLevelAction = trueFormLevelActions.includes(action);\n const resolvedLabel = this.resolveActionLabel(\n action.key,\n action.label,\n null,\n isTrueFormLevelAction,\n );\n actionBtn.textContent = resolvedLabel;\n\n actionBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n this.state.config.actionHandler &&\n typeof this.state.config.actionHandler === \"function\"\n ) {\n this.state.config.actionHandler(action.value, action.key, null);\n }\n });\n\n actionsContainer.appendChild(actionBtn);\n });\n\n this.state.formRoot.appendChild(actionsContainer);\n }\n\n /**\n * Render external action buttons for fields\n */\n renderExternalActions(): void {\n if (\n !this.state.externalActions ||\n !Array.isArray(this.state.externalActions)\n )\n return;\n\n const actionsByField = new Map<string, ExternalAction[]>();\n const trueFormLevelActions: ExternalAction[] = [];\n const movedFormLevelActions: ExternalAction[] = [];\n\n this.state.externalActions.forEach((action) => {\n if (!action.key || !action.value) return;\n\n if (!action.related_field) {\n trueFormLevelActions.push(action);\n } else {\n if (!actionsByField.has(action.related_field)) {\n actionsByField.set(action.related_field, []);\n }\n actionsByField.get(action.related_field)!.push(action);\n }\n });\n\n actionsByField.forEach((actions, fieldPath) => {\n const fieldElement = this.findFormElementByFieldPath(fieldPath);\n if (!fieldElement) {\n console.warn(\n `External action: Could not find form element for field \"${fieldPath}\", treating as form-level actions`,\n );\n movedFormLevelActions.push(...actions);\n return;\n }\n\n let wrapper = fieldElement.closest(\".fb-field-wrapper\");\n if (!wrapper) {\n wrapper = fieldElement.parentElement;\n }\n\n if (!wrapper) {\n console.warn(\n `External action: Could not find wrapper for field \"${fieldPath}\"`,\n );\n return;\n }\n\n const existingContainer = wrapper.querySelector(\n \".external-actions-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n const actionsContainer = document.createElement(\"div\");\n actionsContainer.className =\n \"external-actions-container mt-3 flex flex-wrap gap-2\";\n\n const schemaElement = this.findSchemaElement(fieldPath);\n\n actions.forEach((action) => {\n const actionBtn = document.createElement(\"button\");\n actionBtn.type = \"button\";\n applyActionButtonStyles(actionBtn, false);\n\n const resolvedLabel = this.resolveActionLabel(\n action.key,\n action.label,\n schemaElement,\n );\n actionBtn.textContent = resolvedLabel;\n\n actionBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n this.state.config.actionHandler &&\n typeof this.state.config.actionHandler === \"function\"\n ) {\n this.state.config.actionHandler(\n action.value,\n action.key,\n action.related_field,\n );\n }\n });\n\n actionsContainer.appendChild(actionBtn);\n });\n\n wrapper.appendChild(actionsContainer);\n });\n\n const allFormLevelActions = [\n ...trueFormLevelActions,\n ...movedFormLevelActions,\n ];\n if (allFormLevelActions.length > 0) {\n this.renderFormLevelActions(allFormLevelActions, trueFormLevelActions);\n }\n }\n\n /**\n * Handle prefill hint click - updates container fields with hint values\n */\n private handlePrefillHintClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (!target.classList.contains(\"fb-prefill-hint\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Get hint data from attributes\n const hintValuesJson = target.getAttribute(\"data-hint-values\");\n const isRootHint = target.getAttribute(\"data-root-hint\") === \"true\";\n const containerKey = target.getAttribute(\"data-container-key\");\n\n // For root-level hints, containerKey is not required\n if (!hintValuesJson || (!isRootHint && !containerKey)) {\n console.warn(\"Prefill hint missing required data attributes\");\n return;\n }\n\n try {\n const hintValues = JSON.parse(hintValuesJson) as Record<string, any>;\n\n // Update each field in the hint\n for (const fieldKey in hintValues) {\n // For root-level hints, use field key directly; for container hints, prefix with container key\n const fullPath = isRootHint ? fieldKey : `${containerKey}.${fieldKey}`;\n const value = hintValues[fieldKey];\n this.updateField(fullPath, value);\n }\n } catch (error) {\n console.error(\"Error parsing prefill hint values:\", error);\n }\n }\n\n /**\n * Create root-level prefill hints UI\n */\n private createRootPrefillHints(hints: any[]): HTMLElement {\n const hintsContainer = document.createElement(\"div\");\n hintsContainer.className = \"fb-prefill-hints flex flex-wrap gap-2 mb-4\";\n\n hints.forEach((hint) => {\n const hintButton = document.createElement(\"button\");\n hintButton.type = \"button\";\n hintButton.className = \"fb-prefill-hint\";\n\n // Set button text with optional icon\n if (hint.icon) {\n hintButton.textContent = `${hint.icon} ${hint.label}`;\n } else {\n hintButton.textContent = hint.label;\n }\n\n // Store hint data for root-level hints\n hintButton.setAttribute(\"data-hint-values\", JSON.stringify(hint.values));\n hintButton.setAttribute(\"data-root-hint\", \"true\");\n\n hintsContainer.appendChild(hintButton);\n });\n\n return hintsContainer;\n }\n\n /**\n * Render form from schema\n */\n renderForm(\n root: HTMLElement,\n schema: Schema,\n prefill?: Record<string, any>,\n actions?: ExternalAction[],\n ): void {\n const errors = validateSchema(schema);\n if (errors.length > 0) {\n console.error(\"Schema validation errors:\", errors);\n return;\n }\n\n this.state.formRoot = root;\n this.state.schema = schema;\n this.state.externalActions = actions || null;\n this.state.prefill = prefill || {};\n\n clear(root);\n\n // Mark root element for theme CSS variables\n root.setAttribute(\"data-fb-root\", \"true\");\n\n // Inject theme CSS variables\n injectThemeVariables(root, this.state.config.theme);\n\n // Create root container (treating schema as implicit container)\n const rootContainer = document.createElement(\"div\");\n rootContainer.className = \"space-y-6\";\n\n // Render root-level prefill hints if specified (edit mode only)\n if (schema.prefillHints && !this.state.config.readonly) {\n const hintsContainer = this.createRootPrefillHints(schema.prefillHints);\n rootContainer.appendChild(hintsContainer);\n }\n\n // Create fields wrapper with column layout support\n const fieldsWrapper = document.createElement(\"div\");\n const columns = schema.columns || 1;\n\n if (columns === 1) {\n fieldsWrapper.className = \"space-y-4\"; // Vertical (default)\n } else {\n fieldsWrapper.className = `grid grid-cols-${columns} gap-4`; // Grid layout\n }\n\n // Render each element\n schema.elements.forEach((element) => {\n if (element.hidden || element.type === \"hidden\") {\n // Render as <input type=\"hidden\"> so value is preserved in DOM\n // and can be read/updated via updateField/setFormData\n const val = prefill?.[element.key] ?? element.default ?? null;\n fieldsWrapper.appendChild(createHiddenInput(element.key, val));\n return;\n }\n const block = renderElement(element, {\n path: \"\",\n prefill: prefill || {},\n formData: prefill || {}, // Pass complete root data for enableIf evaluation\n state: this.state,\n instance: this,\n });\n fieldsWrapper.appendChild(block);\n });\n\n rootContainer.appendChild(fieldsWrapper);\n root.appendChild(rootContainer);\n\n // Add global click handler for prefill hints (edit mode only)\n if (!this.state.config.readonly) {\n root.addEventListener(\"click\", this.handlePrefillHintClick.bind(this));\n }\n\n if (\n this.state.config.readonly &&\n this.state.externalActions &&\n Array.isArray(this.state.externalActions)\n ) {\n this.renderExternalActions();\n }\n }\n\n /**\n * Validate form and extract data\n * This is a complete copy of the validateForm logic from form-builder.ts\n * but uses instance state instead of global state\n */\n validateForm(skipValidation = false): FormDataResult {\n if (!this.state.schema || !this.state.formRoot)\n return { valid: true, errors: [], data: {} };\n\n const errors: string[] = [];\n const data: Record<string, any> = {};\n\n // ============================================================================\n // Component delegation validation (all field types now use component registry)\n // ============================================================================\n\n // NOTE: All validateXxxElement functions have been migrated to their respective\n // component files (text.ts, select.ts, file.ts, container.ts, group.ts).\n // They are now called via the component registry pattern.\n\n // Inject validateElement into container component for nested validation\n const validateElement = (\n element: Element,\n ctx: { path: string },\n customScopeRoot: HTMLElement | null = null,\n ): { value: any; spread: boolean } => {\n const key = element.key;\n const scopeRoot = customScopeRoot || this.state.formRoot!;\n\n // All components now use delegation pattern via component registry\n const componentContext: ComponentContext = {\n scopeRoot,\n state: this.state,\n instance: this,\n path: ctx.path,\n skipValidation,\n };\n\n const componentResult = validateElementWithComponent(\n element,\n key,\n componentContext,\n );\n\n if (componentResult !== null) {\n // Component validator handled it - merge errors and return value with spread flag\n errors.push(...componentResult.errors);\n return { value: componentResult.value, spread: !!componentResult.spread };\n }\n\n // Unknown field type\n console.warn(`Unknown field type \"${element.type}\" for key \"${key}\"`);\n return { value: null, spread: false };\n };\n\n // Set up container validation to use this validateElement function\n setContainerValidateElement(validateElement);\n\n this.state.schema.elements.forEach((element) => {\n // Skip conditionally disabled fields (enableIf not met)\n if (element.enableIf) {\n try {\n const shouldEnable = evaluateEnableCondition(\n element.enableIf,\n data,\n );\n if (!shouldEnable) {\n // Field is conditionally disabled, exclude from form data entirely\n return;\n }\n } catch (error) {\n console.error(\n `Error evaluating enableIf for field \"${element.key}\" during validation:`,\n error,\n );\n // Continue validation in case of error (fail-safe)\n }\n }\n\n if (element.hidden || element.type === \"hidden\") {\n const hiddenInput = this.state.formRoot!.querySelector<HTMLInputElement>(\n `input[type=\"hidden\"][data-hidden-field=\"true\"][name=\"${element.key}\"]`,\n );\n const raw = hiddenInput?.value ?? \"\";\n if (raw !== \"\") {\n data[element.key] = deserializeHiddenValue(raw);\n } else {\n data[element.key] =\n element.default !== undefined ? element.default : null;\n }\n } else {\n const result = validateElement(element, { path: \"\" });\n if (result.spread && result.value !== null && typeof result.value === \"object\") {\n Object.assign(data, result.value);\n } else {\n data[element.key] = result.value;\n }\n }\n });\n\n return {\n valid: errors.length === 0,\n errors,\n data,\n };\n }\n\n /**\n * Get form data\n */\n getFormData(): FormDataResult {\n return this.validateForm(false);\n }\n\n /**\n * Submit form with validation\n */\n submitForm(): FormDataResult {\n const result = this.validateForm(false);\n if (result.valid) {\n if (typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n {\n type: \"formSubmit\",\n data: result.data,\n schema: this.state.schema,\n },\n \"*\",\n );\n }\n }\n return result;\n }\n\n /**\n * Save draft without validation\n */\n saveDraft(): FormDataResult {\n const result = this.validateForm(true);\n if (typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n {\n type: \"formDraft\",\n data: result.data,\n schema: this.state.schema,\n },\n \"*\",\n );\n }\n return result;\n }\n\n /**\n * Clear the form - reset all field values to empty while preserving form structure\n * This is done by re-rendering the form with empty data\n */\n clearForm(): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\"clearForm: Form not initialized. Call renderForm() first.\");\n return;\n }\n\n // Get current schema, form root, and external actions\n const schema = this.state.schema;\n const formRoot = this.state.formRoot;\n const actions = this.state.externalActions;\n\n // Build empty prefill data (only for hidden fields)\n const emptyPrefill = this.buildHiddenFieldsData(schema.elements);\n\n // Re-render the form with empty data, preserving external actions\n this.renderForm(formRoot, schema, emptyPrefill, actions || undefined);\n }\n\n /**\n * Build prefill data for hidden fields only\n * Hidden fields should retain their values when clearing\n * Builds nested objects instead of flattened dotted keys\n */\n private buildHiddenFieldsData(elements: Element[]): Record<string, any> {\n const data: Record<string, any> = {};\n\n for (const element of elements) {\n const key = element.key;\n\n // Only include hidden fields with explicit defaults\n if (element.hidden && element.default !== undefined) {\n data[key] = element.default;\n }\n\n // Recursively process container elements for nested hidden fields\n if (element.type === \"container\" || element.type === \"group\") {\n const containerElement = element as ContainerElement | GroupElement;\n const nestedData = this.buildHiddenFieldsData(\n containerElement.elements,\n );\n\n if (Object.keys(nestedData).length > 0) {\n if (!(key in data)) {\n // No default set - use nested data\n data[key] = nestedData;\n } else if (\n typeof data[key] === \"object\" &&\n data[key] !== null &&\n !Array.isArray(data[key])\n ) {\n // Plain object default - merge nested data into it\n data[key] = { ...data[key], ...nestedData };\n }\n // If data[key] is array or other type, don't overwrite\n }\n }\n }\n\n return data;\n }\n\n /**\n * Build a map from flat output keys (textKey/filesKey) to the richinput schema element info.\n * Used by setFormData to detect flat richinput keys and remap them to their composite values.\n */\n private buildFlatKeyMap(\n elements: Element[],\n ): Map<string, { schemaKey: string; role: \"text\" | \"files\" }> {\n const map = new Map<string, { schemaKey: string; role: \"text\" | \"files\" }>();\n for (const el of elements) {\n if (el.type === \"richinput\" && (el as any).flatOutput) {\n const richEl = el as any;\n const textKey: string = richEl.textKey ?? \"text\";\n const filesKey: string = richEl.filesKey ?? \"files\";\n map.set(textKey, { schemaKey: el.key, role: \"text\" });\n map.set(filesKey, { schemaKey: el.key, role: \"files\" });\n }\n }\n return map;\n }\n\n /**\n * Set form data - update multiple fields without full re-render\n * @param data - Object with field paths and their values\n */\n setFormData(data: Record<string, any>): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\n \"setFormData: Form not initialized. Call renderForm() first.\",\n );\n return;\n }\n\n // Build a map of flat keys -> richinput schema elements (for flatOutput richinputs)\n const flatKeyMap = this.buildFlatKeyMap(this.state.schema.elements);\n\n // Collect flat richinput updates: schemaKey -> { [textKey]: val, [filesKey]: val }\n const flatUpdates = new Map<string, Record<string, any>>();\n\n for (const fieldPath in data) {\n const flatInfo = flatKeyMap.get(fieldPath);\n if (flatInfo) {\n // This key belongs to a flatOutput richinput - collect the flat parts\n if (!flatUpdates.has(flatInfo.schemaKey)) {\n flatUpdates.set(flatInfo.schemaKey, {});\n }\n flatUpdates.get(flatInfo.schemaKey)![fieldPath] = data[fieldPath];\n } else {\n // Normal field - update directly\n this.updateField(fieldPath, data[fieldPath]);\n }\n }\n\n // Apply collected flat richinput updates as composite values\n for (const [schemaKey, compositeValue] of flatUpdates) {\n this.updateField(schemaKey, compositeValue);\n }\n }\n\n /**\n * Update a single field by path without full re-render\n * @param fieldPath - Field path (e.g., \"email\", \"address.city\", \"items[0].name\")\n * @param value - New value for the field\n */\n updateField(fieldPath: string, value: any): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\n \"updateField: Form not initialized. Call renderForm() first.\",\n );\n return;\n }\n\n // Find the schema element for this field\n const schemaElement = this.findSchemaElement(fieldPath);\n if (!schemaElement) {\n console.warn(\n `updateField: Schema element not found for path \"${fieldPath}\"`,\n );\n return;\n }\n\n // Find the DOM element\n const domElement = this.findFormElementByFieldPath(fieldPath);\n if (!domElement) {\n console.warn(\n `updateField: DOM element not found for path \"${fieldPath}\"`,\n );\n return;\n }\n\n // Update based on field type\n this.updateFieldValue(domElement, schemaElement, fieldPath, value);\n\n // Re-evaluate conditional fields (enableIf) after field update\n this.reevaluateConditionalFields();\n\n // Optionally trigger onChange callback\n if (this.state.config.onChange || this.state.config.onFieldChange) {\n this.triggerOnChange(fieldPath, value);\n }\n }\n\n /**\n * Update field value in DOM based on field type\n * Delegates to component-specific updaters via registry\n */\n private updateFieldValue(\n domElement: HTMLElement,\n schemaElement: Element,\n fieldPath: string,\n value: any,\n ): void {\n const componentContext: ComponentContext = {\n scopeRoot: this.state.formRoot!,\n state: this.state,\n instance: this,\n path: \"\",\n };\n\n const handled = updateElementWithComponent(\n schemaElement,\n fieldPath,\n value,\n componentContext,\n );\n\n if (!handled) {\n console.warn(\n `updateField: No updater found for field type \"${schemaElement.type}\" at path \"${fieldPath}\"`,\n );\n }\n }\n\n /**\n * Re-evaluate all conditional fields (enableIf) based on current form data\n * This is called automatically when form data changes (via onChange events)\n */\n private reevaluateConditionalFields(): void {\n if (!this.state.schema || !this.state.formRoot) return;\n\n // Get current form data for condition evaluation\n const formData = this.validateForm(true).data; // Skip validation, just get data\n\n // Recursively check all elements with enableIf\n // currentPath tracks the full path to nested elements (e.g., \"address.city\" or \"items[0].name\")\n const checkElements = (elements: Element[], currentPath: string): void => {\n elements.forEach((element) => {\n // Build full path for this element\n const fullPath = currentPath\n ? `${currentPath}.${element.key}`\n : element.key;\n\n if (element.enableIf) {\n // Find the field wrapper for this element at the specific path\n // For nested elements, we need to find the wrapper within the correct container\n let fieldWrapper: HTMLElement | null = null;\n\n if (currentPath) {\n // Nested element - find within specific container\n const pathMatch = currentPath.match(/^(.+)\\[(\\d+)\\]$/);\n if (pathMatch) {\n // Array container - find the specific container item\n const containerKey = pathMatch[1];\n const containerIndex = pathMatch[2];\n const containerElement = this.state.formRoot!.querySelector(\n `[data-container-item=\"${containerKey}[${containerIndex}]\"]`,\n );\n if (containerElement) {\n fieldWrapper = containerElement.querySelector(\n `[data-field-key=\"${element.key}\"]`,\n );\n }\n } else {\n // Single container - find within container\n const containerElement = this.state.formRoot!.querySelector(\n `[data-container=\"${currentPath}\"]`,\n );\n if (containerElement) {\n fieldWrapper = containerElement.querySelector(\n `[data-field-key=\"${element.key}\"]`,\n );\n }\n }\n } else {\n // Root-level element\n fieldWrapper = this.state.formRoot!.querySelector(\n `[data-field-key=\"${element.key}\"]`,\n );\n }\n\n if (fieldWrapper) {\n const wrapper = fieldWrapper;\n try {\n // Determine container data for relative scope\n let containerData: Record<string, any> | undefined = undefined;\n const scope = element.enableIf!.scope ?? \"relative\";\n\n if (scope === \"relative\" && currentPath) {\n // For relative scope, extract the container data\n containerData = getValueByPath(formData, currentPath);\n }\n\n const shouldEnable = evaluateEnableCondition(\n element.enableIf!,\n formData, // Use complete formData for absolute scope\n containerData, // Use container-specific data for relative scope\n );\n\n const isCurrentlyDisabled =\n wrapper.getAttribute(\"data-conditionally-disabled\") === \"true\";\n\n // Update visibility if state changed\n if (shouldEnable && isCurrentlyDisabled) {\n // Need to show the field - re-render it with correct container context\n const containerPrefill = currentPath\n ? getValueByPath(formData, currentPath)\n : formData;\n const prefillContext =\n containerPrefill && typeof containerPrefill === \"object\"\n ? (containerPrefill as Record<string, any>)\n : {};\n\n const newWrapper = renderElement(element, {\n path: currentPath, // Use container path (empty string for root-level)\n prefill: prefillContext,\n formData: formData, // Pass complete formData for enableIf evaluation\n state: this.state,\n instance: this,\n });\n\n // Replace the disabled wrapper with the new rendered element\n wrapper.parentNode?.replaceChild(newWrapper, wrapper);\n } else if (!shouldEnable && !isCurrentlyDisabled) {\n // Need to hide the field - replace with disabled wrapper\n const disabledWrapper = document.createElement(\"div\");\n disabledWrapper.className = \"fb-field-wrapper-disabled\";\n disabledWrapper.style.display = \"none\";\n disabledWrapper.setAttribute(\"data-field-key\", element.key);\n disabledWrapper.setAttribute(\"data-conditionally-disabled\", \"true\");\n\n wrapper.parentNode?.replaceChild(disabledWrapper, wrapper);\n }\n } catch (error) {\n console.error(\n `Error re-evaluating enableIf for field \"${element.key}\" at path \"${fullPath}\":`,\n error,\n );\n }\n }\n }\n\n // Recursively check nested elements in containers\n if (\n (element.type === \"container\" || element.type === \"group\") &&\n \"elements\" in element &&\n element.elements\n ) {\n const containerData = (formData as any)?.[element.key];\n\n // Handle array containers (multiple items)\n if (Array.isArray(containerData)) {\n // Use actual DOM elements instead of containerData indices\n // (after deletion, DOM indices may be non-sequential)\n const containerItems =\n this.state.formRoot!.querySelectorAll<HTMLElement>(\n `[data-container-item]`,\n );\n const directItems = Array.from(containerItems).filter((el) => {\n const attr =\n el.getAttribute(\"data-container-item\") || \"\";\n if (!attr.startsWith(`${fullPath}[`)) return false;\n // Only direct children, not nested containers\n const suffix = attr.slice(fullPath.length);\n return /^\\[\\d+\\]$/.test(suffix);\n });\n directItems.forEach((el) => {\n const attr =\n el.getAttribute(\"data-container-item\") || \"\";\n checkElements(element.elements!, attr);\n });\n } else {\n // Handle single container (pass accumulated path)\n checkElements(element.elements!, fullPath);\n }\n }\n });\n };\n\n // Initialize with empty path for root-level elements\n checkElements(this.state.schema.elements, \"\");\n }\n\n /**\n * Destroy instance and clean up resources\n */\n destroy(): void {\n // Clear debounce timer\n if (this.state.debounceTimer !== null) {\n clearTimeout(this.state.debounceTimer);\n this.state.debounceTimer = null;\n }\n\n // Clear resource index\n this.state.resourceIndex.clear();\n\n // Clear DOM\n if (this.state.formRoot) {\n clear(this.state.formRoot);\n }\n\n // Nullify references for garbage collection\n this.state.formRoot = null;\n this.state.schema = null;\n this.state.externalActions = null;\n\n // Remove from instance tracking if verbose errors enabled\n if (this.state.config.verboseErrors) {\n globalThis.__formBuilderInstances?.delete(this.instanceId);\n }\n }\n}\n","/**\n * Form Builder - Instance-Based API\n *\n * Zero-dependency JSON Schema form builder library with multi-instance support\n */\n\n// Import the FormBuilderInstance class\nimport { FormBuilderInstance } from \"./instance/FormBuilderInstance.js\";\n\n// Import validation utilities\nimport { validateSchema } from \"./utils/validation.js\";\n\n// Re-export all types for TypeScript consumers\nexport type {\n SelectOption,\n ElementAction,\n BaseElement,\n TextElement,\n TextareaElement,\n NumberElement,\n SelectElement,\n FileElement,\n FilesElement,\n ContainerElement,\n GroupElement,\n RichInputElement,\n Element,\n Schema,\n ExternalAction,\n FormData,\n RenderContext,\n Translations,\n Locale,\n Config,\n ResourceMetadata,\n State,\n} from \"./types/index.js\";\n\n// Re-export theming types and utilities\nexport type { Theme } from \"./styles/theme.js\";\nexport { defaultTheme, exampleThemes } from \"./styles/theme.js\";\n\n/**\n * Factory function for creating new form instances\n *\n * @param config Optional configuration for the instance\n * @returns FormBuilderInstance\n *\n * @example\n * const form = createFormBuilder({\n * uploadFile: async (file) => {\n * // Upload logic\n * return \"resource-id-123\";\n * },\n * downloadFile: (resourceId, fileName) => {\n * // Download logic\n * }\n * });\n *\n * form.renderForm(containerElement, schema, prefillData);\n */\nexport function createFormBuilder(\n config?: Partial<import(\"./types/index.js\").Config>,\n): FormBuilderInstance {\n return new FormBuilderInstance(config);\n}\n\n// Export FormBuilderInstance class for direct instantiation\nexport { FormBuilderInstance };\n\n// Export validation utilities\nexport { validateSchema };\n\n// Default export\nexport default FormBuilderInstance;\n\n// Browser global compatibility\n// Set window.FormBuilder to FormBuilderInstance class for browser usage\nif (typeof window !== \"undefined\") {\n (window as any).FormBuilder = FormBuilderInstance;\n (window as any).createFormBuilder = createFormBuilder;\n (window as any).validateSchema = validateSchema;\n}\n"]}
|