@thetechfossil/upfiles 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts","../src/Uploader.tsx","../src/ProjectFilesWidget.tsx","../src/projectConnect.ts","../src/ConnectProjectDialog.tsx","../src/files.ts","../src/ImageManager.tsx","../src/useUpfilesInhouse.ts"],"names":["data","f","result","React","useMemo","useState","useEffect","jsxs","jsx","React3","Dialog","files","Fragment","open","useCallback","useRef"],"mappings":";;;;;;AAMO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAE3C,WAAA,CAAY,SAAiB,OAAA,EAAgF;AAC3G,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF;AAiGO,IAAM,gBAAN,MAAoB;AAAA,EAgBzB,YAAY,IAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC9C,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,oBAAA;AACvC,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,eAAA;AAC5B,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,YAAA,IAAgB,eAAA;AACzC,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,wBAAA;AAC7C,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,mBAAA;AAC7C,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,qBAAA;AACvC,IAAA,IAAA,CAAK,sBAAA,GAAyB,KAAK,sBAAA,IAA0B,KAAA;AAC7D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAc,gBAAA,GAAoD;AAChE,IAAA,MAAM,UAAkC,EAAE,GAAI,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG;AAGlE,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,EAAS;AAClC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,MAC5C;AACA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,OAAA,CAAQ,gBAAgB,IAAI,IAAA,CAAK,WAAA;AAAA,MACnC,CAAA,MAAA,IAAW,KAAK,SAAA,EAAW;AACzB,QAAA,OAAA,CAAQ,cAAc,IAAI,IAAA,CAAK,SAAA;AAAA,MACjC;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAI,IAAA,CAAK,iBAAiB,eAAA,EAAiB;AACzC,QAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,GACpD,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA,GACrB,IAAA,CAAK,MAAA;AAAA,MACX,CAAA,MAAA,IAAW,IAAA,CAAK,YAAA,KAAiB,WAAA,EAAa;AAC5C,QAAA,OAAA,CAAQ,WAAW,IAAI,IAAA,CAAK,MAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,cAAc,IAAI,IAAA,CAAK,MAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,QAAA,GAA+B;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,aAAa,EAAE,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,MAAA,CAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,MAAA,CAAA;AAC9E,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,MAC9B,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY;AAAA,KACjD,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,6BAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,GAAA,GAAM,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,KAAA,IAAS,GAAA;AAAA,MACtC,CAAA,CAAA,MAAQ;AAAA,MAAE;AACV,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAMO;AAE3B,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,EAAU,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAC5D,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,EAAU,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAC5D,IAAA,IAAI,CAAC,OAAO,QAAA,IAAY,MAAA,CAAO,YAAY,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,sBAAsB,CAAA;AAGpF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,GAChB,IAAA,CAAK,aACL,IAAA,CAAK,OAAA,GACH,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,WAAW,KAClC,IAAA,CAAK,WAAA;AAGX,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAI,MAAM,IAAA,CAAK,gBAAA;AAAiB,KAClC;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,MAC9B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,aAAA;AAAA,MAChD,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,0BAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,IAAO,IAAA,CAAK,UAAU,wBAAA,EAA0B;AACjE,UAAA,MAAM,IAAI,iBAAA,CAAkB,IAAA,CAAK,OAAA,IAAW,wBAAA,EAA0B,KAAK,OAAO,CAAA;AAAA,QACpF;AACA,QAAA,GAAA,GAAM,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,KAAA,IAAS,GAAA;AAAA,MACtC,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAA,YAAa,mBAAmB,MAAM,CAAA;AAAA,MAC5C;AACA,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,UAAA,CAAW,YAAA,EAAsB,IAAA,EAA+B;AACpE,IAAA,OAAO,MAAM,YAAA,EAAc;AAAA,MACzB,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,gBAAgB,IAAA,CAAK;AAAA;AACvB,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,IAAA,EACA,MAAA,EAC6B;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB;AAAA,MACzC,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,QAAA,EAAU,KAAK,IAAA,IAAQ,0BAAA;AAAA,MACvB,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,WAAW,MAAA,EAAQ,SAAA;AAAA,MACnB,YAAY,MAAA,EAAQ;AAAA,KACrB,CAAA;AACD,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,cAAc,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,oBAAA,GAAuB,MAAA,EAAQ,sBAAA,IAA0B,IAAA,CAAK,sBAAA;AACpE,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,cAAA,CAAe;AAAA,UACxB,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,cAAc,IAAA,CAAK,IAAA;AAAA,UACnB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,WAAA,EAAa,KAAK,IAAA,IAAQ,0BAAA;AAAA,UAC1B,WAAW,MAAA,EAAQ,SAAA;AAAA,UACnB,KAAK,OAAA,CAAQ,SAAA;AAAA,UACb,QAAS,MAAA,EAAgB;AAAA;AAAA;AAAA,SAE1B,CAAA;AAAA,MACH,SAAS,KAAA,EAAY;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAChE;AAAA,IACF;AAEA,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,aAAA,CAAc,QAAQ,OAAO,CAAA;AAClD,QAAA,UAAA,GAAa,CAAA;AAAA,MACf,CAAA,CAAA,MAAQ;AAAA,MAAE;AAAA,IACZ;AACA,IAAA,OAAO;AAAA,MACL,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,MAAA,EAqBlB;AACD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA,CAAA,GAAK,IAAA,CAAK,cAAA;AAC7E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAI,MAAM,IAAA,CAAK,gBAAA;AAAiB,KAClC;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,MAC9B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,aAAA;AAAA,MAChD,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,GAAG,MAAA;AAAA,QACH,KAAK,MAAA,CAAO;AAAA,OACb;AAAA,KACF,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,2BAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,GAAA,GAAM,KAAK,KAAA,IAAS,GAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAAE;AACV,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,cAAc,OAAA,EAAuC;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA,CAAA,GAAK,IAAA,CAAK,cAAA;AAC7E,IAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,eAAe,CAAA;AACtH,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,4BAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAMA,KAAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,GAAA,GAAMA,MAAK,KAAA,IAAS,GAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAAE;AACV,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA,EAAM,cAAc,EAAC;AAAA,EAC9B;AAAA,EAEA,MAAM,kBAAA,CAAmB,OAAA,EAAiB,KAAA,EAAmG;AAC3I,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA,CAAA,GAAK,IAAA,CAAK,cAAA;AAC7E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAI,MAAM,IAAA,CAAK,gBAAA;AAAiB,KAClC;AACA,IAAA,MAAM,IAAA,GAAY,EAAE,OAAA,EAAQ;AAC5B,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,OAAQ,KAAA,GAAQ,KAAA;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,MAC9B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,aAAA;AAAA,MAChD,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,+BAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAMA,KAAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,GAAA,GAAMA,MAAK,KAAA,IAAS,GAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAAE;AACV,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,EAAE,YAAY,IAAA,CAAK,UAAA,EAAY,YAAY,IAAA,CAAK,UAAA,IAAc,EAAC,EAAE;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,oBAAA,GAAuE;AAC3E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,aAAa,EAAE,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,oBAAA,CAAA,GAAyB,CAAA,EAAG,QAAQ,CAAA,oBAAA,CAAA;AAC5F,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,MAC9B,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY;AAAA,KACjD,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,kCAAA;AACV,MAAA,IAAI;AAAE,QAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,EAAK;AAAG,QAAA,GAAA,GAAM,EAAE,OAAA,IAAW,GAAA;AAAA,MAAK,CAAA,CAAA,MAAQ;AAAA,MAAE;AACpE,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,wBAAwB,QAAA,EAAmG;AAC/H,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,aAAa,EAAE,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,oBAAA,CAAA,GAAyB,CAAA,EAAG,QAAQ,CAAA,oBAAA,CAAA;AAC5F,IAAA,MAAM,OAAA,GAAU,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAI,MAAM,IAAA,CAAK,kBAAiB,EAAG;AACzF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,MAC9B,MAAA,EAAQ,OAAA;AAAA,MACR,OAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,aAAA;AAAA,MAChD,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA,KAC9B,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,qCAAA;AACV,MAAA,IAAI;AAAE,QAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,EAAK;AAAG,QAAA,GAAA,GAAM,EAAE,OAAA,IAAW,GAAA;AAAA,MAAK,CAAA,CAAA,MAAQ;AAAA,MAAE;AACpE,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,WAAW,QAAA,EAAsC;AACrD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,CAAA,GAAK,IAAA,CAAK,WAAA;AAC1E,IAAA,MAAM,GAAA,GAAM,WAAW,CAAA,EAAG,MAAM,aAAa,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA,GAAK,MAAA;AAC9E,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,eAAe,CAAA;AACtH,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,yBAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAMA,KAAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,GAAA,GAAMA,MAAK,KAAA,IAAS,GAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAAE;AACV,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA,EAAM,WAAW,EAAC;AAAA,EAC3B;AAAA,EAEA,MAAM,YAAA,CAAa,IAAA,EAAc,QAAA,EAAoC;AACnE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,CAAA,GAAK,IAAA,CAAK,WAAA;AAC1E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAI,MAAM,IAAA,CAAK,gBAAA;AAAiB,KAClC;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,MAC9B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,aAAA;AAAA,MAChD,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,UAAU;AAAA,KACxC,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,yBAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAMA,KAAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,GAAA,GAAMA,MAAK,KAAA,IAAS,GAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAAE;AACV,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAAgG;AAEpH,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,iBAAiB,EAAE,CAAA;AAChE,IAAA,MAAM,SAAA,GAAY,GAAG,QAAQ,CAAA,MAAA,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,GAAU,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,GAAK,SAAA;AAC9D,IAAA,MAAM,GAAA,GAAM,MAAA,EAAQ,UAAA,GAAa,CAAA,EAAG,MAAM,eAAe,kBAAA,CAAmB,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA,GAAK,MAAA;AACnG,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,eAAe,CAAA;AACtH,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,IAAI,GAAA,GAAM,uBAAA;AACV,MAAA,IAAI;AACF,QAAA,MAAMA,KAAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,GAAA,GAAMA,MAAK,KAAA,IAAS,GAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAAE;AACV,MAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,MACvB,SAAA,EAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,oBAAoB;AAAA,KACjD;AAAA,EACF;AAAA,EAEA,aAAa,SAAA,EAA4B;AACvC,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,WAAA,CAAA,GAAgB,aAAA;AAI7D,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,SAAS,IAAI,CAAA;AAChD,IAAA,IAAI,CAAC,KAAK,QAAA,IAAY,CAAC,KAAK,MAAA,KAAW,SAAA,IAAa,KAAK,SAAA,CAAA,EAAY;AACnE,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,EAAc,SAAA,IAAa,KAAK,SAAW,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AACF;ACzfA,IAAM,sBAAA,GAAyB,CAAC,EAAA,EAAI,GAAA,EAAK,KAAK,GAAG,CAAA;AAoD1C,IAAM,WAAoC,CAAC;AAAA,EAChD,aAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,SAAS,CAAC,SAAA,EAAW,WAAW,SAAA,EAAW,iBAAA,EAAmB,cAAc,kBAAkB,CAAA;AAAA,EAC9F,WAAA,GAAc,CAAA;AAAA,EACd,QAAA,GAAW,CAAA;AAAA,EACX,UAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,SAAA,GAAY,YAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,gBAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,QAAA,GAAW,OAAgC,IAAI,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAM,IAAI,aAAA,CAAc,aAAA,IAAiB,EAAE,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAEpF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAyB,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAGhE,EAAA,MAAM,kBAAkB,gBAAA,KAAqB,MAAA;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA,CAAkB,oBAAoB,IAAI,CAAA;AAClF,EAAA,MAAM,CAAC,YAAY,aAAa,CAAA,GAAI,SAAmB,cAAA,IAAkB,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AACnF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAI,QAAA,iBAAsB,IAAI,KAAK,CAAA;AAGvE,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAgB,gBAAA,IAAoB,IAAI,CAAA;AAChE,EAAA,MAAM,gBAAgB,MAAA,CAAiB,cAAA,IAAkB,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AACnE,EAAA,MAAM,eAAA,GAAkB,MAAA,iBAAoB,IAAI,GAAA,EAAK,CAAA;AAErD,EAAA,SAAA,CAAU,MAAM;AAAE,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAAA,EAAc,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAC3E,EAAA,SAAA,CAAU,MAAM;AAAE,IAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AAAA,EAAY,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AACrE,EAAA,SAAA,CAAU,MAAM;AAAE,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAAA,EAAc,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAG3E,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MAAM,KAAA,CAAM,MAAA,CAAO,CAACC,EAAAA,KAAMA,EAAAA,CAAE,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAAKA,EAAAA,CAAE,MAAA,KAAW,SAAS,CAAA;AAAA,IAC/E,CAAC,KAAK;AAAA,GACR;AACA,EAAA,MAAM,kBAAA,GAAqB,OAAA;AAAA,IACzB,MAAM,aAAA,CAAc,MAAA,CAAO,CAACA,EAAAA,KAAM,aAAa,GAAA,CAAIA,EAAAA,CAAE,EAAE,CAAC,CAAA,CAAE,MAAA;AAAA,IAC1D,CAAC,eAAe,YAAY;AAAA,GAC9B;AAEA,EAAA,MAAM,wBAAA,GAA2B,YAAY,MAAM;AACjD,IAAA,MAAM,MAAA,GAAS,CAAC,eAAA,CAAgB,OAAA;AAChC,IAAA,eAAA,CAAgB,OAAA,GAAU,MAAA;AAC1B,IAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS;AACjB,QAAA,MAAM,MAAM,IAAA,CACT,MAAA,CAAO,CAACA,EAAAA,KAAMA,EAAAA,CAAE,KAAK,UAAA,CAAW,QAAQ,CAAA,IAAKA,EAAAA,CAAE,WAAW,SAAS,CAAA,CACnE,IAAI,CAACA,EAAAA,KAAMA,GAAE,EAAE,CAAA;AAClB,QAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,UAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,eAAA,CAAgB,OAAO,CAAA;AAC5C,UAAA,GAAA,CAAI,QAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AAChC,UAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,UAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,QACtB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,IAAA,KAAiB;AACpD,IAAA,aAAA,CAAc,CAAC,IAAA,KAAS;AACtB,MAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,IAAI,IAC3B,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,IAC7B,CAAC,GAAG,MAAM,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACxC,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,MAAA,KAAmB;AACtD,IAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,KAAK,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,WACnC,IAAA,CAAK,IAAI,MAAM,CAAA;AACpB,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,MAAM,MAAM,aAAA,CAAc,GAAA,CAAI,CAACA,EAAAA,KAAMA,GAAE,EAAE,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,eAAA,CAAgB,OAAO,CAAA;AAC5C,IAAA,GAAA,CAAI,QAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AAChC,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,aAAA,CAAc,IAAI,CAACA,EAAAA,KAAMA,EAAAA,CAAE,EAAE,CAAC,CAAA;AACzD,IAAA,MAAM,OAAO,IAAI,GAAA,CAAI,CAAC,GAAG,gBAAgB,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,OAAO,CAAC,UAAA,CAAW,GAAA,CAAI,EAAE,CAAC,CAAC,CAAA;AACrF,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,QAAA,KAAqB;AACjD,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,CAAA,GAC3B,QAAA,CAAS,MAAA,CAAO,CAACA,EAAAA,KAAMA,EAAAA,CAAE,IAAA,IAAQ,WAAW,CAAA,GAC5C,QAAA;AACJ,IAAA,MAAM,OAAA,GAAU,QAAA,GAAW,CAAA,GACvB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,KAAA,CAAM,MAAM,CAAC,CAAA,GACtD,QAAA;AACJ,IAAA,MAAM,MAAA,GAAyB,OAAA,CAAQ,GAAA,CAAI,CAACA,EAAAA,MAAO;AAAA,MACjD,EAAA,EAAI,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,MACtC,IAAA,EAAMA,EAAAA;AAAA,MACN,MAAMA,EAAAA,CAAE,IAAA;AAAA,MACR,MAAMA,EAAAA,CAAE,IAAA;AAAA,MACR,IAAA,EAAMA,GAAE,IAAA,IAAQ,0BAAA;AAAA,MAChB,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV,CAAE,CAAA;AACF,IAAA,QAAA,CAAS,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,MAAM,CAAC,CAAA;AAGvC,IAAA,IAAI,eAAA,IAAmB,gBAAgB,OAAA,EAAS;AAC9C,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,CAACA,OAAMA,EAAAA,CAAE,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,CAAE,GAAA,CAAI,CAACA,EAAAA,KAAMA,GAAE,EAAE,CAAA;AAClF,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,eAAA,CAAgB,OAAO,CAAA;AAC5C,QAAA,QAAA,CAAS,QAAQ,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AACrC,QAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,QAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAA,CAAM,QAAQ,WAAA,EAAa,QAAA,EAAU,eAAe,CAAC,CAAA;AAEzD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,MAAA,KAAmB;AACjD,IAAA,QAAA,CAAS,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAACA,EAAAA,KAAMA,EAAAA,CAAE,EAAA,KAAO,MAAM,CAAC,CAAA;AACtD,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,eAAA,CAAgB,OAAO,CAAA;AAC5C,MAAA,IAAA,CAAK,OAAO,MAAM,CAAA;AAClB,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAA2C;AAC5E,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAC1C,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,IAAI,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,EACjD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,CAAA,KAAuC;AACrE,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,QAAA,CAAS,MAAM,IAAA,CAAK,CAAA,CAAE,aAAa,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,OAAO,IAAA,KAA8C;AACjF,IAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAiC;AAC/C,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,CAACA,OAAOA,EAAAA,CAAE,EAAA,KAAO,IAAA,CAAK,EAAA,GAAK,EAAE,GAAGA,EAAAA,EAAG,GAAG,KAAA,EAAM,GAAIA,EAAE,CAAC,CAAA;AAAA,IACjF,CAAA;AACA,IAAA,IAAI;AACF,MAAA,aAAA,GAAgB,KAAK,IAAI,CAAA;AACzB,MAAA,MAAA,CAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,GAAG,CAAA;AAC3C,MAAA,MAAM,OAAA,GAA2B,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QAC5D,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,QAAA,EAAU,KAAK,IAAA,IAAQ,0BAAA;AAAA,QACvB,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAGD,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,QAAA,MAAM,GAAA,GAAM,IAAI,cAAA,EAAe;AAC/B,QAAA,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,YAAA,EAAc,IAAI,CAAA;AAC1C,QAAA,GAAA,CAAI,MAAA,CAAO,UAAA,GAAa,CAAC,EAAA,KAAO;AAC9B,UAAA,IAAI,GAAG,gBAAA,EAAkB;AACvB,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAO,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,KAAA,GAAS,GAAG,CAAC,CAAA;AACjE,YAAA,MAAA,CAAO,EAAE,QAAA,EAAU,GAAA,EAAK,CAAA;AACxB,YAAA,gBAAA,GAAmB,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,UACnC;AAAA,QACF,CAAA;AACA,QAAA,GAAA,CAAI,SAAS,MAAM;AACjB,UAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,SAAS,GAAA,EAAK;AACzC,YAAA,OAAA,EAAQ;AAAA,UACV,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,GAAA,CAAI,MAAM,EAAE,CAAC,CAAA;AAAA,UAC7D;AAAA,QACF,CAAA;AACA,QAAA,GAAA,CAAI,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,6BAA6B,CAAC,CAAA;AACnE,QAAA,GAAA,CAAI,gBAAA,CAAiB,cAAA,EAAgB,IAAA,CAAK,IAAA,IAAQ,0BAA0B,CAAA;AAC5E,QAAA,GAAA,CAAI,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MACpB,CAAC,CAAA;AAGD,MAAA,IAAI,gBAAA,GAAwB,IAAA;AAC5B,MAAA,MAAM,gBAAgB,cAAA,KAAmB,SAAA,IAAa,eAAe,WAAA,IAAe,aAAA,EAAe,aAAa,aAAA,EAAe,MAAA,CAAA;AAC/H,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,IAAI;AACF,UAAA,gBAAA,GAAmB,MAAM,OAAO,cAAA,CAAe;AAAA,YAC7C,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,cAAc,IAAA,CAAK,IAAA;AAAA,YACnB,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,WAAA,EAAa,KAAK,IAAA,IAAQ,0BAAA;AAAA,YAC1B,SAAA;AAAA,YACA,KAAK,OAAA,CAAQ,SAAA;AAAA,YACb;AAAA,WACD,CAAA;AAAA,QACH,SAAS,CAAA,EAAQ;AACf,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,CAAC,CAAA;AAC7C,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,QAC5D;AAAA,MACF;AAEA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,UAAA;AAGJ,MAAA,IAAI,gBAAA,EAAkB,UAAA,EAAY,MAAA,GAAS,CAAA,EAAG;AAC5C,QAAA,MAAA,GAAS,gBAAA,CAAiB,UAAA;AAC1B,QAAA,UAAA,GAAa,gBAAA,CAAiB,UAAA;AAAA,MAChC,WAAW,eAAA,EAAiB;AAE1B,QAAA,MAAM,YAAA,GAAe,gBAAA,EAAkB,IAAA,EAAM,GAAA,IAAO,OAAA,CAAQ,OAAA;AAC5D,QAAA,IAAI;AACF,UAAA,MAAMC,OAAAA,GAAS,MAAM,MAAA,CAAO,kBAAA,CAAmB,YAAY,CAAA;AAC3D,UAAA,MAAA,GAASA,OAAAA,CAAO,UAAA;AAChB,UAAA,UAAA,GAAaA,OAAAA,CAAO,UAAA;AAAA,QACtB,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,IAAA,CAAK,kCAAkC,CAAC,CAAA;AAAA,QAClD;AAAA,MACF;AAGA,MAAA,MAAM,YAAA,GAAe,gBAAA,EAAkB,IAAA,EAAM,GAAA,IAAO,OAAA,CAAQ,OAAA;AAC5D,MAAA,MAAM,cAAA,GAAiB,gBAAA,EAAkB,IAAA,EAAM,GAAA,IAAO,OAAA,CAAQ,SAAA;AAG9D,MAAA,MAAM,gBAAA,GAAmB,mBAAmB,eAAA,CAAgB,OAAA,IAAW,gBAAgB,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AAE1G,MAAA,MAAM,MAAA,GAAuB;AAAA,QAC3B,GAAG,IAAA;AAAA,QACH,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,GAAA;AAAA,QACV,OAAA,EAAS,YAAA;AAAA,QACT,SAAA,EAAW,cAAA;AAAA,QACX,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,gBAAA,EAAkB,kBAAkB,gBAAA,GAAmB,KAAA,CAAA;AAAA,QACvD,sBAAA,EAAwB,kBAAmB,gBAAA,GAAmB,CAAC,GAAG,aAAA,CAAc,OAAO,CAAA,GAAI,EAAC,GAAK,KAAA,CAAA;AAAA;AAAA,QAEjG,UAAA,EAAY,MAAA;AAAA;AAAA,QAEZ;AAAA,OACF;AAEA,MAAA,MAAA,CAAO,EAAE,QAAQ,SAAA,EAAW,QAAA,EAAU,KAAK,OAAA,EAAS,YAAA,EAAc,SAAA,EAAW,cAAA,EAAgB,CAAA;AAC7F,MAAA,sBAAA,GAAyB,MAAM,CAAA;AAC/B,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAU;AACjB,MAAA,MAAM,OAAA,GAAU,eAAe,iBAAA,GAC3B,GAAA,CAAI,UACJ,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,eAAA;AACzC,MAAA,MAAA,CAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,SAAS,CAAA;AAC1C,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAA,EAAW,QAAQ,UAAA,EAAY,eAAA,EAAiB,cAAA,EAAgB,SAAA,EAAW,aAAA,EAAe,aAAA,EAAe,gBAAA,EAAkB,sBAAA,EAAwB,eAAe,CAAC,CAAA;AAE/K,EAAA,MAAM,SAAA,GAAY,YAAY,YAAY;AACxC,IAAA,MAAM,UAAU,KAAA,CAAM,MAAA,CAAO,CAACD,EAAAA,KAAMA,EAAAA,CAAE,WAAW,SAAS,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACrB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AAEF,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,QAAA,EAAS;AACpC,QAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AACxB,UAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAA,CAAO,CAAC,KAAKA,EAAAA,KAAM,GAAA,GAAMA,EAAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACnE,UAAA,MAAM,SAAA,GAAY,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,SAAA;AAC3C,UAAA,IAAI,mBAAmB,SAAA,EAAW;AAChC,YAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAc;AACzB,cAAA,IAAI,CAAA,IAAK,IAAA,GAAO,IAAA,GAAO,IAAA,EAAM,OAAO,CAAA,EAAA,CAAI,CAAA,IAAK,IAAA,GAAO,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5E,cAAA,IAAI,CAAA,IAAK,IAAA,GAAO,IAAA,EAAM,OAAO,CAAA,EAAA,CAAI,KAAK,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9D,cAAA,IAAI,CAAA,IAAK,MAAM,OAAO,CAAA,EAAA,CAAI,IAAI,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C,cAAA,OAAO,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,YACb,CAAA;AACA,YAAA,MAAM,MAAA,GAAS,sCAAsC,GAAA,CAAI,SAAS,CAAC,CAAA,eAAA,EAAkB,GAAA,CAAI,gBAAgB,CAAC,CAAA,CAAA;AAC1G,YAAA,aAAA,CAAc,MAAM,CAAA;AACpB,YAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM;AACrB,cAAA,QAAA,CAAS,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAACA,EAAAA,KAAMA,GAAE,EAAA,KAAO,CAAA,CAAE,KAAK,EAAE,GAAGA,IAAG,MAAA,EAAQ,OAAA,EAAS,OAAO,MAAA,EAAO,GAAIA,EAAC,CAAC,CAAA;AAAA,YAClG,CAAC,CAAA;AACD,YAAA,OAAA,GAAU,IAAI,kBAAkB,MAAA,EAAQ;AAAA,cACtC,OAAO,KAAA,CAAM,UAAA;AAAA,cACb,MAAM,KAAA,CAAM,SAAA;AAAA,cACZ,SAAA;AAAA,cACA,QAAA,EAAU;AAAA,aACX,CAAC,CAAA;AACF,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,aAAa,iBAAA,EAAmB;AAClC,UAAA,aAAA,CAAc,EAAE,OAAO,CAAA;AACvB,UAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM;AACrB,YAAA,QAAA,CAAS,CAAC,SAAS,IAAA,CAAK,GAAA,CAAI,CAACA,EAAAA,KAAMA,EAAAA,CAAE,OAAO,CAAA,CAAE,EAAA,GAAK,EAAE,GAAGA,EAAAA,EAAG,QAAQ,OAAA,EAAS,KAAA,EAAO,EAAE,OAAA,EAAQ,GAAIA,EAAC,CAAC,CAAA;AAAA,UACrG,CAAC,CAAA;AACD,UAAA,OAAA,GAAU,CAAC,CAAA;AACX,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,UAA0B,EAAC;AACjC,MAAA,KAAA,MAAWA,MAAK,OAAA,EAAS;AACvB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAUA,EAAC,CAAA;AAC9B,UAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,QACnB,SAAS,CAAA,EAAG;AACV,UAAA,IAAI,aAAa,iBAAA,EAAmB;AAClC,YAAA,aAAA,CAAc,EAAE,OAAO,CAAA;AACvB,YAAA,QAAA,CAAS,CAAC,SAAS,IAAA,CAAK,GAAA;AAAA,cAAI,CAAC,IAAA,KAC3B,IAAA,CAAK,MAAA,KAAW,SAAA,GAAY,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,SAAQ,GAAI;AAAA,aAC9E,CAAA;AACD,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,UAAA,GAAa,QAAQ,MAAA,CAAO,CAACA,OAAMA,EAAAA,CAAE,MAAA,KAAW,SAAS,CAAC,CAAA;AAAA,IAC5D,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,GAAU,CAAU,CAAA;AAAA,IACtB,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,QAAQ,UAAA,EAAY,OAAA,EAAS,SAAS,CAAC,CAAA;AAGlD,EAAAE,eAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,UAAA,IAAc,KAAA,CAAM,IAAA,CAAK,CAACF,EAAAA,KAAMA,GAAE,MAAA,KAAW,SAAS,CAAA,IAAK,CAAC,WAAA,EAAa;AAC3E,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,SAAA,EAAU;AAAA,MACZ,GAAG,GAAG,CAAA;AACN,MAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,KAAA,EAAO,WAAA,EAAa,SAAS,CAAC,CAAA;AAE9C,EAAA,uBACE,IAAA,CAAC,SAAI,SAAA,EACH,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAO;AAAA,QACzB,QAAA;AAAA,QACA,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,QACvB,QAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAGA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAW,CAAA,EAAG,iBAAiB,CAAA,mIAAA,EAAsI,UAAA,GACjK,mDACA,yHACF,CAAA,CAAA;AAAA,QACF,UAAA,EAAY,CAAC,CAAA,KAAM;AAAE,UAAA,CAAA,CAAE,cAAA,EAAe;AAAG,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,UAAA,aAAA,CAAc,IAAI,CAAA;AAAA,QAAG,CAAA;AAAA,QACnF,WAAA,EAAa,CAAC,CAAA,KAAM;AAAE,UAAA,CAAA,CAAE,cAAA,EAAe;AAAG,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,UAAA,aAAA,CAAc,KAAK,CAAA;AAAA,QAAG,CAAA;AAAA,QACrF,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS,MAAM,QAAA,CAAS,OAAA,EAAS,KAAA,EAAM;AAAA,QACvC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,cAAA;AAAA,QAEX,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0HAAA,EACb,QAAA,kBAAA,IAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EACxK,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,2CAAA,EAA4C,CAAA;AAAA,4BACpD,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,eAAA,EAAgB,CAAA;AAAA,4BACjC,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,WAAA,EACvC,CAAA,EACF,CAAA;AAAA,UACC,QAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EAAyD,QAAA,EAAA,oCAAA,EAAkC,CAAA;AAAA,4BAC1G,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACZ,QAAA,EAAA;AAAA,cAAA,CAAC,WAAW,aAAA,GAAgB,QAAA,GAAW,CAAA,GAAI,CAAA,MAAA,EAAS,QAAQ,CAAA,MAAA,CAAA,GAAW,gBAAA;AAAA,cACvE,WAAA,GAAc,IAAI,CAAA,YAAA,EAAA,CAAW,WAAA,IAAe,OAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,WAAA,CAAA,GAAgB;AAAA,aAAA,EACvF;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KAEJ;AAAA,IAGC,UAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,8FACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mGAAA,EACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,eAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAAU,gCAAA,EAC1L,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,wBAC/B,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,wBACrC,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA,OAAA,EAC3C,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,SAAI,SAAA,EAAU,QAAA,EACb,8BAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oDAAA,EAAsD,QAAA,EAAA,UAAA,EAAW,CAAA,EAChF,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,UACjC,SAAA,EAAU,2EAAA;AAAA,UAEV,+BAAC,KAAA,EAAA,EAAI,KAAA,EAAM,8BAA6B,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACxK,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA;AAAA,4BACpC,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,WAAA,EACtC;AAAA;AAAA;AACF,KAAA,EACF,CAAA,EACF,CAAA;AAAA,IAID,MAAM,MAAA,GAAS,CAAA,oBACd,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EAEb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sFAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,wBAC7E,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,iKAAA;AAAA,cACV,QAAA,EAAU,eAAe,KAAA,CAAM,KAAA,CAAM,CAACA,EAAAA,KAAMA,EAAAA,CAAE,WAAW,SAAS,CAAA;AAAA,cAClE,OAAA,EAAS,SAAA;AAAA,cAER,QAAA,EAAA,WAAA,mBACC,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,gCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EAAkC,KAAA,EAAM,8BAA6B,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EACtG,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,CAAA;AAAA,sCAC3F,MAAA,EAAA,EAAK,SAAA,EAAU,cAAa,IAAA,EAAK,cAAA,EAAe,GAAE,iHAAA,EAAkH;AAAA,iBAAA,EACvK,CAAA;AAAA,gBAAM;AAAA,eAAA,EAER,CAAA,GACE;AAAA;AAAA,WACN;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,yLAAA;AAAA,cACV,QAAA,EAAU,WAAA;AAAA,cACV,SAAS,MAAM;AACb,gBAAA,QAAA,CAAS,EAAE,CAAA;AACX,gBAAA,IAAI,eAAA,EAAiB;AACnB,kBAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,kBAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,kBAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,gBACvB;AAAA,cACF,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MAGC,mBAAmB,aAAA,CAAc,MAAA,GAAS,qBACzC,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sGAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,gFAAA,EACX,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAM,4BAAA,EAA6B,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,WAAU,iBAAA,EAC1L,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,SAAA,EAAA,EAAQ,QAAO,0BAAA,EAA2B,CAAA;AAAA,gCAC3C,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB,CAAA;AAAA,gCACpC,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB;AAAA,eAAA,EACtC,CAAA;AAAA,cAAM;AAAA,aAAA,EAER,CAAA;AAAA,4BACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDAAA,EACV,yCACG,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,kBAAA;AAAA,cAAmB,MAAA;AAAA,cAAK,aAAA,CAAc,MAAA;AAAA,cAAO,QAAA;AAAA,cAAO,aAAA,CAAc,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,EAAA;AAAA,cAAG,WAAA;AAAA,cAC1F,QAAA;AAAA,kCACA,QAAA,EAAA,EAAO,OAAA,EAAS,eAAA,EAAiB,SAAA,EAAU,yFAAwF,QAAA,EAAA,YAAA,EAEpI,CAAA;AAAA,cACC,QAAA;AAAA,kCACA,QAAA,EAAA,EAAO,OAAA,EAAS,iBAAA,EAAmB,SAAA,EAAU,iFAAgF,QAAA,EAAA,cAAA,EAE9H;AAAA,aAAA,EACF,IACA,yBAAA,EACN;AAAA,WAAA,EACF,CAAA;AAAA,0BAEA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,wBAAA;AAAA,cACT,SAAA,EAAW,CAAA,yIAAA,EAA4I,YAAA,GAAe,aAAA,GAAgB,8BAA8B,CAAA,CAAA;AAAA,cACpN,IAAA,EAAK,QAAA;AAAA,cACL,cAAA,EAAc,YAAA;AAAA,cAEd,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAW,qGAAqG,YAAA,GAAe,eAAA,GAAkB,eAAe,CAAA,CAAA,EAAI;AAAA;AAAA;AAC5K,SAAA,EACF,CAAA;AAAA,QAEC,YAAA,yBACE,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2DAAA,EAA4D,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BAC9E,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,sBAAA,CAAuB,GAAA,CAAI,CAAC,IAAA,KAAS;AACpC,YAAA,MAAM,MAAA,GAAS,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA;AACvC,YAAA,uBACE,IAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,gBACnC,SAAA,EAAW,CAAA,oEAAA,EACT,MAAA,GACI,4CAAA,GACA,+IACN,CAAA,CAAA;AAAA,gBAEC,QAAA,EAAA;AAAA,kBAAA,IAAA;AAAA,kBAAK;AAAA;AAAA,eAAA;AAAA,cATD;AAAA,aAUP;AAAA,UAEJ,CAAC,CAAA,EACH,CAAA;AAAA,UACC,WAAW,MAAA,KAAW,CAAA,wBACpB,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAkD,QAAA,EAAA,2BAAA,EAAyB;AAAA,SAAA,EAE5F;AAAA,OAAA,EAEJ,CAAA;AAAA,sBAIF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,gBAAM,GAAA,CAAI,CAACA,EAAAA,qBACV,GAAA,CAAC,SAAe,SAAA,EAAU,oIAAA,EACxB,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iGAAA,EACZ,QAAA,EAAAA,EAAAA,CAAE,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,mBACzB,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,8BAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,WAAU,iBAAA,EAC1L,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,8BACtD,QAAA,EAAA,EAAO,EAAA,EAAG,OAAM,EAAA,EAAG,KAAA,EAAM,GAAE,KAAA,EAAM,CAAA;AAAA,0BAClC,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB;AAAA,SAAA,EACtC,CAAA,wBAEC,KAAA,EAAA,EAAI,KAAA,EAAM,8BAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,GAAA,EAAI,eAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAAU,eAAA,EAC1L,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,uEAAA,EAAwE,CAAA;AAAA,0BAChF,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB;AAAA,SAAA,EACpC,CAAA,EAEJ,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EAAsE,QAAA,EAAAA,GAAE,IAAA,EAAK,CAAA;AAAA,4BAC5F,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EAAwD,QAAA,EAAA;AAAA,cAAA,CAAAA,EAAAA,CAAE,IAAA,IAAQ,IAAA,GAAO,IAAA,CAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,cAAE;AAAA,aAAA,EAAG;AAAA,WAAA,EAC/G,CAAA;AAAA,UACCA,EAAAA,CAAE,MAAA,KAAW,OAAA,mBACZ,GAAA,CAAC,SAAI,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAAA,EAAAA,CAAE,KAAA,EAAM,CAAA,mBAEhE,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,WAAW,CAAA,mCAAA,EAAsCA,EAAAA,CAAE,MAAA,KAAW,SAAA,GAAY,iBAAiB,aAAa,CAAA,CAAA;AAAA,cACxG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAGA,EAAAA,CAAE,QAAQ,CAAA,CAAA,CAAA;AAAI;AAAA,WACnC,EACF,CAAA;AAAA,UAGD,eAAA,IAAmB,YAAA,IAAgBA,EAAAA,CAAE,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAAKA,EAAAA,CAAE,MAAA,KAAW,SAAA,oBAC9E,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,oEAAA,EACf,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,UAAA;AAAA,gBACL,OAAA,EAAS,YAAA,CAAa,GAAA,CAAIA,EAAAA,CAAE,EAAE,CAAA;AAAA,gBAC9B,QAAA,EAAU,MAAM,eAAA,CAAgBA,EAAAA,CAAE,EAAE,CAAA;AAAA,gBACpC,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA2C,QAAA,EAAA,oBAAA,EAAkB;AAAA,WAAA,EAC/E;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,UAAAA,GAAE,MAAA,KAAW,SAAA,oBACZ,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4HAAA,EACd,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EACxK,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB,CAAA,EACpC,CAAA,EACF,CAAA;AAAA,YACCA,GAAE,SAAA,oBACD,GAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,MAAMA,EAAAA,CAAE,SAAA;AAAA,gBACR,MAAA,EAAO,QAAA;AAAA,gBACP,GAAA,EAAI,YAAA;AAAA,gBACJ,SAAA,EAAU,6FAAA;AAAA,gBACV,KAAA,EAAM,aAAA;AAAA,gBAEN,+BAAC,KAAA,EAAA,EAAI,KAAA,EAAM,8BAA6B,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACxK,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,0DAAA,EAA2D,CAAA;AAAA,kCACnE,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB,CAAA;AAAA,kCAClC,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI;AAAA,iBAAA,EACvC;AAAA;AAAA;AACF,WAAA,EAEJ,CAAA;AAAA,UAEDA,EAAAA,CAAE,MAAA,KAAW,OAAA,oBACZ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oHAAA,EACd,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EACxK,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA;AAAA,4BACpC,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,WAAA,EACtC,CAAA,EACF,CAAA;AAAA,UAEDA,GAAE,MAAA,KAAW,WAAA,oBACZ,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EAA0D,QAAA,EAAA;AAAA,YAAAA,EAAAA,CAAE,QAAA;AAAA,YAAS;AAAA,WAAA,EAAC,CAAA;AAAA,UAEvFA,EAAAA,CAAE,WAAW,SAAA,oBACZ,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,gBAAA,UAAA,CAAWA,GAAE,EAAE,CAAA;AAAA,cAAG,CAAA;AAAA,cACzD,SAAA,EAAU,8GAAA;AAAA,cACV,KAAA,EAAM,QAAA;AAAA,cAEN,+BAAC,KAAA,EAAA,EAAI,KAAA,EAAM,8BAA6B,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACxK,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA;AAAA,gCACpC,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,eAAA,EACtC;AAAA;AAAA;AACF,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA,EAAA,EA7FQA,EAAAA,CAAE,EA8FZ,CACD,CAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACrqBO,IAAM,qBAAwD,CAAC;AAAA,EACpE,aAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,YAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,eAAA,GAAkB;AACpB,CAAA,KAAM;AACJ,EAAA,MAAM,MAAA,GAASG,OAAAA,CAAQ,MAAM,IAAI,aAAA,CAAc,aAAA,IAAiB,EAAE,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AACpF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,QAAAA,CAAyB,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAElE,EAAA,MAAM,cAAA,GAAiBF,eAAAA,CAAM,MAAA,CAAsB,IAAI,CAAA;AACvD,EAAA,MAAM,aAAA,GAAgBA,eAAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAExC,EAAA,MAAM,UAAA,GAAaA,eAAAA,CAAM,WAAA,CAAY,OAAO,YAAY,KAAA,KAAU;AAChE,IAAA,IAAI,cAAc,OAAA,EAAS;AAC3B,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAExB,IAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,IAAI,CAAA;AAC/B,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,SAAA,EAAU,GAAI,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAE,UAAA,EAAY,CAAA;AAGlF,MAAA,IAAI,SAAA,IAAa,SAAA,IAAa,SAAA,KAAc,cAAA,CAAe,OAAA,EAAS;AAClE,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,cAAA,CAAe,OAAA,GAAU,SAAA;AAAA,IAC3B,SAAS,CAAA,EAAQ;AACf,MAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,CAAA,EAAG,WAAW,sBAAsB,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAChC,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAU,CAAC,CAAA;AAEvB,EAAAG,UAAU,MAAM;AACd,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,IAAmB,eAAA,IAAmB,CAAA,EAAG;AAE9C,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACjB,GAAG,eAAe,CAAA;AAElB,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,UAAA,EAAY,eAAe,CAAC,CAAA;AAEhC,EAAA,MAAM,UAAU,KAAA,CAAM,MAAA;AAAA,IAAO,CAACL,EAAAA,KAC5B,CAAC,KAAA,GAAQ,IAAA,GAAA,CAAQA,EAAAA,CAAE,YAAA,IAAgB,EAAA,EAAI,WAAA,EAAY,CAAE,QAAA,CAAS,KAAA,CAAM,aAAa;AAAA,GACnF;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,GAAA,KAAgB;AAC1C,IAAA,IAAI,CAAC,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AACnC,IAAA,IAAI;AACF,MAAA,cAAA,CAAe,GAAG,CAAA;AAClB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,SAAS,GAAG,CAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,eAAe,OAAA,IAAW,EAAA;AAC1C,QAAA,MAAM,MAAM,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,GAAK,SAAA;AACjD,QAAA,MAAM,OAAA,GAAkC;AAAA,UACtC,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAI,aAAA,EAAe,OAAA,IAAW;AAAC,SACjC;AACA,QAAA,MAAM,KAAA,GAAQ,eAAe,QAAA,IAAW;AACxC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAC1C,UAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,YAAA,OAAA,CAAQ,gBAAgB,IAAI,aAAA,CAAc,WAAA;AAAA,UAC5C,CAAA,MAAA,IAAW,cAAc,SAAA,EAAW;AAClC,YAAA,OAAA,CAAQ,cAAc,IAAI,aAAA,CAAc,SAAA;AAAA,UAC1C;AAAA,QACF,CAAA,MAAA,IAAW,eAAe,MAAA,EAAQ;AAChC,UAAA,MAAM,SAAA,GAAY,cAAc,YAAA,IAAgB,eAAA;AAChD,UAAA,IAAI,cAAc,eAAA,EAAiB;AACjC,YAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,aAAA,CAAc,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,GAC7D,CAAA,OAAA,EAAU,aAAA,CAAc,MAAM,CAAA,CAAA,GAC9B,aAAA,CAAc,MAAA;AAAA,UACpB,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,SAAS,IAAI,aAAA,CAAc,MAAA;AAAA,UACrC;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAC3B,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA;AAAA,UACA,WAAA,EAAa,aAAA,EAAe,eAAA,GAAkB,SAAA,GAAY,aAAA;AAAA,UAC1D,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,KAAK;AAAA,SACtC,CAAA;AACD,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAAA,MAC9C;AACA,MAAA,QAAA,CAAS,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAACA,EAAAA,KAAMA,EAAAA,CAAE,GAAA,KAAQ,GAAG,CAAC,CAAA;AAAA,IACtD,SAAS,CAAA,EAAQ;AACf,MAAA,KAAA,CAAM,CAAA,EAAG,WAAW,kBAAkB,CAAA;AAAA,IACxC,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,UAAA,EAAY,QAAA,EAAU,YAAA,EAAc,CAAA,EAAE,EAC3E,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,WAAA,EAAY,uBAAA;AAAA,UACZ,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA,EAAG,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,CAAA;AAAE;AAAA,OAC7E;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAM;AACb,YAAA,QAAA,CAAS,EAAE,CAAA;AACX,YAAA,UAAA,EAAW;AAAA,UACb,CAAA;AAAA,UACA,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,EAAY,QAAQ,mBAAA,EAAqB,YAAA,EAAc,CAAA,EAAG,UAAA,EAAY,MAAA,EAAO;AAAA,UAChG,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAEC,OAAA,oBAAWA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO,EAAG,QAAA,EAAA,qBAAA,EAAc,CAAA;AAAA,IACtE,KAAA,oBAASA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,SAAA,EAAU,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAEhE,CAAC,WAAW,CAAC,KAAA,oBACZD,IAAAA,CAAC,IAAA,EAAA,EAAG,WAAW,aAAA,EAAe,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAA,EAAG,MAAA,EAAQ,GAAG,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAE,EACtG,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAACN,EAAAA,qBACZM,IAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,aAAA;AAAA,UACX,KAAA,EAAO,EAAE,MAAA,EAAQ,mBAAA,EAAqB,YAAA,EAAc,CAAA,EAAG,OAAA,EAAS,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,YAAY,QAAA,EAAS;AAAA,UAE3I,QAAA,EAAA;AAAA,4BAAAA,KAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,GAAE,EACxB,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,UAAA,EAAW,EAAI,QAAA,EAAAP,GAAE,YAAA,EAAa,CAAA;AAAA,8BAC/FM,KAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO,EAAK,QAAA,EAAA;AAAA,gBAAA,CAAAN,EAAAA,CAAE,IAAA,IAAQ,IAAA,GAAO,IAAA,CAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,gBAAE,aAAA;AAAA,gBAAOA,EAAAA,CAAE;AAAA,eAAA,EAAY;AAAA,aAAA,EACzG,CAAA;AAAA,4BACAM,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,UAAA,EAAY,QAAA,EAAS,EAC1D,QAAA,EAAA;AAAA,8BAAAC,IAAC,GAAA,EAAA,EAAE,IAAA,EAAMP,EAAAA,CAAE,GAAA,EAAK,QAAO,QAAA,EAAS,GAAA,EAAI,YAAA,EAAa,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,SAAA,IAAa,QAAA,EAAA,MAAA,EAE5F,CAAA;AAAA,8BACAO,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,SAAS,YAAY;AACnB,oBAAA,MAAM,WAAW,EAAE,IAAA,EAAMP,EAAAA,CAAE,YAAA,EAAc,KAAKA,EAAAA,CAAE,GAAA,EAAK,GAAA,EAAKA,EAAAA,CAAE,KAAK,IAAA,EAAMA,EAAAA,CAAE,IAAA,EAAM,WAAA,EAAaA,GAAE,WAAA,EAAY;AAC1G,oBAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,oBAAA,IAAI,OAAO,MAAA,KAAW,UAAA,IAAc,CAAC,CAAC,OAAA,EAAS;AAC7C,sBAAA,IAAI;AACF,wBAAA,YAAA,CAAaA,GAAE,GAAG,CAAA;AAClB,wBAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,0BAAA,MAAM,OAAO,QAAQ,CAAA;AACrB,0BAAA,OAAA,IAAU;AAAA,wBACZ;AACA,wBAAA,IAAI,OAAA,EAAS;AACX,0BAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,OAAA,EAAS;AAAA,4BAC/B,MAAA,EAAQ,MAAA;AAAA,4BACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,4BAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,4BAC7B,WAAA,EAAa;AAAA,2BACd,CAAA;AACD,0BAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACnD,0BAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAO,IAAA,EAAc,SAAS,gBAAgB,CAAA;AACrE,0BAAA,OAAA,GAAU,IAAI,CAAA;AAAA,wBAChB;AAAA,sBACF,SAAS,CAAA,EAAG;AAEV,wBAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAC,CAAA;AACxC,wBAAA,KAAA,CAAO,CAAA,EAAW,WAAW,gBAAgB,CAAA;AAAA,sBAC/C,CAAA,SAAE;AACA,wBAAA,YAAA,CAAa,IAAI,CAAA;AAAA,sBACnB;AAAA,oBACF;AAAA,kBACF,CAAA;AAAA,kBACA,QAAA,EAAU,cAAcA,EAAAA,CAAE,GAAA;AAAA,kBAC1B,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,UAAA,EAAY,WAAW,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,mBAAA,EAAqB,cAAc,CAAA,EAAG,OAAA,EAAS,cAAcA,EAAAA,CAAE,GAAA,GAAM,MAAM,CAAA,EAAE;AAAA,kBAExJ,QAAA,EAAA,SAAA,KAAcA,EAAAA,CAAE,GAAA,GAAM,cAAA,GAAY;AAAA;AAAA,eACrC;AAAA,cACC,8BACCO,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,YAAA,CAAaP,EAAAA,CAAE,GAAG,CAAA;AAAA,kBACjC,QAAA,EAAU,gBAAgBA,EAAAA,CAAE,GAAA;AAAA,kBAC5B,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,UAAA,EAAY,WAAW,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,mBAAA,EAAqB,cAAc,CAAA,EAAG,OAAA,EAAS,gBAAgBA,EAAAA,CAAE,GAAA,GAAM,MAAM,CAAA,EAAE;AAAA,kBAE1J,QAAA,EAAA,WAAA,KAAgBA,EAAAA,CAAE,GAAA,GAAM,gBAAA,GAAc;AAAA;AAAA;AACzC,aAAA,EAEJ;AAAA;AAAA,SAAA;AAAA,QAzDKA,EAAAA,CAAE;AAAA,OA2DV,CAAA;AAAA,MACA,OAAA,CAAQ,MAAA,KAAW,CAAA,oBAClBO,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,MAAA,IAAU,QAAA,EAAA,gBAAA,EAAc;AAAA,KAAA,EAE9D;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;ACzNA,IAAM,CAAA,GAAA,CAAK,UAAA,CAAW,KAAA,IAAS,KAAA,EAAO,KAAK,UAAU,CAAA;AAErD,SAAS,SAAA,CAAU,MAAsB,KAAA,EAAkC;AACzE,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,GAAI,KAAA,EAAO,OAAA,IAAqC;AAAC,GACnD;AAEA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,OAAA;AAAA,IACA,WAAA,EAAa,IAAA,CAAK,KAAA,GAAQ,aAAA,GAAgB;AAAA,GAC5C;AACF;AAEA,eAAe,QAAA,CAAS,KAAA,EAA0B,IAAA,EAAoB,QAAA,EAAyB;AAC7F,EAAA,MAAM,UAAU,QAAA,IAAY,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AACrC,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,IAAI,GAAA,GAAM,CAAA,gBAAA,EAAmB,GAAA,CAAI,MAAM,CAAA,CAAA,CAAA;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,EAAK;AACzB,MAAA,GAAA,GAAM,CAAA,EAAG,KAAA,IAAS,CAAA,EAAG,OAAA,IAAW,GAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAAE;AACV,IAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAI,IAAA,EAAK;AAClB;AAGA,eAAsB,aAAa,IAAA,EAA0C;AAC3E,EAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,aAAA,CAAA;AAC9C,EAAA,MAAM,OAAO,MAAM,QAAA;AAAA,IACjB,GAAA;AAAA,IACA,SAAA,CAAU,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,IACjC,IAAA,CAAK;AAAA,GACP;AACA,EAAA,OAAQ,IAAA,EAAM,YAAY,EAAC;AAC7B;AAEA,eAAsB,cAAc,IAAA,EAIjC;AACD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC3C,EAAA,MAAM,UAAU,MAAM,QAAA;AAAA,IACpB,GAAG,IAAI,CAAA,aAAA,CAAA;AAAA,IACP,UAAU,IAAA,EAAM;AAAA,MACd,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,uBAAuB,IAAA,CAAK;AAAA,OAC7B;AAAA,KACF,CAAA;AAAA,IACD,IAAA,CAAK;AAAA,GACP;AACA,EAAA,MAAM,SAAA,GAAY,SAAS,OAAA,EAAS,EAAA;AACpC,EAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC1D,EAAA,OAAO,EAAE,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,OAAA,EAA+B;AACvE;AAIA,eAAsB,wBAAwB,IAAA,EAG3C;AACD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC3C,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,cAAc,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,IAAW,CAAA,WAAA,EAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACpF,EAAA,MAAM,MAAM,MAAM,QAAA;AAAA,IAChB,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,SAAS,CAAA,KAAA,CAAA;AAAA,IACjC,UAAU,IAAA,EAAM;AAAA,MACd,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,UAAU;AAAA,KACxC,CAAA;AAAA,IACD,IAAA,CAAK;AAAA,GACP;AACA,EAAA,MAAM,SAAA,GAAa,GAAA,EAAK,GAAA,EAAK,MAAA,IAAU,KAAK,GAAA,EAAK,SAAA;AACjD,EAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC1D,EAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAU;AACxC;AAGA,eAAsB,cAAc,IAAA,EAIjC;AACD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC3C,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACxD,EAAA,IAAI,IAAA,CAAK,qBAAA,KAA0B,MAAA,EAAW,IAAA,CAAK,wBAAwB,IAAA,CAAK,qBAAA;AAEhF,EAAA,MAAM,QAAA;AAAA,IACJ,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IACtC,UAAU,IAAA,EAAM;AAAA,MACd,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,IACD,IAAA,CAAK;AAAA,GACP;AACF;AAGA,eAAsB,eAAe,IAAA,EAAgE;AACnG,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,IAAW,CAAA,WAAA,EAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACpF,EAAA,MAAM,MAAM,MAAM,QAAA;AAAA,IAChB,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAS,CAAA,KAAA,CAAA;AAAA,IACtC,UAAU,IAAA,EAAM;AAAA,MACd,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,UAAU;AAAA,KACxC,CAAA;AAAA,IACD,IAAA,CAAK;AAAA,GACP;AACA,EAAA,MAAM,SAAA,GAAa,GAAA,EAAK,GAAA,EAAK,MAAA,IAAU,KAAK,GAAA,EAAK,SAAA;AACjD,EAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC1D,EAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAC7B;AAGO,SAAS,kBAAkB,MAAA,EAAgB;AAChD,EAAA,MAAM,CAAA,GAAA,CAAK,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK;AAC9B,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAC7C,EAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,CAAC,CAAA,EAAG;AAElC,IAAA,OAAA,CAAQ,KAAK,uDAAuD,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,EAAE,QAAQ,CAAA,EAAE;AACrB;AAGO,SAAS,mBAAA,CAAoB,SAAiB,MAAA,EAAgB;AACnE,EAAA,OAAO,IAAI,aAAA,CAAc,EAAE,SAAS,MAAA,EAAQ,YAAA,EAAc,iBAAiB,CAAA;AAC7E;AAGO,SAAS,mBAAmB,IAAA,EAIhC;AACD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,QAAQ,YAAA,EAAc,IAAA,CAAK,YAAA,IAAgB,eAAA,EAAiB,CAAA;AACxG,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;AC5JO,SAAS,qBAAqB,KAAA,EAAkC;AACrE,EAAA,MAAM,EAAE,SAAS,IAAA,EAAM,YAAA,EAAc,aAAa,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,SAAA,EAAU,GAAI,KAAA;AAG/F,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUC,gBAAe,UAAU,CAAA;AACvD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,gBAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,gBAAwB,IAAI,CAAA;AAE5D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAoB,EAAE,CAAA;AAC5D,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAUA,gBAAiB,EAAE,CAAA;AAE3E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,gBAAS,EAAE,CAAA;AAEnD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAUA,gBAAS,EAAE,CAAA;AAE7D,EAAA,MAAM,UAAA,GAAmBA,mBAAY,MAAM;AACzC,IAAA,OAAA,CAAQ,UAAU,CAAA;AAClB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,iBAAA,CAAkB,EAAE,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAMA,iBAAU,MAAM;AACpB,IAAA,MAAM,MAAM,YAAY;AACtB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,UAAA,EAAY;AAClC,MAAA,IAAI;AACF,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,MAAM,IAAA,GAAuB,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAU;AACzD,QAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,IAAI,CAAA;AACpC,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,IAAI,IAAA,CAAK,UAAU,CAAC,iBAAA,uBAAwC,IAAA,CAAK,CAAC,EAAE,EAAE,CAAA;AAAA,MACxE,SAAS,CAAA,EAAQ;AACf,QAAA,QAAA,CAAS,CAAA,EAAG,WAAW,0BAA0B,CAAA;AAAA,MACnD,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AACA,IAAA,GAAA,EAAI;AAAA,EAEN,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,EAAM,OAAO,CAAC,CAAA;AAExB,EAAA,MAAM,wBAAwB,YAAY;AACxC,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI,CAAC,iBAAA,EAAmB,MAAM,IAAI,MAAM,yBAAyB,CAAA;AACjE,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,cAAA,CAAe,EAAE,OAAA,EAAS,SAAA,EAAW,iBAAA,EAAmB,KAAA,EAAO,SAAA,EAAW,CAAA;AACnG,MAAA,WAAA,CAAY,QAAQ,EAAE,SAAA,EAAW,iBAAA,EAAmB,MAAA,EAAQ,YAAY,CAAA;AACxE,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,UAAA,EAAW;AAAA,IACb,SAAS,CAAA,EAAQ;AACf,MAAA,QAAA,CAAS,CAAA,EAAG,WAAW,2BAA2B,CAAA;AAAA,IACpD,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,iBAAA,CAAkB,SAAS,CAAA;AAC9C,MAAA,WAAA,CAAY,MAAA,EAAQ,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AACxC,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,UAAA,EAAW;AAAA,IACb,SAAS,CAAA,EAAQ;AACf,MAAA,QAAA,CAAS,CAAA,EAAG,WAAW,iBAAiB,CAAA;AAAA,IAC1C,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI,CAAC,cAAA,CAAe,IAAA,IAAQ,MAAM,IAAI,MAAM,0BAA0B,CAAA;AACtE,MAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,MAAM,uBAAA,CAAwB,EAAE,OAAA,EAAS,IAAA,EAAM,cAAA,CAAe,IAAA,EAAK,EAAG,KAAA,EAAO,WAAW,CAAA;AACtH,MAAA,WAAA,CAAY,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAA,EAAQ,OAAO,CAAA;AAChD,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,UAAA,EAAW;AAAA,IACb,SAAS,CAAA,EAAQ;AACf,MAAA,QAAA,CAAS,CAAA,EAAG,WAAW,0BAA0B,CAAA;AAAA,IACnD,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,mBACJF,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,CAAA,iCAAA,EAAoC,IAAA,KAAS,UAAA,GAAa,uCAAuC,eAAe,CAAA,CAAA,CAAA;AAAA,QAC3H,OAAA,EAAS,MAAM,OAAA,CAAQ,UAAU,CAAA;AAAA,QAClC,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,CAAA,iCAAA,EAAoC,IAAA,KAAS,QAAA,GAAW,uCAAuC,eAAe,CAAA,CAAA,CAAA;AAAA,QACzH,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAChC,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,CAAA,iCAAA,EAAoC,IAAA,KAAS,KAAA,GAAQ,uCAAuC,eAAe,CAAA,CAAA,CAAA;AAAA,QACtH,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,QAC7B,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAGF,EAAA,uBACEA,GAAAA,CAAQE,OAAA,CAAA,IAAA,EAAP,EAAY,IAAA,EAAY,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,IAAA,IAAI,CAAC,GAAG,UAAA,EAAW;AAAG,IAAA,YAAA,CAAa,CAAC,CAAA;AAAA,EAAG,CAAA,EACrF,QAAA,kBAAAH,IAAAA,CAAQG,OAAA,CAAA,MAAA,EAAP,EACC,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAQE,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,oBACtDF,GAAAA,CAAQE,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAW,CAAA,oHAAA,EAAuH,SAAA,IAAa,EAAE,CAAA,CAAA,EAC/J,QAAA,kBAAAH,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,IAAQE,OAAA,CAAA,KAAA,EAAP,EAAa,SAAA,EAAU,uBAAA,EACrB,mBAAS,oBAAA,EACZ,CAAA;AAAA,sBACAF,GAAAA,CAAQE,OAAA,CAAA,WAAA,EAAP,EAAmB,SAAA,EAAU,+BAAA,EAC3B,yBAAe,4DAAA,EAClB,CAAA;AAAA,MAEC,YAAA;AAAA,MAEA,yBACCF,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAA0E,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAIhG,SAAS,UAAA,oBACRD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,wBAC9CD,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,yCAAA;AAAA,YACV,KAAA,EAAO,iBAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACpD,QAAA,EAAU,OAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,MAAA,KAAW,qBAAKC,GAAAA,CAAC,YAAO,KAAA,EAAM,EAAA,EAAI,QAAA,EAAA,OAAA,GAAU,YAAA,GAAe,mBAAA,EAAoB,CAAA;AAAA,cACxF,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACbA,GAAAA,CAAC,QAAA,EAAA,EAAkB,KAAA,EAAO,CAAA,CAAE,EAAA,EAAK,QAAA,EAAA,CAAA,CAAE,IAAA,EAAA,EAAtB,CAAA,CAAE,EAAyB,CACzC;AAAA;AAAA;AAAA,SACH;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAQE,OAAA,CAAA,KAAA,EAAP,EAAa,OAAA,EAAO,IAAA,EACnB,QAAA,kBAAAF,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,kCAAA,EAAmC,oBAAM,CAAA,EAC3E,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,sEAAA;AAAA,cACV,OAAA,EAAS,qBAAA;AAAA,cACT,QAAA,EAAU,WAAW,CAAC,iBAAA;AAAA,cAErB,oBAAU,kBAAA,GAAgB;AAAA;AAAA;AAC7B,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MAID,SAAS,QAAA,oBACRD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,wBAC9CA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,yCAAA;AAAA,YACV,WAAA,EAAY,SAAA;AAAA,YACZ,KAAA,EAAO,SAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC5C,QAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAQE,OAAA,CAAA,KAAA,EAAP,EAAa,OAAA,EAAO,IAAA,EACnB,QAAA,kBAAAF,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,kCAAA,EAAmC,oBAAM,CAAA,EAC3E,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,sEAAA;AAAA,cACV,OAAA,EAAS,YAAA;AAAA,cACT,QAAA,EAAU,OAAA,IAAW,CAAC,SAAA,CAAU,IAAA,EAAK;AAAA,cAEpC,oBAAU,cAAA,GAAY;AAAA;AAAA;AACzB,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MAID,SAAS,KAAA,oBACRD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,wBACnDA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,yCAAA;AAAA,YACV,WAAA,EAAY,YAAA;AAAA,YACZ,KAAA,EAAO,cAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACjD,QAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,6EAAA,EAA2E,CAAA;AAAA,wBACxHD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAQE,OAAA,CAAA,KAAA,EAAP,EAAa,OAAA,EAAO,IAAA,EACnB,QAAA,kBAAAF,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,kCAAA,EAAmC,oBAAM,CAAA,EAC3E,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,sEAAA;AAAA,cACV,OAAA,EAAS,YAAA;AAAA,cACT,QAAA,EAAU,OAAA,IAAW,CAAC,cAAA,CAAe,IAAA,EAAK;AAAA,cAEzC,oBAAU,gBAAA,GAAc;AAAA;AAAA;AAC3B,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;ACjPA,eAAsB,iBAAA,CAAkB,eAAqC,UAAA,EAAmF;AAC9J,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,aAAa,CAAA;AAC9C,EAAA,OAAO,MAAA,CAAO,eAAA,CAAgB,EAAE,UAAA,EAAY,CAAA;AAC9C;AAEA,eAAsB,mBAAA,CAAoB,eAAqC,OAAA,EAAuC;AACpH,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,aAAa,CAAA;AAC9C,EAAA,OAAO,MAAA,CAAO,cAAc,OAAO,CAAA;AACrC;AAIA,eAAsB,4BAAA,CACpB,eACA,IAAA,EACiE;AACjE,EAAA,MAAM,EAAE,OAAO,SAAA,EAAU,GAAI,MAAM,iBAAA,CAAkB,aAAA,EAAe,MAAM,UAAU,CAAA;AACpF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,EAAM,eAAA,IAAmB,CAAA,EAAG,EAAE,CAAC,CAAA;AAElE,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,KAAK,CAAA;AACvB,EAAA,MAAM,UAA6B,EAAC;AACpC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,eAAe,MAAA,GAAS;AACtB,IAAA,OAAO,MAAM,MAAA,EAAQ;AACnB,MAAA,MAAMP,EAAAA,GAAI,MAAM,KAAA,EAAM;AACtB,MAAA,IAAI,CAACA,EAAAA,IAAK,SAAA,CAAU,GAAA,CAAIA,EAAAA,CAAE,GAAG,CAAA,EAAG;AAEhC,MAAA,SAAA,CAAU,GAAA,CAAIA,GAAE,GAAG,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,aAAA,EAAeA,GAAE,GAAG,CAAA,CAAE,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACpF,QAAA,OAAA,CAAQ,KAAK,EAAE,GAAGA,EAAAA,EAAG,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC3C,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAGA,EAAAA,EAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAA,CAAM,UAAU,CAAC,CAAA;AACjD,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAAG,MAAM,MAAA,EAAQ,CAAC,CAAA;AAGjE,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAACA,EAAAA,EAAG,CAAA,KAAM,CAACA,EAAAA,CAAE,GAAA,EAAK,CAAC,CAAC,CAAC,CAAA;AAC1D,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,WAAW,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,IAAK,MAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,GAAG,KAAK,CAAA,CAAE,CAAA;AAElF,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,SAAA,EAAU;AACrC;ACtCA,IAAM,QAAA,GAAW,CAAC,EAAE,SAAA,EAAU,qBAC5BM,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,kBAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,kBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,kBAChDA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI;AAAA,CAAA,EACjD,CAAA;AAcF,IAAM,eAAA,GAAkB,CAAC,EAAE,SAAA,EAAU,qBACnCD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0DAAA,EAA2D,CAAA;AAAA,kBACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,kBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB;AAAA,CAAA,EAC3B,CAAA;AAGF,IAAM,UAAA,GAAa,CAAC,EAAE,SAAA,EAAU,qBAC9BA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,cAAA,EAAe,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,SAAA,EAC3I,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8PAAA,EAA+P,CAAA,EACzQ,CAAA;AAGF,IAAM,cAAA,GAAiB,CAAC,EAAE,SAAA,EAAU,qBAClCD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4HAAA,EAA6H,CAAA;AAAA,kBACrIA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kBACtCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,CAAA,EACvC,CAAA;AAGF,IAAM,UAAA,GAAa,CAAC,EAAE,SAAA,EAAU,qBAC9BD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,kBAC9BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB;AAAA,CAAA,EAC3B,CAAA;AAGF,IAAM,WAAA,GAAc,CAAC,EAAE,SAAA,EAAU,qBAC/BD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oDAAA,EAAqD,CAAA;AAAA,kBAC7DA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,kBACrBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qDAAA,EAAsD,CAAA;AAAA,kBAC9DA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY;AAAA,CAAA,EACtB,CAAA;AAGF,IAAM,gBAAA,GAAmB,CAAC,EAAE,SAAA,uBAC1BA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,eAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAgB,CAAA,EAC1B,CAAA;AAGF,IAAM,SAAA,GAAY,CAAC,EAAE,SAAA,EAAU,qBAC7BD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,kBAClBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uCAAA,EAAwC,CAAA;AAAA,kBAChDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oCAAA,EAAqC,CAAA;AAAA,kBAC7CA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kBACtCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,CAAA,EACxC,CAAA;AAGF,IAAM,KAAA,GAAQ,CAAC,EAAE,SAAA,EAAU,qBACzBD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,kBACrBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa;AAAA,CAAA,EACvB,CAAA;AAGF,IAAM,QAAA,GAAW,CAAC,EAAE,SAAA,EAAU,qBAC5BD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gDAAA,EAAiD,CAAA;AAAA,kBACzDA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,uBAAA,EAAwB;AAAA,CAAA,EAC3C,CAAA;AAGF,IAAM,SAAA,GAAY,CAAC,EAAE,SAAA,EAAU,qBAC7BD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA;AAAA,kBACvDA,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,kBAC5BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2CAAA,EAA4C;AAAA,CAAA,EACtD,CAAA;AAGF,IAAM,UAAA,GAAa,CAAC,EAAE,SAAA,uBACpBA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,eAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+BAA8B,CAAA,EACxC,CAAA;AAGF,IAAM,UAAA,GAAa,CAAC,EAAE,SAAA,EAAU,qBAC9BD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,SAAA,EAChL,QAAA,EAAA;AAAA,kBAAAC,GAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,0BAAA,EAA2B,CAAA;AAAA,kBAC3CA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB,CAAA;AAAA,kBACpCA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB;AAAA,CAAA,EACtC,CAAA;AAKF,IAAM,cAAA,GAAiB,CAAC,EAAE,QAAA,uBACxBA,GAAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,GAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,QAAA;AAAA,MACV,IAAA,EAAM,kBAAA;AAAA,MACN,UAAA,EAAY,QAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,IAEC;AAAA;AACH,CAAA;AA4CK,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,GAAY,YAAA;AAAA,IACZ,cAAA,GAAiB,IAAA;AAAA,IACjB,eAAA,GAAkB,IAAA;AAAA,IAClB,WAAA,GAAc,MAAM,IAAA,GAAO,IAAA;AAAA,IAC3B,QAAA,GAAW,EAAA;AAAA,IACX,IAAA,GAAO,MAAA;AAAA,IACP,UAAA,GAAa,IAAA;AAAA,IACb,eAAA,GAAkB,GAAA;AAAA,IAClB,yBAAA,GAA4B,KAAA;AAAA,IAC5B;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,CAAC,YAAY,aAAa,CAAA,GAAU,gBAA8B,IAAA,KAAS,QAAA,GAAW,WAAW,QAAQ,CAAA;AAC/G,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,gBAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAG5D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,gBAA6B,MAAS,CAAA;AAC1F,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,MAAA,CAAA,QAAA,CAAqD,CAAC,EAAE,EAAA,EAAI,MAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;AAElI,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,MAAA,CAAA,QAAA,CAA4B,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,MAAA,CAAA,QAAA,CAAmB,EAAE,CAAA;AAEzD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAElE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAU,gBAAS,KAAK,CAAA;AACpE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,gBAAS,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAU,gBAAS,KAAK,CAAA;AAGhE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,gBAAiC,IAAI,CAAA;AACnF,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAU,gBAAiC,IAAI,CAAA;AACrG,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAAU,gBAA2F,IAAI,CAAA;AAGrK,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,gBAAiC,IAAI,CAAA;AAGjF,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAU,gBAAS,KAAK,CAAA;AAE5E,EAAA,MAAM,cAAA,GAAuB,cAAsB,IAAI,CAAA;AACvD,EAAA,MAAM,aAAA,GAAsB,cAAO,KAAK,CAAA;AAGxC,EAAA,MAAM,gBAAA,GAAyB,MAAA,CAAA,WAAA,CAAY,CAACG,MAAAA,KAAgD;AAC1F,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,OAAOA,MAAAA,CAAM,OAAO,CAAA,IAAA,KAAQ;AAC1B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG;AACtB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,CAAA;AACjB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAa,MAAA,CAAA,WAAA,CAAY,OAAO,SAAA,GAAY,KAAA,KAAU;AAC1D,IAAA,IAAI,cAAc,OAAA,EAAS;AAC3B,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAExB,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,IAAI,CAAA;AAC/B,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,aAAa,CAAA;AAG9C,MAAA,MAAM,oBAAoB,WAAA,CAAY,MAAA,GAAS,CAAA,GAC3C,WAAA,CAAY,MAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,IAAI,GAAA,GAClD,KAAA,CAAA;AACJ,MAAA,MAAM,sBAAsB,iBAAA,IAAqB,UAAA;AAEjD,MAAA,MAAM,CAAC,SAAA,EAAW,WAAW,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACjD,iBAAA,CAAkB,eAAe,mBAAmB,CAAA;AAAA,QACpD,MAAA,CAAO,WAAW,eAAe;AAAA,OAClC,CAAA;AAED,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,SAAA,EAAU,GAAI,SAAA;AAGvC,MAAA,MAAM,IAAA,GAA0B,QAAA;AAEhC,MAAA,IAAI,SAAA,IAAa,SAAA,IAAa,SAAA,KAAc,cAAA,CAAe,OAAA,EAAS;AAAA,MAEpE;AAEA,MAAA,QAAA,CAAS,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAC/B,MAAA,UAAA,CAAW,WAAW,CAAA;AACtB,MAAA,cAAA,CAAe,OAAA,GAAU,SAAA;AAAA,IAC3B,SAAS,CAAA,EAAQ;AACf,MAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,CAAA,EAAG,WAAW,uBAAuB,CAAA;AAAA,IAChE,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAChC,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,UAAA,EAAY,eAAA,EAAiB,WAAW,CAAC,CAAA;AAE5D,EAAM,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,UAAA,KAAe,QAAA,EAAU;AAChD,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,IAAI,CAAC,CAAA;AAiCjC,EAAA,MAAM,YAAA,GAAqB,eAAQ,MAAM;AACvC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,IAAA,OAAO,CAAC,CAAA,GAAI,KAAA,GAAQ,KAAA,CAAM,OAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,YAAA,IAAgB,EAAA,EAAI,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EAC1F,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAEjB,EAAA,MAAM,cAAA,GAAuB,eAAQ,MAAM;AACzC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,IAAA,OAAO,CAAC,CAAA,GAAI,OAAA,GAAU,OAAA,CAAQ,OAAO,CAACV,EAAAA,KAAAA,CAAOA,EAAAA,CAAE,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EACtF,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AAEnB,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,MAAM,MAAM,YAAA,CAAa,GAAA;AACzB,IAAA,IAAI;AACF,MAAA,WAAA,CAAY,GAAG,CAAA;AACf,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,SAAS,GAAG,CAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,aAAa,CAAA;AAC9C,QAAA,MAAM,OAAA,GAAU,eAAe,OAAA,IAAW,EAAA;AAC1C,QAAA,MAAM,MAAM,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,GAAK,SAAA;AACjD,QAAA,MAAM,OAAA,GAAkC;AAAA,UACtC,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAI,aAAA,EAAe,OAAA,IAAW;AAAC,SACjC;AACA,QAAA,MAAM,KAAA,GAAQ,eAAe,QAAA,IAAW;AACxC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAC1C,UAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,YAAA,OAAA,CAAQ,gBAAgB,IAAI,aAAA,CAAc,WAAA;AAAA,UAC5C,CAAA,MAAA,IAAW,cAAc,SAAA,EAAW;AAClC,YAAA,OAAA,CAAQ,cAAc,IAAI,aAAA,CAAc,SAAA;AAAA,UAC1C;AAAA,QACF,CAAA,MAAA,IAAW,eAAe,MAAA,EAAQ;AAChC,UAAA,MAAM,SAAA,GAAY,cAAc,YAAA,IAAgB,eAAA;AAChD,UAAA,IAAI,cAAc,eAAA,EAAiB;AACjC,YAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,aAAA,CAAc,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,GAC7D,CAAA,OAAA,EAAU,aAAA,CAAc,MAAM,CAAA,CAAA,GAC9B,aAAA,CAAc,MAAA;AAAA,UACpB,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,SAAS,IAAI,aAAA,CAAc,MAAA;AAAA,UACrC;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAC3B,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA;AAAA,UACA,WAAA,EAAa,aAAA,EAAe,eAAA,GAAkB,SAAA,GAAY,aAAA;AAAA,UAC1D,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,KAAK;AAAA,SACtC,CAAA;AACD,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAAA,MAC9C;AACA,MAAA,QAAA,CAAS,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAACA,EAAAA,KAAMA,EAAAA,CAAE,GAAA,KAAQ,GAAG,CAAC,CAAA;AACpD,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB,SAAS,CAAA,EAAQ;AACf,MAAA,KAAA,CAAM,CAAA,EAAG,WAAW,kBAAkB,CAAA;AAAA,IACxC,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,qBAAqB,YAAY;AACrC,IAAA,IAAI,CAAC,aAAA,CAAc,IAAA,EAAK,EAAG;AAC3B,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,aAAa,CAAA;AAC9C,MAAA,MAAM,MAAA,CAAO,YAAA,CAAa,aAAA,EAAe,eAAe,CAAA;AACxD,MAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,MAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,CAAA,EAAQ;AACf,MAAA,KAAA,CAAM,CAAA,CAAE,WAAW,yBAAyB,CAAA;AAAA,IAC9C,CAAA,SAAE;AACA,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAmB;AACzC,IAAA,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAC5B,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAC,CAAA;AACtE,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAkB;AAC/C,IAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,IAAA,cAAA,CAAe,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC9C,IAAA,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAC5B,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,iBAAA,GAA0B,eAAQ,MAAM;AAC5C,IAAA,MAAM,UAAU,EAAC;AACjB,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAM,YAAA,EAAc,IAAA,EAAM,QAAW,CAAA;AAChE,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AACtE,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,SAAA,EAAW,MAAM,CAAA,UAAA,EAAa,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,CAAE,IAAI,CAAA,EAAA,CAAA,EAAM,IAAA,EAAM,aAAa,CAAA;AAAA,IACpH;AACA,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAAA,EAAAA,KAAK;AACnB,MAAA,MAAM,aAAa,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,CAAY,MAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,IAAI,GAAA,GAAM,EAAA;AACpG,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAIA,EAAAA,CAAE,EAAA,EAAI,IAAA,EAAMA,EAAAA,CAAE,IAAA,EAAM,IAAA,EAAM,UAAA,GAAaA,EAAAA,CAAE,IAAA,GAAO,KAAK,CAAA;AAAA,IAC1E,CAAC,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,EAAa,eAAA,EAAiB,OAAO,CAAC,CAAA;AAE1C,EAAA,MAAM,oBAAA,GAA6B,MAAA,CAAA,WAAA,CAAY,OAAOA,EAAAA,KAAuB;AAE3E,IAAA,IAAIA,EAAAA,CAAE,UAAA,IAAcA,EAAAA,CAAE,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3C,MAAA,wBAAA,CAAyBA,EAAC,CAAA;AAC1B,MAAA,2BAAA,CAA4B,IAAI,CAAA;AAChC,MAAA;AAAA,IACF;AAGA,IAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,IAAA,wBAAA,CAAyBA,EAAC,CAAA;AAC1B,IAAA,2BAAA,CAA4B,IAAI,CAAA;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,aAAa,CAAA;AAC9C,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,kBAAA,CAAmBA,GAAE,GAAG,CAAA;AACpD,MAAA,MAAM,cAAc,EAAE,GAAGA,EAAAA,EAAG,UAAA,EAAY,OAAO,UAAA,EAAW;AAC1D,MAAA,wBAAA,CAAyB,WAAW,CAAA;AAEpC,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,KAAQA,EAAAA,CAAE,GAAA,GAAM,WAAA,GAAc,IAAI,CAAC,CAAA;AAAA,IAChF,SAAS,CAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,CAAC,CAAA;AAAA,IAEnD,CAAA,SAAE;AACA,MAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAU,gBAAiB,SAAS,CAAA;AACxF,EAAA,MAAM,oBAAA,GAA6B,eAAQ,MAAM;AAC/C,IAAA,OAAO,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,CAAY,MAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,IAAI,GAAA,GAAM,MAAA;AAAA,EAC1F,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBACEM,IAAAA,CAAQ,OAAA,CAAA,IAAA,EAAP,EAAY,MAAY,YAAA,EACvB,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAQ,gBAAP,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAQ,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,oCAAA,EAAqC,CAAA;AAAA,sBAC/DD,IAAAA;AAAA,QAAQ,OAAA,CAAA,OAAA;AAAA,QAAP;AAAA,UACC,SAAA,EAAW,CAAA,0MAAA,EAA6M,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,UAEvO,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,kBACC,QAAA,kBAAAA,GAAAA,CAAQ,eAAP,EAAc,QAAA,EAAA,KAAA,IAAS,iBAAgB,CAAA,EAC1C,CAAA;AAAA,4BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0HAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yEAAA,EACZ,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,kBACpC,KAAA,IAAS;AAAA,iBAAA,EACZ,CAAA;AAAA,gCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA8B,yBAAe,oBAAA,EAAqB;AAAA,eAAA,EACjF,CAAA;AAAA,8BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,IAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,MAAM,aAAA,CAAc,QAAQ,CAAA;AAAA,oBACrC,SAAA,EAAW,CAAA,4FAAA,EAA+F,UAAA,KAAe,QAAA,GAAW,yEAAyE,2EAA2E,CAAA,CAAA;AAAA,oBAExR,QAAA,EAAA;AAAA,sCAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBAAE;AAAA;AAAA;AAAA,iBAElC;AAAA,gBACC,IAAA,KAAS,0BACRD,IAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,MAAM,aAAA,CAAc,QAAQ,CAAA;AAAA,oBACrC,SAAA,EAAW,CAAA,4FAAA,EAA+F,UAAA,KAAe,QAAA,GAAW,yEAAyE,2EAA2E,CAAA,CAAA;AAAA,oBAExR,QAAA,EAAA;AAAA,sCAAAC,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBAAE;AAAA;AAAA;AAAA;AAEzC,eAAA,EAEJ,CAAA;AAAA,8BAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,KAAA,CAAM,MAAA;AAAA,gBAAO,gBAAA;AAAA,gBAAU,OAAA,CAAQ,MAAA;AAAA,gBAAO;AAAA,eAAA,EACzC,CAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BAGAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EAEb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iGAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,gCAAA,EACZ,yBAAe,QAAA,oBACdD,IAAAA,CAAAK,QAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,kCAAAL,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,sBAAsB,CAAC,CAAA,EAAG,SAAA,EAAU,uCAAA,EACzD,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,WAAU,CAAA,EAChC,CAAA;AAAA,oBACC,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAC5BD,IAAAA,CAAO,MAAA,CAAA,QAAA,EAAN,EACC,QAAA,EAAA;AAAA,sCAAAC,GAAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,sCACzDA,GAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,OAAA,EAAS,MAAM,qBAAA,CAAsB,CAAA,GAAI,CAAC,CAAA;AAAA,0BAC1C,WAAW,CAAA,6DAAA,EAAgE,CAAA,KAAM,YAAY,MAAA,GAAS,CAAA,GAAI,gDAAgD,EAAE,CAAA,CAAA;AAAA,0BAE3J,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA;AACL,qBAAA,EAAA,EAPmB,GAAG,CAAA,CAAE,EAAA,IAAM,YAAY,CAAA,CAAA,EAAI,CAAC,EAQjD,CACD;AAAA,mBAAA,EACH,CAAA;AAAA,kCAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,kCAE5DA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,MAAM,IAAA,EAAK;AAAA,sBACpB,QAAA,EAAU,OAAA;AAAA,sBACV,SAAA,EAAU,kIAAA;AAAA,sBACV,KAAA,EAAM,SAAA;AAAA,sBAEN,QAAA,kBAAAA,IAAC,WAAA,EAAA,EAAY,SAAA,EAAW,WAAW,OAAA,GAAU,cAAA,GAAiB,EAAE,CAAA,CAAA,EAAI;AAAA;AAAA,mBACtE;AAAA,kCAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,kCAG5DD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,mHAAA,EAAoH,CAAA;AAAA,oCAC1IA,GAAAA;AAAA,sBAAC,OAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO,KAAA;AAAA,wBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,wBACxC,WAAA,EAAY,iBAAA;AAAA,wBACZ,SAAA,EAAU;AAAA;AAAA;AACZ,mBAAA,EACF;AAAA,iBAAA,EACF,CAAA,EAEJ,CAAA;AAAA,gCAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,UAAA,KAAe,QAAA,oBACdA,IAAAA,CAAAK,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oCAAAJ,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,mBAAA,CAAoB,IAAI,CAAA,EAAG,SAAA,EAAU,+GAAA,EAAgH,KAAA,EAAM,cAChL,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,WAAU,CAAA,EACtC,CAAA;AAAA,oCACAA,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,IAAA,EAAK,EAAG,WAAW,CAAA,8GAAA,EAAiH,OAAA,GAAU,+BAA+B,EAAE,CAAA,CAAA,EAAI,OAAM,SAAA,EAC9M,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW,SAAA,EAAU,WAAU,CAAA,EAClC;AAAA,mBAAA,EACF,CAAA;AAAA,kCAEFA,GAAAA,CAAQ,OAAA,CAAA,KAAA,EAAP,EAAa,OAAA,EAAO,MACnB,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,mHAChB,QAAA,kBAAAA,GAAAA,CAAC,SAAM,SAAA,EAAU,SAAA,EAAU,GAC7B,CAAA,EACF;AAAA,iBAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,8BAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,UAAA,KAAe,QAAA,oBACdA,IAAAA,CAAAK,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,kBAAA,KAAA,oBACCJ,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oGACb,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA,EACf,CAAA;AAAA,kCAGFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,iBAAiB,qEAAA,EAE9B,QAAA,EAAA;AAAA,oBAAA,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,qBACnBA,IAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBAEC,OAAA,EAAS,MAAM,cAAA,CAAe,MAAM,CAAA;AAAA,wBACpC,SAAA,EAAU,2MAAA;AAAA,wBAEV,QAAA,EAAA;AAAA,0CAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,2HAAA,EACb,0BAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,wBAAA,EAAyB,CAAA,EACjD,CAAA;AAAA,0CACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+DAAA,EAAiE,iBAAO,IAAA,EAAK;AAAA;AAAA,uBAAA;AAAA,sBAPxF,MAAA,CAAO;AAAA,qBASf,CAAA;AAAA,oBAGA,YAAA,CAAa,GAAA,CAAI,CAACP,EAAAA,KAAM;AAEvB,sBAAA,MAAM,aAAaA,EAAAA,CAAE,GAAA;AACrB,sBAAA,MAAM,aAAA,GAAgBA,EAAAA,CAAE,UAAA,IAAcA,EAAAA,CAAE,WAAW,MAAA,GAAS,CAAA;AAE5D,sBAAA,uBACEM,IAAAA;AAAA,wBAAC,KAAA;AAAA,wBAAA;AAAA,0BAEC,OAAA,EAAS,MAAM,cAAA,CAAeN,EAAC,CAAA;AAAA,0BAC/B,SAAA,EAAU,4MAAA;AAAA,0BAEV,QAAA,EAAA;AAAA,4CAAAO,GAAAA,CAAC,SAAI,GAAA,EAAK,UAAA,EAAY,KAAKP,EAAAA,CAAE,YAAA,EAAc,WAAU,oFAAA,EAAqF,CAAA;AAAA,4BAGzIA,EAAAA,CAAE,WAAA,EAAa,UAAA,CAAW,QAAQ,qBACjCO,GAAAA;AAAA,8BAAC,QAAA;AAAA,8BAAA;AAAA,gCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kCAAA,oBAAA,CAAqBP,EAAC,CAAA;AAAA,gCACxB,CAAA;AAAA,gCACA,SAAA,EAAW,CAAA,iHAAA,EAAoH,aAAA,GAAgB,sCAAA,GAAyC,oCAAoC,CAAA,CAAA;AAAA,gCAC5N,KAAA,EAAO,gBAAgB,iBAAA,GAAoB,qBAAA;AAAA,gCAE3C,QAAA,kBAAAO,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,6BAClC;AAAA,4CAIFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gIACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+GAAA,EACb,QAAA,EAAA;AAAA,8CAAAC,GAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oCAAA,QAAA,CAAS;AAAA,sCACP,KAAKP,EAAAA,CAAE,GAAA;AAAA,sCACP,KAAKA,EAAAA,CAAE,GAAA;AAAA,sCACP,cAAcA,EAAAA,CAAE,YAAA;AAAA,sCAChB,MAAMA,EAAAA,CAAE,IAAA;AAAA,sCACR,aAAaA,EAAAA,CAAE,WAAA;AAAA,sCACf,YAAYA,EAAAA,CAAE;AAAA,qCACf,CAAA;AACD,oCAAA,YAAA,CAAa,KAAK,CAAA;AAAA,kCACpB,CAAA;AAAA,kCACA,SAAA,EAAU,iGAAA;AAAA,kCACX,QAAA,EAAA;AAAA;AAAA,+BAED;AAAA,8BACC,8BACCO,GAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,oCAAA,eAAA,CAAgBP,EAAC,CAAA;AAAA,kCAAG,CAAA;AAAA,kCAC3D,SAAA,EAAU,mHAAA;AAAA,kCAEV,QAAA,kBAAAO,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACjC,6BAAA,EAEJ,CAAA,EACF,CAAA;AAAA,4CAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yJACZ,QAAA,EAAAP,EAAAA,CAAE,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,aAAY,EAChD;AAAA;AAAA,yBAAA;AAAA,wBAtDKA,EAAAA,CAAE;AAAA,uBAuDT;AAAA,oBAEJ,CAAC;AAAA,mBAAA,EACH,CAAA;AAAA,kBAEC,CAAC,OAAA,IAAW,cAAA,CAAe,MAAA,KAAW,CAAA,IAAK,YAAA,CAAa,MAAA,KAAW,CAAA,oBAClEM,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,yEAAA,EACb,0BAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC7C,CAAA;AAAA,oCACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kCAAiC,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,oCAC9DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,WAAU,QAAA,EAAA,gDAAA,EAA8C;AAAA,mBAAA,EACvE;AAAA,iBAAA,EAEJ,CAAA;AAAA,gBAGD,UAAA,KAAe,QAAA,oBACdA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kEAAA,EACZ,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,eAAA,EAAgB,CAAA;AAAA,oBAAE;AAAA,mBAAA,EAE/C,CAAA;AAAA,kCAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8CAAA,EAA+C,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,oCAC7ED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,sCAAAC,GAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,KAAA,EAAO,oBAAA;AAAA,0BACP,UAAU,CAAC,CAAA,KAAM,uBAAA,CAAwB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,0BACvD,SAAA,EAAU,0HAAA;AAAA,0BAET,QAAA,EAAA,iBAAA,CAAkB,GAAA,CAAI,CAAA,GAAA,qBACrBA,GAAAA,CAAC,QAAA,EAAA,EAAoB,KAAA,EAAO,GAAA,CAAI,EAAA,EAAK,QAAA,EAAA,GAAA,CAAI,IAAA,EAAA,EAA5B,GAAA,CAAI,EAA6B,CAC/C;AAAA;AAAA,uBACH;AAAA,sCACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,mBAAA,CAAoB,IAAI,CAAA,EAAG,SAAA,EAAU,iFAC1D,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,WAAU,CAAA,EACtC;AAAA,qBAAA,EACF;AAAA,mBAAA,EACF,CAAA;AAAA,kCAEAA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,aAAA;AAAA,sBACA,SAAA;AAAA,sBACA,MAAA;AAAA,sBACA,UAAA,EAAY,kBAAkB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,oBAAoB,CAAA,EAAG,IAAA,IAAQ,oBAAA,IAAwB,UAAA;AAAA,sBACxG,MAAA,EAAQ,CAAC,SAAS,CAAA;AAAA,sBAClB,WAAA;AAAA,sBACA,QAAA;AAAA,sBACA,cAAA;AAAA,sBACA,eAAA,EAAiB,KAAA;AAAA,sBACjB,UAAA,EAAY,KAAA;AAAA,sBACZ,gBAAA,EAAkB,iBAAiB,OAAA,IAAW,IAAA;AAAA,sBAC9C,gBAAgB,eAAA,EAAiB,KAAA;AAAA,sBACjC,sBAAA,EAAwB,OAAO,IAAA,KAAuB;AACpD,wBAAA,IAAI,KAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,SAAA,IAAa,KAAK,OAAA,EAAS;AAC/D,0BAAA,IAAI,aAAc,IAAA,CAAa,UAAA;AAG/B,0BAAA,IAAI,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,sBAAA,IAA0B,IAAA,CAAK,sBAAA,CAAuB,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,IAAA,EAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AACrI,4BAAA,IAAI;AACF,8BAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,aAAa,CAAA;AAC9C,8BAAA,MAAM,SAAS,MAAM,MAAA,CAAO,mBAAmB,IAAA,CAAK,OAAA,EAAS,KAAK,sBAAsB,CAAA;AACxF,8BAAA,UAAA,GAAa,MAAA,CAAO,UAAA;AAAA,4BACtB,SAAS,CAAA,EAAG;AACV,8BAAA,OAAA,CAAQ,IAAA,CAAK,kCAAkC,CAAC,CAAA;AAAA,4BAClD;AAAA,0BACF;AAEA,0BAAA,MAAM,OAAA,GAAU;AAAA,4BACd,KAAK,IAAA,CAAK,OAAA;AAAA,4BACV,cAAc,IAAA,CAAK,IAAA;AAAA,4BACnB,MAAM,IAAA,CAAK,IAAA;AAAA,4BACX,aAAa,IAAA,CAAK,IAAA;AAAA,4BAClB,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,4BACnC,KAAK,IAAA,CAAK,SAAA;AAAA,4BACV;AAAA,2BACF;AACA,0BAAA,QAAA,CAAS,CAAC,IAAA,KAAS;AACjB,4BAAA,IAAI,IAAA,CAAK,KAAK,CAAAP,EAAAA,KAAKA,GAAE,GAAA,KAAQ,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,IAAA;AAClD,4BAAA,OAAO,gBAAA,CAAiB,CAAC,OAAA,EAAS,GAAG,IAAI,CAAC,CAAA;AAAA,0BAC5C,CAAC,CAAA;AAAA,wBACH;AAAA,sBACF,CAAA;AAAA,sBACA,YAAY,MAAM;AAChB,wBAAA,IAAI,IAAA,KAAS,MAAA,IAAU,CAAC,yBAAA,EAA2B;AACjD,0BAAA,UAAA,CAAW,MAAM;AACf,4BAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,4BAAA,IAAA,EAAK;AAAA,0BACP,GAAG,GAAI,CAAA;AAAA,wBACT,CAAA,MAAO;AACL,0BAAA,IAAA,EAAK;AAAA,wBACP;AAAA,sBACF,CAAA;AAAA,sBACA,iBAAA,EAAkB,uJAAA;AAAA,sBAClB,eAAA,EAAgB,QAAA;AAAA,sBAChB,QAAA,kBACEM,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,wCAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,mFAAA,EACb,0BAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,SAAA,EAAU,CAAA,EACvC,CAAA;AAAA,wCACAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0CAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,kCAAA,EAAgC,CAAA;AAAA,0CACzED,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,4BAAA,+BAAA;AAAA,4BAA8B,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,IAAA,GAAO,IAAI,CAAA;AAAA,4BAAE;AAAA,2BAAA,EAAE;AAAA,yBAAA,EAClH;AAAA,uBAAA,EACF;AAAA;AAAA;AAEJ,iBAAA,EACF,CAAA,EAEF;AAAA,eAAA,EAEJ;AAAA,aAAA,EACF;AAAA;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBAGAC,GAAAA,CAAQ,OAAA,CAAA,IAAA,EAAP,EAAY,IAAA,EAAM,gBAAA,EAAkB,YAAA,EAAc,mBAAA,EACjD,QAAA,kBAAAD,IAAAA,CAAQ,OAAA,CAAA,MAAA,EAAP,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAQ,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,qCAAA,EAAsC,CAAA;AAAA,sBAChED,IAAAA,CAAQ,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,oIAAA,EAAqI,oBAAiB,wBAAA,EAC9K,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAQ,OAAA,CAAA,KAAA,EAAP,EAAa,SAAA,EAAU,4CAA2C,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,wBAC7EA,IAAQ,OAAA,CAAA,WAAA,EAAP,EAAmB,IAAG,wBAAA,EAAyB,SAAA,EAAU,WAAU,QAAA,EAAA,4CAAA,EAEpE,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAU,0HAAA;AAAA,YACV,WAAA,EAAY,aAAA;AAAA,YACZ,KAAA,EAAO,aAAA;AAAA,YACP,QAAA,EAAU,CAAA,CAAA,KAAK,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC9C,SAAA,EAAW,CAAA,CAAA,KAAK,CAAA,CAAE,GAAA,KAAQ,WAAW,kBAAA;AAAmB;AAAA,SAC1D;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,YAAO,OAAA,EAAS,MAAM,oBAAoB,KAAK,CAAA,EAAG,SAAA,EAAU,0EAAA,EAA2E,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAC9IA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,kBAAA;AAAA,cACT,QAAA,EAAU,cAAA,IAAkB,CAAC,aAAA,CAAc,IAAA,EAAK;AAAA,cAChD,SAAA,EAAU,uGAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA,CAAQ,OAAA,CAAA,IAAA,EAAP,EAAY,IAAA,EAAM,CAAC,CAAC,YAAA,EAAc,YAAA,EAAc,CAACK,KAAAA,KAAS,CAACA,SAAQ,eAAA,CAAgB,IAAI,GACtF,QAAA,kBAAAN,IAAAA,CAAQ,gBAAP,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAQ,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,qCAAA,EAAsC,CAAA;AAAA,sBAChED,IAAAA,CAAQ,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,uHAAA,EAAwH,oBAAiB,yBAAA,EACjK,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAQ,OAAA,CAAA,KAAA,EAAP,EAAa,SAAA,EAAU,4CAA2C,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBAC9ED,IAAAA,CAAQ,OAAA,CAAA,WAAA,EAAP,EAAmB,EAAA,EAAG,yBAAA,EAA0B,WAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,UAAA,kCAAA;AAAA,0BAC9CA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAAE,YAAA,EAAc,YAAA;AAAA,YAAa;AAAA,WAAA,EAAC,CAAA;AAAA,UAAO;AAAA,SAAA,EACrH,CAAA;AAAA,wBACAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,cACnC,SAAA,EAAU,0EAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,YAAA;AAAA,cACT,QAAA,EAAU,CAAC,CAAC,QAAA;AAAA,cACZ,SAAA,EAAU,qGAAA;AAAA,cAET,qBAAW,aAAA,GAAgB;AAAA;AAAA;AAC9B,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA,CAAQ,OAAA,CAAA,IAAA,EAAP,EAAY,IAAA,EAAM,CAAC,CAAC,qBAAA,EAAuB,YAAA,EAAc,CAACK,KAAAA,KAAS,CAACA,SAAQ,wBAAA,CAAyB,IAAI,GACxG,QAAA,kBAAAN,IAAAA,CAAQ,gBAAP,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAQ,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,qCAAA,EAAsC,CAAA;AAAA,sBAChED,IAAAA,CAAQ,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,iJAAA,EAAkJ,oBAAiB,gCAAA,EAC3L,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAQ,OAAA,CAAA,KAAA,EAAP,EAAa,SAAA,EAAU,4CAA2C,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,0BACnFD,IAAAA,CAAQ,OAAA,CAAA,WAAA,EAAP,EAAmB,EAAA,EAAG,gCAAA,EAAiC,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,YAAA,8BAAA;AAAA,4BACpDA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAAE,qBAAA,EAAuB,YAAA;AAAA,cAAa;AAAA,aAAA,EAAC;AAAA,WAAA,EACnH;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,oBAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,4BAC7CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAsB,QAAA,EAAA,0BAAA,EAAwB;AAAA,WAAA,EAChE,CAAA;AAAA,0BAEFD,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,wDAAwD,oBAAA,GAAuB,gCAAA,GAAmC,EAAE,CAAA,CAAA,EAElI,QAAA,EAAA;AAAA,4BAAAA,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,2BAAA,CAA4B,IAAI,CAAA;AAAA,gBAC/C,SAAA,EAAW,CAAA,wEAAA,EAA2E,wBAAA,KAA6B,IAAA,GAC/G,yCACA,uCACF,CAAA,CAAA;AAAA,gBAEF,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qEAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,GAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,KAAK,qBAAA,EAAuB,GAAA;AAAA,wBAC5B,GAAA,EAAI,UAAA;AAAA,wBACJ,SAAA,EAAU;AAAA;AAAA,qBACZ;AAAA,oBACC,wBAAA,KAA6B,IAAA,oBAC5BA,GAAAA,CAAC,SAAI,SAAA,EAAU,kEAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EACb,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,IAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,WAAA,EAC9D,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,QAAA,EAAS,SAAA,EAAU,CAAA,EAAE,oHAAA,EAAqH,QAAA,EAAS,SAAA,EAAU,CAAA,EACrK,GACF,CAAA,EACF;AAAA,mBAAA,EAEJ,CAAA;AAAA,kCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,oCAC3DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAwB,QAAA,EAAA,WAAA,EAAS;AAAA,mBAAA,EAClD;AAAA;AAAA;AAAA,aACF;AAAA,YAGC,qBAAA,EAAuB,UAAA,EAAY,GAAA,CAAI,CAAC,8BACvCD,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,OAAA,EAAS,MAAM,2BAAA,CAA4B,SAAS,CAAA;AAAA,gBACpD,WAAW,CAAA,wEAAA,EAA2E,wBAAA,EAA0B,OAAO,SAAA,CAAU,EAAA,GAC7H,yCACA,uCACF,CAAA,CAAA;AAAA,gBAEF,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qEAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,GAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,KAAK,SAAA,CAAU,GAAA;AAAA,wBACf,GAAA,EAAK,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,YAAA,CAAA;AAAA,wBACtB,SAAA,EAAU;AAAA;AAAA,qBACZ;AAAA,oBACC,wBAAA,EAA0B,EAAA,KAAO,SAAA,CAAU,EAAA,oBAC1CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,IAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,WAAA,EAC9D,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAS,SAAA,EAAU,GAAE,oHAAA,EAAqH,QAAA,EAAS,SAAA,EAAU,CAAA,EACrK,GACF,CAAA,EACF;AAAA,mBAAA,EAEJ,CAAA;AAAA,kCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAqC,QAAA,EAAA;AAAA,sBAAA,SAAA,CAAU,IAAA;AAAA,sBAAK;AAAA,qBAAA,EAAE,CAAA;AAAA,oCACrEC,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EACZ,QAAA,EAAA,SAAA,CAAU,YAAY,WAAA,EACzB;AAAA,mBAAA,EACF;AAAA;AAAA,eAAA;AAAA,cA5BK,SAAA,CAAU;AAAA,aA8BlB;AAAA,WAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,wBAAA,CAAyB,IAAI,CAAA;AAAA,cAC5C,SAAA,EAAU,0EAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAD,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AACb,gBAAA,IAAI,qBAAA,EAAuB;AACzB,kBAAA,QAAA,CAAS;AAAA,oBACP,GAAA,EAAK,wBAAA,EAA0B,GAAA,IAAO,qBAAA,CAAsB,GAAA;AAAA,oBAC5D,KAAK,qBAAA,CAAsB,GAAA;AAAA,oBAC3B,cAAc,qBAAA,CAAsB,YAAA;AAAA,oBACpC,MAAM,qBAAA,CAAsB,IAAA;AAAA,oBAC5B,aAAa,qBAAA,CAAsB,WAAA;AAAA,oBACnC,YAAY,qBAAA,CAAsB,UAAA;AAAA,oBAClC,mBAAmB,wBAAA,IAA4B;AAAA,mBAChD,CAAA;AACD,kBAAA,YAAA,CAAa,KAAK,CAAA;AAClB,kBAAA,wBAAA,CAAyB,IAAI,CAAA;AAAA,gBAC/B;AAAA,cACF,CAAA;AAAA,cACA,SAAA,EAAU,mFAAA;AAAA,cACX,QAAA,EAAA;AAAA,gBAAA,SAAA;AAAA,gBACS,wBAAA,GAA2B,CAAA,EAAG,wBAAA,CAAyB,IAAI,CAAA,YAAA,CAAA,GAAiB;AAAA;AAAA;AAAA;AACtF,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGAC,GAAAA,CAAQ,OAAA,CAAA,IAAA,EAAP,EAAY,IAAA,EAAM,CAAC,CAAC,WAAA,EAAa,YAAA,EAAc,CAACK,KAAAA,KAAS,CAACA,SAAQ,cAAA,CAAe,IAAI,GACpF,QAAA,kBAAAN,IAAAA,CAAQ,gBAAP,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAQ,iBAAP,EAAe,SAAA,EAAU,uCAAsC,OAAA,EAAS,MAAM,cAAA,CAAe,IAAI,CAAA,EAAG,CAAA;AAAA,sBACrGA,GAAAA,CAAQ,OAAA,CAAA,OAAA,EAAP,EAAe,SAAA,EAAU,mGAAA,EAAoG,kBAAA,EAAiB,2BAAA,EAC7I,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAEb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,sFAAA,EACb,0BAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,IAAQ,OAAA,CAAA,KAAA,EAAP,EAAa,SAAA,EAAU,4BAAA,EAA8B,uBAAa,YAAA,EAAa,CAAA;AAAA,4BAChFD,IAAAA,CAAQ,OAAA,CAAA,WAAA,EAAP,EAAmB,EAAA,EAAG,2BAAA,EAA4B,WAAU,uBAAA,EAC1D,QAAA,EAAA;AAAA,cAAA,WAAA,EAAa,IAAA,GAAO,IAAI,WAAA,CAAY,IAAA,GAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA,GAAQ,EAAA;AAAA,cAAG,UAAA;AAAA,cAAI,WAAA,EAAa;AAAA,aAAA,EAC1F;AAAA,WAAA,EACF,CAAA;AAAA,0BACAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,cAClC,SAAA,EAAU,iFAAA;AAAA,cAEV,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,oBAAA,EAAqB;AAAA;AAAA;AACxC,SAAA,EACF,CAAA,EACF,CAAA;AAAA,wBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAK,WAAA,EAAa,GAAA;AAAA,YAClB,KAAK,WAAA,EAAa,YAAA;AAAA,YAClB,SAAA,EAAU,sCAAA;AAAA,YACV,OAAA,EAAS,CAAC,CAAA,KAAM;AAEd,cAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,cAAA,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AACvB,cAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,cAAA,QAAA,CAAS,SAAA,GAAY,wBAAA;AACrB,cAAA,QAAA,CAAS,SAAA,GAAY;AAAA;AAAA,8DAAA,EAEuB,aAAa,GAAG,CAAA;AAAA,oBAAA,CAAA;AAE5D,cAAA,MAAA,CAAO,aAAA,EAAe,YAAY,QAAQ,CAAA;AAAA,YAC5C;AAAA;AAAA,SACF,EACF,CAAA;AAAA,wBAGAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,IAAI,WAAA,EAAa;AACf,kBAAA,QAAA,CAAS;AAAA,oBACP,KAAK,WAAA,CAAY,GAAA;AAAA,oBACjB,KAAK,WAAA,CAAY,GAAA;AAAA,oBACjB,cAAc,WAAA,CAAY,YAAA;AAAA,oBAC1B,MAAM,WAAA,CAAY,IAAA;AAAA,oBAClB,aAAa,WAAA,CAAY,WAAA;AAAA,oBACzB,YAAY,WAAA,CAAY;AAAA,mBACzB,CAAA;AACD,kBAAA,YAAA,CAAa,KAAK,CAAA;AAClB,kBAAA,cAAA,CAAe,IAAI,CAAA;AAAA,gBACrB;AAAA,cACF,CAAA;AAAA,cACA,SAAA,EAAU,yFAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,MAAM,WAAA,EAAa,GAAA;AAAA,cACnB,MAAA,EAAO,QAAA;AAAA,cACP,GAAA,EAAI,qBAAA;AAAA,cACJ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,cAClC,SAAA,EAAU,kHAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,UACC,WAAA,EAAa,WAAA,EAAa,UAAA,CAAW,QAAQ,qBAC5CD,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,IAAI,WAAA,EAAa;AACf,kBAAA,oBAAA,CAAqB,WAAW,CAAA;AAChC,kBAAA,cAAA,CAAe,IAAI,CAAA;AAAA,gBACrB;AAAA,cACF,CAAA;AAAA,cACA,SAAA,EAAU,qHAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA;AAEpC,SAAA,EAEJ,CAAA,EACF;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACpgCO,SAAS,kBAAkB,MAAA,EAAsC;AACtE,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA,GAAc,SAAA;AAAA,IACd,OAAA,GAAU;AAAA,GACZ,GAAI,MAAA;AAEJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,SAKvB,EAAE,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAExE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,CAAC,CAAA;AAE9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,QAAAA;AAAA,IACxB,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW;AAAA,GAC5C;AAGA,EAAA,MAAM,UAAA,GAAaS,YAAY,MAAM;AACnC,IAAA,OAAO,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,EAAS,GAAI,QAAA;AAAA,EACvD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAR,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,YAAA,GAAe;AAC5B,MAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAC9B,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,YAAA,EAAa;AACb,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAC7C,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,YAAY,CAAA;AAC/C,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAChD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,YAAY,CAAA;AAAA,IACpD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,MAAM,UAAA,GAAaS,OAAO,IAAI,CAAA;AAC9B,EAAAT,UAAU,MAAM;AACd,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AAAA,IACvB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAIL,EAAA,MAAM,kBAAA,GAAqBQ,WAAAA;AAAA,IACzB,OAA6B;AAAA,MAC3B,OAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV;AAAA,KACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,UAAA,EAAY,WAAW;AAAA,GACnC;AAEA,EAAAR,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AACjC,MAAA,QAAA,CAAS,EAAE,eAAe,IAAA,EAAM,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA;AAC9E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,SAAA,GAAY;AACzB,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,MAAA,QAAA,CAAS,CAAC,UAAU,EAAE,GAAG,MAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAE,CAAA;AAE5D,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,EAAE,OAAA,EAAS,KAAA,EAAc;AAG7C,QAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,WAAW,CAAA;AAC/C,QAAA,IAAI,SAAA,IAAa,CAAC,UAAA,CAAW,OAAA,EAAS;AAItC,QAAA,MAAM,WAAW,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AAE5D,QAAA,IAAI,QAAA,EAAU;AAEZ,UAAA,MAAM,aAAA,CAAc;AAAA,YAClB,GAAG,WAAA;AAAA,YACH,WAAW,QAAA,CAAS,EAAA;AAAA,YACpB,SAAA,EAAW,IAAA;AAAA,YACX,qBAAA,EAAuB;AAAA;AAAA,WACxB,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,IAAI;AACF,YAAA,MAAM,aAAA,CAAc;AAAA,cAClB,GAAG,WAAA;AAAA,cACH,IAAA,EAAM,WAAA;AAAA,cACN,SAAA,EAAW,IAAA;AAAA,cACX,qBAAA,EAAuB;AAAA;AAAA,aACxB,CAAA;AAAA,UACH,SAAS,GAAA,EAAU;AAEjB,YAAA,IAAI,GAAA,EAAK,OAAA,EAAS,QAAA,CAAS,KAAK,KAAK,GAAA,EAAK,OAAA,EAAS,QAAA,CAAS,WAAW,CAAA,IAAK,GAAA,EAAK,OAAA,EAAS,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACpH,cAAA,MAAM,aAAA,GAAgB,MAAM,YAAA,CAAa,WAAW,CAAA;AACpD,cAAA,MAAM,QAAQ,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AAC9D,cAAA,IAAI,CAAC,OAAO,MAAM,GAAA;AAClB,cAAA,MAAM,aAAA,CAAc;AAAA,gBAClB,GAAG,WAAA;AAAA,gBACH,WAAW,KAAA,CAAM,EAAA;AAAA,gBACjB,SAAA,EAAW,IAAA;AAAA,gBACX,qBAAA,EAAuB;AAAA;AAAA,eACxB,CAAA;AAAA,YACH,CAAA,MAAO;AACL,cAAA,MAAM,GAAA;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,SAAA,IAAa,CAAC,UAAA,CAAW,OAAA,EAAS;AAGtC,QAAA,QAAA,CAAS;AAAA,UACP,eAAe,kBAAA,EAAmB;AAAA,UAClC,SAAA,EAAW,IAAA;AAAA,UACX,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH,SAAS,GAAA,EAAU;AACjB,QAAA,IAAI,SAAA,IAAa,CAAC,UAAA,CAAW,OAAA,EAAS;AACtC,QAAA,QAAA,CAAS;AAAA,UACP,aAAA,EAAe,IAAA;AAAA,UACf,SAAA,EAAW,IAAA;AAAA,UACX,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,KAAK,OAAA,IAAW;AAAA,SACxB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,SAAA,EAAU;AAEV,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,QAAQ,OAAA,EAAS,WAAA,EAAa,UAAA,EAAY,kBAAkB,CAAC,CAAA;AAEjF,EAAA,MAAM,KAAA,GAAQQ,YAAY,MAAM;AAC9B,IAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,QAAA,CAAS,EAAE,eAAe,IAAA,EAAM,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,EAChF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,OAAA,EAAS,CAAC,CAAC,KAAA,CAAM,aAAA;AAAA,IACjB,KAAA;AAAA,IACA;AAAA,GACF;AACF","file":"index.mjs","sourcesContent":["export type QuotaInfo = {\n limitBytes: number;\n usedBytes: number;\n remainingBytes: number;\n};\n\nexport class StorageQuotaError extends Error {\n details?: { limit: number; used: number; remaining: number; fileSize: number };\n constructor(message: string, details?: { limit: number; used: number; remaining: number; fileSize: number }) {\n super(message);\n this.name = 'StorageQuotaError';\n this.details = details;\n }\n}\n\nexport type PresignResponse = {\n presignedUrl: string;\n fileKey: string;\n publicUrl: string;\n apiKeyId?: string;\n projectId?: string;\n};\n\nexport type UploadedFileResult = {\n publicUrl: string;\n fileKey: string;\n fileName: string;\n fileType: string;\n fileSize: number;\n projectId?: string;\n apiKeyId?: string;\n thumbnails?: Thumbnail[];\n};\n\nexport type Thumbnail = {\n id: string;\n key: string;\n url: string;\n size: number;\n sizeType?: string;\n createdAt?: string;\n};\n\nexport type Folder = {\n id: string;\n name: string;\n parentId: string | null;\n projectId: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type FileListItem = {\n key: string;\n originalName: string;\n size: number;\n contentType: string;\n uploadedAt: string;\n url: string;\n};\n\n/**\n * Upfiles Client - JavaScript client for Upfiles Plugin API\n * \n * 📚 Full documentation: https://ktw-upfiles-docs.netlify.app/\n * \n * @example\n * ```ts\n * const client = new UpfilesClient({\n * baseUrl: 'https://your-upfiles.example.com',\n * apiKey: 'upf_...',\n * });\n * ```\n */\n\nexport type UpfilesClientOptions = {\n baseUrl?: string; // e.g., https://your-upfiles.example.com. If omitted, uses same-origin.\n presignPath?: string; // default /api/plugin/upload (relative)\n presignUrl?: string; // full absolute URL override, e.g., https://api.example.com/api/upload\n headers?: Record<string, string>; // e.g., { Authorization: `Bearer ${token}` }\n withCredentials?: boolean; // send cookies for session auth\n apiKey?: string; // upf_... value; when provided, sent using apiKeyHeader\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key'; // default 'authorization'\n thumbnailsPath?: string; // default /api/plugin/thumbnails (relative)\n completionPath?: string; // default /api/plugin/files (relative)\n foldersPath?: string; // default /api/plugin/folders (relative)\n callCompletionEndpoint?: boolean; // default false for backward compatibility\n /** Dynamic token getter for JWT-based auth (inhouse mode). Called on each request for fresh token. Takes priority over apiKey. */\n getToken?: () => string | null | undefined | Promise<string | null | undefined>;\n /** Project ID sent as x-project-id header when using getToken (JWT auth) */\n projectId?: string;\n /** Project name sent as x-project-name in in-house mode so the browser does not need the project id. */\n projectName?: string;\n};\n\n/**\n * UpfilesClient - Main client class for interacting with Upfiles Plugin API\n * \n * 📚 Documentation: https://ktw-upfiles-docs.netlify.app/\n * \n * @example\n * ```ts\n * const client = new UpfilesClient({\n * baseUrl: 'https://your-upfiles.example.com',\n * apiKey: 'upf_...',\n * });\n * \n * const result = await client.upload(file, { folderPath: 'uploads/' });\n * ```\n */\nexport class UpfilesClient {\n private baseUrl?: string;\n private presignPath: string;\n private presignUrl?: string;\n private headers?: Record<string, string>;\n private withCredentials?: boolean;\n private apiKey?: string;\n private apiKeyHeader: 'authorization' | 'x-api-key' | 'x-up-api-key';\n private thumbnailsPath: string;\n private completionPath: string;\n private foldersPath: string;\n private callCompletionEndpoint: boolean;\n private getToken?: () => string | null | undefined | Promise<string | null | undefined>;\n private projectId?: string;\n private projectName?: string;\n\n constructor(opts: UpfilesClientOptions) {\n this.baseUrl = opts.baseUrl?.replace(/\\/$/, '');\n this.presignPath = opts.presignPath ?? '/api/plugin/upload';\n this.presignUrl = opts.presignUrl;\n this.headers = opts.headers;\n this.withCredentials = opts.withCredentials;\n this.apiKey = opts.apiKey;\n this.apiKeyHeader = opts.apiKeyHeader ?? 'authorization';\n this.thumbnailsPath = opts.thumbnailsPath ?? '/api/plugin/thumbnails';\n this.completionPath = opts.completionPath ?? '/api/plugin/files';\n this.foldersPath = opts.foldersPath ?? '/api/plugin/folders';\n this.callCompletionEndpoint = opts.callCompletionEndpoint ?? false;\n this.getToken = opts.getToken;\n this.projectId = opts.projectId;\n this.projectName = opts.projectName;\n }\n\n /** Build auth headers for API requests. Priority: getToken (JWT) > apiKey > static headers */\n private async buildAuthHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = { ...(this.headers || {}) };\n\n // JWT-based auth via getToken (used in inhouse mode)\n if (this.getToken) {\n const token = await this.getToken();\n if (token) {\n headers['authorization'] = `Bearer ${token}`;\n }\n if (this.projectName) {\n headers['x-project-name'] = this.projectName;\n } else if (this.projectId) {\n headers['x-project-id'] = this.projectId;\n }\n return headers;\n }\n\n // API key-based auth (used in customer/plugin mode)\n if (this.apiKey) {\n if (this.apiKeyHeader === 'authorization') {\n headers['authorization'] = this.apiKey.startsWith('upf_')\n ? `Bearer ${this.apiKey}`\n : this.apiKey;\n } else if (this.apiKeyHeader === 'x-api-key') {\n headers['x-api-key'] = this.apiKey;\n } else {\n headers['x-up-api-key'] = this.apiKey;\n }\n }\n return headers;\n }\n\n /** Get storage quota info for the project */\n async getQuota(): Promise<QuotaInfo> {\n const basePath = this.presignPath.replace(/\\/upload$/, '');\n const target = this.baseUrl ? `${this.baseUrl}${basePath}/quota` : `${basePath}/quota`;\n const headers = await this.buildAuthHeaders();\n const res = await fetch(target, {\n method: 'GET',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n });\n if (!res.ok) {\n let msg = 'Failed to get storage quota';\n try {\n const data = await res.json();\n msg = data.message || data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n return res.json();\n }\n\n async getPresignedUrl(params: {\n fileName: string;\n fileType: string;\n fileSize: number;\n projectId?: string;\n folderPath?: string;\n }): Promise<PresignResponse> {\n // Validate per Plugin API requirements\n if (!params.fileName) throw new Error('fileName is required');\n if (!params.fileType) throw new Error('fileType is required');\n if (!params.fileSize || params.fileSize <= 0) throw new Error('fileSize must be > 0');\n\n // Determine target URL: explicit presignUrl > baseUrl+presignPath > relative presignPath\n const target = this.presignUrl\n ? this.presignUrl\n : this.baseUrl\n ? `${this.baseUrl}${this.presignPath}`\n : this.presignPath; // relative to current origin\n\n // Compose headers, including API key if provided\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(await this.buildAuthHeaders()),\n };\n const res = await fetch(target, {\n method: 'POST',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify(params),\n });\n if (!res.ok) {\n let msg = 'Failed to get upload URL';\n try {\n const data = await res.json();\n if (res.status === 413 && data.error === 'STORAGE_QUOTA_EXCEEDED') {\n throw new StorageQuotaError(data.message || 'Storage quota exceeded', data.details);\n }\n msg = data.message || data.error || msg;\n } catch (e) {\n if (e instanceof StorageQuotaError) throw e;\n }\n throw new Error(msg);\n }\n return res.json();\n }\n\n async uploadToS3(presignedUrl: string, file: File): Promise<Response> {\n return fetch(presignedUrl, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type,\n },\n });\n }\n\n // Convenience: perform full flow and return URL/path metadata for DB\n async upload(\n file: File,\n extras?: { projectId?: string; folderPath?: string; fetchThumbnails?: boolean; callCompletionEndpoint?: boolean; userId?: string }\n ): Promise<UploadedFileResult> {\n const presign = await this.getPresignedUrl({\n fileName: file.name,\n fileType: file.type || 'application/octet-stream',\n fileSize: file.size,\n projectId: extras?.projectId,\n folderPath: extras?.folderPath,\n });\n const res = await this.uploadToS3(presign.presignedUrl, file);\n if (!res.ok) {\n throw new Error(`Upload failed with status ${res.status}`);\n }\n\n // Call completion endpoint if enabled (either globally or per-upload)\n const shouldCallCompletion = extras?.callCompletionEndpoint ?? this.callCompletionEndpoint;\n if (shouldCallCompletion) {\n try {\n await this.completeUpload({\n fileKey: presign.fileKey,\n originalName: file.name,\n size: file.size,\n contentType: file.type || 'application/octet-stream',\n projectId: extras?.projectId,\n url: presign.publicUrl,\n userId: (extras as any)?.userId, // userId might be passed in extras but not typed yet in this method signature, easy fix is to cast or update signature. Better to update signature but for now access via cast to keep change minimal if extras type isn't fully updated here locally. Wait, the plan said \"Update upload method to pass...\". I should probably check if I can update extras type locally or just cast. The `upload` method signature has `extras`. I should probably update `extras` type in the signature if I can.\n // Actually, looking at the code, `extras` is defined inline: `extras?: { projectId?: string; folderPath?: string; fetchThumbnails?: boolean; callCompletionEndpoint?: boolean }`. I should update this type definition too.\n });\n } catch (error: any) {\n throw new Error(`Upload verification failed: ${error.message}`);\n }\n }\n\n let thumbnails: Thumbnail[] | undefined;\n if (extras?.fetchThumbnails) {\n try {\n const t = await this.getThumbnails(presign.fileKey);\n thumbnails = t;\n } catch { }\n }\n return {\n publicUrl: presign.publicUrl,\n fileKey: presign.fileKey,\n fileName: file.name,\n fileType: file.type,\n fileSize: file.size,\n projectId: presign.projectId,\n apiKeyId: presign.apiKeyId,\n thumbnails,\n };\n }\n\n async completeUpload(params: {\n fileKey: string;\n originalName: string;\n size: number;\n contentType: string;\n projectId?: string;\n url?: string;\n userId?: string;\n }): Promise<{\n success: boolean;\n file: {\n id: string;\n key: string;\n originalName: string;\n size: number;\n contentType: string;\n url: string;\n uploadedAt: string;\n };\n thumbnails?: Thumbnail[];\n masterWebp?: { key: string; url: string };\n }> {\n const target = this.baseUrl ? `${this.baseUrl}${this.completionPath}` : this.completionPath;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(await this.buildAuthHeaders()),\n };\n const res = await fetch(target, {\n method: 'POST',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify({\n ...params,\n key: params.fileKey,\n }),\n });\n if (!res.ok) {\n let msg = 'Failed to complete upload';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n return res.json();\n }\n\n async getThumbnails(fileKey: string): Promise<Thumbnail[]> {\n const target = this.baseUrl ? `${this.baseUrl}${this.thumbnailsPath}` : this.thumbnailsPath;\n const url = `${target}?fileKey=${encodeURIComponent(fileKey)}`;\n const headers = await this.buildAuthHeaders();\n const res = await fetch(url, { method: 'GET', headers, credentials: this.withCredentials ? 'include' : 'same-origin' });\n if (!res.ok) {\n let msg = 'Failed to fetch thumbnails';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return data?.thumbnails ?? [];\n }\n\n async generateThumbnails(fileKey: string, sizes?: number[]): Promise<{ masterWebp?: { key: string; url: string }; thumbnails: Thumbnail[] }> {\n const target = this.baseUrl ? `${this.baseUrl}${this.thumbnailsPath}` : this.thumbnailsPath;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(await this.buildAuthHeaders()),\n };\n const body: any = { fileKey };\n if (sizes && sizes.length > 0) body.sizes = sizes;\n const res = await fetch(target, {\n method: 'POST',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n let msg = 'Failed to generate thumbnails';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return { masterWebp: data.masterWebp, thumbnails: data.thumbnails ?? [] };\n }\n\n /** Get thumbnail settings for the project (requires API key) */\n async getThumbnailSettings(): Promise<{ enabled: boolean; sizes: number[] }> {\n const basePath = this.presignPath.replace(/\\/upload$/, '');\n const target = this.baseUrl ? `${this.baseUrl}${basePath}/settings/thumbnails` : `${basePath}/settings/thumbnails`;\n const headers = await this.buildAuthHeaders();\n const res = await fetch(target, {\n method: 'GET',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n });\n if (!res.ok) {\n let msg = 'Failed to get thumbnail settings';\n try { const d = await res.json(); msg = d.message || msg; } catch { }\n throw new Error(msg);\n }\n return res.json();\n }\n\n /** Update thumbnail settings for the project (requires API key with write scope) */\n async updateThumbnailSettings(settings: { enabled?: boolean; sizes?: number[] }): Promise<{ enabled: boolean; sizes: number[] }> {\n const basePath = this.presignPath.replace(/\\/upload$/, '');\n const target = this.baseUrl ? `${this.baseUrl}${basePath}/settings/thumbnails` : `${basePath}/settings/thumbnails`;\n const headers = { 'content-type': 'application/json', ...(await this.buildAuthHeaders()) };\n const res = await fetch(target, {\n method: 'PATCH',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify(settings),\n });\n if (!res.ok) {\n let msg = 'Failed to update thumbnail settings';\n try { const d = await res.json(); msg = d.message || msg; } catch { }\n throw new Error(msg);\n }\n return res.json();\n }\n\n async getFolders(parentId?: string): Promise<Folder[]> {\n const target = this.baseUrl ? `${this.baseUrl}${this.foldersPath}` : this.foldersPath;\n const url = parentId ? `${target}?parentId=${encodeURIComponent(parentId)}` : target;\n const headers = await this.buildAuthHeaders();\n const res = await fetch(url, { method: 'GET', headers, credentials: this.withCredentials ? 'include' : 'same-origin' });\n if (!res.ok) {\n let msg = 'Failed to fetch folders';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return data?.folders ?? [];\n }\n\n async createFolder(name: string, parentId?: string): Promise<Folder> {\n const target = this.baseUrl ? `${this.baseUrl}${this.foldersPath}` : this.foldersPath;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(await this.buildAuthHeaders()),\n };\n const res = await fetch(target, {\n method: 'POST',\n headers,\n credentials: this.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify({ name, parentId }),\n });\n if (!res.ok) {\n let msg = 'Failed to create folder';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return data.folder;\n }\n\n async getProjectFiles(params?: { folderPath?: string }): Promise<{ files: FileListItem[]; updatedAt: string | null }> {\n // Derive plugin files path based on thumbnailsPath sibling\n const basePath = this.thumbnailsPath.replace(/\\/thumbnails$/, '');\n const filesPath = `${basePath}/files`;\n const target = this.baseUrl ? `${this.baseUrl}${filesPath}` : filesPath;\n const url = params?.folderPath ? `${target}?folderPath=${encodeURIComponent(params.folderPath)}` : target;\n const headers = await this.buildAuthHeaders();\n const res = await fetch(url, { method: 'GET', headers, credentials: this.withCredentials ? 'include' : 'same-origin' });\n if (!res.ok) {\n let msg = 'Failed to fetch files';\n try {\n const data = await res.json();\n msg = data.error || msg;\n } catch { }\n throw new Error(msg);\n }\n const data = await res.json();\n return {\n files: data?.files ?? [],\n updatedAt: res.headers.get('X-Files-Updated-At'),\n };\n }\n\n getEventsUrl(projectId?: string): string {\n const target = this.baseUrl ? `${this.baseUrl}/api/events` : '/api/events';\n\n // Construct URL without auth material. EventSource cannot send custom\n // headers, and credentials or internal project ids must not be placed in URLs.\n const url = new URL(target, window.location.href);\n if (!this.getToken && !this.apiKey && (projectId || this.projectId)) {\n url.searchParams.set('projectId', (projectId || this.projectId)!);\n }\n return url.toString();\n }\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { UpfilesClient, UpfilesClientOptions, PresignResponse, StorageQuotaError, QuotaInfo } from './client.js';\n\nconst THUMBNAIL_SIZE_OPTIONS = [64, 128, 256, 512] as const;\n\nexport type UploaderFile = {\n id: string;\n file: File;\n name: string;\n size: number;\n type: string;\n progress: number; // 0-100\n status: 'pending' | 'uploading' | 'success' | 'error';\n error?: string;\n publicUrl?: string;\n fileKey?: string;\n projectId?: string;\n apiKeyId?: string;\n /** Whether thumbnails should be generated for this file (set from per-file selection) */\n thumbnailEnabled?: boolean;\n /** Which thumbnail sizes were selected for this file */\n thumbnailSizesSelected?: number[];\n};\n\nexport type UploaderProps = {\n clientOptions?: UpfilesClientOptions;\n multiple?: boolean;\n accept?: string[]; // e.g., ['image/*','application/pdf']\n maxFileSize?: number; // bytes (0 = no limit, uses quota only)\n maxFiles?: number; // 0 = no limit\n projectId?: string;\n userId?: string; // Optional: user ID to associate with the file\n folderPath?: string;\n onComplete?: (files: UploaderFile[]) => void;\n onError?: (error: Error) => void;\n onUploadBegin?: (fileName: string) => void;\n onUploadProgress?: (fileName: string, progress: number) => void;\n onClientUploadComplete?: (file: UploaderFile) => void;\n className?: string;\n buttonClassName?: string;\n dropzoneClassName?: string;\n children?: React.ReactNode; // custom inner content for dropzone\n fetchThumbnails?: boolean; // fetch thumbnails after upload via plugin API\n autoRecordToDb?: boolean; // automatically record file to DB after upload\n recordUrl?: string; // custom endpoint to record file metadata (default: /api/files)\n autoUpload?: boolean; // automatically start upload when files are added (default: false)\n /**\n * If defined, show the per-image thumbnail configuration panel.\n * Value is the initial enabled state (default: true when panel is shown).\n */\n thumbnailEnabled?: boolean;\n /** Default thumbnail sizes to generate. Supported: 64, 128, 256, 512. Default: [256, 512] */\n thumbnailSizes?: number[];\n};\n\nexport const Uploader: React.FC<UploaderProps> = ({\n clientOptions,\n multiple = true,\n accept = ['image/*', 'video/*', 'audio/*', 'application/pdf', 'text/plain', 'application/json'],\n maxFileSize = 0,\n maxFiles = 0,\n onComplete,\n onError,\n onUploadBegin,\n onUploadProgress,\n onClientUploadComplete,\n className,\n buttonClassName,\n dropzoneClassName,\n children,\n projectId,\n userId,\n folderPath,\n fetchThumbnails,\n autoRecordToDb = true,\n recordUrl = '/api/files',\n autoUpload = false,\n thumbnailEnabled,\n thumbnailSizes,\n}) => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const client = useMemo(() => new UpfilesClient(clientOptions ?? {}), [clientOptions]);\n\n const [files, setFiles] = useState<UploaderFile[]>([]);\n const [isUploading, setIsUploading] = useState(false);\n const [isDragOver, setIsDragOver] = useState(false);\n const [quotaError, setQuotaError] = useState<string | null>(null);\n\n // Thumbnail UI: only shown when thumbnailEnabled prop is explicitly provided\n const showThumbnailUI = thumbnailEnabled !== undefined;\n const [thumbEnabled, setThumbEnabled] = useState<boolean>(thumbnailEnabled ?? true);\n const [thumbSizes, setThumbSizes] = useState<number[]>(thumbnailSizes ?? [256, 512]);\n const [thumbFileIds, setThumbFileIds] = useState<Set<string>>(new Set());\n\n // Refs for access inside uploadOne without stale closure issues\n const thumbEnabledRef = useRef<boolean>(thumbnailEnabled ?? true);\n const thumbSizesRef = useRef<number[]>(thumbnailSizes ?? [256, 512]);\n const thumbFileIdsRef = useRef<Set<string>>(new Set());\n\n useEffect(() => { thumbEnabledRef.current = thumbEnabled; }, [thumbEnabled]);\n useEffect(() => { thumbSizesRef.current = thumbSizes; }, [thumbSizes]);\n useEffect(() => { thumbFileIdsRef.current = thumbFileIds; }, [thumbFileIds]);\n\n // Derived values\n const pendingImages = useMemo(\n () => files.filter((f) => f.type.startsWith('image/') && f.status === 'pending'),\n [files],\n );\n const thumbSelectedCount = useMemo(\n () => pendingImages.filter((f) => thumbFileIds.has(f.id)).length,\n [pendingImages, thumbFileIds],\n );\n\n const handleThumbEnabledToggle = useCallback(() => {\n const newVal = !thumbEnabledRef.current;\n thumbEnabledRef.current = newVal;\n setThumbEnabled(newVal);\n if (newVal) {\n // Re-enroll all pending images when toggling on\n setFiles((prev) => {\n const ids = prev\n .filter((f) => f.type.startsWith('image/') && f.status === 'pending')\n .map((f) => f.id);\n if (ids.length > 0) {\n const next = new Set(thumbFileIdsRef.current);\n ids.forEach((id) => next.add(id));\n thumbFileIdsRef.current = next;\n setThumbFileIds(next);\n }\n return prev;\n });\n }\n }, []);\n\n const toggleThumbSize = useCallback((size: number) => {\n setThumbSizes((prev) => {\n const next = prev.includes(size)\n ? prev.filter((s) => s !== size)\n : [...prev, size].sort((a, b) => a - b);\n thumbSizesRef.current = next;\n return next;\n });\n }, []);\n\n const toggleFileThumb = useCallback((fileId: string) => {\n setThumbFileIds((prev) => {\n const next = new Set(prev);\n if (next.has(fileId)) next.delete(fileId);\n else next.add(fileId);\n thumbFileIdsRef.current = next;\n return next;\n });\n }, []);\n\n const selectAllThumbs = useCallback(() => {\n const ids = pendingImages.map((f) => f.id);\n const next = new Set(thumbFileIdsRef.current);\n ids.forEach((id) => next.add(id));\n thumbFileIdsRef.current = next;\n setThumbFileIds(next);\n }, [pendingImages]);\n\n const deselectAllThumbs = useCallback(() => {\n const pendingSet = new Set(pendingImages.map((f) => f.id));\n const next = new Set([...thumbFileIdsRef.current].filter((id) => !pendingSet.has(id)));\n thumbFileIdsRef.current = next;\n setThumbFileIds(next);\n }, [pendingImages]);\n\n const addFiles = useCallback((incoming: File[]) => {\n setQuotaError(null);\n const filtered = maxFileSize > 0\n ? incoming.filter((f) => f.size <= maxFileSize)\n : incoming;\n const limited = maxFiles > 0\n ? filtered.slice(0, Math.max(0, maxFiles - files.length))\n : filtered;\n const mapped: UploaderFile[] = limited.map((f) => ({\n id: Math.random().toString(36).slice(2),\n file: f,\n name: f.name,\n size: f.size,\n type: f.type || 'application/octet-stream',\n progress: 0,\n status: 'pending',\n }));\n setFiles((prev) => [...prev, ...mapped]);\n\n // Auto-enroll new images if thumbnail UI is shown and enabled\n if (showThumbnailUI && thumbEnabledRef.current) {\n const imageIds = mapped.filter((f) => f.type.startsWith('image/')).map((f) => f.id);\n if (imageIds.length > 0) {\n const next = new Set(thumbFileIdsRef.current);\n imageIds.forEach((id) => next.add(id));\n thumbFileIdsRef.current = next;\n setThumbFileIds(next);\n }\n }\n }, [files.length, maxFileSize, maxFiles, showThumbnailUI]);\n\n const removeFile = useCallback((fileId: string) => {\n setFiles((prev) => prev.filter((f) => f.id !== fileId));\n if (showThumbnailUI) {\n const next = new Set(thumbFileIdsRef.current);\n next.delete(fileId);\n thumbFileIdsRef.current = next;\n setThumbFileIds(next);\n }\n }, [showThumbnailUI]);\n\n const onInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const fs = Array.from(e.target.files || []);\n addFiles(fs);\n if (inputRef.current) inputRef.current.value = '';\n }, [addFiles]);\n\n const handleDrop = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n addFiles(Array.from(e.dataTransfer.files || []));\n }, [addFiles]);\n\n const uploadOne = useCallback(async (item: UploaderFile): Promise<UploaderFile> => {\n const update = (patch: Partial<UploaderFile>) => {\n setFiles((prev) => prev.map((f) => (f.id === item.id ? { ...f, ...patch } : f)));\n };\n try {\n onUploadBegin?.(item.name);\n update({ status: 'uploading', progress: 1 });\n const presign: PresignResponse = await client.getPresignedUrl({\n fileName: item.name,\n fileType: item.type || 'application/octet-stream',\n fileSize: item.size,\n projectId,\n folderPath,\n });\n\n // Use XMLHttpRequest to track upload progress\n await new Promise<void>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('PUT', presign.presignedUrl, true);\n xhr.upload.onprogress = (ev) => {\n if (ev.lengthComputable) {\n const pct = Math.min(99, Math.floor((ev.loaded / ev.total) * 100));\n update({ progress: pct });\n onUploadProgress?.(item.name, pct);\n }\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new Error(`Upload failed with status ${xhr.status}`));\n }\n };\n xhr.onerror = () => reject(new Error('Network error during upload'));\n xhr.setRequestHeader('Content-Type', item.type || 'application/octet-stream');\n xhr.send(item.file);\n });\n\n // Auto-record to database if enabled\n let completionResult: any = null;\n const canRecordToDb = autoRecordToDb && (projectId || clientOptions?.projectName || clientOptions?.projectId || clientOptions?.apiKey);\n if (canRecordToDb) {\n try {\n completionResult = await client.completeUpload({\n fileKey: presign.fileKey,\n originalName: item.name,\n size: item.size,\n contentType: item.type || 'application/octet-stream',\n projectId,\n url: presign.publicUrl,\n userId,\n });\n } catch (e: any) {\n console.error('Failed to complete upload:', e);\n throw new Error(`Upload verification failed: ${e.message}`);\n }\n }\n\n let thumbs;\n let masterWebp;\n\n // Use thumbnails from completion response if already generated\n if (completionResult?.thumbnails?.length > 0) {\n thumbs = completionResult.thumbnails;\n masterWebp = completionResult.masterWebp;\n } else if (fetchThumbnails) {\n // Generate thumbnails via plugin API after recording to DB\n const fileKeyToUse = completionResult?.file?.key || presign.fileKey;\n try {\n const result = await client.generateThumbnails(fileKeyToUse);\n thumbs = result.thumbnails;\n masterWebp = result.masterWebp;\n } catch (e) {\n console.warn('Failed to generate thumbnails:', e);\n }\n }\n\n // Use final URL/key from completion result (may differ from presign if backend transforms it)\n const finalFileKey = completionResult?.file?.key || presign.fileKey;\n const finalPublicUrl = completionResult?.file?.url || presign.publicUrl;\n\n // Determine per-file thumbnail config from current selection state\n const fileThumbEnabled = showThumbnailUI && thumbEnabledRef.current && thumbFileIdsRef.current.has(item.id);\n\n const result: UploaderFile = {\n ...item,\n status: 'success' as const,\n progress: 100,\n fileKey: finalFileKey,\n publicUrl: finalPublicUrl,\n projectId: presign.projectId,\n apiKeyId: presign.apiKeyId,\n thumbnailEnabled: showThumbnailUI ? fileThumbEnabled : undefined,\n thumbnailSizesSelected: showThumbnailUI ? (fileThumbEnabled ? [...thumbSizesRef.current] : []) : undefined,\n // @ts-ignore - allow downstream to access thumbs if present\n thumbnails: thumbs,\n // @ts-ignore - allow downstream to access masterWebp if present\n masterWebp: masterWebp,\n };\n\n update({ status: 'success', progress: 100, fileKey: finalFileKey, publicUrl: finalPublicUrl });\n onClientUploadComplete?.(result);\n return result;\n } catch (err: any) {\n const message = err instanceof StorageQuotaError\n ? err.message\n : err instanceof Error ? err.message : 'Upload failed';\n update({ status: 'error', error: message });\n throw err;\n }\n }, [client, projectId, userId, folderPath, fetchThumbnails, autoRecordToDb, recordUrl, clientOptions, onUploadBegin, onUploadProgress, onClientUploadComplete, showThumbnailUI]);\n\n const uploadAll = useCallback(async () => {\n const targets = files.filter((f) => f.status === 'pending');\n if (!targets.length) return;\n setQuotaError(null);\n setIsUploading(true);\n try {\n // Pre-check storage quota before uploading\n try {\n const quota = await client.getQuota();\n if (quota.limitBytes > 0) {\n const totalPendingSize = targets.reduce((sum, f) => sum + f.size, 0);\n const remaining = quota.limitBytes - quota.usedBytes;\n if (totalPendingSize > remaining) {\n const fmt = (n: number) => {\n if (n >= 1024 * 1024 * 1024) return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n if (n >= 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(2)} MB`;\n if (n >= 1024) return `${(n / 1024).toFixed(2)} KB`;\n return `${n} B`;\n };\n const errMsg = `Storage quota exceeded. Remaining: ${fmt(remaining)}, Upload size: ${fmt(totalPendingSize)}`;\n setQuotaError(errMsg);\n targets.forEach((t) => {\n setFiles((prev) => prev.map((f) => f.id === t.id ? { ...f, status: 'error', error: errMsg } : f));\n });\n onError?.(new StorageQuotaError(errMsg, {\n limit: quota.limitBytes,\n used: quota.usedBytes,\n remaining,\n fileSize: totalPendingSize,\n }));\n return;\n }\n }\n } catch (e) {\n if (e instanceof StorageQuotaError) {\n setQuotaError(e.message);\n targets.forEach((t) => {\n setFiles((prev) => prev.map((f) => f.id === t.id ? { ...f, status: 'error', error: e.message } : f));\n });\n onError?.(e);\n return;\n }\n }\n\n const results: UploaderFile[] = [];\n for (const f of targets) {\n try {\n const done = await uploadOne(f);\n results.push(done);\n } catch (e) {\n if (e instanceof StorageQuotaError) {\n setQuotaError(e.message);\n setFiles((prev) => prev.map((file) =>\n file.status === 'pending' ? { ...file, status: 'error', error: e.message } : file\n ));\n break;\n }\n }\n }\n onComplete?.(results.filter((f) => f.status === 'success'));\n } catch (e) {\n onError?.(e as Error);\n } finally {\n setIsUploading(false);\n }\n }, [files, client, onComplete, onError, uploadOne]);\n\n // Auto-upload when autoUpload is enabled and pending files are detected\n React.useEffect(() => {\n if (autoUpload && files.some((f) => f.status === 'pending') && !isUploading) {\n const timer = setTimeout(() => {\n uploadAll();\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [autoUpload, files, isUploading, uploadAll]);\n\n return (\n <div className={className}>\n <input\n ref={inputRef}\n type=\"file\"\n style={{ display: 'none' }}\n multiple={multiple}\n accept={accept.join(',')}\n onChange={onInputChange}\n />\n\n {/* Drop Zone */}\n <div\n className={`${dropzoneClassName} border-2 border-dashed rounded-xl transition-all duration-200 cursor-pointer p-10 flex flex-col items-center justify-center gap-4 ${isDragOver\n ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/20'\n : 'border-gray-200 dark:border-gray-800 hover:border-gray-300 dark:hover:border-gray-700 bg-gray-50/50 dark:bg-gray-900/50'\n }`}\n onDragOver={(e) => { e.preventDefault(); e.stopPropagation(); setIsDragOver(true); }}\n onDragLeave={(e) => { e.preventDefault(); e.stopPropagation(); setIsDragOver(false); }}\n onDrop={handleDrop}\n onClick={() => inputRef.current?.click()}\n role=\"button\"\n aria-label=\"Upload files\"\n >\n <div className=\"w-16 h-16 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center text-blue-600 dark:text-blue-400\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </div>\n {children ?? (\n <div className=\"text-center\">\n <div className=\"text-lg font-semibold text-gray-900 dark:text-gray-100\">Drop files here or click to browse</div>\n <div className=\"text-sm text-gray-500 dark:text-gray-400 mt-1\">\n {!multiple ? 'Single file' : maxFiles > 0 ? `Up to ${maxFiles} files` : 'Multiple files'}\n {maxFileSize > 0 ? ` • Max ${(maxFileSize / (1024 * 1024)).toFixed(0)}MB per file` : ''}\n </div>\n </div>\n )}\n </div>\n\n {/* Quota Error */}\n {quotaError && (\n <div className=\"mt-4 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-xl\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex-shrink-0 w-8 h-8 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-red-600 dark:text-red-400\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium text-red-800 dark:text-red-300\">{quotaError}</p>\n </div>\n <button\n onClick={() => setQuotaError(null)}\n className=\"text-red-400 hover:text-red-600 dark:hover:text-red-300 transition-colors\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {/* Files Section */}\n {files.length > 0 && (\n <div className=\"mt-8 space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-100 dark:border-gray-800 pb-4\">\n <h4 className=\"font-semibold text-gray-900 dark:text-gray-100\">Selected Files</h4>\n <div className=\"flex gap-3\">\n <button\n className=\"px-4 py-2 bg-blue-600 text-white text-sm font-semibold rounded-lg hover:bg-blue-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors shadow-sm\"\n disabled={isUploading || files.every((f) => f.status !== 'pending')}\n onClick={uploadAll}\n >\n {isUploading ? (\n <span className=\"flex items-center gap-2\">\n <svg className=\"animate-spin h-4 w-4 text-white\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n Uploading...\n </span>\n ) : 'Upload All'}\n </button>\n <button\n className=\"px-4 py-2 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 text-sm font-semibold rounded-lg hover:bg-gray-200 dark:hover:bg-gray-700 disabled:opacity-50 transition-colors\"\n disabled={isUploading}\n onClick={() => {\n setFiles([]);\n if (showThumbnailUI) {\n const empty = new Set<string>();\n thumbFileIdsRef.current = empty;\n setThumbFileIds(empty);\n }\n }}\n >\n Clear\n </button>\n </div>\n </div>\n\n {/* Thumbnail Panel — shown when prop provided and image files are pending */}\n {showThumbnailUI && pendingImages.length > 0 && (\n <div className=\"bg-purple-50 dark:bg-purple-900/10 border border-purple-200 dark:border-purple-800/50 rounded-xl p-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <p className=\"text-sm font-semibold text-gray-900 dark:text-gray-100 flex items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-purple-500\">\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\" />\n <polyline points=\"2 17 12 22 22 17\" />\n <polyline points=\"2 12 12 17 22 12\" />\n </svg>\n Generate Thumbnails\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-0.5\">\n {thumbEnabled\n ? <>\n {thumbSelectedCount} of {pendingImages.length} image{pendingImages.length !== 1 ? 's' : ''} selected\n {' · '}\n <button onClick={selectAllThumbs} className=\"text-purple-600 hover:text-purple-700 dark:text-purple-400 dark:hover:text-purple-300\">\n Select all\n </button>\n {' · '}\n <button onClick={deselectAllThumbs} className=\"text-gray-500 hover:text-gray-600 dark:text-gray-400 dark:hover:text-gray-300\">\n Deselect all\n </button>\n </>\n : 'Disabled for all images'}\n </p>\n </div>\n {/* Toggle */}\n <button\n type=\"button\"\n onClick={handleThumbEnabledToggle}\n className={`relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors focus:outline-none ${thumbEnabled ? 'bg-blue-600' : 'bg-gray-200 dark:bg-gray-700'}`}\n role=\"switch\"\n aria-checked={thumbEnabled}\n >\n <span className={`pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition ${thumbEnabled ? 'translate-x-5' : 'translate-x-0'}`} />\n </button>\n </div>\n\n {thumbEnabled && (\n <div>\n <p className=\"text-xs font-medium text-gray-600 dark:text-gray-400 mb-2\">Sizes:</p>\n <div className=\"flex gap-2 flex-wrap\">\n {THUMBNAIL_SIZE_OPTIONS.map((size) => {\n const active = thumbSizes.includes(size);\n return (\n <button\n key={size}\n type=\"button\"\n onClick={() => toggleThumbSize(size)}\n className={`px-3 py-1 rounded-full text-xs font-medium border transition-colors ${\n active\n ? 'bg-purple-600 border-purple-600 text-white'\n : 'bg-white dark:bg-gray-800 border-gray-300 dark:border-gray-600 text-gray-600 dark:text-gray-400 hover:border-purple-400 hover:text-purple-600'\n }`}\n >\n {size}px\n </button>\n );\n })}\n </div>\n {thumbSizes.length === 0 && (\n <p className=\"text-xs text-amber-600 dark:text-amber-400 mt-2\">Select at least one size.</p>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* File List */}\n <div className=\"grid gap-3\">\n {files.map((f) => (\n <div key={f.id} className=\"group relative bg-white dark:bg-gray-900 border border-gray-100 dark:border-gray-800 rounded-xl p-4 transition-all hover:shadow-md\">\n <div className=\"flex items-center gap-4\">\n <div className=\"w-10 h-10 rounded-lg bg-gray-50 dark:bg-gray-800 flex items-center justify-center flex-shrink-0\">\n {f.type.startsWith('image/') ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-indigo-500\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-blue-500\">\n <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between mb-1\">\n <div className=\"text-sm font-medium text-gray-900 dark:text-gray-100 truncate pr-4\">{f.name}</div>\n <div className=\"text-xs text-gray-500 font-medium whitespace-nowrap\">{(f.size / (1024 * 1024)).toFixed(2)} MB</div>\n </div>\n {f.status === 'error' ? (\n <div className=\"text-xs text-red-500 font-medium mt-1\">{f.error}</div>\n ) : (\n <div className=\"h-1.5 w-full bg-gray-100 dark:bg-gray-800 rounded-full overflow-hidden mt-2\">\n <div\n className={`h-full transition-all duration-300 ${f.status === 'success' ? 'bg-green-500' : 'bg-blue-500'}`}\n style={{ width: `${f.progress}%` }}\n />\n </div>\n )}\n {/* Per-file thumbnail checkbox */}\n {showThumbnailUI && thumbEnabled && f.type.startsWith('image/') && f.status === 'pending' && (\n <label className=\"mt-1.5 inline-flex items-center gap-1.5 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={thumbFileIds.has(f.id)}\n onChange={() => toggleFileThumb(f.id)}\n className=\"w-3.5 h-3.5 rounded accent-purple-600 cursor-pointer\"\n />\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">Generate thumbnail</span>\n </label>\n )}\n </div>\n <div className=\"flex-shrink-0 ml-4\">\n {f.status === 'success' && (\n <div className=\"flex items-center gap-2\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </span>\n {f.publicUrl && (\n <a\n href={f.publicUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"p-1.5 text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-md transition-colors\"\n title=\"View online\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n </a>\n )}\n </div>\n )}\n {f.status === 'error' && (\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </span>\n )}\n {f.status === 'uploading' && (\n <span className=\"text-xs font-semibold text-blue-600 dark:text-blue-400\">{f.progress}%</span>\n )}\n {f.status === 'pending' && (\n <button\n onClick={(e) => { e.stopPropagation(); removeFile(f.id); }}\n className=\"p-1.5 text-gray-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-md transition-colors\"\n title=\"Remove\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default Uploader;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { UpfilesClient, UpfilesClientOptions, FileListItem } from './client.js';\n\nexport type ProjectFilesWidgetProps = {\n clientOptions: UpfilesClientOptions; // baseUrl + JWT/projectName, server-side API key proxy, or cookies\n folderPath?: string;\n className?: string;\n listClassName?: string;\n itemClassName?: string;\n onSelect: (file: { name: string; key: string; url: string; size: number; contentType: string }) => void;\n // Optional: automatically save the selected file to your backend\n saveUrl?: string; // if provided, will POST the selected file JSON to this URL\n onSave?: (file: { name: string; key: string; url: string; size: number; contentType: string }) => Promise<void> | void;\n onSaved?: (result?: any) => void; // called after successful save\n onDelete?: (key: string) => Promise<void>;\n deleteUrl?: string; // default: /api/files\n showDelete?: boolean; // show delete button (default: false)\n refreshInterval?: number; // poll for updates (ms), default: 5000 (0 to disable)\n};\n\nexport const ProjectFilesWidget: React.FC<ProjectFilesWidgetProps> = ({\n clientOptions,\n folderPath,\n className,\n listClassName,\n itemClassName,\n onSelect,\n saveUrl,\n onSave,\n onSaved,\n onDelete,\n deleteUrl = '/api/files',\n showDelete = false,\n refreshInterval = 5000,\n}) => {\n const client = useMemo(() => new UpfilesClient(clientOptions ?? {}), [clientOptions]);\n const [files, setFiles] = useState<FileListItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [query, setQuery] = useState('');\n const [savingKey, setSavingKey] = useState<string | null>(null);\n const [deletingKey, setDeletingKey] = useState<string | null>(null);\n\n const lastUpdatedRef = React.useRef<string | null>(null);\n const isFetchingRef = React.useRef(false);\n\n const fetchFiles = React.useCallback(async (isPolling = false) => {\n if (isFetchingRef.current) return;\n isFetchingRef.current = true;\n\n if (!isPolling) setLoading(true);\n setError(null);\n try {\n const { files: newFiles, updatedAt } = await client.getProjectFiles({ folderPath });\n\n // Efficiency check: if polling and data hasn't changed, skip update\n if (isPolling && updatedAt && updatedAt === lastUpdatedRef.current) {\n return;\n }\n\n setFiles(newFiles);\n lastUpdatedRef.current = updatedAt;\n } catch (e: any) {\n if (!isPolling) setError(e?.message || 'Failed to load files');\n } finally {\n if (!isPolling) setLoading(false);\n isFetchingRef.current = false;\n }\n }, [client, folderPath]);\n\n useEffect(() => {\n fetchFiles();\n }, [fetchFiles]);\n\n // Polling effect\n useEffect(() => {\n if (!refreshInterval || refreshInterval <= 0) return;\n\n const timer = setInterval(() => {\n fetchFiles(true);\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [fetchFiles, refreshInterval]);\n\n const visible = files.filter((f) =>\n !query ? true : (f.originalName || '').toLowerCase().includes(query.toLowerCase())\n );\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this file?')) return;\n try {\n setDeletingKey(key);\n if (onDelete) {\n await onDelete(key);\n } else {\n const baseUrl = clientOptions?.baseUrl || '';\n const url = baseUrl ? `${baseUrl}${deleteUrl}` : deleteUrl;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(clientOptions?.headers || {}),\n };\n const token = clientOptions?.getToken?.();\n if (token) {\n headers['authorization'] = `Bearer ${token}`;\n if (clientOptions.projectName) {\n headers['x-project-name'] = clientOptions.projectName;\n } else if (clientOptions.projectId) {\n headers['x-project-id'] = clientOptions.projectId;\n }\n } else if (clientOptions?.apiKey) {\n const keyHeader = clientOptions.apiKeyHeader || 'authorization';\n if (keyHeader === 'authorization') {\n headers['authorization'] = clientOptions.apiKey.startsWith('upf_')\n ? `Bearer ${clientOptions.apiKey}`\n : clientOptions.apiKey;\n } else {\n headers[keyHeader] = clientOptions.apiKey;\n }\n }\n const res = await fetch(url, {\n method: 'DELETE',\n headers,\n credentials: clientOptions?.withCredentials ? 'include' : 'same-origin',\n body: JSON.stringify({ fileKey: key }),\n });\n if (!res.ok) throw new Error('Delete failed');\n }\n setFiles((prev) => prev.filter((f) => f.key !== key));\n } catch (e: any) {\n alert(e?.message || 'Failed to delete');\n } finally {\n setDeletingKey(null);\n }\n };\n\n return (\n <div className={className}>\n <div style={{ display: 'flex', gap: 8, alignItems: 'center', marginBottom: 8 }}>\n <input\n type=\"text\"\n placeholder=\"Search by filename...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n style={{ flex: 1, padding: 8, border: '1px solid #e5e7eb', borderRadius: 6 }}\n />\n <button\n onClick={() => {\n setQuery('');\n fetchFiles();\n }}\n style={{ padding: '8px 12px', border: '1px solid #e5e7eb', borderRadius: 6, background: '#fff' }}\n >\n Refresh\n </button>\n </div>\n\n {loading && <div style={{ fontSize: 12, color: '#666' }}>Loading files…</div>}\n {error && <div style={{ fontSize: 12, color: '#b91c1c' }}>{error}</div>}\n\n {!loading && !error && (\n <ul className={listClassName} style={{ listStyle: 'none', padding: 0, margin: 0, display: 'grid', gap: 8 }}>\n {visible.map((f) => (\n <li\n key={f.key}\n className={itemClassName}\n style={{ border: '1px solid #e5e7eb', borderRadius: 8, padding: 10, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}\n >\n <div style={{ minWidth: 0 }}>\n <div style={{ fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis' }}>{f.originalName}</div>\n <div style={{ fontSize: 12, color: '#666' }}>{(f.size / (1024 * 1024)).toFixed(2)} MB • {f.contentType}</div>\n </div>\n <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>\n <a href={f.url} target=\"_blank\" rel=\"noreferrer\" style={{ fontSize: 12, color: '#2563eb' }}>\n View\n </a>\n <button\n onClick={async () => {\n const selected = { name: f.originalName, key: f.key, url: f.url, size: f.size, contentType: f.contentType };\n onSelect(selected);\n if (typeof onSave === 'function' || !!saveUrl) {\n try {\n setSavingKey(f.key);\n if (typeof onSave === 'function') {\n await onSave(selected);\n onSaved?.();\n }\n if (saveUrl) {\n const res = await fetch(saveUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(selected),\n credentials: 'same-origin',\n });\n const data = await res.json().catch(() => undefined);\n if (!res.ok) throw new Error((data as any)?.error || 'Failed to save');\n onSaved?.(data);\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Save selection failed', e);\n alert((e as any)?.message || 'Failed to save');\n } finally {\n setSavingKey(null);\n }\n }\n }}\n disabled={savingKey === f.key}\n style={{ padding: '6px 10px', background: '#2563eb', color: '#fff', border: '1px solid #1d4ed8', borderRadius: 6, opacity: savingKey === f.key ? 0.7 : 1 }}\n >\n {savingKey === f.key ? 'Saving…' : 'Use'}\n </button>\n {showDelete && (\n <button\n onClick={() => handleDelete(f.key)}\n disabled={deletingKey === f.key}\n style={{ padding: '6px 10px', background: '#dc2626', color: '#fff', border: '1px solid #b91c1c', borderRadius: 6, opacity: deletingKey === f.key ? 0.7 : 1 }}\n >\n {deletingKey === f.key ? 'Deleting…' : 'Delete'}\n </button>\n )}\n </div>\n </li>\n ))}\n {visible.length === 0 && (\n <li style={{ fontSize: 12, color: '#666' }}>No files found</li>\n )}\n </ul>\n )}\n </div>\n );\n};\n\nexport default ProjectFilesWidget;\n","import { UpfilesClient } from './client.js';\r\n\r\nexport type ConnectOptions = {\r\n baseUrl: string; // Main app origin, e.g., https://upfiles.example.com\r\n fetch?: typeof fetch; // override for testing\r\n token?: string; // JWT Bearer token for inhouse auth (alternative to cookies)\r\n};\r\n\r\nexport type Project = {\r\n id: string;\r\n name: string;\r\n createdAt?: string;\r\n};\r\n\r\nconst f = (globalThis.fetch || fetch).bind(globalThis);\r\n\r\nfunction buildInit(opts: ConnectOptions, extra?: RequestInit): RequestInit {\r\n const headers: Record<string, string> = {\r\n ...(extra?.headers as Record<string, string> || {}),\r\n };\r\n\r\n if (opts.token) {\r\n headers['authorization'] = `Bearer ${opts.token}`;\r\n }\r\n\r\n return {\r\n ...extra,\r\n headers,\r\n credentials: opts.token ? 'same-origin' : 'include',\r\n };\r\n}\r\n\r\nasync function httpJson(input: RequestInfo | URL, init?: RequestInit, useFetch?: typeof fetch) {\r\n const doFetch = useFetch ?? f;\r\n const res = await doFetch(input, init);\r\n if (!res.ok) {\r\n let msg = `Request failed (${res.status})`;\r\n try {\r\n const j = await res.json();\r\n msg = j?.error || j?.message || msg;\r\n } catch { }\r\n throw new Error(msg);\r\n }\r\n return res.json();\r\n}\r\n\r\n// Fetch existing projects for the authenticated user (on main app domain)\r\nexport async function listProjects(opts: ConnectOptions): Promise<Project[]> {\r\n const url = `${opts.baseUrl.replace(/\\/$/, '')}/api/projects`;\r\n const data = await httpJson(\r\n url,\r\n buildInit(opts, { method: 'GET' }),\r\n opts.fetch\r\n );\r\n return (data?.projects ?? []) as Project[];\r\n}\r\n\r\nexport async function createProject(opts: ConnectOptions & {\n name: string;\n isInHouse?: boolean;\n freeStorageLimitBytes?: number;\n}) {\n const base = opts.baseUrl.replace(/\\/$/, '');\n const created = await httpJson(\n `${base}/api/projects`,\n buildInit(opts, {\n method: 'POST',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({\r\n name: opts.name,\r\n isInHouse: opts.isInHouse,\r\n freeStorageLimitBytes: opts.freeStorageLimitBytes,\r\n }),\r\n }),\r\n opts.fetch\r\n );\n const projectId = created?.project?.id as string | undefined;\n if (!projectId) throw new Error('Failed to create project');\n return { projectId, project: created?.project as Project | undefined };\n}\n\n// Create a customer/plugin project and immediately create an API key.\n// In-house integrations must not use this helper because it returns a plaintext key.\nexport async function createProjectWithApiKey(opts: ConnectOptions & {\n name: string;\n keyName?: string;\n}) {\n const base = opts.baseUrl.replace(/\\/$/, '');\n const { projectId } = await createProject(opts);\n const keyLabel = opts.keyName || `Plugin key ${new Date().toISOString().slice(0, 10)}`;\n const key = await httpJson(\n `${base}/api/projects/${projectId}/keys`,\n buildInit(opts, {\r\n method: 'POST',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ name: keyLabel }),\r\n }),\r\n opts.fetch\r\n );\r\n const plaintext = (key?.key?.secret ?? key?.key?.plaintext) as string | undefined;\n if (!plaintext) throw new Error('Failed to create API key');\n return { apiKey: plaintext, projectId };\n}\n\r\n// Update a project (e.g., mark as in-house)\r\nexport async function updateProject(opts: ConnectOptions & {\r\n projectId: string;\r\n isInHouse?: boolean;\r\n freeStorageLimitBytes?: number;\r\n}) {\r\n const base = opts.baseUrl.replace(/\\/$/, '');\r\n const body: Record<string, unknown> = {};\r\n if (opts.isInHouse !== undefined) body.isInHouse = opts.isInHouse;\r\n if (opts.freeStorageLimitBytes !== undefined) body.freeStorageLimitBytes = opts.freeStorageLimitBytes;\r\n\r\n await httpJson(\r\n `${base}/api/projects/${opts.projectId}`,\r\n buildInit(opts, {\r\n method: 'PUT',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify(body),\r\n }),\r\n opts.fetch\r\n );\r\n}\r\n\r\n// For an existing project, create a new API key; return plaintext API key\r\nexport async function connectProject(opts: ConnectOptions & { projectId: string; keyName?: string }) {\r\n const base = opts.baseUrl.replace(/\\/$/, '');\r\n const keyLabel = opts.keyName || `Plugin key ${new Date().toISOString().slice(0, 10)}`;\r\n const key = await httpJson(\r\n `${base}/api/projects/${opts.projectId}/keys`,\r\n buildInit(opts, {\r\n method: 'POST',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ name: keyLabel }),\r\n }),\r\n opts.fetch\r\n );\r\n const plaintext = (key?.key?.secret ?? key?.key?.plaintext) as string | undefined;\r\n if (!plaintext) throw new Error('Failed to create API key');\r\n return { apiKey: plaintext };\r\n}\r\n\r\n// Accept a manually entered key (basic validation)\r\nexport function addApiKeyManually(apiKey: string) {\n const k = (apiKey || '').trim();\n if (!k) throw new Error('API key is required');\n if (!/^upf_[A-Za-z0-9_-]+/.test(k)) {\n // Allow flexibility but nudge format\n console.warn('Provided API key does not match expected format upf_*');\n }\n return { apiKey: k };\n}\n\r\n// Optional helper to build a client with the key\r\nexport function createClientWithKey(baseUrl: string, apiKey: string) {\r\n return new UpfilesClient({ baseUrl, apiKey, apiKeyHeader: 'authorization' });\r\n}\r\n\r\n// Create a connection using a provided API key (e.g., from env)\r\nexport function connectUsingApiKey(opts: {\r\n baseUrl: string;\r\n apiKey: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n}) {\r\n const baseUrl = opts.baseUrl.replace(/\\/$/, '');\r\n const apiKey = (opts.apiKey || '').trim();\r\n if (!apiKey) throw new Error('apiKey is required');\r\n const client = new UpfilesClient({ baseUrl, apiKey, apiKeyHeader: opts.apiKeyHeader ?? 'authorization' });\r\n return { apiKey, client };\r\n}\r\n","import * as React from 'react';\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { listProjects, createProjectWithApiKey, connectProject, addApiKeyManually, type Project, type ConnectOptions } from './projectConnect.js';\n\nexport type ConnectProjectDialogProps = {\n baseUrl: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConnected: (apiKey: string, meta: { projectId?: string; source: 'existing' | 'new' | 'manual' }) => void;\n fetchImpl?: typeof fetch;\n title?: string;\n description?: string;\n className?: string; // wrapper for content\n};\n\nexport function ConnectProjectDialog(props: ConnectProjectDialogProps) {\n const { baseUrl, open, onOpenChange, onConnected, fetchImpl, title, description, className } = props;\n\n type Mode = 'existing' | 'manual' | 'new';\n const [mode, setMode] = React.useState<Mode>('existing');\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const [projects, setProjects] = React.useState<Project[]>([]);\n const [selectedProjectId, setSelectedProjectId] = React.useState<string>('');\n\n const [manualKey, setManualKey] = React.useState('');\n\n const [newProjectName, setNewProjectName] = React.useState('');\n\n const resetState = React.useCallback(() => {\n setMode('existing');\n setLoading(false);\n setError(null);\n setProjects([]);\n setSelectedProjectId('');\n setManualKey('');\n setNewProjectName('');\n }, []);\n\n // Load projects when switching to existing mode and dialog is open\n React.useEffect(() => {\n const run = async () => {\n if (!open || mode !== 'existing') return;\n try {\n setLoading(true);\n setError(null);\n const opts: ConnectOptions = { baseUrl, fetch: fetchImpl };\n const list = await listProjects(opts);\n setProjects(list);\n if (list.length && !selectedProjectId) setSelectedProjectId(list[0].id);\n } catch (e: any) {\n setError(e?.message || 'Failed to fetch projects');\n } finally {\n setLoading(false);\n }\n };\n run();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, mode, baseUrl]);\n\n const handleConnectExisting = async () => {\n try {\n setLoading(true);\n setError(null);\n if (!selectedProjectId) throw new Error('Please select a project');\n const { apiKey } = await connectProject({ baseUrl, projectId: selectedProjectId, fetch: fetchImpl });\n onConnected(apiKey, { projectId: selectedProjectId, source: 'existing' });\n onOpenChange(false);\n resetState();\n } catch (e: any) {\n setError(e?.message || 'Failed to connect project');\n } finally {\n setLoading(false);\n }\n };\n\n const handleManual = async () => {\n try {\n setLoading(true);\n setError(null);\n const { apiKey } = addApiKeyManually(manualKey);\n onConnected(apiKey, { source: 'manual' });\n onOpenChange(false);\n resetState();\n } catch (e: any) {\n setError(e?.message || 'Invalid API key');\n } finally {\n setLoading(false);\n }\n };\n\n const handleCreate = async () => {\n try {\n setLoading(true);\n setError(null);\n if (!newProjectName.trim()) throw new Error('Project name is required');\n const { apiKey, projectId } = await createProjectWithApiKey({ baseUrl, name: newProjectName.trim(), fetch: fetchImpl });\n onConnected(apiKey, { projectId, source: 'new' });\n onOpenChange(false);\n resetState();\n } catch (e: any) {\n setError(e?.message || 'Failed to create project');\n } finally {\n setLoading(false);\n }\n };\n\n const ModeSwitcher = (\n <div className=\"grid grid-cols-3 gap-2\">\n <button\n type=\"button\"\n className={`px-3 py-2 rounded border text-sm ${mode === 'existing' ? 'bg-primary text-primary-foreground' : 'bg-background'} `}\n onClick={() => setMode('existing')}\n >\n Connect existing\n </button>\n <button\n type=\"button\"\n className={`px-3 py-2 rounded border text-sm ${mode === 'manual' ? 'bg-primary text-primary-foreground' : 'bg-background'} `}\n onClick={() => setMode('manual')}\n >\n Add API key\n </button>\n <button\n type=\"button\"\n className={`px-3 py-2 rounded border text-sm ${mode === 'new' ? 'bg-primary text-primary-foreground' : 'bg-background'} `}\n onClick={() => setMode('new')}\n >\n Create new\n </button>\n </div>\n );\n\n return (\n <Dialog.Root open={open} onOpenChange={(o) => { if (!o) resetState(); onOpenChange(o); }}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 bg-black/40\" />\n <Dialog.Content className={`fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[95vw] max-w-md rounded-lg border bg-white p-4 shadow-lg ${className ?? ''}`}>\n <div className=\"space-y-3\">\n <Dialog.Title className=\"text-lg font-semibold\">\n {title ?? 'Connect to Upfiles'}\n </Dialog.Title>\n <Dialog.Description className=\"text-sm text-muted-foreground\">\n {description ?? 'Choose how to connect your project to retrieve an API key.'}\n </Dialog.Description>\n\n {ModeSwitcher}\n\n {error && (\n <div className=\"rounded border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700\">{error}</div>\n )}\n\n {/* Existing project */}\n {mode === 'existing' && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Project</label>\n <select\n className=\"w-full rounded border px-3 py-2 text-sm\"\n value={selectedProjectId}\n onChange={(e) => setSelectedProjectId(e.target.value)}\n disabled={loading}\n >\n {projects.length === 0 && <option value=\"\">{loading ? 'Loading...' : 'No projects found'}</option>}\n {projects.map((p) => (\n <option key={p.id} value={p.id}>{p.name}</option>\n ))}\n </select>\n <div className=\"flex justify-end gap-2 pt-2\">\n <Dialog.Close asChild>\n <button type=\"button\" className=\"px-3 py-2 text-sm rounded border\">Cancel</button>\n </Dialog.Close>\n <button\n type=\"button\"\n className=\"px-3 py-2 text-sm rounded bg-blue-600 text-white disabled:opacity-60\"\n onClick={handleConnectExisting}\n disabled={loading || !selectedProjectId}\n >\n {loading ? 'Connecting…' : 'Connect'}\n </button>\n </div>\n </div>\n )}\n\n {/* Manual key */}\n {mode === 'manual' && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">API key</label>\n <input\n className=\"w-full rounded border px-3 py-2 text-sm\"\n placeholder=\"upk_...\"\n value={manualKey}\n onChange={(e) => setManualKey(e.target.value)}\n disabled={loading}\n />\n <div className=\"flex justify-end gap-2 pt-2\">\n <Dialog.Close asChild>\n <button type=\"button\" className=\"px-3 py-2 text-sm rounded border\">Cancel</button>\n </Dialog.Close>\n <button\n type=\"button\"\n className=\"px-3 py-2 text-sm rounded bg-blue-600 text-white disabled:opacity-60\"\n onClick={handleManual}\n disabled={loading || !manualKey.trim()}\n >\n {loading ? 'Adding…' : 'Add key'}\n </button>\n </div>\n </div>\n )}\n\n {/* Create new */}\n {mode === 'new' && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Project name</label>\n <input\n className=\"w-full rounded border px-3 py-2 text-sm\"\n placeholder=\"My project\"\n value={newProjectName}\n onChange={(e) => setNewProjectName(e.target.value)}\n disabled={loading}\n />\n <p className=\"text-xs text-muted-foreground\">A project will be created in your Upfiles account and an API key generated.</p>\n <div className=\"flex justify-end gap-2 pt-2\">\n <Dialog.Close asChild>\n <button type=\"button\" className=\"px-3 py-2 text-sm rounded border\">Cancel</button>\n </Dialog.Close>\n <button\n type=\"button\"\n className=\"px-3 py-2 text-sm rounded bg-blue-600 text-white disabled:opacity-60\"\n onClick={handleCreate}\n disabled={loading || !newProjectName.trim()}\n >\n {loading ? 'Creating…' : 'Create & connect'}\n </button>\n </div>\n </div>\n )}\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n\nexport default ConnectProjectDialog;\n","import { UpfilesClient, UpfilesClientOptions, FileListItem, Thumbnail } from './client.js';\r\n\r\nexport async function fetchProjectFiles(clientOptions: UpfilesClientOptions, folderPath?: string): Promise<{ files: FileListItem[]; updatedAt: string | null }> {\r\n const client = new UpfilesClient(clientOptions);\r\n return client.getProjectFiles({ folderPath });\r\n}\r\n\r\nexport async function fetchFileThumbnails(clientOptions: UpfilesClientOptions, fileKey: string): Promise<Thumbnail[]> {\r\n const client = new UpfilesClient(clientOptions);\r\n return client.getThumbnails(fileKey);\r\n}\r\n\r\nexport type ImageWithThumbs = FileListItem & { thumbnails?: Thumbnail[] };\r\n\r\nexport async function fetchProjectImagesWithThumbs(\r\n clientOptions: UpfilesClientOptions,\r\n opts?: { folderPath?: string; limitConcurrent?: number }\r\n): Promise<{ items: ImageWithThumbs[]; updatedAt: string | null }> {\r\n const { files, updatedAt } = await fetchProjectFiles(clientOptions, opts?.folderPath);\r\n const limit = Math.max(1, Math.min(opts?.limitConcurrent ?? 6, 12));\r\n\r\n const queue = [...files];\r\n const results: ImageWithThumbs[] = [];\r\n const processed = new Set<string>();\r\n\r\n async function worker() {\r\n while (queue.length) {\r\n const f = queue.shift();\r\n if (!f || processed.has(f.key)) continue;\r\n\r\n processed.add(f.key);\r\n try {\r\n const thumbs = await fetchFileThumbnails(clientOptions, f.key).catch(() => undefined);\r\n results.push({ ...f, thumbnails: thumbs });\r\n } catch {\r\n results.push({ ...f });\r\n }\r\n }\r\n }\r\n\r\n const workers = Math.min(limit, files.length || 1);\r\n await Promise.all(Array.from({ length: workers }, () => worker()));\r\n\r\n // Sort results to maintain original order\r\n const keyToIndex = new Map(files.map((f, i) => [f.key, i]));\r\n results.sort((a, b) => (keyToIndex.get(a.key) ?? 0) - (keyToIndex.get(b.key) ?? 0));\r\n\r\n return { items: results, updatedAt };\r\n}\r\n","'use client';\r\n\r\nimport * as React from 'react';\r\nimport * as Dialog from '@radix-ui/react-dialog';\r\nimport { UpfilesClientOptions, UpfilesClient, Thumbnail, Folder } from './client.js';\r\nimport { Uploader, UploaderFile } from './Uploader.js';\r\nimport { fetchProjectFiles, ImageWithThumbs } from './files.js';\r\n\r\n// --- Icons (Lucide Style) ---\r\n\r\nconst IconGrid = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\" />\r\n <rect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\" />\r\n <rect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\" />\r\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\" />\r\n </svg>\r\n);\r\n\r\nconst IconList = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n);\r\n\r\nconst IconUploadCloud = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" />\r\n <path d=\"M12 12v9\" />\r\n <path d=\"m16 16-4-4-4 4\" />\r\n </svg>\r\n);\r\n\r\nconst IconFolder = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"0\" className={className}>\r\n <path d=\"M19.5 21a3 3 0 0 0 3-3v-4.5a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3V18a3 3 0 0 0 3 3h15ZM1.5 10.146V6a3 3 0 0 1 3-3h5.379a2.25 2.25 0 0 1 1.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 0 1 3 3v1.146A4.483 4.483 0 0 0 19.5 9h-15a4.483 4.483 0 0 0-3 1.146Z\" />\r\n </svg>\r\n);\r\n\r\nconst IconFolderPlus = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 2H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2Z\" />\r\n <line x1=\"12\" x2=\"12\" y1=\"10\" y2=\"16\" />\r\n <line x1=\"9\" x2=\"15\" y1=\"13\" y2=\"13\" />\r\n </svg>\r\n);\r\n\r\nconst IconSearch = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\r\n <path d=\"m21 21-4.3-4.3\" />\r\n </svg>\r\n);\r\n\r\nconst IconRefresh = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\r\n <path d=\"M8 16H3v5\" />\r\n </svg>\r\n);\r\n\r\nconst IconChevronRight = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </svg>\r\n);\r\n\r\nconst IconTrash = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M3 6h18\" />\r\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\r\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\r\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\r\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\r\n </svg>\r\n);\r\n\r\nconst IconX = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M18 6 6 18\" />\r\n <path d=\"m6 6 12 12\" />\r\n </svg>\r\n);\r\n\r\nconst IconHome = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\r\n <polyline points=\"9 22 9 12 15 12 15 22\" />\r\n </svg>\r\n);\r\n\r\nconst IconImage = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\r\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\r\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\r\n </svg>\r\n);\r\n\r\nconst IconLoader = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\r\n </svg>\r\n);\r\n\r\nconst IconLayers = ({ className }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\" />\r\n <polyline points=\"2 17 12 22 22 17\" />\r\n <polyline points=\"2 12 12 17 22 12\" />\r\n </svg>\r\n);\r\n\r\n// --- Component ---\r\n\r\nconst VisuallyHidden = ({ children }: { children: React.ReactNode }) => (\r\n <span\r\n style={{\r\n position: 'absolute',\r\n width: '1px',\r\n height: '1px',\r\n padding: '0',\r\n margin: '-1px',\r\n overflow: 'hidden',\r\n clip: 'rect(0, 0, 0, 0)',\r\n whiteSpace: 'nowrap',\r\n border: '0',\r\n }}\r\n >\r\n {children}\r\n </span>\r\n);\r\n\r\nexport type ThumbnailConfig = {\r\n /** Whether thumbnail generation is enabled (default: true) */\r\n enabled?: boolean;\r\n /** Pixel sizes to generate. Supported: 64, 128, 256, 512. Default: [256, 512] */\r\n sizes?: number[];\r\n};\r\n\r\nexport type ImageManagerProps = {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n clientOptions: UpfilesClientOptions;\r\n projectId?: string;\r\n folderPath?: string;\r\n userId?: string; // User ID for file ownership tracking\r\n title?: string;\r\n description?: string;\r\n className?: string; // Content class\r\n gridClassName?: string;\r\n onSelect: (image: {\r\n url: string;\r\n key: string;\r\n originalName: string;\r\n size: number;\r\n contentType: string;\r\n thumbnails?: { id: string; key: string; url: string; size: number; sizeType?: string }[];\r\n selectedThumbnail?: { id: string; key: string; url: string; size: number; sizeType?: string };\r\n }) => void;\r\n onDelete?: (key: string) => Promise<void>;\r\n deleteUrl?: string;\r\n autoRecordToDb?: boolean;\r\n fetchThumbnails?: boolean;\r\n maxFileSize?: number;\r\n maxFiles?: number;\r\n mode?: 'full' | 'browse' | 'upload';\r\n showDelete?: boolean;\r\n refreshInterval?: number;\r\n stayOnUploadAfterComplete?: boolean;\r\n /** Thumbnail generation config. Users can override per-upload in the upload panel. */\r\n thumbnailConfig?: ThumbnailConfig;\r\n};\r\n\r\nexport function ImageManager(props: ImageManagerProps) {\r\n const {\r\n open,\r\n onOpenChange,\r\n clientOptions,\r\n projectId,\r\n folderPath,\r\n userId,\r\n title,\r\n description,\r\n className,\r\n gridClassName,\r\n onSelect,\r\n onDelete,\r\n deleteUrl = '/api/files',\r\n autoRecordToDb = true,\r\n fetchThumbnails = true,\r\n maxFileSize = 100 * 1024 * 1024,\r\n maxFiles = 10,\r\n mode = 'full',\r\n showDelete = true,\r\n refreshInterval = 5000,\r\n stayOnUploadAfterComplete = false,\r\n thumbnailConfig,\r\n } = props;\r\n\r\n const [activeView, setActiveView] = React.useState<'browse' | 'upload'>(mode === 'upload' ? 'upload' : 'browse');\r\n const [loading, setLoading] = React.useState(false);\r\n const [error, setError] = React.useState<string | null>(null);\r\n\r\n // Folder state\r\n const [currentFolderId, setCurrentFolderId] = React.useState<string | undefined>(undefined);\r\n const [breadcrumbs, setBreadcrumbs] = React.useState<{ id: string | undefined, name: string }[]>([{ id: undefined, name: 'Home' }]);\r\n\r\n const [files, setFiles] = React.useState<ImageWithThumbs[]>([]);\r\n const [folders, setFolders] = React.useState<Folder[]>([]);\r\n\r\n const [query, setQuery] = React.useState('');\r\n const [deleting, setDeleting] = React.useState<string | null>(null);\r\n\r\n const [showCreateFolder, setShowCreateFolder] = React.useState(false);\r\n const [newFolderName, setNewFolderName] = React.useState('');\r\n const [creatingFolder, setCreatingFolder] = React.useState(false);\r\n\r\n // Delete & Thumbnail Dialogs\r\n const [fileToDelete, setFileToDelete] = React.useState<ImageWithThumbs | null>(null);\r\n const [thumbnailSelectorFile, setThumbnailSelectorFile] = React.useState<ImageWithThumbs | null>(null);\r\n const [selectedThumbnailForFile, setSelectedThumbnailForFile] = React.useState<{ id: string; key: string; url: string; size: number; sizeType?: string } | null>(null);\r\n\r\n // Image Preview Dialog\r\n const [previewFile, setPreviewFile] = React.useState<ImageWithThumbs | null>(null);\r\n\r\n // Thumbnail generation loading state\r\n const [generatingThumbnails, setGeneratingThumbnails] = React.useState(false);\r\n\r\n const lastUpdatedRef = React.useRef<string | null>(null);\r\n const isFetchingRef = React.useRef(false);\r\n\r\n // Helper function to deduplicate files by key\r\n const deduplicateFiles = React.useCallback((files: ImageWithThumbs[]): ImageWithThumbs[] => {\r\n const seen = new Set<string>();\r\n return files.filter(file => {\r\n if (seen.has(file.key)) {\r\n return false;\r\n }\r\n seen.add(file.key);\r\n return true;\r\n });\r\n }, []);\r\n\r\n const load = React.useCallback(async (isPolling = false) => {\r\n if (isFetchingRef.current) return;\r\n isFetchingRef.current = true;\r\n\r\n try {\r\n if (!isPolling) setLoading(true);\r\n setError(null);\r\n\r\n const client = new UpfilesClient(clientOptions);\r\n\r\n // Determine folder path prefix\r\n const currentPathPrefix = breadcrumbs.length > 1\r\n ? breadcrumbs.slice(1).map(b => b.name).join('/') + '/'\r\n : undefined;\r\n const effectiveFolderPath = currentPathPrefix || folderPath;\r\n\r\n const [filesData, foldersData] = await Promise.all([\r\n fetchProjectFiles(clientOptions, effectiveFolderPath),\r\n client.getFolders(currentFolderId)\r\n ]);\r\n\r\n const { files: rawFiles, updatedAt } = filesData;\r\n // Show files immediately without fetching thumbnails per-file (N+1 problem)\r\n // Thumbnails are loaded on-demand when user clicks the thumbnail icon\r\n const list: ImageWithThumbs[] = rawFiles;\r\n\r\n if (isPolling && updatedAt && updatedAt === lastUpdatedRef.current) {\r\n // Optimization: if not polling or changed, we continue\r\n }\r\n\r\n setFiles(deduplicateFiles(list));\r\n setFolders(foldersData);\r\n lastUpdatedRef.current = updatedAt;\r\n } catch (e: any) {\r\n if (!isPolling) setError(e?.message || 'Failed to load images');\r\n } finally {\r\n if (!isPolling) setLoading(false);\r\n isFetchingRef.current = false;\r\n }\r\n }, [clientOptions, folderPath, currentFolderId, breadcrumbs]);\r\n\r\n React.useEffect(() => {\r\n if (!open) {\r\n setFiles([]);\r\n setFolders([]);\r\n setQuery('');\r\n setError(null);\r\n lastUpdatedRef.current = null;\r\n return;\r\n }\r\n if (mode !== 'upload' && activeView === 'browse') {\r\n load();\r\n }\r\n }, [open, activeView, load, mode]);\r\n\r\n // Real-time updates via SSE - DISABLED: Backend now uses Socket.IO\r\n // TODO: Implement Socket.IO client for real-time updates\r\n /*\r\n React.useEffect(() => {\r\n if (!open) return;\r\n const client = new UpfilesClient(clientOptions);\r\n const url = client.getEventsUrl(projectId);\r\n const eventSource = new EventSource(url);\r\n\r\n eventSource.onmessage = (event) => {\r\n try {\r\n const payload = JSON.parse(event.data);\r\n if (payload.type === 'file:uploaded') {\r\n const newFile = payload.data.file;\r\n setFiles((prev) => {\r\n // Check for duplicates before adding\r\n if (prev.find(f => f.key === newFile.key)) return prev;\r\n return deduplicateFiles([newFile, ...prev]);\r\n });\r\n } else if (payload.type === 'file:deleted') {\r\n const deletedKey = payload.data.fileKey || payload.data.file?.key;\r\n setFiles((prev) => prev.filter((f) => f.key !== deletedKey));\r\n }\r\n } catch (e) {\r\n console.error('SSE Error parsing message', e);\r\n }\r\n };\r\n return () => eventSource.close();\r\n }, [open, clientOptions, projectId]);\r\n */\r\n\r\n const visibleFiles = React.useMemo(() => {\r\n const q = query.trim().toLowerCase();\r\n return !q ? files : files.filter((i) => (i.originalName || '').toLowerCase().includes(q));\r\n }, [files, query]);\r\n\r\n const visibleFolders = React.useMemo(() => {\r\n const q = query.trim().toLowerCase();\r\n return !q ? folders : folders.filter((f) => (f.name || '').toLowerCase().includes(q));\r\n }, [folders, query]);\r\n\r\n const handleDelete = async () => {\r\n if (!fileToDelete) return;\r\n const key = fileToDelete.key;\r\n try {\r\n setDeleting(key);\r\n if (onDelete) {\r\n await onDelete(key);\r\n } else {\r\n const client = new UpfilesClient(clientOptions);\r\n const baseUrl = clientOptions?.baseUrl || '';\r\n const url = baseUrl ? `${baseUrl}${deleteUrl}` : deleteUrl;\r\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(clientOptions?.headers || {}),\n };\n const token = clientOptions?.getToken?.();\n if (token) {\n headers['authorization'] = `Bearer ${token}`;\n if (clientOptions.projectName) {\n headers['x-project-name'] = clientOptions.projectName;\n } else if (clientOptions.projectId) {\n headers['x-project-id'] = clientOptions.projectId;\n }\n } else if (clientOptions?.apiKey) {\n const keyHeader = clientOptions.apiKeyHeader || 'authorization';\n if (keyHeader === 'authorization') {\n headers['authorization'] = clientOptions.apiKey.startsWith('upf_')\n ? `Bearer ${clientOptions.apiKey}`\n : clientOptions.apiKey;\n } else {\n headers[keyHeader] = clientOptions.apiKey;\r\n }\r\n }\r\n const res = await fetch(url, {\r\n method: 'DELETE',\r\n headers,\r\n credentials: clientOptions?.withCredentials ? 'include' : 'same-origin',\r\n body: JSON.stringify({ fileKey: key }),\r\n });\r\n if (!res.ok) throw new Error('Delete failed');\r\n }\r\n setFiles((prev) => prev.filter((f) => f.key !== key));\r\n setFileToDelete(null);\r\n } catch (e: any) {\r\n alert(e?.message || 'Failed to delete');\r\n } finally {\r\n setDeleting(null);\r\n }\r\n };\r\n\r\n const handleCreateFolder = async () => {\r\n if (!newFolderName.trim()) return;\r\n setCreatingFolder(true);\r\n try {\r\n const client = new UpfilesClient(clientOptions);\r\n await client.createFolder(newFolderName, currentFolderId);\r\n setNewFolderName('');\r\n setShowCreateFolder(false);\r\n load();\r\n } catch (e: any) {\r\n alert(e.message || 'Failed to create folder');\r\n } finally {\r\n setCreatingFolder(false);\r\n }\r\n };\r\n\r\n const handleNavigate = (folder: Folder) => {\r\n setCurrentFolderId(folder.id);\r\n setBreadcrumbs(prev => [...prev, { id: folder.id, name: folder.name }]);\r\n setQuery('');\r\n };\r\n\r\n const handleBreadcrumbClick = (index: number) => {\r\n const target = breadcrumbs[index];\r\n setBreadcrumbs(breadcrumbs.slice(0, index + 1));\r\n setCurrentFolderId(target.id);\r\n setQuery('');\r\n };\r\n\r\n const uploadFoldersList = React.useMemo(() => {\r\n const options = [];\r\n options.push({ id: 'root', name: 'Root ( / )', path: undefined });\r\n if (currentFolderId) {\r\n const currentPath = breadcrumbs.slice(1).map(b => b.name).join('/') + '/';\r\n options.push({ id: 'current', name: `Current ( ${breadcrumbs[breadcrumbs.length - 1].name} )`, path: currentPath });\r\n }\r\n folders.forEach(f => {\r\n const parentPath = breadcrumbs.length > 1 ? breadcrumbs.slice(1).map(b => b.name).join('/') + '/' : '';\r\n options.push({ id: f.id, name: f.name, path: parentPath + f.name + '/' });\r\n });\r\n return options;\r\n }, [breadcrumbs, currentFolderId, folders]);\r\n\r\n const handleThumbnailClick = React.useCallback(async (f: ImageWithThumbs) => {\r\n // If thumbnails already exist, open selector directly\r\n if (f.thumbnails && f.thumbnails.length > 0) {\r\n setThumbnailSelectorFile(f);\r\n setSelectedThumbnailForFile(null);\r\n return;\r\n }\r\n\r\n // Generate thumbnails on-the-fly\r\n setGeneratingThumbnails(true);\r\n setThumbnailSelectorFile(f);\r\n setSelectedThumbnailForFile(null);\r\n try {\r\n const client = new UpfilesClient(clientOptions);\r\n const result = await client.generateThumbnails(f.key);\r\n const updatedFile = { ...f, thumbnails: result.thumbnails };\r\n setThumbnailSelectorFile(updatedFile);\r\n // Update the file in the files list so thumbnails persist\r\n setFiles((prev) => prev.map((file) => file.key === f.key ? updatedFile : file));\r\n } catch (e: any) {\r\n console.error('Failed to generate thumbnails:', e);\r\n // Still show the selector with original-only option\r\n } finally {\r\n setGeneratingThumbnails(false);\r\n }\r\n }, [clientOptions]);\r\n\r\n const [selectedUploadFolder, setSelectedUploadFolder] = React.useState<string>('current');\r\n const activeBreadcrumbPath = React.useMemo(() => {\r\n return breadcrumbs.length > 1 ? breadcrumbs.slice(1).map(b => b.name).join('/') + '/' : undefined;\r\n }, [breadcrumbs]);\r\n\r\n return (\r\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/60 z-[9999]\" />\r\n <Dialog.Content\r\n className={`fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[95vw] h-[90vh] max-w-7xl min-w-[800px] min-h-[600px] rounded-2xl bg-white dark:bg-gray-950 shadow-2xl z-[10000] overflow-hidden flex flex-row ${className ?? ''}`}\r\n >\r\n <VisuallyHidden>\r\n <Dialog.Title>{title ?? 'Media Library'}</Dialog.Title>\r\n </VisuallyHidden>\r\n {/* SIDEBAR */}\r\n <div className=\"w-64 min-w-[256px] bg-gray-50 dark:bg-gray-900 border-r border-gray-200 dark:border-gray-800 flex flex-col flex-shrink-0\">\r\n <div className=\"p-6\">\r\n <h2 className=\"text-lg font-bold text-gray-900 dark:text-white flex items-center gap-2\">\r\n <IconImage className=\"text-blue-600\" />\r\n {title ?? 'Media Library'}\r\n </h2>\r\n <p className=\"text-xs text-gray-500 mt-1\">{description ?? 'Manage your assets'}</p>\r\n </div>\r\n\r\n <nav className=\"flex-1 px-3 space-y-1\">\r\n <button\r\n onClick={() => setActiveView('browse')}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-lg transition-colors ${activeView === 'browse' ? 'bg-white dark:bg-gray-800 text-blue-600 dark:text-blue-400 shadow-sm' : 'text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800'}`}\r\n >\r\n <IconGrid className=\"w-4 h-4\" />\r\n All Files\r\n </button>\r\n {mode === 'full' && (\r\n <button\r\n onClick={() => setActiveView('upload')}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-lg transition-colors ${activeView === 'upload' ? 'bg-white dark:bg-gray-800 text-blue-600 dark:text-blue-400 shadow-sm' : 'text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800'}`}\r\n >\r\n <IconUploadCloud className=\"w-4 h-4\" />\r\n Upload New\r\n </button>\r\n )}\r\n </nav>\r\n\r\n <div className=\"p-4 border-t border-gray-200 dark:border-gray-800\">\r\n <div className=\"text-xs text-center text-gray-400\">\r\n {files.length} files • {folders.length} folders\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* MAIN CONTENT */}\r\n <div className=\"flex-1 flex flex-col bg-white dark:bg-gray-950 relative\">\r\n {/* Toolbar */}\r\n <div className=\"h-16 border-b border-gray-100 dark:border-gray-800 flex items-center justify-between px-6 gap-4\">\r\n <div className=\"flex items-center gap-4 flex-1\">\r\n {activeView === 'browse' && (\r\n <>\r\n {/* Breadcrumbs */}\r\n <div className=\"flex items-center text-sm text-gray-500 overflow-hidden whitespace-nowrap\">\r\n <button onClick={() => handleBreadcrumbClick(0)} className=\"hover:text-blue-600 transition-colors\">\r\n <IconHome className=\"w-4 h-4\" />\r\n </button>\r\n {breadcrumbs.slice(1).map((b, i) => (\r\n <React.Fragment key={`${b.id || 'breadcrumb'}-${i}`}>\r\n <IconChevronRight className=\"w-4 h-4 text-gray-300 mx-1\" />\r\n <button\r\n onClick={() => handleBreadcrumbClick(i + 1)}\r\n className={`hover:text-blue-600 transition-colors truncate max-w-[100px] ${i === breadcrumbs.length - 2 ? 'font-semibold text-gray-900 dark:text-white' : ''}`}\r\n >\r\n {b.name}\r\n </button>\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n\r\n <div className=\"h-4 w-px bg-gray-200 dark:bg-gray-700 mx-2\" />\r\n\r\n <button\r\n onClick={() => load()}\r\n disabled={loading}\r\n className=\"p-1.5 text-gray-400 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-md transition-all disabled:opacity-50\"\r\n title=\"Refresh\"\r\n >\r\n <IconRefresh className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />\r\n </button>\r\n\r\n <div className=\"h-4 w-px bg-gray-200 dark:bg-gray-700 mx-2\" />\r\n\r\n {/* Search */}\r\n <div className=\"relative flex-1 max-w-sm group\">\r\n <IconSearch className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400 group-focus-within:text-blue-500 transition-colors\" />\r\n <input\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n placeholder=\"Search files...\"\r\n className=\"w-full pl-9 pr-4 py-1.5 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all\"\r\n />\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {activeView === 'browse' && (\r\n <>\r\n <button onClick={() => setShowCreateFolder(true)} className=\"p-2 text-gray-400 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/10 rounded-lg transition-colors\" title=\"New Folder\">\r\n <IconFolderPlus className=\"w-5 h-5\" />\r\n </button>\r\n <button onClick={() => load()} className={`p-2 text-gray-400 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/10 rounded-lg transition-colors ${loading ? 'animate-spin text-blue-600' : ''}`} title=\"Refresh\">\r\n <IconLoader className=\"w-5 h-5\" />\r\n </button>\r\n </>\r\n )}\r\n <Dialog.Close asChild>\r\n <button className=\"ml-2 p-2 text-gray-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/10 rounded-lg transition-colors\">\r\n <IconX className=\"w-5 h-5\" />\r\n </button>\r\n </Dialog.Close>\r\n </div>\r\n </div>\r\n\r\n {/* Content Area */}\r\n <div className=\"flex-1 overflow-y-auto p-6 bg-gray-50/30 dark:bg-gray-900/30\">\r\n {activeView === 'browse' && (\r\n <>\r\n {error && (\r\n <div className=\"mb-6 bg-red-50 text-red-600 p-4 rounded-lg text-sm border border-red-100 flex items-center gap-2\">\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n <div className={gridClassName ?? \"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 gap-6\"}>\r\n {/* Folders */}\r\n {visibleFolders.map((folder) => (\r\n <div\r\n key={folder.id}\r\n onClick={() => handleNavigate(folder)}\r\n className=\"group flex flex-col items-center gap-3 p-4 rounded-xl border border-gray-200/60 bg-white hover:border-blue-200 hover:shadow-lg hover:shadow-blue-500/5 hover:-translate-y-1 transition-all cursor-pointer\"\r\n >\r\n <div className=\"w-16 h-12 bg-blue-50 rounded-lg flex items-center justify-center text-blue-500 group-hover:scale-110 transition-transform\">\r\n <IconFolder className=\"w-8 h-8 drop-shadow-sm\" />\r\n </div>\r\n <span className=\"text-sm font-medium text-gray-700 truncate w-full text-center\">{folder.name}</span>\r\n </div>\r\n ))}\r\n\r\n {/* Files */}\r\n {visibleFiles.map((f) => {\r\n // Show original image for best quality display\r\n const displayUrl = f.url;\r\n const hasThumbnails = f.thumbnails && f.thumbnails.length > 0;\r\n\r\n return (\r\n <div\r\n key={f.key}\r\n onClick={() => setPreviewFile(f)}\r\n className=\"group relative aspect-[4/3] bg-white rounded-xl border border-gray-200 overflow-hidden shadow-sm hover:shadow-xl hover:shadow-gray-200/50 hover:border-blue-300 transition-all duration-300 cursor-pointer\"\r\n >\r\n <img src={displayUrl} alt={f.originalName} className=\"w-full h-full object-cover transition-transform duration-700 group-hover:scale-105\" />\r\n\r\n {/* Thumbnail Icon - Top Left (visible on hover for all image files) */}\r\n {f.contentType?.startsWith('image/') && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleThumbnailClick(f);\r\n }}\r\n className={`absolute top-2 left-2 p-1.5 text-white rounded-md opacity-0 group-hover:opacity-100 transition-opacity shadow-lg ${hasThumbnails ? 'bg-purple-600/90 hover:bg-purple-500' : 'bg-gray-600/90 hover:bg-purple-500'}`}\r\n title={hasThumbnails ? 'View Thumbnails' : 'Generate Thumbnails'}\r\n >\r\n <IconLayers className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n\r\n {/* Hover Overlay */}\r\n <div className=\"absolute inset-0 bg-black/40 opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex flex-col justify-end p-3\">\r\n <div className=\"flex gap-2 justify-center transform translate-y-2 group-hover:translate-y-0 transition-transform duration-300\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onSelect({\r\n url: f.url,\r\n key: f.key,\r\n originalName: f.originalName,\r\n size: f.size,\r\n contentType: f.contentType,\r\n thumbnails: f.thumbnails,\r\n });\r\n onOpenChange(false);\r\n }}\r\n className=\"px-3 py-1.5 bg-blue-600 text-white text-xs font-semibold rounded-md hover:bg-blue-500 shadow-lg\"\r\n >\r\n Select\r\n </button>\r\n {showDelete && (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setFileToDelete(f); }}\r\n className=\"p-1.5 bg-white/20 text-white text-xs font-semibold rounded-md hover:bg-red-500 backdrop-blur-md transition-colors\"\r\n >\r\n <IconTrash className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Info Badge */}\r\n <div className=\"absolute top-2 right-2 bg-black/50 backdrop-blur-md text-white text-[10px] px-1.5 py-0.5 rounded opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {f.originalName.split('.').pop()?.toUpperCase()}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {!loading && visibleFolders.length === 0 && visibleFiles.length === 0 && (\r\n <div className=\"h-full flex flex-col items-center justify-center text-gray-400\">\r\n <div className=\"w-16 h-16 bg-gray-100 rounded-2xl flex items-center justify-center mb-4\">\r\n <IconSearch className=\"w-8 h-8 opacity-40\" />\r\n </div>\r\n <h3 className=\"text-gray-900 font-medium mb-1\">No Assets Found</h3>\r\n <p className=\"text-sm\">Try uploading a file or creating a new folder.</p>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {activeView === 'upload' && (\r\n <div className=\"h-full flex flex-col items-center justify-center max-w-2xl mx-auto gap-4\">\r\n <div className=\"w-full bg-white rounded-2xl border border-gray-200 p-8 shadow-sm\">\r\n <h3 className=\"text-lg font-semibold text-gray-900 mb-6 flex items-center gap-2\">\r\n <IconUploadCloud className=\"text-blue-500\" />\r\n Upload Files\r\n </h3>\r\n\r\n <div className=\"mb-6\">\r\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">Target Folder</label>\r\n <div className=\"flex gap-2\">\r\n <select\r\n value={selectedUploadFolder}\r\n onChange={(e) => setSelectedUploadFolder(e.target.value)}\r\n className=\"block w-full rounded-lg border-gray-200 bg-gray-50 text-gray-900 text-sm focus:ring-blue-500 focus:border-blue-500 p-2.5\"\r\n >\r\n {uploadFoldersList.map(opt => (\r\n <option key={opt.id} value={opt.id}>{opt.name}</option>\r\n ))}\r\n </select>\r\n <button onClick={() => setShowCreateFolder(true)} className=\"px-3 bg-gray-100 hover:bg-gray-200 rounded-lg text-gray-600 transition-colors\">\r\n <IconFolderPlus className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <Uploader\r\n clientOptions={clientOptions}\r\n projectId={projectId}\r\n userId={userId}\r\n folderPath={uploadFoldersList.find(o => o.id === selectedUploadFolder)?.path || activeBreadcrumbPath || folderPath}\r\n accept={['image/*']}\r\n maxFileSize={maxFileSize}\r\n maxFiles={maxFiles}\r\n autoRecordToDb={autoRecordToDb}\r\n fetchThumbnails={false}\r\n autoUpload={false}\r\n thumbnailEnabled={thumbnailConfig?.enabled ?? true}\r\n thumbnailSizes={thumbnailConfig?.sizes}\r\n onClientUploadComplete={async (file: UploaderFile) => {\r\n if (file.status === 'success' && file.publicUrl && file.fileKey) {\r\n let thumbnails = (file as any).thumbnails as Thumbnail[] | undefined;\r\n\r\n // Generate thumbnails based on per-file selection from Uploader\r\n if (file.thumbnailEnabled && file.thumbnailSizesSelected && file.thumbnailSizesSelected.length > 0 && file.type?.startsWith('image/')) {\r\n try {\r\n const client = new UpfilesClient(clientOptions);\r\n const result = await client.generateThumbnails(file.fileKey, file.thumbnailSizesSelected);\r\n thumbnails = result.thumbnails;\r\n } catch (e) {\r\n console.warn('Failed to generate thumbnails:', e);\r\n }\r\n }\r\n\r\n const newItem = {\r\n key: file.fileKey,\r\n originalName: file.name,\r\n size: file.size,\r\n contentType: file.type,\r\n uploadedAt: new Date().toISOString(),\r\n url: file.publicUrl,\r\n thumbnails,\r\n };\r\n setFiles((prev) => {\r\n if (prev.find(f => f.key === newItem.key)) return prev;\r\n return deduplicateFiles([newItem, ...prev]);\r\n });\r\n }\r\n }}\r\n onComplete={() => {\r\n if (mode === 'full' && !stayOnUploadAfterComplete) {\r\n setTimeout(() => {\r\n setActiveView('browse');\r\n load();\r\n }, 1000);\r\n } else {\r\n load();\r\n }\r\n }}\r\n dropzoneClassName=\"border-2 border-dashed border-gray-300 bg-gray-50 rounded-xl p-12 text-center cursor-pointer hover:border-blue-500 hover:bg-blue-50/50 transition-all\"\r\n buttonClassName=\"hidden\"\r\n children={\r\n <div className=\"flex flex-col items-center gap-4\">\r\n <div className=\"w-12 h-12 bg-blue-100 text-blue-600 rounded-full flex items-center justify-center\">\r\n <IconUploadCloud className=\"w-6 h-6\" />\r\n </div>\r\n <div>\r\n <p className=\"text-gray-900 font-medium\">Click to upload or drag and drop</p>\r\n <p className=\"text-xs text-gray-500 mt-1\">Supports PNG, JPG, GIF up to {Math.round(maxFileSize / 1024 / 1024)}MB</p>\r\n </div>\r\n </div>\r\n }\r\n />\r\n </div>\r\n\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n\r\n {/* New Folder Dialog */}\r\n <Dialog.Root open={showCreateFolder} onOpenChange={setShowCreateFolder}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/40 z-[10010]\" />\r\n <Dialog.Content className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-sm rounded-xl bg-white p-6 shadow-2xl z-[10011] outline-none\" aria-describedby=\"new-folder-description\">\r\n <Dialog.Title className=\"text-lg font-semibold text-gray-900 mb-4\">New Folder</Dialog.Title>\r\n <Dialog.Description id=\"new-folder-description\" className=\"sr-only\">\r\n Create a new folder to organize your files\r\n </Dialog.Description>\r\n <input\r\n autoFocus\r\n className=\"w-full rounded-lg border border-gray-200 bg-gray-50 px-4 py-2 text-sm focus:ring-2 focus:ring-blue-500 outline-none mb-6\"\r\n placeholder=\"Folder Name\"\r\n value={newFolderName}\r\n onChange={e => setNewFolderName(e.target.value)}\r\n onKeyDown={e => e.key === 'Enter' && handleCreateFolder()}\r\n />\r\n <div className=\"flex justify-end gap-3\">\r\n <button onClick={() => setShowCreateFolder(false)} className=\"px-4 py-2 text-sm font-medium text-gray-600 hover:bg-gray-100 rounded-lg\">Cancel</button>\r\n <button\r\n onClick={handleCreateFolder}\r\n disabled={creatingFolder || !newFolderName.trim()}\r\n className=\"px-4 py-2 text-sm font-medium rounded-lg bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50\"\r\n >\r\n Create\r\n </button>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n\r\n {/* Delete Dialog */}\r\n <Dialog.Root open={!!fileToDelete} onOpenChange={(open) => !open && setFileToDelete(null)}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/40 z-[10020]\" />\r\n <Dialog.Content className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-md rounded-xl bg-white p-6 shadow-2xl z-[10021]\" aria-describedby=\"delete-file-description\">\r\n <Dialog.Title className=\"text-xl font-semibold text-gray-900 mb-2\">Delete File</Dialog.Title>\r\n <Dialog.Description id=\"delete-file-description\" className=\"text-gray-600 mb-6\">\r\n Are you sure you want to delete <span className=\"font-semibold text-gray-900\">\"{fileToDelete?.originalName}\"</span>?\r\n </Dialog.Description>\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={() => setFileToDelete(null)}\r\n className=\"px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-100 rounded-lg\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={handleDelete}\r\n disabled={!!deleting}\r\n className=\"px-4 py-2 text-sm font-medium rounded-lg bg-red-600 text-white hover:bg-red-700 disabled:opacity-70\"\r\n >\r\n {deleting ? 'Deleting...' : 'Delete'}\r\n </button>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n\r\n {/* Thumbnail Selector Dialog */}\r\n <Dialog.Root open={!!thumbnailSelectorFile} onOpenChange={(open) => !open && setThumbnailSelectorFile(null)}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/50 z-[10030]\" />\r\n <Dialog.Content className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-4xl max-h-[80vh] rounded-xl bg-white shadow-2xl z-[10031] overflow-hidden\" aria-describedby=\"thumbnail-selector-description\">\r\n <div className=\"p-6 border-b border-gray-200\">\r\n <Dialog.Title className=\"text-xl font-semibold text-gray-900 mb-2\">Select Thumbnail</Dialog.Title>\r\n <Dialog.Description id=\"thumbnail-selector-description\" className=\"text-gray-600\">\r\n Choose a thumbnail size for <span className=\"font-semibold text-gray-900\">\"{thumbnailSelectorFile?.originalName}\"</span>\r\n </Dialog.Description>\r\n </div>\r\n\r\n <div className=\"p-6 overflow-y-auto max-h-[60vh]\">\r\n {generatingThumbnails && (\r\n <div className=\"flex items-center justify-center gap-3 py-8 text-gray-500\">\r\n <IconLoader className=\"w-5 h-5 animate-spin\" />\r\n <span className=\"text-sm font-medium\">Generating thumbnails...</span>\r\n </div>\r\n )}\r\n <div className={`grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 ${generatingThumbnails ? 'opacity-50 pointer-events-none' : ''}`}>\r\n {/* Original Image Option */}\r\n <div\r\n onClick={() => setSelectedThumbnailForFile(null)}\r\n className={`group cursor-pointer rounded-lg border-2 overflow-hidden transition-all ${selectedThumbnailForFile === null\r\n ? 'border-blue-500 ring-2 ring-blue-200'\r\n : 'border-gray-200 hover:border-blue-300'\r\n }`}\r\n >\r\n <div className=\"aspect-square bg-gray-100 flex items-center justify-center relative\">\r\n <img\r\n src={thumbnailSelectorFile?.url}\r\n alt=\"Original\"\r\n className=\"w-full h-full object-cover\"\r\n />\r\n {selectedThumbnailForFile === null && (\r\n <div className=\"absolute inset-0 bg-blue-500/20 flex items-center justify-center\">\r\n <div className=\"w-6 h-6 bg-blue-500 rounded-full flex items-center justify-center\">\r\n <svg className=\"w-4 h-4 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"p-3 bg-white\">\r\n <div className=\"font-medium text-sm text-gray-900\">Original</div>\r\n <div className=\"text-xs text-gray-500\">Full size</div>\r\n </div>\r\n </div>\r\n\r\n {/* Thumbnail Options */}\r\n {thumbnailSelectorFile?.thumbnails?.map((thumbnail) => (\r\n <div\r\n key={thumbnail.id}\r\n onClick={() => setSelectedThumbnailForFile(thumbnail)}\r\n className={`group cursor-pointer rounded-lg border-2 overflow-hidden transition-all ${selectedThumbnailForFile?.id === thumbnail.id\r\n ? 'border-blue-500 ring-2 ring-blue-200'\r\n : 'border-gray-200 hover:border-blue-300'\r\n }`}\r\n >\r\n <div className=\"aspect-square bg-gray-100 flex items-center justify-center relative\">\r\n <img\r\n src={thumbnail.url}\r\n alt={`${thumbnail.size}px thumbnail`}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n {selectedThumbnailForFile?.id === thumbnail.id && (\r\n <div className=\"absolute inset-0 bg-blue-500/20 flex items-center justify-center\">\r\n <div className=\"w-6 h-6 bg-blue-500 rounded-full flex items-center justify-center\">\r\n <svg className=\"w-4 h-4 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"p-3 bg-white\">\r\n <div className=\"font-medium text-sm text-gray-900\">{thumbnail.size}px</div>\r\n <div className=\"text-xs text-gray-500\">\r\n {thumbnail.sizeType || 'Thumbnail'}\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n <div className=\"p-6 border-t border-gray-200 flex justify-end gap-3\">\r\n <button\r\n onClick={() => setThumbnailSelectorFile(null)}\r\n className=\"px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-100 rounded-lg\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={() => {\r\n if (thumbnailSelectorFile) {\r\n onSelect({\r\n url: selectedThumbnailForFile?.url || thumbnailSelectorFile.url,\r\n key: thumbnailSelectorFile.key,\r\n originalName: thumbnailSelectorFile.originalName,\r\n size: thumbnailSelectorFile.size,\r\n contentType: thumbnailSelectorFile.contentType,\r\n thumbnails: thumbnailSelectorFile.thumbnails,\r\n selectedThumbnail: selectedThumbnailForFile || undefined,\r\n });\r\n onOpenChange(false);\r\n setThumbnailSelectorFile(null);\r\n }\r\n }}\r\n className=\"px-4 py-2 text-sm font-medium rounded-lg bg-blue-600 text-white hover:bg-blue-700\"\r\n >\r\n Select {selectedThumbnailForFile ? `${selectedThumbnailForFile.size}px Thumbnail` : 'Original'}\r\n </button>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n\r\n {/* Image Preview Dialog */}\r\n <Dialog.Root open={!!previewFile} onOpenChange={(open) => !open && setPreviewFile(null)}>\r\n <Dialog.Portal>\r\n <Dialog.Overlay className=\"fixed inset-0 bg-black/90 z-[10040]\" onClick={() => setPreviewFile(null)} />\r\n <Dialog.Content className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[90vw] h-[90vh] z-[10041] outline-none\" aria-describedby=\"image-preview-description\">\r\n <div className=\"relative w-full h-full flex flex-col\">\r\n {/* Header */}\r\n <div className=\"absolute top-0 left-0 right-0 z-10 bg-gradient-to-b from-black/70 to-transparent p-6\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"text-white\">\r\n <Dialog.Title className=\"text-xl font-semibold mb-1\">{previewFile?.originalName}</Dialog.Title>\r\n <Dialog.Description id=\"image-preview-description\" className=\"text-sm text-gray-300\">\r\n {previewFile?.size ? `${(previewFile.size / 1024).toFixed(1)} KB` : ''} • {previewFile?.contentType}\r\n </Dialog.Description>\r\n </div>\r\n <button\r\n onClick={() => setPreviewFile(null)}\r\n className=\"p-2 bg-white/10 hover:bg-white/20 rounded-lg backdrop-blur-md transition-colors\"\r\n >\r\n <IconX className=\"w-6 h-6 text-white\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Image */}\r\n <div className=\"flex-1 flex items-center justify-center p-6\">\r\n <img\r\n src={previewFile?.url}\r\n alt={previewFile?.originalName}\r\n className=\"max-w-full max-h-full object-contain\"\r\n onError={(e) => {\r\n // If image fails to load, show error message\r\n const target = e.target as HTMLImageElement;\r\n target.style.display = 'none';\r\n const errorDiv = document.createElement('div');\r\n errorDiv.className = 'text-white text-center';\r\n errorDiv.innerHTML = `\r\n <div class=\"text-red-400 mb-2\">Failed to load image</div>\r\n <div class=\"text-sm text-gray-400\">URL: ${previewFile?.url}</div>\r\n `;\r\n target.parentElement?.appendChild(errorDiv);\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Footer Actions */}\r\n <div className=\"absolute bottom-0 left-0 right-0 z-10 bg-gradient-to-t from-black/70 to-transparent p-6\">\r\n <div className=\"flex gap-3 justify-center\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (previewFile) {\r\n onSelect({\r\n url: previewFile.url,\r\n key: previewFile.key,\r\n originalName: previewFile.originalName,\r\n size: previewFile.size,\r\n contentType: previewFile.contentType,\r\n thumbnails: previewFile.thumbnails,\r\n });\r\n onOpenChange(false);\r\n setPreviewFile(null);\r\n }\r\n }}\r\n className=\"px-6 py-2.5 bg-blue-600 text-white font-semibold rounded-lg hover:bg-blue-500 shadow-lg\"\r\n >\r\n Select Image\r\n </button>\r\n <a\r\n href={previewFile?.url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"px-6 py-2.5 bg-white/10 text-white font-semibold rounded-lg hover:bg-white/20 backdrop-blur-md transition-colors\"\r\n >\r\n Open in New Tab\r\n </a>\r\n {previewFile?.contentType?.startsWith('image/') && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (previewFile) {\r\n handleThumbnailClick(previewFile);\r\n setPreviewFile(null);\r\n }\r\n }}\r\n className=\"px-6 py-2.5 bg-purple-600 text-white font-semibold rounded-lg hover:bg-purple-500 shadow-lg flex items-center gap-2\"\r\n >\r\n <IconLayers className=\"w-5 h-5\" />\r\n Select Thumbnail\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </Dialog.Content>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n </Dialog.Root>\r\n );\r\n}\r\n\r\nexport default ImageManager;\r\n","'use client';\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type { UpfilesClientOptions } from './client.js';\nimport { listProjects, createProject, updateProject } from './projectConnect.js';\n\n// --- Types ---\n\nexport type InhouseConfig = {\n /** Upfiles backend base URL (e.g., http://localhost:4021) */\n baseUrl: string;\n /** Function returning the current JWT token, or a token string directly */\n getToken:\n | (() => string | null | undefined | Promise<string | null | undefined>)\n | string\n | null\n | undefined;\n /** Current user ID. Required before in-house provisioning starts. */\n userId: string | null | undefined;\n /** Project name to auto-create (default: 'default') */\n projectName?: string;\n /** @deprecated In-house project data is no longer cached in browser storage. */\n cachePrefix?: string;\n /** Whether to enable auto-connect (default: true) */\n enabled?: boolean;\n};\n\nexport type InhouseResult = {\n /** Ready-to-use UpfilesClientOptions for ImageManager, Uploader, etc. */\n clientOptions: UpfilesClientOptions | null;\n /** Project ID is intentionally not exposed in secure in-house mode. */\n projectId: string | null;\n /** Whether the hook is currently provisioning */\n loading: boolean;\n /** Error message if provisioning failed */\n error: string | null;\n /** Whether credentials are ready to use */\n isReady: boolean;\n /** Force re-provision. */\n retry: () => void;\n /** Clear in-memory credentials. */\n clearCache: () => void;\n};\n\n// --- Hook ---\n\nexport function useUpfilesInhouse(config: InhouseConfig): InhouseResult {\n const {\n baseUrl,\n getToken,\n userId,\n projectName = 'default',\n enabled = true,\n } = config;\n\n const [state, setState] = useState<{\n clientOptions: UpfilesClientOptions | null;\n projectId: string | null;\n loading: boolean;\n error: string | null;\n }>({ clientOptions: null, projectId: null, loading: false, error: null });\n\n const [retryCount, setRetryCount] = useState(0);\n\n const [token, setToken] = useState<string | null>(\n typeof getToken === 'string' ? getToken : null\n );\n\n // Stable getToken function reference for UpfilesClientOptions\n const getTokenFn = useCallback(() => {\n return typeof getToken === 'function' ? getToken() : getToken;\n }, [getToken]);\n\n useEffect(() => {\n let cancelled = false;\n\n async function resolveToken() {\n const next = await getTokenFn();\n if (!cancelled) {\n setToken(next ?? null);\n }\n }\n\n resolveToken();\n window.addEventListener('focus', resolveToken);\n window.addEventListener('storage', resolveToken);\n return () => {\n cancelled = true;\n window.removeEventListener('focus', resolveToken);\n window.removeEventListener('storage', resolveToken);\n };\n }, [getTokenFn]);\n\n // Ref to track if the effect is still mounted\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Build clientOptions without exposing the project id. The backend resolves\n // the in-house project by name after verifying the user's JWT.\n const buildClientOptions = useCallback(\n (): UpfilesClientOptions => ({\n baseUrl,\n getToken: getTokenFn,\n projectName,\n }),\n [baseUrl, getTokenFn, projectName],\n );\n\n useEffect(() => {\n if (!enabled || !token || !userId) {\n setState({ clientOptions: null, projectId: null, loading: false, error: null });\n return;\n }\n\n let cancelled = false;\n\n async function provision() {\n if (!mountedRef.current) return;\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n const connectOpts = { baseUrl, token: token! };\n\n // 1. List existing projects\n const projects = await listProjects(connectOpts);\n if (cancelled || !mountedRef.current) return;\n\n // 2. Find or create project. No API key is created; runtime access uses\n // the user's JWT plus x-project-name.\n const existing = projects.find((p) => p.name === projectName);\n\n if (existing) {\n // Ensure the project is marked as in-house with free storage.\n await updateProject({\n ...connectOpts,\n projectId: existing.id,\n isInHouse: true,\n freeStorageLimitBytes: 2147483648, // 2GB\n });\n } else {\n try {\n await createProject({\n ...connectOpts,\n name: projectName,\n isInHouse: true,\n freeStorageLimitBytes: 2147483648, // 2GB in bytes\n });\n } catch (err: any) {\n // Handle race condition: another tab may have created the project.\n if (err?.message?.includes('409') || err?.message?.includes('duplicate') || err?.message?.includes('already exists')) {\n const retryProjects = await listProjects(connectOpts);\n const found = retryProjects.find((p) => p.name === projectName);\n if (!found) throw err;\n await updateProject({\n ...connectOpts,\n projectId: found.id,\n isInHouse: true,\n freeStorageLimitBytes: 2147483648, // 2GB\n });\n } else {\n throw err;\n }\n }\n }\n\n if (cancelled || !mountedRef.current) return;\n\n // 3. Set state: JWT auth via getToken, with no API key or project id in browser storage.\n setState({\n clientOptions: buildClientOptions(),\n projectId: null,\n loading: false,\n error: null,\n });\n } catch (err: any) {\n if (cancelled || !mountedRef.current) return;\n setState({\n clientOptions: null,\n projectId: null,\n loading: false,\n error: err?.message || 'Failed to auto-connect upfiles',\n });\n }\n }\n\n provision();\n\n return () => {\n cancelled = true;\n };\n }, [enabled, token, userId, baseUrl, projectName, retryCount, buildClientOptions]);\n\n const retry = useCallback(() => {\n setRetryCount((c) => c + 1);\n }, []);\n\n const clearCache = useCallback(() => {\n setState({ clientOptions: null, projectId: null, loading: false, error: null });\n }, []);\n\n return {\n ...state,\n isReady: !!state.clientOptions,\n retry,\n clearCache,\n };\n}\n"]}