{"version":3,"sources":["../src/utils/config.ts","../src/utils/debug.ts","../src/utils/retry.ts","../src/core/AttributionManager.ts","../src/core/EventManager.ts","../src/utils/environment.ts","../src/core/FingerPrintManager.ts","../src/core/SessionManager.ts","../src/core/FairShareCore.ts","../src/index.ts"],"names":["STORAGE_KEYS","COOKIE_KEYS","EventTypes","startedCheckout","startedCheckoutBeacon","FingerprintJS","createSession","StorageManager","instance","axios"],"mappings":";;;;;;;;;;;;;;;AAOO,IAAM,oBAAuB,GAAA,uBAAA;AAa7B,IAAM,cAAiB,GAAA;AAAA,EAC5B,YAAc,EAAA,oBAAA;AAAA,EACd,cAAgB,EAAA,CAIlB,CAAA;;;ACvBA,IAAI,YAAe,GAAA,KAAA;AAOZ,SAAS,KAAA,CAAM,YAAoB,IAAuB,EAAA;AAC/D,EAAI,IAAA,YAAA,IAAgB,OAAO,OAAA,KAAY,WAAa,EAAA;AAClD,IAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,WAAA,CAAA,EAAe,OAAS,EAAA,GAAG,IAAI,CAAA;AAAA;AAE/C;AAMO,SAAS,aAAa,OAAwB,EAAA;AACnD,EAAe,YAAA,GAAA,OAAA;AACjB;;;ACbA,eAAsB,KACpB,CAAA,EAAA,EACA,QACA,EAAA,KAAA,GAAQ,GACI,EAAA;AACZ,EAAI,IAAA;AACF,IAAA,OAAO,MAAM,EAAG,EAAA;AAAA,WACT,KAAO,EAAA;AACd,IAAA,IAAI,YAAY,CAAG,EAAA;AACjB,MAAM,MAAA,KAAA;AAAA;AAIR,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,GAAM,GAAA,IAAA;AACrC,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,GAAQ,QAAQ,GAAK,CAAA;AAE9C,IAAA,KAAA,CAAM,CAAkB,eAAA,EAAA,OAAO,CAAO,IAAA,EAAA,QAAA,GAAW,CAAC,CAAgB,cAAA,CAAA,CAAA;AAGlE,IAAA,MAAM,IAAI,OAAQ,CAAA,CAAC,YAAY,UAAW,CAAA,OAAA,EAAS,OAAO,CAAC,CAAA;AAG3D,IAAA,OAAO,KAAM,CAAA,EAAA,EAAI,QAAW,GAAA,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA;AAE5C;ACba,IAAA,kBAAA,GAAN,MAAM,mBAAmB,CAAA;AAAA,EACtB,cAAA;AAAA,EACA,mBAAA,uBAA0B,GAAoC,EAAA;AAAA,EACtE,OAAe,GAAM,GAAA,EAAA,GAAK,EAAK,GAAA,GAAA;AAAA;AAAA,EAE/B,YAAY,cAAgC,EAAA;AAC1C,IAAA,IAAA,CAAK,cAAiB,GAAA,cAAA;AAAA;AACxB;AAAA,EAGQ,YAAY,GAAqB,EAAA;AACvC,IAAI,IAAA;AACF,MAAM,MAAA,SAAA,GAAY,IAAI,GAAA,CAAI,GAAG,CAAA;AAC7B,MAAO,OAAA,CAAA,EAAG,UAAU,QAAQ,CAAA,EAAG,UAAU,MAAM,CAAA,EAAG,UAAU,IAAI,CAAA,CAAA;AAAA,KAC1D,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF;AAAA,EAGQ,kBAGN,GAAA;AACA,IACE,OAAA,IAAA,CAAK,eAAe,SAAU,CAAA,EAAE,KAAKA,2BAAa,CAAA,iBAAA,EAAmB,CAAA,IACrE,EAAC;AAAA;AAEL;AAAA,EAGQ,mBACN,KAIM,EAAA;AACN,IAAA,IAAA,CAAK,eAAe,SAAU,CAAA;AAAA,MAC5B,KAAKA,2BAAa,CAAA,iBAAA;AAAA,MAClB,KAAO,EAAA;AAAA,KACR,CAAA;AAAA;AACH;AAAA,EAGQ,aAAa,KAIT,EAAA;AACV,IAAA,OAAO,IAAK,CAAA,GAAA,EAAQ,GAAA,KAAA,CAAM,YAAY,mBAAmB,CAAA,GAAA;AAAA;AAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,sBAAA,CACL,KACA,WACM,EAAA;AACN,IAAA,KAAA;AAAA,MACE,yDAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAK,IAAA,CAAA,mBAAA,CAAoB,GAAI,CAAA,GAAA,EAAK,WAAW,CAAA;AAC7C,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,WAAA,CAAY,GAAG,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,KAAK,kBAAmB,EAAA;AACtC,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,KAAA,CAAM,QAAQ,CAAI,GAAA;AAAA,QAChB,WAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,QACpB;AAAA,OACF;AAAA,KACK,MAAA;AACL,MAAA,OAAO,MAAM,QAAQ,CAAA;AAAA;AAEvB,IAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA;AAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,uBAAwB,CAAA;AAAA,IAC7B,GAAA;AAAA,IACA,oBAAuB,GAAA;AAAA,GACzB,GAGI,EAA4B,EAAA;AAC9B,IAAA,KAAA,CAAM,8DAA8D,GAAG,CAAA;AAGvE,IAAM,MAAA,mBAAA,GAAsB,KAAK,sBAAuB,EAAA;AACxD,IAAA,IAAI,mBAAqB,EAAA;AACvB,MAAA,KAAA;AAAA,QACE,iDAAA;AAAA,QACA;AAAA,OACF;AACA,MAAO,OAAA,mBAAA;AAAA;AAIT,IAAM,MAAA,iBAAA,GAAoB,IAAK,CAAA,oBAAA,CAAqB,GAAG,CAAA;AACvD,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAA,KAAA;AAAA,QACE,0DAAA;AAAA,QACA;AAAA,OACF;AACA,MAAO,OAAA,iBAAA;AAAA;AAGT,IAAA,IAAI,oBAAsB,EAAA;AAExB,MAAM,MAAA,SAAA,GAAY,IAAK,CAAA,cAAA,CAAe,SAEnC,CAAA;AAAA,QACD,KAAKC,0BAAY,CAAA;AAAA,OAClB,CAAA;AAED,MAAA,IAAI,WAAW,YAAc,EAAA;AAC3B,QAAM,KAAA,CAAA,sCAAA,EAAwC,UAAU,YAAY,CAAA;AACpE,QAAO,OAAA;AAAA,UACL,cAAc,SAAU,CAAA;AAAA,SAC1B;AAAA;AACF;AAIF,IAAA,KAAA,CAAM,8CAA8C,CAAA;AACpD,IAAO,OAAA,IAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKO,qBAAqB,GAAsC,EAAA;AAChE,IAAA,MAAM,aACJ,GAAQ,KAAA,OAAO,WAAW,WAAc,GAAA,MAAA,CAAO,SAAS,QAAW,GAAA,EAAA,CAAA;AAGrE,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,mBAAoB,CAAA,GAAA,CAAI,UAAU,CAAA;AACtD,IAAA,IAAI,WAAW,MAAW,EAAA;AACxB,MAAO,OAAA,MAAA;AAAA;AAIT,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,WAAA,CAAY,UAAU,CAAA;AAC5C,IAAM,MAAA,KAAA,GAAQ,KAAK,kBAAmB,EAAA;AACtC,IAAM,MAAA,KAAA,GAAQ,MAAM,QAAQ,CAAA;AAC5B,IAAA,IAAI,KAAS,IAAA,IAAA,CAAK,YAAa,CAAA,KAAK,CAAG,EAAA;AAErC,MAAA,IAAA,CAAK,mBAAoB,CAAA,GAAA,CAAI,UAAY,EAAA,KAAA,CAAM,WAAW,CAAA;AAC1D,MAAA,OAAO,KAAM,CAAA,WAAA;AAAA,eACJ,KAAO,EAAA;AAEhB,MAAA,OAAO,MAAM,QAAQ,CAAA;AACrB,MAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA;AAE/B,IAAO,OAAA,IAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKO,uBACL,mBACM,EAAA;AACN,IAAA,KAAA,CAAM,iCAAiC,mBAAmB,CAAA;AAC1D,IAAM,MAAA,eAAA,GACJ,IAAK,CAAA,cAAA,CAAe,SAEjB,CAAA,EAAE,KAAKD,2BAAa,CAAA,iBAAA,EAAmB,CAAA,IAAK,EAAC;AAClD,IAAA,eAAA,CAAgB,mBAAsB,GAAA,mBAAA;AACtC,IAAA,IAAA,CAAK,eAAe,SAAU,CAAA;AAAA,MAC5B,KAAKA,2BAAa,CAAA,iBAAA;AAAA,MAClB,KAAO,EAAA;AAAA,KACR,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKO,wBAAiC,GAAA;AACtC,IAAA,KAAA,CAAM,+BAA+B,CAAA;AACrC,IAAM,MAAA,eAAA,GACJ,IAAK,CAAA,cAAA,CAAe,SAEjB,CAAA,EAAE,KAAKA,2BAAa,CAAA,iBAAA,EAAmB,CAAA,IAAK,EAAC;AAClD,IAAA,OAAO,eAAgB,CAAA,mBAAA;AACvB,IAAA,IAAA,CAAK,eAAe,SAAU,CAAA;AAAA,MAC5B,KAAKA,2BAAa,CAAA,iBAAA;AAAA,MAClB,KAAO,EAAA;AAAA,KACR,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKO,sBAAiD,GAAA;AACtD,IAAM,MAAA,eAAA,GAAkB,KAAK,cAAe,CAAA,SAAA,CAEzC,EAAE,GAAK,EAAAA,2BAAA,CAAa,mBAAmB,CAAA;AAE1C,IAAI,IAAA,eAAA,EAAiB,qBAAqB,WAAa,EAAA;AACrD,MAAA,OAAO,gBAAgB,mBAAoB,CAAA,WAAA;AAAA;AAG7C,IAAO,OAAA,IAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKO,aAAa,GAAsB,EAAA;AAExC,IAAA,IAAI,IAAK,CAAA,mBAAA,CAAoB,GAAI,CAAA,GAAG,CAAG,EAAA;AACrC,MAAO,OAAA,KAAA;AAAA;AAET,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,WAAA,CAAY,GAAG,CAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,KAAK,kBAAmB,EAAA;AACtC,IAAM,MAAA,KAAA,GAAQ,MAAM,QAAQ,CAAA;AAC5B,IAAA,OAAO,CAAC,KAAA,IAAS,CAAC,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA,EAKO,iBAAiB,GAAoB,EAAA;AAC1C,IAAA,IAAI,GAAK,EAAA;AACP,MAAK,IAAA,CAAA,mBAAA,CAAoB,OAAO,GAAG,CAAA;AACnC,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,WAAA,CAAY,GAAG,CAAA;AACrC,MAAM,MAAA,KAAA,GAAQ,KAAK,kBAAmB,EAAA;AACtC,MAAA,OAAO,MAAM,QAAQ,CAAA;AACrB,MAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,KACxB,MAAA;AACL,MAAA,IAAA,CAAK,oBAAoB,KAAM,EAAA;AAC/B,MAAA,IAAA,CAAK,eAAe,UAAW,CAAA,EAAE,GAAK,EAAAA,2BAAA,CAAa,mBAAmB,CAAA;AAAA;AACxE;AACF;AAAA;AAAA;AAAA,EAKO,oBAIM,GAAA;AACX,IAAI,IAAA,IAAA,CAAK,wBAA0B,EAAA;AACjC,MAAO,OAAA,sBAAA;AAAA;AAET,IAAI,IAAA,IAAA,CAAK,sBAAwB,EAAA;AAC/B,MAAO,OAAA,QAAA;AAAA;AAET,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,cAAA,CAAe,SAAqC,CAAA;AAAA,MACzE,KAAKC,0BAAY,CAAA;AAAA,KAClB,CAAA;AACD,IAAA,IAAI,WAAW,YAAc,EAAA;AAC3B,MAAO,OAAA,QAAA;AAAA;AAET,IAAO,OAAA,MAAA;AAAA;AAEX;AC5QA,IAAM,kBAAqB,GAAA,EAAA;AAC3B,IAAM,sBAAyB,GAAA,GAAA;AAC/B,IAAM,sBAAyB,GAAA,GAAA;AAKxB,IAAM,eAAN,MAAmB;AAAA,EAChB,aAAuC,EAAC;AAAA,EACxC,YAAqD,GAAA,IAAA;AAAA,EACrD,eAAkB,GAAA,KAAA;AAAA,EAClB,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,MAAwB,GAAA,IAAA;AAAA,EACxB,MAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAkB,GAAA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW1B,WAAA,CACE,gBACA,cACA,EAAA,kBAAA,EACA,YAAY,EACZ,EAAA,UAAA,GAAa,GACb,MACA,EAAA;AACA,IAAA,IAAA,CAAK,cAAiB,GAAA,cAAA;AACtB,IAAA,IAAA,CAAK,cAAiB,GAAA,cAAA;AACtB,IAAA,IAAA,CAAK,kBAAqB,GAAA,kBAAA;AAC1B,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AACjB,IAAA,IAAA,CAAK,UAAa,GAAA,UAAA;AAClB,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAGd,IAAK,IAAA,CAAA,SAAA,GAAY,OAAO,SAAa,IAAA,kBAAA;AACrC,IAAK,IAAA,CAAA,aAAA,GAAgB,OAAO,aAAiB,IAAA,sBAAA;AAC7C,IAAK,IAAA,CAAA,YAAA,GAAe,OAAO,YAAgB,IAAA,sBAAA;AAG3C,IAAA,IAAA,CAAK,gBAAiB,EAAA;AACtB,IAAA,IAAA,CAAK,kBAAmB,EAAA;AAAA;AAC1B;AAAA;AAAA;AAAA,EAKO,OAAgB,GAAA;AAErB,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,MAAA,IAAA,CAAK,YAAe,GAAA,IAAA;AAAA;AAItB,IAAA,IAAI,KAAK,aAAe,EAAA;AACtB,MAAA,aAAA,CAAc,KAAK,aAAa,CAAA;AAChC,MAAA,IAAA,CAAK,aAAgB,GAAA,MAAA;AAAA;AAIvB,IAAK,KAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA;AAC5B;AAAA;AAAA;AAAA,EAKO,qBACL,IACM,EAAA;AACN,IAAI,IAAA;AACF,MAAA,KAAA,CAAM,wDAAwD,IAAI,CAAA;AAElE,MAAM,MAAA,QAAA,GAAW,KAAK,aAAc,EAAA;AACpC,MAAA,KAAA,CAAM,oDAAoD,QAAQ,CAAA;AAElE,MAAA,MAAM,SAAY,GAAA;AAAA,QAChB,IAAM,EAAA;AAAA,UACJ,YAAY,IAAK,CAAA,UAAA;AAAA,UACjB;AAAA,SACF;AAAA,QACA,WAAWC,oBAAW,CAAA;AAAA,OACxB;AAEA,MAAQ,OAAA,CAAA,GAAA;AAAA,QACN,sDAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AAEzB,MAAQ,OAAA,CAAA,GAAA;AAAA,QACN,yEAAA;AAAA,QACA,KAAK,UAAW,CAAA;AAAA,OAClB;AACA,MAAA,KAAA,CAAM,kCAAkC,IAAI,CAAA;AAAA,aACrC,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA;AAAA,QACN,sDAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,KAAA;AAAA,QACE,uCAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AAAA;AACF;AACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,yBACX,IACe,EAAA;AACf,IAAI,IAAA;AACF,MAAQ,OAAA,CAAA,GAAA;AAAA,QACN,0DAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAM,MAAA,QAAA,GAAW,KAAK,aAAc,EAAA;AACpC,MAAQ,OAAA,CAAA,GAAA,CAAI,oDAAoD,QAAQ,CAAA;AAExE,MAAA,MAAM,SAAY,GAAA;AAAA,QAChB,IAAM,EAAA;AAAA,UACJ,YAAY,IAAK,CAAA,UAAA;AAAA,UACjB;AAAA,SACF;AAAA,QACA,WAAWA,oBAAW,CAAA;AAAA,OACxB;AAEA,MAAQ,OAAA,CAAA,GAAA;AAAA,QACN,8DAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,sBAAA,CAAuB,SAAS,CAAA;AAE3D,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAM,MAAA,IAAI,MAAM,8CAA8C,CAAA;AAAA;AAGhE,MAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,MAAA,KAAA,CAAM,gDAAgD,IAAI,CAAA;AAAA,aACnD,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,oDAAoD,KAAK,CAAA;AACvE,MAAA,KAAA;AAAA,QACE,qDAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAM,MAAA,KAAA;AAAA;AACR;AACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,WAAW,KAAqC,EAAA;AACrD,IAAI,IAAA;AACF,MAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,MAAA,KAAA,CAAM,iBAAiB,KAAK,CAAA;AAAA,aACrB,KAAO,EAAA;AACd,MAAA,KAAA;AAAA,QACE,6BAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AAAA;AACF;AACF;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,MAAsB,EAAA;AACrC,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAAA;AAChB;AAAA;AAAA;AAAA;AAAA,EAMO,SAAoB,GAAA;AACzB,IAAA,OAAO,KAAK,MAAU,IAAA,EAAA;AAAA;AACxB;AAAA;AAAA;AAAA;AAAA,EAMO,iBAAiB,QAAyB,EAAA;AAC/C,IAAA,IAAA,CAAK,eAAkB,GAAA,QAAA;AAAA;AACzB;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAgC,GAAA;AACtC,IAAO,OAAA,OAAO,SAAc,KAAA,WAAA,IAAe,YAAgB,IAAA,SAAA;AAAA;AAC7D;AAAA;AAAA;AAAA;AAAA,EAMQ,aAA4C,GAAA;AAClD,IAAA,MAAM,eAAe,eAAgB,EAAA;AACrC,IAAA,MAAM,QAAuC,GAAA;AAAA,MAC3C,aAAe,EAAA,YAAA;AAAA,MACf,YAAY,IAAK,CAAA;AAAA,KACnB;AACA,IAAA,QAAA,CAAS,WACP,GAAA,IAAA,CAAK,kBAAmB,CAAA,uBAAA,EAA6B,IAAA,MAAA;AAEvD,IAAM,MAAA,MAAA,GAAS,KAAK,cAAe,CAAA,OAAA,CAAQ,EAAE,GAAKD,EAAAA,0BAAAA,CAAY,QAAQ,CAAA;AACtE,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,QAAA,CAAS,YAAe,GAAA,MAAA;AAAA;AAG1B,IAAM,MAAA,OAAA,GAAU,KAAK,cAAe,CAAA,OAAA,CAAQ,EAAE,GAAKA,EAAAA,0BAAAA,CAAY,SAAS,CAAA;AACxE,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,QAAA,CAAS,aAAgB,GAAA,OAAA;AAAA;AAE3B,IAAO,OAAA,QAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,WAAW,KAAqC,EAAA;AAEtD,IAAK,IAAA,CAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAG1B,IAAA,IAAI,IAAK,CAAA,UAAA,CAAW,MAAS,GAAA,IAAA,CAAK,YAAc,EAAA;AAC9C,MAAA,IAAA,CAAK,aAAa,IAAK,CAAA,UAAA,CAAW,KAAM,CAAA,CAAC,KAAK,YAAY,CAAA;AAAA;AAI5D,IAAA,IAAA,CAAK,gBAAiB,EAAA;AAGtB,IAAA,IAAA,CAAK,aAAc,EAAA;AAAA;AACrB;AAAA;AAAA;AAAA,EAKQ,aAAsB,GAAA;AAC5B,IAAA,IAAI,KAAK,YAAiB,KAAA,IAAA,IAAQ,IAAK,CAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AAC5D,MAAK,IAAA,CAAA,YAAA,GAAe,WAAW,MAAM;AACnC,QAAA,IAAA,CAAK,YAAa,EAAA;AAElB,QAAA,IAAA,CAAK,YAAe,GAAA,IAAA;AAAA,OACtB,EAAG,KAAK,aAAa,CAAA;AAErB,MAAA,KAAA;AAAA,QACE,iCAAiC,IAAK,CAAA,aAAa,CAAmB,gBAAA,EAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,OAC9F;AAAA;AACF;AACF;AAAA;AAAA;AAAA,EAKQ,YAAqB,GAAA;AAE3B,IAAA,IAAI,KAAK,eAAiB,EAAA;AACxB,MAAA;AAAA;AAIF,IAAA,IAAA,CAAK,eAAkB,GAAA,IAAA;AAEvB,IAAI,IAAA;AAEF,MAAA,MAAM,kBAAkB,IAAK,CAAA,UAAA,CAAW,KAAM,CAAA,CAAA,EAAG,KAAK,SAAS,CAAA;AAG/D,MAAI,IAAA,eAAA,CAAgB,WAAW,CAAG,EAAA;AAChC,QAAA,IAAA,CAAK,eAAkB,GAAA,KAAA;AACvB,QAAA;AAAA;AAIF,MAAM,MAAA,OAAA,GAAU,IAAK,CAAA,SAAA,CAAU,eAAe,CAAA;AAE9C,MAAA,IAAI,OAAS,EAAA;AAEX,QAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAK,UAAW,CAAA,KAAA,CAAM,gBAAgB,MAAM,CAAA;AAG9D,QAAA,IAAA,CAAK,gBAAiB,EAAA;AAGtB,QAAI,IAAA,IAAA,CAAK,UAAW,CAAA,MAAA,GAAS,CAAG,EAAA;AAC9B,UAAA,IAAA,CAAK,aAAc,EAAA;AAAA;AACrB,OACK,MAAA;AAEL,QAAI,IAAA,IAAA,CAAK,aAAa,CAAG,EAAA;AACvB,UAAK,IAAA,CAAA,UAAA,EAAA;AACL,UAAA,IAAA,CAAK,aAAc,EAAA;AAAA;AACrB;AACF,aACO,KAAO,EAAA;AACd,MAAA,KAAA;AAAA,QACE,wBAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AAAA,KACA,SAAA;AAEA,MAAA,IAAA,CAAK,eAAkB,GAAA,KAAA;AAAA;AACzB;AACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAU,MAA2C,EAAA;AAC3D,IAAI,IAAA;AAEF,MAAA,KAAA,CAAM,wBAAwB,MAAM,CAAA;AAGpC,MAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,GAAI,CAAA,CAAC,KAAU,KAAA;AAE1C,QAAM,MAAA,aAAA,GAAgB,KAAK,aAAc,EAAA;AAIzC,QAAO,OAAA;AAAA,UACL,GAAG,KAAA;AAAA,UACH,QAAU,EAAA;AAAA,YACR,GAAG,MAAM,IAAK,CAAA,QAAA;AAAA,YACd,GAAG;AAAA;AACL,SACF;AAAA,OACD,CAAA;AAGD,MAAA,KAAA,MAAW,SAAS,aAAe,EAAA;AACjC,QAAK,KAAA,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA;AAI9B,MAAc,aAAA,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AAC/B,QAAM,KAAA,CAAA,CAAA,UAAA,EAAa,KAAM,CAAA,SAAS,CAAU,MAAA,CAAA,EAAA;AAAA,UAC1C,WAAW,KAAM,CAAA,SAAA;AAAA,UACjB,MAAM,KAAM,CAAA;AAAA,SACb,CAAA;AAAA,OACF,CAAA;AAED,MAAO,OAAA,IAAA;AAAA,aACA,KAAO,EAAA;AACd,MAAA,KAAA;AAAA,QACE,4BAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAO,OAAA,KAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,aAAa,KAAiD,EAAA;AAC1E,IAAI,IAAA;AACF,MAAM,KAAA,CAAA,CAAA,WAAA,EAAc,KAAM,CAAA,SAAS,CAAW,SAAA,CAAA,CAAA;AAE9C,MAAA,IAAI,MAAS,GAAA,KAAA;AAEb,MAAA,QAAQ,MAAM,SAAW;AAAA,QACvB,KAAKC,oBAAW,CAAA,gBAAA;AACd,UAAS,MAAA,GAAA,IAAA,CAAK,eACV,GAAA,MAAM,IAAK,CAAA,gCAAA,CAAiC,KAAK,CACjD,GAAA,MAAM,IAAK,CAAA,sBAAA,CAAuB,KAAK,CAAA;AAC3C,UAAA;AAAA,QACF;AACE,UAAM,KAAA,CAAA,CAAA,wBAAA,EAA2B,KAAM,CAAA,SAAS,CAAE,CAAA,CAAA;AAClD,UAAO,OAAA,KAAA;AAAA;AAGX,MAAA,KAAA;AAAA,QACE,CAAwB,qBAAA,EAAA,KAAA,CAAM,SAAS,CAAA,oBAAA,EAAuB,MAAM,CAAA;AAAA,OACtE;AACA,MAAO,OAAA,MAAA;AAAA,aACA,KAAO,EAAA;AAEd,MAAA,KAAA;AAAA,QACE,CAAA,sBAAA,CAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAO,OAAA,KAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,uBACZ,KACkB,EAAA;AAClB,IAAI,IAAA;AACF,MAAQ,OAAA,CAAA,GAAA,CAAI,oDAAoD,KAAK,CAAA;AAErE,MAAA,MAAM,WAAuD,GAAA;AAAA,QAC3D,UAAA,EAAY,MAAM,IAAK,CAAA,UAAA;AAAA,QACvB,QAAA,EAAU,MAAM,IAAK,CAAA;AAAA,OACvB;AAEA,MAAQ,OAAA,CAAA,GAAA;AAAA,QACN,8DAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,KAAA,CAAM,qCAAqC,WAAW,CAAA;AAGtD,MAAM,MAAA,QAAA,GAAW,MAAMC,yBAAgB,CAAA;AAAA,QACrC,OAAS,EAAA;AAAA,OACV,CAAA;AAED,MAAQ,OAAA,CAAA,GAAA;AAAA,QACN,+DAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,KAAA,CAAM,yCAAyC,QAAQ,CAAA;AACvD,MAAO,OAAA,IAAA;AAAA,aACA,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,qDAAqD,KAAK,CAAA;AACxE,MAAA,KAAA;AAAA,QACE,iCAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAO,OAAA,KAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,iCACZ,KACkB,EAAA;AAClB,IAAI,IAAA,CAAC,IAAK,CAAA,oBAAA,EAAwB,EAAA;AAChC,MAAA,KAAA,CAAM,2DAA2D,CAAA;AACjE,MAAO,OAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA;AAG1C,IAAI,IAAA;AACF,MAAA,MAAM,WAAuD,GAAA;AAAA,QAC3D,UAAA,EAAY,MAAM,IAAK,CAAA,UAAA;AAAA,QACvB,QAAA,EAAU,MAAM,IAAK,CAAA;AAAA,OACvB;AAEA,MAAA,KAAA,CAAM,gDAAgD,WAAW,CAAA;AAEjE,MAAA,MAAM,OAAU,GAAAC,+BAAA,CAAsB,EAAE,OAAA,EAAS,aAAa,CAAA;AAC9D,MAAA,KAAA,CAAM,qCAAqC,OAAO,CAAA;AAClD,MAAO,OAAA,OAAA;AAAA,aACA,KAAO,EAAA;AACd,MAAA,KAAA,CAAM,6CAA6C,KAAK,CAAA;AACxD,MAAO,OAAA,KAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA,EAKQ,gBAAyB,GAAA;AAC/B,IAAI,IAAA;AACF,MAAA,IAAA,CAAK,eAAe,OAAQ,CAAA;AAAA,QAC1B,KAAKJ,2BAAa,CAAA,WAAA;AAAA,QAClB,KAAO,EAAA,IAAA,CAAK,SAAU,CAAA,IAAA,CAAK,UAAU;AAAA,OACtC,CAAA;AAAA,aACM,KAAO,EAAA;AACd,MAAA,KAAA;AAAA,QACE,4BAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AAAA;AACF;AACF;AAAA;AAAA;AAAA,EAKQ,gBAAyB,GAAA;AAC/B,IAAI,IAAA;AACF,MAAM,MAAA,YAAA,GAAe,IAAK,CAAA,cAAA,CAAe,OAAQ,CAAA;AAAA,QAC/C,KAAKA,2BAAa,CAAA;AAAA,OACnB,CAAA;AACD,MAAA,IAAI,YAAc,EAAA;AAChB,QAAK,IAAA,CAAA,UAAA,GAAa,IAAK,CAAA,KAAA,CAAM,YAAY,CAAA;AAAA;AAC3C,aACO,KAAO,EAAA;AACd,MAAA,KAAA;AAAA,QACE,6BAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AAAA;AACF;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,UAAA,CAAW,IAAO,GAAA,KAAA,EAAO,YAAY,GAAqB,EAAA;AAErE,IAAI,IAAA,IAAA,CAAK,UAAW,CAAA,MAAA,KAAW,CAAG,EAAA;AAChC,MAAA,OAAO,QAAQ,OAAQ,EAAA;AAAA;AAGzB,IAAI,IAAA;AACF,MAAA,KAAA;AAAA,QACE,6BAA6B,IAAK,CAAA,UAAA,CAAW,MAAM,CAAkB,eAAA,EAAA,IAAI,cAAc,SAAS,CAAA,GAAA;AAAA,OAClG;AAGA,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,QAAA,IAAA,CAAK,YAAe,GAAA,IAAA;AAAA;AAItB,MAAA,IAAI,IAAM,EAAA;AAER,QAAA,MAAM,eAAkB,GAAA,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AAG3C,QAAA,IAAA,CAAK,aAAa,EAAC;AACnB,QAAA,IAAA,CAAK,gBAAiB,EAAA;AAGtB,QAAA,MAAM,kBAAqB,GAAA,eAAA,CAAgB,GAAI,CAAA,OAAO,KAAU,KAAA;AAE9D,UAAM,MAAA,aAAA,GAAgB,KAAK,aAAc,EAAA;AAGzC,UAAA,MAAM,YAAe,GAAA;AAAA,YACnB,GAAG,KAAA;AAAA,YACH,IAAM,EAAA;AAAA,cACJ,GAAG,KAAM,CAAA,IAAA;AAAA,cACT,QAAU,EAAA;AAAA,gBACR,GAAG,MAAM,IAAK,CAAA,QAAA;AAAA,gBACd,GAAG;AAAA;AACL;AACF,WACF;AAGA,UAAA,OAAO,KAAK,YAAa,CAAA,YAAY,CAAE,CAAA,IAAA,CAAK,CAAC,OAAY,KAAA;AACvD,YAAA,IAAI,OAAS,EAAA;AACX,cAAA,KAAA;AAAA,gBACE,CAAA,uBAAA,EAA0B,MAAM,SAAS,CAAA,wBAAA;AAAA,eAC3C;AAAA,aACK,MAAA;AACL,cAAA,KAAA;AAAA,gBACE,CAAA,kBAAA,EAAqB,MAAM,SAAS,CAAA,wBAAA;AAAA,eACtC;AAAA;AAEF,YAAO,OAAA,OAAA;AAAA,WACR,CAAA;AAAA,SACF,CAAA;AAED,QAAA,KAAA;AAAA,UACE,CAAA,YAAA,EAAe,mBAAmB,MAAM,CAAA,iCAAA;AAAA,SAC1C;AAGA,QAAA,MAAM,cAAiB,GAAA,IAAI,OAAc,CAAA,CAAC,OAAY,KAAA;AACpD,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,KAAA;AAAA,cACE,oBAAoB,SAAS,CAAA,0DAAA;AAAA,aAC/B;AACA,YAAQ,OAAA,EAAA;AAAA,aACP,SAAS,CAAA;AAAA,SACb,CAAA;AAID,QAAI,IAAA;AACF,UAAO,OAAA,MAAM,QAAQ,IAAK,CAAA;AAAA;AAAA,YAExB,QAAQ,GAAI,CAAA,kBAAkB,CAAE,CAAA,IAAA,CAAK,CAAC,OAAY,KAAA;AAChD,cAAA,MAAM,YAAe,GAAA,OAAA,CAAQ,MAAO,CAAA,OAAO,CAAE,CAAA,MAAA;AAC7C,cAAA,KAAA;AAAA,gBACE,CAAwB,qBAAA,EAAA,YAAY,CAAI,CAAA,EAAA,OAAA,CAAQ,MAAM,CAAA,yBAAA;AAAA,eACxD;AAAA,aACD,CAAA;AAAA;AAAA,YAED;AAAA,WACD,CAAA;AAAA,iBACM,KAAO,EAAA;AACd,UAAA,KAAA;AAAA,YACE,6CAAA;AAAA,YACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,WACvD;AAEA,UAAA,MAAM,iBAAiB,KAAQ,GAAA,KAAA,GAAQ,IAAI,KAAM,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA;AAChE,OACK,MAAA;AAEL,QAAA,IAAA,CAAK,YAAa,EAAA;AAElB,QAAA,OAAO,QAAQ,OAAQ,EAAA;AAAA;AACzB,aACO,KAAO,EAAA;AACd,MAAA,KAAA;AAAA,QACE,sBAAA;AAAA,QACA,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AAEA,MAAA,OAAO,OAAQ,CAAA,MAAA;AAAA,QACb,iBAAiB,KAAQ,GAAA,KAAA,GAAQ,IAAI,KAAM,CAAA,MAAA,CAAO,KAAK,CAAC;AAAA,OAC1D;AAAA;AACF;AACF;AAAA;AAAA;AAAA;AAAA,EAMO,aAAa,SAAyB,EAAA;AAC3C,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AACjB,IAAM,KAAA,CAAA,CAAA,mBAAA,EAAsB,SAAS,CAAE,CAAA,CAAA;AAAA;AACzC;AAAA;AAAA;AAAA,EAKQ,kBAA2B,GAAA;AAEjC,IAAA,IAAI,KAAK,aAAe,EAAA;AACtB,MAAA,aAAA,CAAc,KAAK,aAAa,CAAA;AAAA;AAIlC,IAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,MAAA,CAAO,eAAmB,IAAA,GAAA;AACvD,IAAA,IAAI,kBAAkB,CAAG,EAAA;AACvB,MAAK,IAAA,CAAA,aAAA,GAAgB,YAAY,MAAM;AACrC,QAAM,KAAA,CAAA,CAAA,qCAAA,EAAwC,eAAe,CAAK,GAAA,CAAA,CAAA;AAClE,QAAK,KAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,SACzB,eAAe,CAAA;AAElB,MAAM,KAAA,CAAA,CAAA,uBAAA,EAA0B,eAAe,CAAI,EAAA,CAAA,CAAA;AAAA;AACrD;AACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,oBAAsC,GAAA;AACjD,IAAI,IAAA,IAAA,CAAK,UAAW,CAAA,MAAA,KAAW,CAAG,EAAA;AAChC,MAAA,OAAO,QAAQ,OAAQ,EAAA;AAAA;AAGzB,IAAI,IAAA;AACF,MAAA,KAAA,CAAM,CAAY,SAAA,EAAA,IAAA,CAAK,UAAW,CAAA,MAAM,CAAqB,mBAAA,CAAA,CAAA;AAG7D,MAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAG1B,MAAA,MAAM,eAAkB,GAAA,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AAC3C,MAAA,IAAA,CAAK,aAAa,EAAC;AACnB,MAAA,IAAA,CAAK,gBAAiB,EAAA;AAGtB,MAAA,MAAM,OAAU,GAAA,eAAA,CAAgB,GAAI,CAAA,CAAC,KAAU,KAAA;AAC7C,QAAM,MAAA,aAAA,GAAgB,KAAK,aAAc,EAAA;AACzC,QAAA,MAAM,YAAe,GAAA;AAAA,UACnB,GAAG,KAAA;AAAA,UACH,IAAM,EAAA;AAAA,YACJ,GAAG,KAAM,CAAA,IAAA;AAAA,YACT,UAAU,EAAE,GAAG,MAAM,IAAK,CAAA,QAAA,EAAU,GAAG,aAAc;AAAA;AACvD,SACF;AAEA,QAAO,OAAA,IAAA,CAAK,aAAa,YAAY,CAAA;AAAA,OACtC,CAAA;AAGD,MAAM,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAEzB,MAAA,KAAA,CAAM,wBAAwB,CAAA;AAAA,aACvB,KAAO,EAAA;AACd,MAAA,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAAA,KAC/C,SAAA;AACA,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA;AAC7B;AAEJ,CAAA;AC/qBO,IAAM,sBAAsB,YAAY;AAE7C,EAAO,OAAA,MAAMK,+BAAc,IAAK,CAAA;AAAA,IAC9B,MAAQ,EAAA;AAAA,GACT,CAAA,CACE,IAAK,CAAA,CAAC,EAAO,KAAA;AAEZ,IAAA,OAAO,GAAG,GAAI,EAAA;AAAA,GACf,CAAA,CACA,IAAK,CAAA,CAAC,MAAW,KAAA;AAChB,IAAA,OAAO,MAAO,CAAA,SAAA;AAAA,GACf,CAAA;AACL,CAAA;;;AC3DO,IAAM,qBAAN,MAAyB;AAAA,EACtB,cAAA;AAAA,EACA,kBAAoC,GAAA,IAAA;AAAA,EACpC,iBAAoB,GAAA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5B,YAAY,cAAgC,EAAA;AAC1C,IAAA,IAAA,CAAK,cAAiB,GAAA,cAAA;AAGtB,IAAA,IAAA,CAAK,cAAe,EAAA;AAAA;AACtB;AAAA;AAAA;AAAA,EAKQ,cAAuB,GAAA;AAC7B,IAAM,MAAA,iBAAA,GAAoB,KAAK,oBAAqB,EAAA;AACpD,IAAM,MAAA,iBAAA,GAAoB,IAAK,CAAA,cAAA,CAAe,OAAQ,CAAA;AAAA,MACpD,KAAKJ,0BAAY,CAAA;AAAA,KAClB,CAAA;AAID,IAAA,IAAA,CAAK,iBAAoB,GAAA,CAAC,EACxB,iBAAA,IACA,qBACA,iBAAsB,KAAA,iBAAA,CAAA;AAGxB,IAAA,IAAI,KAAK,iBAAmB,EAAA;AAC1B,MAAQ,OAAA,CAAA,KAAA;AAAA,QACN;AAAA,OACF;AAAA;AACF;AACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,mBAAuC,GAAA;AAClD,IAAA,OAAO,mBAAoB,EAAA;AAAA;AAC7B;AAAA;AAAA;AAAA;AAAA,EAMO,iBAAiB,WAA2B,EAAA;AACjD,IAAM,MAAA,mBAAA,GAAsB,KAAK,oBAAqB,EAAA;AACtD,IAAA,MAAM,mBAAmB,WAAgB,KAAA,mBAAA;AAEzC,IAAA,IAAA,CAAK,kBAAqB,GAAA,WAAA;AAC1B,IAAA,IAAA,CAAK,eAAe,OAAQ,CAAA;AAAA,MAC1B,KAAKA,0BAAY,CAAA,OAAA;AAAA,MACjB,KAAO,EAAA;AAAA,KACR,CAAA;AAGD,IAAA,IAAI,gBAAkB,EAAA;AACpB,MAAA,IAAA,CAAK,iBAAoB,GAAA,KAAA;AAEzB,MAAA,IAAA,CAAK,eAAe,UAAW,CAAA,EAAE,GAAKA,EAAAA,0BAAAA,CAAY,gBAAgB,CAAA;AAAA;AACpE;AACF;AAAA;AAAA;AAAA;AAAA,EAMO,oBAAsC,GAAA;AAC3C,IAAA,OAAO,KAAK,cAAe,CAAA,OAAA,CAAQ,EAAE,GAAKA,EAAAA,0BAAAA,CAAY,SAAS,CAAA;AAAA;AACjE;AAAA;AAAA;AAAA;AAAA,EAMO,eAAe,WAA2B,EAAA;AAG/C,IAAM,MAAA,iBAAA,GAAoB,KAAK,oBAAqB,EAAA;AACpD,IAAM,MAAA,iBAAA,GAAoB,IAAK,CAAA,cAAA,CAAe,OAAQ,CAAA;AAAA,MACpD,KAAKA,0BAAY,CAAA;AAAA,KAClB,CAAA;AAED,IAAA,IAAA,CAAK,kBAAqB,GAAA,WAAA;AAK1B,IAAA,IAAI,gBAAgB,iBAAmB,EAAA;AACrC,MAAA,IAAA,CAAK,iBAAoB,GAAA,KAAA;AAAA,KAEzB,MAAA,IAAA,iBAAA,IACA,iBACA,IAAA,iBAAA,KAAsB,iBACtB,EAAA;AAEA,MAAA,IAAA,CAAK,iBAAoB,GAAA,IAAA;AAAA;AAC3B;AACF;AAAA;AAAA;AAAA;AAAA,EAMO,cAAgC,GAAA;AACrC,IAAA,OAAO,IAAK,CAAA,kBAAA;AAAA;AACd;AAAA;AAAA;AAAA;AAAA,EAMO,SAAqB,GAAA;AAE1B,IAAA,IAAA,CAAK,cAAe,EAAA;AACpB,IAAA,OAAO,CAAC,IAAA,CAAK,iBAAqB,IAAA,IAAA,CAAK,kBAAuB,KAAA,IAAA;AAAA;AAElE,CAAA;AC1HO,IAAM,iBAAN,MAAqB;AAAA,EAClB,cAAA;AAAA,EACA,YAA8B,GAAA,IAAA;AAAA,EAC9B,UAAA;AAAA,EACA,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASR,WAAY,CAAA,cAAA,EAAgC,UAAa,GAAA,CAAA,EAAG,YAAY,EAAI,EAAA;AAC1E,IAAA,IAAA,CAAK,cAAiB,GAAA,cAAA;AACtB,IAAA,IAAA,CAAK,UAAa,GAAA,UAAA;AAClB,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAAA;AACnB;AAAA;AAAA;AAAA;AAAA,EAMO,aAAa,SAAyB,EAAA;AAC3C,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAAA;AACnB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,WAA6B,GAAA;AACxC,IAAI,IAAA;AAEF,MAAM,MAAA,OAAA,GAAU,KAAK,eAAgB,EAAA;AACrC,MAAA,IAAI,OAAS,EAAA;AACX,QAAA,KAAA,CAAM,0BAA0B,OAAO,CAAA;AACvC,QAAA;AAAA;AAIF,MAAK,IAAA,CAAA,YAAA,GAAe,MAAM,IAAA,CAAK,aAAc,EAAA;AAC7C,MAAM,KAAA,CAAA,qBAAA,EAAuB,KAAK,YAAY,CAAA;AAAA,aACvC,KAAgB,EAAA;AAEvB,MAAA,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA;AAC3C;AACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,aAAwC,GAAA;AACnD,IAAI,IAAA,CAAC,KAAK,SAAW,EAAA;AACnB,MAAM,MAAA,IAAI,MAAM,2CAA2C,CAAA;AAAA;AAI7D,IAAA,MAAM,cAEF,GAAA;AAAA,MACF,YAAY,IAAK,CAAA;AAAA,KACnB;AAGA,IAAI,IAAA;AAEF,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACrB,YAAY;AACV,UAAM,MAAA,eAAA,GAAkB,MAAMK,uBAAc,CAAA;AAAA,YAC1C,OAAS,EAAA;AAAA,WACV,CAAA;AACD,UAAO,OAAA,eAAA;AAAA,SACT;AAAA,QACA,IAAK,CAAA;AAAA,OACP;AAEA,MAAA,KAAA,CAAM,sCAAsC,QAAQ,CAAA;AAGpD,MAAM,MAAA,EAAE,aAAe,EAAA,YAAA,EAAiB,GAAA,QAAA;AAGxC,MAAA,IAAI,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAU,EAAA;AACrD,QAAA,KAAA,CAAM,kCAAkC,YAAY,CAAA;AACpD,QAAO,OAAA,IAAA;AAAA;AAGT,MAAA,KAAA,CAAM,sCAAsC,YAAY,CAAA;AAGxD,MAAA,IAAA,CAAK,eAAe,OAAQ,CAAA;AAAA,QAC1B,KAAKL,0BAAY,CAAA,OAAA;AAAA,QACjB,KAAO,EAAA;AAAA,OACR,CAAA;AACD,MAAA,IAAA,CAAK,gBAAgB,YAAY,CAAA;AAEjC,MAAO,OAAA,YAAA;AAAA,aACA,KAAgB,EAAA;AACvB,MAAA,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAC/C,MAAO,OAAA,IAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA;AAAA,EAMO,eAAiC,GAAA;AAEtC,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAM,KAAA,CAAA,kCAAA,EAAoC,KAAK,YAAY,CAAA;AAC3D,MAAA,OAAO,IAAK,CAAA,YAAA;AAAA;AAId,IAAI,IAAA;AACF,MAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,cAAA,CAAe,OAAQ,CAAA;AAAA,QAChD,KAAKA,0BAAY,CAAA;AAAA,OAClB,CAAA;AAED,MAAA,KAAA,CAAM,yCAAyC,aAAa,CAAA;AAE5D,MAAA,IAAA,CAAK,YAAe,GAAA,aAAA;AACpB,MAAO,OAAA,aAAA;AAAA,aACA,KAAgB,EAAA;AACvB,MAAA,KAAA,CAAM,gDAAgD,KAAK,CAAA;AAE3D,MAAO,OAAA,IAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA;AAAA,EAMO,gBAAgB,YAAmC,EAAA;AACxD,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA;AAAA;AAExB,CAAA;;;ACjIO,IAAM,aAAA,GAAN,MAAM,cAAc,CAAA;AAAA,EACzB,OAAe,QAAiC,GAAA,IAAA;AAAA,EACtC,MAAA;AAAA,EACA,YAA8B,GAAA,IAAA;AAAA,EAC9B,WAA6B,GAAA,IAAA;AAAA,EAC/B,WAAc,GAAA,KAAA;AAAA,EACd,WAA6B,GAAA,IAAA;AAAA,EAC7B,oBAAA;AAAA;AAAA,EAGA,qBAAA;AAAA,EACA,qBAAA;AAAA;AAAA,EAGA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,YAAA;AAAA,EAEA,YAAY,MAAyB,EAAA;AAE3C,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAGd,IAAK,IAAA,CAAA,cAAA,GAAiB,IAAIM,6BAAe,EAAA;AACzC,IAAA,IAAA,CAAK,kBAAqB,GAAA,IAAI,kBAAmB,CAAA,IAAA,CAAK,cAAc,CAAA;AAEpE,IAAA,IAAA,CAAK,iBAAiB,IAAI,cAAA;AAAA,MACxB,IAAK,CAAA,cAAA;AAAA,MACL,cAAe,CAAA,cAAA;AAAA,MACf,KAAK,MAAO,CAAA;AAAA,KACd;AAGA,IAAA,IAAA,CAAK,kBAAqB,GAAA,IAAI,kBAAmB,CAAA,IAAA,CAAK,cAAc,CAAA;AAEpE,IAAA,IAAA,CAAK,eAAe,IAAI,YAAA;AAAA,MACtB,IAAK,CAAA,cAAA;AAAA,MACL,IAAK,CAAA,cAAA;AAAA,MACL,IAAK,CAAA,kBAAA;AAAA,MACL,KAAK,MAAO,CAAA,SAAA;AAAA,MACZ,cAAe,CAAA,cAAA;AAAA,MACf,IAAK,CAAA;AAAA,KACP;AAGA,IAAA,IAAA,CAAK,qBAAwB,GAAA,IAAI,OAAc,CAAA,CAAC,OAAY,KAAA;AAC1D,MAAA,IAAA,CAAK,qBAAwB,GAAA,OAAA;AAAA,KAC9B,CAAA;AAAA;AACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,WAA6B,GAAA;AACzC,IAAI,IAAA,CAAC,eAAc,QAAU,EAAA;AAC3B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAEF,IAAA,OAAO,cAAc,CAAA,QAAA;AAAA;AACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,eAAe,MAAwC,EAAA;AAEnE,IAAMC,MAAAA,SAAAA,GAAW,IAAI,cAAA,CAAc,MAAM,CAAA;AACzC,IAAA,cAAA,CAAc,QAAWA,GAAAA,SAAAA;AAGzB,IAAAA,UAAS,WAAc,GAAA,IAAA;AACvB,IAAAA,SAAAA,CAAS,eAAe,MAAM,CAAA;AAE9B,IAAOA,OAAAA,SAAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA,EAMA,OAAc,aAAsB,GAAA;AAClC,IAAA,cAAA,CAAc,QAAW,GAAA,IAAA;AAAA;AAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAe,MAA+B,EAAA;AAEpD,IAAI,IAAA,CAAC,OAAO,SAAW,EAAA;AACrB,MAAM,MAAA,IAAI,MAAM,4CAA4C,CAAA;AAAA;AAG9D,IAAA,KAAA,CAAM,kCAAkC,CAAA;AAGxC,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAEd,IAAM,KAAA,CAAA,oCAAA,EAAsC,KAAK,MAAM,CAAA;AAGvD,IAAA,IAAA,CAAK,kBAAqB,GAAA,IAAI,kBAAmB,CAAA,IAAA,CAAK,cAAc,CAAA;AAGpE,IAAA,YAAA,CAAa,CAAC,CAAC,IAAK,CAAA,MAAA,CAAO,KAAK,CAAA;AAGhC,IAAA,IAAA,CAAK,YAAa,CAAA,YAAA,CAAa,IAAK,CAAA,MAAA,CAAO,SAAS,CAAA;AAGpD,IAAMC,sBAAA,CAAA,QAAA,CAAS,UAAU,cAAe,CAAA,YAAA;AAGxC,IAAK,IAAA,CAAA,WAAA,GAAc,KAAK,oBAAqB,EAAA;AAC7C,IAAM,KAAA,CAAA,+BAAA,EAAiC,KAAK,WAAW,CAAA;AAEvD,IAAI,IAAA,IAAA,CAAK,gBAAgB,IAAM,EAAA;AAC7B,MAAA,KAAA,CAAM,mDAAmD,CAAA;AACzD,MAAA,IAAA,CAAK,mBAAoB,EAAA,CACtB,IAAK,CAAA,CAAC,WAAgB,KAAA;AACrB,QAAA,IAAA,CAAK,iBAAiB,WAAW,CAAA;AACjC,QAAM,KAAA,CAAA,uCAAA,EAAyC,KAAK,WAAW,CAAA;AAAA,OAChE,CAAA,CACA,KAAM,CAAA,CAAC,KAAU,KAAA;AAChB,QAAA,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,OAC7C,CAAA;AAAA,KACE,MAAA;AACL,MAAM,KAAA,CAAA,oCAAA,EAAsC,KAAK,WAAW,CAAA;AAAA;AAI9D,IAAA,IAAI,KAAK,WAAa,EAAA;AACpB,MAAK,IAAA,CAAA,kBAAA,CAAmB,cAAe,CAAA,IAAA,CAAK,WAAW,CAAA;AACvD,MAAM,KAAA,CAAA,6BAAA,EAA+B,KAAK,WAAW,CAAA;AAAA;AAIvD,IAAA,KAAK,IAAK,CAAA,WAAA,EACP,CAAA,IAAA,CAAK,MAAM;AAEV,MAAM,MAAA,YAAA,GAAe,IAAK,CAAA,cAAA,CAAe,eAAgB,EAAA;AACzD,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,KAAA,CAAM,qCAAqC,YAAY,CAAA;AAKvD,QAAA,KAAA,CAAM,sDAAsD,CAAA;AAG5D,QAAA,IAAI,KAAK,qBAAuB,EAAA;AAC9B,UAAA,IAAA,CAAK,qBAAsB,EAAA;AAAA;AAC7B,OACK,MAAA;AACL,QAAA,KAAA;AAAA,UACE;AAAA,SACF;AAIA,QAAA,IAAI,KAAK,qBAAuB,EAAA;AAG9B,UAAA,IAAA,CAAK,qBAAsB,EAAA;AAAA;AAC7B;AACF,KACD,CAAA,CACA,KAAM,CAAA,CAAC,KAAU,KAAA;AAChB,MAAA,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAI1C,MAAA,IAAI,KAAK,qBAAuB,EAAA;AAC9B,QAAA,IAAA,CAAK,qBAAsB,EAAA;AAAA;AAC7B,KACD,CAAA;AAGH,IAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AACjC,MAAK,IAAA,CAAA,WAAA,GAAc,OAAO,QAAS,CAAA,IAAA;AAAA;AAIrC,IAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAEjC,MAAA,IAAA,CAAK,uBAAwB,EAAA;AAG7B,MAAO,MAAA,CAAA,gBAAA,CAAiB,gBAAgB,MAAM;AAC5C,QAAA,IAAA,CAAK,sBAAuB,EAAA;AAE5B,QAAK,KAAA,IAAA,CAAK,aAAa,oBAAqB,EAAA;AAAA,OAC7C,CAAA;AAAA;AAIH,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AAEnC,MAAS,QAAA,CAAA,gBAAA,CAAiB,oBAAoB,MAAM;AAClD,QAAI,IAAA,QAAA,CAAS,oBAAoB,QAAU,EAAA;AAEzC,UAAK,KAAA,IAAA,CAAK,aAAa,oBAAqB,EAAA;AAAA;AAC9C,OACD,CAAA;AAGD,MAAO,MAAA,CAAA,gBAAA,CAAiB,UAAU,MAAM;AACtC,QAAK,KAAA,IAAA,CAAK,aAAa,oBAAqB,EAAA;AAAA,OAC7C,CAAA;AAAA;AACH;AACF;AAAA;AAAA;AAAA;AAAA,EAMO,oBAAoB,MAA+B,EAAA;AACxD,IAAA,IAAI,KAAK,WAAa,EAAA;AACpB,MAAA,KAAA,CAAM,+BAA+B,CAAA;AACrC,MAAA;AAAA;AAGF,IAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAC1B,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AAAA;AACrB;AAAA;AAAA;AAAA,EAKQ,uBAAgC,GAAA;AACtC,IAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAGnC,IAAO,MAAA,CAAA,gBAAA,CAAiB,YAAc,EAAA,IAAA,CAAK,oBAAoB,CAAA;AAG/D,IAAO,MAAA,CAAA,gBAAA,CAAiB,UAAY,EAAA,IAAA,CAAK,oBAAoB,CAAA;AAG7D,IAAA,IAAA,CAAK,oBAAuB,GAAA,MAAA,CAAO,WAAY,CAAA,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA;AACzE;AAAA;AAAA;AAAA,EAKQ,sBAA+B,GAAA;AACrC,IAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAGnC,IAAO,MAAA,CAAA,mBAAA,CAAoB,YAAc,EAAA,IAAA,CAAK,oBAAoB,CAAA;AAClE,IAAO,MAAA,CAAA,mBAAA,CAAoB,UAAY,EAAA,IAAA,CAAK,oBAAoB,CAAA;AAGhE,IAAI,IAAA,IAAA,CAAK,yBAAyB,MAAW,EAAA;AAC3C,MAAO,MAAA,CAAA,aAAA,CAAc,KAAK,oBAAoB,CAAA;AAC9C,MAAA,IAAA,CAAK,oBAAuB,GAAA,MAAA;AAAA;AAC9B;AACF;AAAA;AAAA;AAAA,EAKQ,uBAAuB,MAAY;AACzC,IAAA,IAAA,CAAK,eAAgB,EAAA;AAAA,GACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,MAAY;AACnC,IAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAEnC,IAAM,MAAA,UAAA,GAAa,OAAO,QAAS,CAAA,IAAA;AACnC,IAAI,IAAA,UAAA,KAAe,KAAK,WAAa,EAAA;AACnC,MAAA,IAAA,CAAK,eAAgB,EAAA;AAAA;AACvB,GACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAwB,GAAA;AAC9B,IAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAEnC,IAAM,MAAA,UAAA,GAAa,OAAO,QAAS,CAAA,IAAA;AAGnC,IAAI,IAAA,UAAA,KAAe,KAAK,WAAa,EAAA;AAEnC,MAAA,IAAA,CAAK,WAAc,GAAA,UAAA;AAGnB,MAAA,IAAA,CAAK,kBAAmB,EAAA;AAAA;AAC1B;AACF,EAEA,MAAgB,WAA6B,GAAA;AAC3C,IAAI,IAAA;AAEF,MAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,cAAA,CAAe,eAAgB,EAAA;AAE1D,MAAA,IAAI,aAAe,EAAA;AACjB,QAAA,KAAA,CAAM,iCAAiC,aAAa,CAAA;AACpD,QAAA,IAAA,CAAK,YAAe,GAAA,aAAA;AACpB,QAAA;AAAA;AAIF,MAAM,MAAA,IAAA,CAAK,eAAe,WAAY,EAAA;AACtC,MAAK,IAAA,CAAA,YAAA,GAAe,IAAK,CAAA,cAAA,CAAe,eAAgB,EAAA;AAExD,MAAA,IAAI,KAAK,YAAc,EAAA;AACrB,QAAM,KAAA,CAAA,mCAAA,EAAqC,KAAK,YAAY,CAAA;AAAA,OACvD,MAAA;AACL,QAAA,KAAA;AAAA,UACE;AAAA,SACF;AAAA;AACF,aACO,KAAO,EAAA;AACd,MAAA,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA;AAErD;AACF,EAEO,eAAiC,GAAA;AAEtC,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAA,OAAO,IAAK,CAAA,YAAA;AAAA;AAId,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,cAAA,CAAe,eAAgB,EAAA;AAGlD,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,IAAA,CAAK,YAAe,GAAA,KAAA;AAAA;AAGtB,IAAO,OAAA,KAAA;AAAA;AACT,EAEA,MAAgB,aAAwC,GAAA;AACtD,IAAO,OAAA,IAAA,CAAK,eAAe,aAAc,EAAA;AAAA;AAC3C,EAEA,MAAgB,mBAAuC,GAAA;AACrD,IAAO,OAAA,IAAA,CAAK,mBAAmB,mBAAoB,EAAA;AAAA;AACrD,EAEU,iBAAiB,WAA2B,EAAA;AACpD,IAAK,IAAA,CAAA,kBAAA,CAAmB,iBAAiB,WAAW,CAAA;AAAA;AACtD,EAEU,oBAAsC,GAAA;AAC9C,IAAO,OAAA,IAAA,CAAK,mBAAmB,oBAAqB,EAAA;AAAA;AACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,kBAA6C,GAAA;AAGlD,IAAM,MAAA,WAAA,GAAc,IAAK,CAAA,kBAAA,CAAmB,uBAAwB,EAAA;AACpE,IAAA,KAAA,CAAM,6CAA6C,WAAW,CAAA;AAC9D,IAAO,OAAA,WAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,cAAyC,GAAA;AAE9C,IAAO,OAAA,IAAA,CAAK,mBAAmB,uBAAwB,EAAA;AAAA;AACzD,EAEO,oBAAoB,KAAqC,EAAA;AAC9D,IAAO,OAAA,IAAA,CAAK,YAAa,CAAA,UAAA,CAAW,KAAK,CAAA;AAAA;AAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,qBAAqB,IAAoC,EAAA;AAG9D,IAAO,OAAA,IAAA,CAAK,aAAa,oBAAqB,CAAA;AAAA,MAC5C,YAAY,IAAK,CAAA,UAAA;AAAA,MACjB,QAAU,EAAA;AAAA,QACR,UAAY,EAAA,EAAA;AAAA;AAAA,QACZ,aAAe,EAAA;AAAA;AAAA;AACjB,KACD,CAAA;AAAA;AACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,yBAAyB,IAEpB,EAAA;AAGhB,IAAO,OAAA,IAAA,CAAK,aAAa,wBAAyB,CAAA;AAAA,MAChD,YAAY,IAAK,CAAA,UAAA;AAAA,MACjB,QAAU,EAAA;AAAA,QACR,UAAY,EAAA,EAAA;AAAA;AAAA,QACZ,aAAe,EAAA;AAAA;AAAA;AACjB,KACD,CAAA;AAAA;AACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WAAY,CAAA,IAAA,GAAO,IAAM,EAAA,SAAA,GAAY,GAAqB,EAAA;AAC/D,IAAA,OAAO,IAAK,CAAA,YAAA,CAAa,UAAW,CAAA,IAAA,EAAM,SAAS,CAAA;AAAA;AACrD;AAAA;AAAA;AAAA;AAAA,EAMO,qBAAuC,GAAA;AAC5C,IAAO,OAAA,IAAA,CAAK,aAAa,oBAAqB,EAAA;AAAA;AAChD,EAEU,SAAoB,GAAA;AAC5B,IAAO,OAAA,IAAA,CAAK,aAAa,SAAU,EAAA;AAAA;AACrC,EAEU,KAAA,CAAM,YAAoB,IAAuB,EAAA;AACzD,IAAM,KAAA,CAAA,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA;AACxB,EAEA,MAAgB,KAAA,CACd,EACA,EAAA,QAAA,EACA,QAAQ,GACI,EAAA;AACZ,IAAO,OAAA,KAAA,CAAM,EAAI,EAAA,QAAA,EAAU,KAAK,CAAA;AAAA;AAClC,EAEO,KAAc,GAAA;AAEnB,IAAA,IAAA,CAAK,sBAAuB,EAAA;AAE5B,IAAA,MAAA,CAAO,MAAOT,CAAAA,2BAAY,CAAE,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AAC3C,MAAA,IAAA,CAAK,cAAe,CAAA,UAAA,CAAW,EAAE,GAAA,EAAK,KAAK,CAAA;AAAA,KAC5C,CAAA;AAED,IAAA,MAAA,CAAO,MAAOC,CAAAA,0BAAW,CAAE,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AAC1C,MAAA,IAAA,CAAK,cAAe,CAAA,UAAA,CAAW,EAAE,GAAA,EAAK,KAAK,CAAA;AAAA,KAC5C,CAAA;AAGD,IAAA,IAAI,KAAK,WAAa,EAAA;AACpB,MAAK,IAAA,CAAA,kBAAA,CAAmB,eAAe,EAAE,CAAA;AAAA;AAE3C,IAAK,IAAA,CAAA,cAAA,CAAe,gBAAgB,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AACnB,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AAAA;AACrB;AAAA;AAAA;AAAA;AAAA,EAMO,wBAA0C,GAAA;AAC/C,IAAA,OAAO,IAAK,CAAA,qBAAA;AAAA;AAEhB,CAAA;;;AC5fA,IAAI,QAAiC,GAAA,IAAA;AAOrC,SAAS,WAA6B,GAAA;AACpC,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAI,IAAA;AACF,MAAA,QAAA,GAAW,cAAc,WAAY,EAAA;AAAA,aAC9B,KAAO,EAAA;AAEd,MAAQ,OAAA,CAAA,KAAA,CAAM,oBAAoB,KAAK,CAAA;AACvC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AACF;AAEF,EAAO,OAAA,QAAA;AACT;AAOO,SAAS,oBAAoB,MAAwC,EAAA;AAE1E,EAAM,KAAA,EAAA;AAGN,EAAW,QAAA,GAAA,aAAA,CAAc,eAAe,MAAM,CAAA;AAG9C,EAAA,OAAO,SAAS,wBAAyB,EAAA;AAC3C;AASO,SAAS,oBAAoB,KAAqC,EAAA;AACvE,EAAO,OAAA,WAAA,EAAc,CAAA,mBAAA,CAAoB,KAAK,CAAA;AAChD;AAOO,SAAS,qBAAqB,IAAoC,EAAA;AACvE,EAAO,OAAA,WAAA,EAAc,CAAA,oBAAA,CAAqB,IAAI,CAAA;AAChD;AAOO,SAAS,yBAAyB,IAEvB,EAAA;AAChB,EAAO,OAAA,WAAA,EAAc,CAAA,wBAAA,CAAyB,IAAI,CAAA;AACpD;AAKO,SAAS,KAAc,GAAA;AAC5B,EAAA,IAAI,QAAU,EAAA;AACZ,IAAA,QAAA,CAAS,KAAM,EAAA;AACf,IAAW,QAAA,GAAA,IAAA;AAAA;AAGb,EAAA,aAAA,CAAc,aAAc,EAAA;AAC9B;AAEO,SAAS,eAA0B,GAAA;AACxC,EAAI,IAAA;AACF,IAAA,MAAM,oBAAoB,WAAY,EAAA;AACtC,IAAM,MAAA,YAAA,GAAe,kBAAkB,eAAgB,EAAA;AAEvD,IAAA,IAAI,CAAC,YAAc,EAAA;AAEjB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAKF;AAAA;AAEF,IAAO,OAAA,YAAA;AAAA,WACA,KAAO,EAAA;AAEd,IAAA,IACE,iBAAiB,KACjB,IAAA,KAAA,CAAM,OAAQ,CAAA,QAAA,CAAS,2BAA2B,CAClD,EAAA;AACA,MAAQ,OAAA,CAAA,KAAA;AAAA,QACN;AAAA,OACF;AAAA,KACK,MAAA;AACL,MAAQ,OAAA,CAAA,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA;AAExD,IAAM,MAAA,KAAA;AAAA;AAEV;AAEO,SAAS,cAAyC,GAAA;AACvD,EAAO,OAAA,WAAA,GAAc,cAAe,EAAA;AACtC;AAMO,SAAS,eAA2B,GAAA;AACzC,EAAI,IAAA;AACF,IAAA,MAAM,oBAAoB,WAAY,EAAA;AACtC,IAAM,MAAA,YAAA,GAAe,kBAAkB,eAAgB,EAAA;AACvD,IAAA,OAAO,CAAC,CAAC,YAAA;AAAA,GACH,CAAA,MAAA;AACN,IAAO,OAAA,KAAA;AAAA;AAEX;AAMO,SAAS,mBAAqC,GAAA;AACnD,EAAI,IAAA;AACF,IAAA,MAAM,oBAAoB,WAAY,EAAA;AACtC,IAAA,OAAO,kBAAkB,eAAgB,EAAA;AAAA,GACnC,CAAA,MAAA;AACN,IAAO,OAAA,IAAA;AAAA;AAEX;AAQO,SAAS,WAAY,CAAA,IAAA,GAAO,IAAM,EAAA,SAAA,GAAY,GAAqB,EAAA;AACxE,EAAA,OAAO,WAAY,EAAA,CAAE,WAAY,CAAA,IAAA,EAAM,SAAS,CAAA;AAClD;AAMO,SAAS,qBAAuC,GAAA;AACrD,EAAO,OAAA,WAAA,GAAc,qBAAsB,EAAA;AAC7C","file":"index.cjs","sourcesContent":["/**\n * Configuration utilities for the FairShare SDK\n */\n\n/**\n * Default API endpoint\n */\nexport const DEFAULT_API_ENDPOINT = \"https://api.fluid.app\";\n\n/**\n * Get the API endpoint\n * @returns The API endpoint URL\n */\nexport const getApiEndpoint = (): string => {\n  return DEFAULT_API_ENDPOINT;\n};\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG = {\n  API_ENDPOINT: DEFAULT_API_ENDPOINT,\n  RETRY_ATTEMPTS: 3,\n  ATTRIBUTION_WINDOW: 30, // days\n  ATTRIBUTION_MODEL: \"last-touch\" as const,\n  SHARE_TOKEN_PARAM: \"share_token\",\n};\n","/**\n * Whether debug mode is enabled\n */\nlet debugEnabled = false;\n\n/**\n * Log a debug message if debug mode is enabled\n * @param message The message to log\n * @param args Additional arguments to log\n */\nexport function debug(message: string, ...args: unknown[]): void {\n  if (debugEnabled && typeof console !== \"undefined\") {\n    console.log(`[FairShare]`, message, ...args);\n  }\n}\n\n/**\n * Set debug mode\n * @param enabled Whether debug mode is enabled\n */\nexport function setDebugMode(enabled: boolean): void {\n  debugEnabled = enabled;\n}\n\n/**\n * Get current debug mode state\n * @returns Whether debug mode is enabled\n */\nexport function isDebugMode(): boolean {\n  return debugEnabled;\n}\n","import { debug } from \"./debug\";\n\n/**\n * Retry a function multiple times with exponential backoff\n * @param fn The function to retry\n * @param attempts The number of attempts to make\n * @param delay The initial delay in milliseconds\n * @returns A promise that resolves with the result of the function\n */\nexport async function retry<T>(\n  fn: () => Promise<T>,\n  attempts: number,\n  delay = 1000,\n): Promise<T> {\n  try {\n    return await fn();\n  } catch (error) {\n    if (attempts <= 1) {\n      throw error;\n    }\n\n    // Calculate backoff with jitter\n    const jitter = Math.random() * 0.3 + 0.85; // 0.85-1.15\n    const backoff = Math.min(delay * jitter, 30000); // Cap at 30 seconds\n\n    debug(`Retrying after ${backoff}ms, ${attempts - 1} attempts left`);\n\n    // Wait for the backoff period\n    await new Promise((resolve) => setTimeout(resolve, backoff));\n\n    // Retry with one less attempt and increased delay\n    return retry(fn, attempts - 1, delay * 2);\n  }\n}\n","import type { AttributionData } from \"@fluid-app/api-client\";\nimport type { StorageManager } from \"@fluid-app/storage-manager\";\nimport { COOKIE_KEYS, STORAGE_KEYS } from \"@fluid-app/storage-manager\";\n\nimport { debug } from \"../utils/debug\";\n\n// ServerAttributionData is now the same as AttributionData from API client\n\n/**\n * Interface for attribution override configuration\n * This allows setting attribution that overrides server-calculated attribution\n */\nexport interface AttributionOverride {\n  attribution?: AttributionData;\n}\n\n/**\n * Attribution manager that handles attribution from settings API\n * and supports attribution overrides with priority handling\n */\nexport class AttributionManager {\n  private storageManager: StorageManager;\n  private urlAttributionCache = new Map<string, AttributionData | null>();\n  private static TTL = 60 * 60 * 1000; // 1 hour in ms\n\n  constructor(storageManager: StorageManager) {\n    this.storageManager = storageManager;\n  }\n\n  // Helper to generate a cache key for a URL\n  private getCacheKey(url: string): string {\n    try {\n      const parsedUrl = new URL(url);\n      return `${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`;\n    } catch {\n      return url;\n    }\n  }\n\n  // Get the persistent cache object\n  private getPersistentCache(): Record<\n    string,\n    { attribution: AttributionData; timestamp: number; url: string }\n  > {\n    return (\n      this.storageManager.getObject({ key: STORAGE_KEYS.ATTRIBUTION_CACHE }) ??\n      {}\n    );\n  }\n\n  // Save the persistent cache object\n  private setPersistentCache(\n    cache: Record<\n      string,\n      { attribution: AttributionData; timestamp: number; url: string }\n    >,\n  ): void {\n    this.storageManager.setObject({\n      key: STORAGE_KEYS.ATTRIBUTION_CACHE,\n      value: cache,\n    });\n  }\n\n  // Check if a cached entry is still valid\n  private isCacheValid(entry: {\n    attribution: AttributionData;\n    timestamp: number;\n    url: string;\n  }): boolean {\n    return Date.now() - entry.timestamp < AttributionManager.TTL;\n  }\n\n  /**\n   * Store attribution data from settings API response\n   * @param url The URL this attribution data is for\n   * @param attribution Attribution data from settings API (API client format)\n   */\n  public storeServerAttribution(\n    url: string,\n    attribution: AttributionData | null,\n  ): void {\n    debug(\n      \"AttributionManager: Storing server attribution for URL:\",\n      url,\n      attribution,\n    );\n\n    this.urlAttributionCache.set(url, attribution);\n    const cacheKey = this.getCacheKey(url);\n    const cache = this.getPersistentCache();\n    if (attribution) {\n      cache[cacheKey] = {\n        attribution,\n        timestamp: Date.now(),\n        url,\n      };\n    } else {\n      delete cache[cacheKey];\n    }\n    this.setPersistentCache(cache);\n  }\n\n  /**\n   * Get effective attribution data respecting priority:\n   * 1. Attribution override (highest priority)\n   * 2. Server-calculated attribution\n   * 3. Fallback (null)\n   */\n  public getEffectiveAttribution({\n    url,\n    useCachedAttribution = false,\n  }: {\n    url?: string;\n    useCachedAttribution?: boolean;\n  } = {}): AttributionData | null {\n    debug(\"AttributionManager: Getting effective attribution for URL:\", url);\n\n    // 1. Check for attribution override (highest priority)\n    const attributionOverride = this.getAttributionOverride();\n    if (attributionOverride) {\n      debug(\n        \"AttributionManager: Using attribution override:\",\n        attributionOverride,\n      );\n      return attributionOverride;\n    }\n\n    // 2. Check for server-calculated attribution\n    const serverAttribution = this.getServerAttribution(url);\n    if (serverAttribution) {\n      debug(\n        \"AttributionManager: Using server-calculated attribution:\",\n        serverAttribution,\n      );\n      return serverAttribution;\n    }\n\n    if (useCachedAttribution) {\n      // 3. Check for affiliate cookie\n      const affiliate = this.storageManager.getObject<{\n        fluid_rep_id?: number;\n      }>({\n        key: COOKIE_KEYS.AFFILIATE,\n      });\n\n      if (affiliate?.fluid_rep_id) {\n        debug(\"AttributionManager: Using affiliate:\", affiliate.fluid_rep_id);\n        return {\n          fluid_rep_id: affiliate.fluid_rep_id,\n        };\n      }\n    }\n\n    // 4. No attribution available\n    debug(\"AttributionManager: No attribution available\");\n    return null;\n  }\n\n  /**\n   * Get server-calculated attribution for the current or specified URL\n   */\n  public getServerAttribution(url?: string): AttributionData | null {\n    const currentUrl =\n      url ?? (typeof window !== \"undefined\" ? window.location.pathname : \"\");\n\n    // Check in-memory cache first\n    const cached = this.urlAttributionCache.get(currentUrl);\n    if (cached !== undefined) {\n      return cached;\n    }\n\n    // Check persistent cache\n    const cacheKey = this.getCacheKey(currentUrl);\n    const cache = this.getPersistentCache();\n    const entry = cache[cacheKey];\n    if (entry && this.isCacheValid(entry)) {\n      // Update in-memory cache for future fast access\n      this.urlAttributionCache.set(currentUrl, entry.attribution);\n      return entry.attribution;\n    } else if (entry) {\n      // Expired, remove from persistent cache\n      delete cache[cacheKey];\n      this.setPersistentCache(cache);\n    }\n    return null;\n  }\n\n  /**\n   * Set attribution override that overrides server-calculated attribution\n   */\n  public setAttributionOverride(\n    attributionOverride: AttributionOverride,\n  ): void {\n    debug(\"Setting attribution override:\", attributionOverride);\n    const storedOverrides =\n      this.storageManager.getObject<{\n        attributionOverride?: AttributionOverride;\n      }>({ key: STORAGE_KEYS.SETTINGS_OVERRIDE }) ?? {};\n    storedOverrides.attributionOverride = attributionOverride;\n    this.storageManager.setObject({\n      key: STORAGE_KEYS.SETTINGS_OVERRIDE,\n      value: storedOverrides,\n    });\n  }\n\n  /**\n   * Clear attribution override, falling back to server-calculated attribution\n   */\n  public clearAttributionOverride(): void {\n    debug(\"Clearing attribution override\");\n    const storedOverrides =\n      this.storageManager.getObject<{\n        attributionOverride?: AttributionOverride;\n      }>({ key: STORAGE_KEYS.SETTINGS_OVERRIDE }) ?? {};\n    delete storedOverrides.attributionOverride;\n    this.storageManager.setObject({\n      key: STORAGE_KEYS.SETTINGS_OVERRIDE,\n      value: storedOverrides,\n    });\n  }\n\n  /**\n   * Get attribution override if set\n   */\n  public getAttributionOverride(): AttributionData | null {\n    const storedOverrides = this.storageManager.getObject<{\n      attributionOverride?: AttributionOverride;\n    }>({ key: STORAGE_KEYS.SETTINGS_OVERRIDE });\n\n    if (storedOverrides?.attributionOverride?.attribution) {\n      return storedOverrides.attributionOverride.attribution;\n    }\n\n    return null;\n  }\n\n  /**\n   * Check if attribution data needs refresh for the current URL\n   */\n  public needsRefresh(url: string): boolean {\n    // Needs refresh if not in memory or persistent cache, or if persistent cache is expired\n    if (this.urlAttributionCache.has(url)) {\n      return false;\n    }\n    const cacheKey = this.getCacheKey(url);\n    const cache = this.getPersistentCache();\n    const entry = cache[cacheKey];\n    return !entry || !this.isCacheValid(entry);\n  }\n\n  /**\n   * Clear attribution data for a specific URL or all URLs\n   */\n  public clearAttribution(url?: string): void {\n    if (url) {\n      this.urlAttributionCache.delete(url);\n      const cacheKey = this.getCacheKey(url);\n      const cache = this.getPersistentCache();\n      delete cache[cacheKey];\n      this.setPersistentCache(cache);\n    } else {\n      this.urlAttributionCache.clear();\n      this.storageManager.removeItem({ key: STORAGE_KEYS.ATTRIBUTION_CACHE });\n    }\n  }\n\n  /**\n   * Get attribution source information for debugging\n   */\n  public getAttributionSource():\n    | \"attribution-override\"\n    | \"server\"\n    | \"none\"\n    | \"cookie\" {\n    if (this.getAttributionOverride()) {\n      return \"attribution-override\";\n    }\n    if (this.getServerAttribution()) {\n      return \"server\";\n    }\n    const affiliate = this.storageManager.getObject<{ fluid_rep_id?: number }>({\n      key: COOKIE_KEYS.AFFILIATE,\n    });\n    if (affiliate?.fluid_rep_id) {\n      return \"cookie\";\n    }\n    return \"none\";\n  }\n}\n","import type { ApiTypes, Schemas } from \"@fluid-app/api-client\";\nimport type { StorageManager } from \"@fluid-app/storage-manager\";\nimport {\n  EventTypes,\n  startedCheckout,\n  startedCheckoutBeacon,\n} from \"@fluid-app/api-client\";\nimport { COOKIE_KEYS, STORAGE_KEYS } from \"@fluid-app/storage-manager\";\n\nimport type { AttributionManager } from \"./AttributionManager\";\nimport type { SessionManager } from \"./SessionManager\";\nimport type {\n  CheckoutStartedEventWithData,\n  FairshareConfig,\n  TrackableEventWithData,\n} from \"./types\";\nimport { getSessionToken } from \"..\";\nimport { debug } from \"../utils/debug\";\n\n// Default values for performance optimization\nconst DEFAULT_BATCH_SIZE = 10; // Maximum number of events to send in a single batch\nconst DEFAULT_BATCH_INTERVAL = 2000; // Time in ms to wait before sending a batch\nconst DEFAULT_MAX_QUEUE_SIZE = 100; // Maximum number of events to store in the queue\n\n/**\n * Manages event tracking and batching for the FairShare SDK\n */\nexport class EventManager {\n  private eventQueue: TrackableEventWithData[] = [];\n  private batchTimeout: ReturnType<typeof setTimeout> | null = null;\n  private processingBatch = false;\n  private retryCount: number;\n  private fluidShop: string;\n  private storageManager: StorageManager;\n  private sessionManager: SessionManager;\n  private attributionManager: AttributionManager;\n  private userId: string | null = null;\n  private config: FairshareConfig;\n  private flushInterval?: ReturnType<typeof setInterval>;\n  private batchSize: number;\n  private batchInterval: number;\n  private maxQueueSize: number;\n  private isUnloadContext = false;\n\n  /**\n   * Create a new EventManager instance\n   * @param storageManager Storage manager instance\n   * @param sessionManager Session manager instance\n   * @param attributionManager Server attribution manager instance\n   * @param fluidShop The fluid shop identifier\n   * @param retryCount Number of retry attempts\n   * @param config Configuration for Fairshare\n   */\n  constructor(\n    storageManager: StorageManager,\n    sessionManager: SessionManager,\n    attributionManager: AttributionManager,\n    fluidShop = \"\",\n    retryCount = 3,\n    config: FairshareConfig,\n  ) {\n    this.storageManager = storageManager;\n    this.sessionManager = sessionManager;\n    this.attributionManager = attributionManager;\n    this.fluidShop = fluidShop;\n    this.retryCount = retryCount;\n    this.config = config;\n\n    // Set configurable batch settings or use defaults\n    this.batchSize = config.batchSize ?? DEFAULT_BATCH_SIZE;\n    this.batchInterval = config.batchInterval ?? DEFAULT_BATCH_INTERVAL;\n    this.maxQueueSize = config.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE;\n\n    // Load any queued events from storage\n    this.loadQueuedEvents();\n    this.setupFlushInterval();\n  }\n\n  /**\n   * Clean up resources when the manager is no longer needed\n   */\n  public cleanup(): void {\n    // Clear any pending timeouts\n    if (this.batchTimeout) {\n      clearTimeout(this.batchTimeout);\n      this.batchTimeout = null;\n    }\n\n    // Clear flush interval if set\n    if (this.flushInterval) {\n      clearInterval(this.flushInterval);\n      this.flushInterval = undefined;\n    }\n\n    // Process any remaining events before cleanup\n    void this.flushQueue(false);\n  }\n\n  /**\n   * Track a checkout started event\n   */\n  public trackCheckoutStarted(\n    data: ApiTypes[\"checkout-started\"][\"request\"],\n  ): void {\n    try {\n      debug(\"EventManager: trackCheckoutStarted called with data:\", data);\n\n      const metadata = this.buildMetadata();\n      debug(\"EventManager: Built metadata for checkout event:\", metadata);\n\n      const eventData = {\n        data: {\n          cart_token: data.cart_token,\n          metadata,\n        },\n        eventName: EventTypes.CHECKOUT_STARTED,\n      };\n\n      console.log(\n        \"EventManager: About to queue checkout started event:\",\n        eventData,\n      );\n      this.queueEvent(eventData);\n\n      console.log(\n        \"EventManager: Checkout started event queued successfully, queue length:\",\n        this.eventQueue.length,\n      );\n      debug(\"Checkout started event tracked\", data);\n    } catch (error) {\n      console.error(\n        \"EventManager: Error tracking checkout started event:\",\n        error,\n      );\n      debug(\n        \"Error tracking checkout started event\",\n        error instanceof Error ? error.message : String(error),\n      );\n    }\n  }\n\n  /**\n   * Track a checkout started event immediately (without queuing)\n   * Returns a promise that resolves when the API request completes\n   */\n  public async trackCheckoutStartedSync(\n    data: ApiTypes[\"checkout-started\"][\"request\"],\n  ): Promise<void> {\n    try {\n      console.log(\n        \"EventManager: trackCheckoutStartedSync called with data:\",\n        data,\n      );\n\n      const metadata = this.buildMetadata();\n      console.log(\"EventManager: Built metadata for checkout event:\", metadata);\n\n      const eventData = {\n        data: {\n          cart_token: data.cart_token,\n          metadata,\n        },\n        eventName: EventTypes.CHECKOUT_STARTED,\n      };\n\n      console.log(\n        \"EventManager: About to send checkout started event directly:\",\n        eventData,\n      );\n\n      // Process the event immediately instead of queuing it\n      const success = await this.processCheckoutStarted(eventData);\n\n      if (!success) {\n        throw new Error(\"Failed to send checkout started event to API\");\n      }\n\n      console.log(\"EventManager: Checkout started event sent successfully\");\n      debug(\"Checkout started event tracked synchronously\", data);\n    } catch (error) {\n      console.error(\"EventManager: Error in trackCheckoutStartedSync:\", error);\n      debug(\n        \"Error tracking checkout started event synchronously\",\n        error instanceof Error ? error.message : String(error),\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Track a custom event\n   * @param eventName Event name\n   * @param properties Event properties\n   */\n  public trackEvent(event: TrackableEventWithData): void {\n    try {\n      this.queueEvent(event);\n      debug(\"Event tracked\", event);\n    } catch (error) {\n      debug(\n        \"Error tracking custom event\",\n        error instanceof Error ? error.message : String(error),\n      );\n    }\n  }\n\n  /**\n   * Set the user ID\n   * @param userId User ID\n   */\n  public setUserId(userId: string): void {\n    this.userId = userId;\n  }\n\n  /**\n   * Get the user ID\n   * @returns The user ID or an empty string if not set\n   */\n  public getUserId(): string {\n    return this.userId ?? \"\";\n  }\n\n  /**\n   * Set the unload context to determine if events should use beacon\n   * @param isUnload Whether we're in an unload context\n   */\n  public setUnloadContext(isUnload: boolean): void {\n    this.isUnloadContext = isUnload;\n  }\n\n  /**\n   * Check if navigator.sendBeacon is supported in the current browser\n   * @returns true if sendBeacon is supported, false otherwise\n   */\n  private hasSendBeaconSupport(): boolean {\n    return typeof navigator !== \"undefined\" && \"sendBeacon\" in navigator;\n  }\n\n  /**\n   * Build metadata for API requests\n   * @returns Metadata object with session, attribution, and other data\n   */\n  private buildMetadata(): Schemas[\"RequestMetadata\"] {\n    const sessionToken = getSessionToken();\n    const metadata: Schemas[\"RequestMetadata\"] = {\n      fluid_session: sessionToken,\n      fluid_shop: this.fluidShop,\n    };\n    metadata.attribution =\n      this.attributionManager.getEffectiveAttribution() ?? undefined;\n    // Add fluid_locale if available\n    const locale = this.storageManager.getItem({ key: COOKIE_KEYS.LOCALE });\n    if (locale) {\n      metadata.fluid_locale = locale;\n    }\n    // Add fluid_journey if available\n    const journey = this.storageManager.getItem({ key: COOKIE_KEYS.JOURNEY });\n    if (journey) {\n      metadata.fluid_journey = journey;\n    }\n    return metadata;\n  }\n\n  /**\n   * Queue an event for batched sending\n   * @param type Event type\n   * @param data Event data\n   * @param metadata Event metadata\n   */\n  private queueEvent(event: TrackableEventWithData): void {\n    // Add to the queue\n    this.eventQueue.push(event);\n\n    // Enforce maximum queue size by removing oldest events if needed\n    if (this.eventQueue.length > this.maxQueueSize) {\n      this.eventQueue = this.eventQueue.slice(-this.maxQueueSize);\n    }\n\n    // Save queue to storage\n    this.saveQueuedEvents();\n\n    // Schedule batch processing if not already scheduled\n    this.scheduleBatch();\n  }\n\n  /**\n   * Schedule batch processing\n   */\n  private scheduleBatch(): void {\n    if (this.batchTimeout === null && this.eventQueue.length > 0) {\n      this.batchTimeout = setTimeout(() => {\n        this.processBatch();\n        // Clear the timeout reference after it's executed\n        this.batchTimeout = null;\n      }, this.batchInterval);\n\n      debug(\n        `Batch scheduled to process in ${this.batchInterval}ms, queue size: ${this.eventQueue.length}`,\n      );\n    }\n  }\n\n  /**\n   * Process the event queue\n   */\n  private processBatch(): void {\n    // If already processing a batch, skip\n    if (this.processingBatch) {\n      return;\n    }\n\n    // Set processing flag\n    this.processingBatch = true;\n\n    try {\n      // Get events to process (up to batchSize)\n      const eventsToProcess = this.eventQueue.slice(0, this.batchSize);\n\n      // If no events to process, return\n      if (eventsToProcess.length === 0) {\n        this.processingBatch = false;\n        return;\n      }\n\n      // Send events to server\n      const success = this.sendBatch(eventsToProcess);\n\n      if (success) {\n        // Remove processed events from queue\n        this.eventQueue = this.eventQueue.slice(eventsToProcess.length);\n\n        // Save updated queue\n        this.saveQueuedEvents();\n\n        // If more events in queue, schedule another batch\n        if (this.eventQueue.length > 0) {\n          this.scheduleBatch();\n        }\n      } else {\n        // Retry processing the batch\n        if (this.retryCount > 0) {\n          this.retryCount--;\n          this.scheduleBatch();\n        }\n      }\n    } catch (error) {\n      debug(\n        \"Error processing batch\",\n        error instanceof Error ? error.message : String(error),\n      );\n    } finally {\n      // Reset processing flag\n      this.processingBatch = false;\n    }\n  }\n\n  /**\n   * Send a batch of events to the server\n   * @param events Events to send\n   * @returns Whether the send was successful\n   */\n  private sendBatch(events: TrackableEventWithData[]): boolean {\n    try {\n      // Log batch events for debugging\n      debug(\"Sending batch events\", events);\n\n      // For each event, ensure it has the latest metadata\n      const updatedEvents = events.map((event) => {\n        // Get fresh metadata with the most current attribution data\n        const freshMetadata = this.buildMetadata();\n\n        // Merge the fresh metadata with the event's existing metadata\n        // This ensures we always send the most up-to-date attribution data\n        return {\n          ...event,\n          metadata: {\n            ...event.data.metadata,\n            ...freshMetadata,\n          },\n        };\n      });\n\n      // Process each event based on its type\n      for (const event of updatedEvents) {\n        void this.processEvent(event);\n      }\n\n      // Log each event for debugging purposes\n      updatedEvents.forEach((event) => {\n        debug(`Processed ${event.eventName} event`, {\n          eventName: event.eventName,\n          data: event.data,\n        });\n      });\n\n      return true;\n    } catch (error) {\n      debug(\n        \"Error sending batch events\",\n        error instanceof Error ? error.message : String(error),\n      );\n      return false;\n    }\n  }\n\n  /**\n   * Process an individual event based on its type\n   * @param event The event to process\n   * @returns Promise that resolves to true if successful, false otherwise\n   */\n  private async processEvent(event: TrackableEventWithData): Promise<boolean> {\n    try {\n      debug(`Processing ${event.eventName} event...`);\n\n      let result = false;\n\n      switch (event.eventName) {\n        case EventTypes.CHECKOUT_STARTED:\n          result = this.isUnloadContext\n            ? await this.processCheckoutStartedWithBeacon(event)\n            : await this.processCheckoutStarted(event);\n          break;\n        default:\n          debug(`Unsupported event type: ${event.eventName}`);\n          return false;\n      }\n\n      debug(\n        `Completed processing ${event.eventName} event with result: ${result}`,\n      );\n      return result;\n    } catch (error) {\n      // Avoid accessing event.eventName directly to prevent TypeScript errors\n      debug(\n        `Error processing event`,\n        error instanceof Error ? error.message : String(error),\n      );\n      return false;\n    }\n  }\n\n  /**\n   * Process a checkout started event\n   * @param event Checkout started event\n   * @returns Promise that resolves to true if successful, false otherwise\n   */\n  private async processCheckoutStarted(\n    event: CheckoutStartedEventWithData,\n  ): Promise<boolean> {\n    try {\n      console.log(\"EventManager: Processing checkout started event:\", event);\n\n      const requestBody: ApiTypes[\"checkout-started\"][\"request\"] = {\n        cart_token: event.data.cart_token,\n        metadata: event.data.metadata,\n      };\n\n      console.log(\n        \"EventManager: About to send checkout started request to API:\",\n        requestBody,\n      );\n      debug(\"Sending checkout started request:\", requestBody);\n\n      // Make sure we explicitly wait for the response before proceeding\n      const response = await startedCheckout({\n        request: requestBody,\n      });\n\n      console.log(\n        \"EventManager: Checkout started API call successful, response:\",\n        response,\n      );\n      debug(\"Checkout started tracked successfully\", response);\n      return true;\n    } catch (error) {\n      console.error(\"EventManager: Error in checkout started API call:\", error);\n      debug(\n        \"Error tracking checkout started\",\n        error instanceof Error ? error.message : String(error),\n      );\n      return false;\n    }\n  }\n\n  /**\n   * Process a checkout started event using navigator.sendBeacon for reliable delivery during page unload\n   * @param event Checkout started event\n   * @returns Promise that resolves to true if successful, false otherwise\n   */\n  private async processCheckoutStartedWithBeacon(\n    event: CheckoutStartedEventWithData,\n  ): Promise<boolean> {\n    if (!this.hasSendBeaconSupport()) {\n      debug(\"SendBeacon not supported, falling back to regular request\");\n      return this.processCheckoutStarted(event);\n    }\n\n    try {\n      const requestBody: ApiTypes[\"checkout-started\"][\"request\"] = {\n        cart_token: event.data.cart_token,\n        metadata: event.data.metadata,\n      };\n\n      debug(\"Sending checkout started request via beacon:\", requestBody);\n\n      const success = startedCheckoutBeacon({ request: requestBody });\n      debug(\"Checkout started sent via beacon:\", success);\n      return success;\n    } catch (error) {\n      debug(\"Error sending checkout started via beacon\", error);\n      return false;\n    }\n  }\n\n  /**\n   * Save queued events to storage\n   */\n  private saveQueuedEvents(): void {\n    try {\n      this.storageManager.setItem({\n        key: STORAGE_KEYS.EVENT_QUEUE,\n        value: JSON.stringify(this.eventQueue),\n      });\n    } catch (error) {\n      debug(\n        \"Error saving queued events\",\n        error instanceof Error ? error.message : String(error),\n      );\n    }\n  }\n\n  /**\n   * Load queued events from storage\n   */\n  private loadQueuedEvents(): void {\n    try {\n      const queuedEvents = this.storageManager.getItem({\n        key: STORAGE_KEYS.EVENT_QUEUE,\n      });\n      if (queuedEvents) {\n        this.eventQueue = JSON.parse(queuedEvents) as TrackableEventWithData[];\n      }\n    } catch (error) {\n      debug(\n        \"Error loading queued events\",\n        error instanceof Error ? error.message : String(error),\n      );\n    }\n  }\n\n  /**\n   * Flush the event queue\n   * @param sync Whether to flush synchronously (wait for all events to complete)\n   * @param timeoutMs Maximum time to wait for events to complete (only applies when sync=true)\n   * @returns Promise that resolves when all events are processed\n   */\n  public async flushQueue(sync = false, timeoutMs = 3000): Promise<void> {\n    // If no events in queue, return resolved promise immediately\n    if (this.eventQueue.length === 0) {\n      return Promise.resolve();\n    }\n\n    try {\n      debug(\n        `Flushing event queue with ${this.eventQueue.length} events (sync: ${sync}, timeout: ${timeoutMs}ms)`,\n      );\n\n      // Cancel any pending batch timeout\n      if (this.batchTimeout) {\n        clearTimeout(this.batchTimeout);\n        this.batchTimeout = null;\n      }\n\n      // For synchronous processing, wait for all events to complete\n      if (sync) {\n        // Process each event in the queue individually\n        const eventsToProcess = [...this.eventQueue];\n\n        // Clear the queue immediately to prevent re-processing\n        this.eventQueue = [];\n        this.saveQueuedEvents();\n\n        // Create an array of promises for each event processing\n        const processingPromises = eventsToProcess.map(async (event) => {\n          // Get fresh metadata with the most current attribution data\n          const freshMetadata = this.buildMetadata();\n\n          // Update the event with fresh metadata\n          const updatedEvent = {\n            ...event,\n            data: {\n              ...event.data,\n              metadata: {\n                ...event.data.metadata,\n                ...freshMetadata,\n              },\n            },\n          };\n\n          // Return the promise for this event's processing\n          return this.processEvent(updatedEvent).then((success) => {\n            if (success) {\n              debug(\n                `Successfully processed ${event.eventName} event during sync flush`,\n              );\n            } else {\n              debug(\n                `Failed to process ${event.eventName} event during sync flush`,\n              );\n            }\n            return success;\n          });\n        });\n\n        debug(\n          `Waiting for ${processingPromises.length} events to complete processing...`,\n        );\n\n        // Create a timeout promise that will resolve after the specified timeout\n        const timeoutPromise = new Promise<void>((resolve) => {\n          setTimeout(() => {\n            debug(\n              `Flush timeout of ${timeoutMs}ms reached. Some events may not have been fully processed.`,\n            );\n            resolve();\n          }, timeoutMs);\n        });\n\n        // Race between the processing promises and the timeout\n        // This ensures we'll either wait for all events to complete OR the timeout to be reached\n        try {\n          return await Promise.race([\n            // Promise that completes when all events are processed\n            Promise.all(processingPromises).then((results) => {\n              const successCount = results.filter(Boolean).length;\n              debug(\n                `Completed processing ${successCount}/${results.length} events during sync flush`,\n              );\n            }),\n            // Timeout promise\n            timeoutPromise,\n          ]);\n        } catch (error) {\n          debug(\n            \"Error during synchronized event processing:\",\n            error instanceof Error ? error.message : String(error),\n          );\n          // Re-throw as an Error object to satisfy linter\n          throw error instanceof Error ? error : new Error(String(error));\n        }\n      } else {\n        // For async processing, use the normal batch process but still return a Promise\n        this.processBatch();\n        // Return a resolved promise since we don't wait for batch processing to complete\n        return Promise.resolve();\n      }\n    } catch (error) {\n      debug(\n        \"Error flushing queue\",\n        error instanceof Error ? error.message : String(error),\n      );\n      // Ensure we're rejecting with an Error object\n      return Promise.reject(\n        error instanceof Error ? error : new Error(String(error)),\n      );\n    }\n  }\n\n  /**\n   * Set the fluid shop identifier\n   * @param fluidShop The fluid shop identifier\n   */\n  public setFluidShop(fluidShop: string): void {\n    this.fluidShop = fluidShop;\n    debug(`Fluid shop set to: ${fluidShop}`);\n  }\n\n  /**\n   * Setup interval to periodically flush the event queue\n   */\n  private setupFlushInterval(): void {\n    // Clear any existing interval\n    if (this.flushInterval) {\n      clearInterval(this.flushInterval);\n    }\n\n    // Set up a new interval if auto-flush is enabled in config\n    const flushIntervalMs = this.config.flushIntervalMs ?? 30000; // Default to 30 seconds\n    if (flushIntervalMs > 0) {\n      this.flushInterval = setInterval(() => {\n        debug(`Auto-flushing event queue (interval: ${flushIntervalMs}ms)`);\n        void this.flushQueue(false);\n      }, flushIntervalMs);\n\n      debug(`Set up flush interval: ${flushIntervalMs}ms`);\n    }\n  }\n\n  /**\n   * Flush the event queue using navigator.sendBeacon for reliable delivery during page unload\n   * @returns Promise that resolves when all events are processed with beacon\n   */\n  public async flushQueueWithBeacon(): Promise<void> {\n    if (this.eventQueue.length === 0) {\n      return Promise.resolve();\n    }\n\n    try {\n      debug(`Flushing ${this.eventQueue.length} events with beacon`);\n\n      // Set unload context\n      this.setUnloadContext(true);\n\n      // Process events immediately with beacon\n      const eventsToProcess = [...this.eventQueue];\n      this.eventQueue = [];\n      this.saveQueuedEvents();\n\n      // Process each event with beacon (synchronous)\n      const results = eventsToProcess.map((event) => {\n        const freshMetadata = this.buildMetadata();\n        const updatedEvent = {\n          ...event,\n          data: {\n            ...event.data,\n            metadata: { ...event.data.metadata, ...freshMetadata },\n          },\n        } as TrackableEventWithData;\n\n        return this.processEvent(updatedEvent);\n      });\n\n      // Wait for all beacon sends (they're mostly synchronous)\n      await Promise.all(results);\n\n      debug(\"Completed beacon flush\");\n    } catch (error) {\n      debug(\"Error flushing queue with beacon\", error);\n    } finally {\n      this.setUnloadContext(false);\n    }\n  }\n}\n","import FingerprintJS from \"@fingerprintjs/fingerprintjs-pro\";\n\nexport const isBrowser =\n  typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nexport const getBrowserInfo = () => {\n  if (!isBrowser) {\n    return {\n      url: \"\",\n      referrer: \"\",\n      title: \"\",\n      hostname: \"\",\n    };\n  }\n\n  return {\n    url: window.location.href,\n    referrer: document.referrer,\n    title: document.title,\n    hostname: window.location.hostname,\n  };\n};\n\n// New local storage implementation\nexport const getLocalStorage = () => {\n  return {\n    get: (key: string): string | null => {\n      if (!isBrowser) return null;\n      try {\n        return localStorage.getItem(key);\n      } catch (error) {\n        console.error(\"Error accessing localStorage:\", error);\n        return null;\n      }\n    },\n    set: (key: string, value: string): void => {\n      if (!isBrowser) return;\n      try {\n        localStorage.setItem(key, value);\n      } catch (error) {\n        console.error(\"Error writing to localStorage:\", error);\n      }\n    },\n    remove: (key: string): void => {\n      if (!isBrowser) return;\n      try {\n        localStorage.removeItem(key);\n      } catch (error) {\n        console.error(\"Error removing from localStorage:\", error);\n      }\n    },\n  };\n};\n\n// Browser fingerprinting utility\nexport const generateFingerprint = async () => {\n  // Initialize the agent on application start.\n  return await FingerprintJS.load({\n    apiKey: \"nsa806O1PfAKU3ax1n52\",\n  })\n    .then((fp) => {\n      // Get the visitor identifier when you need it.\n      return fp.get();\n    })\n    .then((result) => {\n      return result.visitorId;\n    });\n};\n","import type { StorageManager } from \"@fluid-app/storage-manager\";\nimport { COOKIE_KEYS } from \"@fluid-app/storage-manager\";\n\nimport { generateFingerprint } from \"../utils/environment\";\n\n/**\n * Manages browser fingerprinting operations\n */\nexport class FingerPrintManager {\n  private storageManager: StorageManager;\n  private currentFingerprint: string | null = null;\n  private fingerprintSynced = false;\n\n  /**\n   * Create a new FingerPrintManager\n   * @param storageManager Storage manager instance\n   */\n  constructor(storageManager: StorageManager) {\n    this.storageManager = storageManager;\n\n    // Check if the current fingerprint has been synced already\n    this.loadSyncStatus();\n  }\n\n  /**\n   * Load the sync status from storage\n   */\n  private loadSyncStatus(): void {\n    const storedFingerprint = this.getStoredFingerprint();\n    const syncedFingerprint = this.storageManager.getItem({\n      key: COOKIE_KEYS.JOURNEY_SYNCED,\n    });\n\n    // If we have both a stored fingerprint and a synced fingerprint, and they match,\n    // then this fingerprint has already been synced\n    this.fingerprintSynced = !!(\n      storedFingerprint &&\n      syncedFingerprint &&\n      storedFingerprint === syncedFingerprint\n    );\n\n    if (this.fingerprintSynced) {\n      console.debug(\n        \"[FairShare] Loaded existing fingerprint that has already been synced with server\",\n      );\n    }\n  }\n\n  /**\n   * Generate a browser fingerprint\n   * @returns A unique fingerprint string\n   */\n  public async generateFingerprint(): Promise<string> {\n    return generateFingerprint();\n  }\n\n  /**\n   * Store a fingerprint in local storage\n   * @param fingerprint The fingerprint to store\n   */\n  public storeFingerprint(fingerprint: string): void {\n    const existingFingerprint = this.getStoredFingerprint();\n    const isNewFingerprint = fingerprint !== existingFingerprint;\n\n    this.currentFingerprint = fingerprint;\n    this.storageManager.setItem({\n      key: COOKIE_KEYS.JOURNEY,\n      value: fingerprint,\n    });\n\n    // If this is a new fingerprint, mark it as not synced\n    if (isNewFingerprint) {\n      this.fingerprintSynced = false;\n      // Clear the synced status in storage\n      this.storageManager.removeItem({ key: COOKIE_KEYS.JOURNEY_SYNCED });\n    }\n  }\n\n  /**\n   * Get the stored fingerprint from local storage\n   * @returns The stored fingerprint or null if not found\n   */\n  public getStoredFingerprint(): string | null {\n    return this.storageManager.getItem({ key: COOKIE_KEYS.JOURNEY });\n  }\n\n  /**\n   * Set the current fingerprint in memory\n   * @param fingerprint The fingerprint to set\n   */\n  public setFingerprint(fingerprint: string): void {\n    // Don't mark as not synced just because we're setting the fingerprint in memory\n    // Instead, check if it's the same as what's in storage and what's been synced\n    const storedFingerprint = this.getStoredFingerprint();\n    const syncedFingerprint = this.storageManager.getItem({\n      key: COOKIE_KEYS.JOURNEY_SYNCED,\n    });\n\n    this.currentFingerprint = fingerprint;\n\n    // Only mark as not synced if:\n    // 1. The fingerprint is different from what's stored AND\n    // 2. It's not already marked as synced in storage\n    if (fingerprint !== storedFingerprint) {\n      this.fingerprintSynced = false;\n    } else if (\n      storedFingerprint &&\n      syncedFingerprint &&\n      storedFingerprint === syncedFingerprint\n    ) {\n      // If it matches what's stored and what's synced, make sure to mark it as synced\n      this.fingerprintSynced = true;\n    }\n  }\n\n  /**\n   * Get the current fingerprint from memory\n   * @returns The current fingerprint or null if not set\n   */\n  public getFingerprint(): string | null {\n    return this.currentFingerprint;\n  }\n\n  /**\n   * Check if the current fingerprint needs to be synced with the server\n   * @returns True if the fingerprint needs to be synced, false otherwise\n   */\n  public needsSync(): boolean {\n    // Force a re-check of the sync status from storage to ensure we have the latest\n    this.loadSyncStatus();\n    return !this.fingerprintSynced && this.currentFingerprint !== null;\n  }\n}\n","import type { StorageManager } from \"@fluid-app/storage-manager\";\nimport { createSession } from \"@fluid-app/api-client\";\nimport { COOKIE_KEYS } from \"@fluid-app/storage-manager\";\n\nimport { debug } from \"../utils/debug\";\nimport { retry } from \"../utils/retry\";\n\n/**\n * Manages session operations for the FairShare SDK\n */\nexport class SessionManager {\n  private storageManager: StorageManager;\n  private sessionToken: string | null = null;\n  private retryCount: number;\n  private fluidShop: string;\n\n  /**\n   * Create a new SessionManager\n   * @param storageManager Storage manager\n   * @param fingerPrintManager Fingerprint manager\n   * @param retryCount Number of times to retry operations\n   * @param fluidShop The Fluid shop identifier\n   */\n  constructor(storageManager: StorageManager, retryCount = 3, fluidShop = \"\") {\n    this.storageManager = storageManager;\n    this.retryCount = retryCount;\n    this.fluidShop = fluidShop;\n  }\n\n  /**\n   * Set the Fluid shop identifier\n   * @param fluidShop The Fluid shop identifier\n   */\n  public setFluidShop(fluidShop: string): void {\n    this.fluidShop = fluidShop;\n  }\n\n  /**\n   * Initialize the session\n   * @returns A promise that resolves when the session is initialized\n   */\n  public async initSession(): Promise<void> {\n    try {\n      // Try to get the session token (this will now check storage first)\n      const session = this.getSessionToken();\n      if (session) {\n        debug(\"Using existing session\", session);\n        return;\n      }\n\n      // Create new session\n      this.sessionToken = await this.createSession();\n      debug(\"Created new session\", this.sessionToken);\n    } catch (error: unknown) {\n      // Type assertion for error to use in debug\n      debug(\"Error initializing session\", error);\n    }\n  }\n\n  /**\n   * Create a new session\n   * @returns A promise that resolves with the new session data\n   */\n  public async createSession(): Promise<string | null> {\n    if (!this.fluidShop) {\n      throw new Error(\"fluidShop is required to create a session\");\n    }\n\n    // Prepare session creation request\n    const sessionRequest: {\n      fluid_shop: string;\n    } = {\n      fluid_shop: this.fluidShop,\n    };\n\n    // Send session data to server\n    try {\n      // Wrap the session creation in a try-catch to handle errors\n      const response = await retry<{ status: number; fluid_session: string }>(\n        async () => {\n          const sessionResponse = await createSession({\n            request: sessionRequest,\n          });\n          return sessionResponse;\n        },\n        this.retryCount,\n      );\n\n      debug(\"Full response from create session:\", response);\n\n      // Directly extract and use fluid_session if it exists\n      const { fluid_session: sessionToken } = response;\n\n      // Ensure we have a valid string\n      if (!sessionToken || typeof sessionToken !== \"string\") {\n        debug(\"Invalid fluid_session received\", sessionToken);\n        return null;\n      }\n\n      debug(\"Received session token from server\", sessionToken);\n\n      // Store the clean token\n      this.storageManager.setItem({\n        key: COOKIE_KEYS.SESSION,\n        value: sessionToken,\n      });\n      this.setSessionToken(sessionToken);\n\n      return sessionToken;\n    } catch (error: unknown) {\n      debug(\"Error creating session on server\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Get the current session ID\n   * @returns The current session ID or null if no session exists\n   */\n  public getSessionToken(): string | null {\n    // If we already have a session token in memory, return it\n    if (this.sessionToken) {\n      debug(\"Using session token from memory:\", this.sessionToken);\n      return this.sessionToken;\n    }\n\n    // If we don't have a session token in memory, try to get it from storage\n    try {\n      const storedSession = this.storageManager.getItem({\n        key: COOKIE_KEYS.SESSION,\n      });\n\n      debug(\"Retrieved session token from storage:\", storedSession);\n      // Important: Set the token in memory to avoid repeated lookups\n      this.sessionToken = storedSession;\n      return storedSession;\n    } catch (error: unknown) {\n      debug(\"Error retrieving session token from storage:\", error);\n      // Only return null if we truly failed to retrieve a token\n      return null;\n    }\n  }\n\n  /**\n   * Set the current session data\n   * @param sessionToken The session data to set\n   */\n  public setSessionToken(sessionToken: string | null): void {\n    this.sessionToken = sessionToken;\n  }\n}\n","import axios from \"axios\";\n\nimport type { AttributionData } from \"@fluid-app/api-client\";\nimport {\n  COOKIE_KEYS,\n  STORAGE_KEYS,\n  StorageManager,\n} from \"@fluid-app/storage-manager\";\n\nimport type { FairshareConfig, TrackableEventWithData } from \"./types\";\nimport { DEFAULT_CONFIG } from \"../utils/config\";\nimport { debug, setDebugMode } from \"../utils/debug\";\nimport { retry } from \"../utils/retry\";\nimport { AttributionManager } from \"./AttributionManager\";\nimport { EventManager } from \"./EventManager\";\nimport { FingerPrintManager } from \"./FingerPrintManager\";\nimport { SessionManager } from \"./SessionManager\";\n\n/**\n * Core implementation of the FairShare tracking library\n */\nexport class FairShareCore {\n  private static instance: FairShareCore | null = null;\n  protected config: FairshareConfig;\n  protected sessionToken: string | null = null;\n  protected fingerprint: string | null = null;\n  private initialized = false;\n  private lastPageUrl: string | null = null;\n  private navigationIntervalId?: number;\n\n  // Promise for tracking initialization status\n  private initializationPromise: Promise<void>;\n  private resolveInitialization?: () => void;\n\n  // Managers\n  private storageManager: StorageManager;\n  private fingerPrintManager: FingerPrintManager;\n  private sessionManager: SessionManager;\n  private attributionManager: AttributionManager;\n  private eventManager: EventManager;\n\n  private constructor(config: FairshareConfig) {\n    // Store the config directly\n    this.config = config;\n\n    // Initialize managers\n    this.storageManager = new StorageManager();\n    this.fingerPrintManager = new FingerPrintManager(this.storageManager);\n\n    this.sessionManager = new SessionManager(\n      this.storageManager,\n      DEFAULT_CONFIG.RETRY_ATTEMPTS,\n      this.config.fluidShop,\n    );\n\n    // Initialize server attribution manager (replacing AttributionManager)\n    this.attributionManager = new AttributionManager(this.storageManager);\n\n    this.eventManager = new EventManager(\n      this.storageManager,\n      this.sessionManager,\n      this.attributionManager,\n      this.config.fluidShop,\n      DEFAULT_CONFIG.RETRY_ATTEMPTS,\n      this.config,\n    );\n\n    // Set up initialization Promise\n    this.initializationPromise = new Promise<void>((resolve) => {\n      this.resolveInitialization = resolve;\n    });\n  }\n\n  /**\n   * Get the existing FairShare instance\n   * @returns The FairShare instance\n   * @throws Error if FairShare is not initialized\n   */\n  public static getInstance(): FairShareCore {\n    if (!FairShareCore.instance) {\n      throw new Error(\n        \"FairShare not initialized. Call initializeFairshare first.\",\n      );\n    }\n    return FairShareCore.instance;\n  }\n\n  /**\n   * Create and initialize a new FairShare instance\n   * @param config The FairShare configuration\n   * @returns The initialized FairShare instance\n   */\n  public static createInstance(config: FairshareConfig): FairShareCore {\n    // Create a new instance with the provided config\n    const instance = new FairShareCore(config);\n    FairShareCore.instance = instance;\n\n    // Initialize the instance (mark it as initializing to avoid double initialization)\n    instance.initialized = true;\n    instance.initializeCore(config);\n\n    return instance;\n  }\n\n  /**\n   * Create a new instance of FairShareCore, replacing any existing instance\n   * For internal use by the reset function\n   */\n  public static resetInstance(): void {\n    FairShareCore.instance = null;\n  }\n\n  /**\n   * Initialize the FairShare SDK core functionality\n   * @param config Configuration options\n   * @private Used internally by initializeFairshare and createInstance\n   */\n  private initializeCore(config: FairshareConfig): void {\n    // Validate required configuration\n    if (!config.fluidShop) {\n      throw new Error(\"fluidShop is required in the configuration\");\n    }\n\n    debug(\"FairShare configuration received\");\n\n    // Completely replace the config with the new one\n    this.config = config;\n\n    debug(\"FairShare initialized with config:\", this.config);\n\n    // Recreate the AttributionManager with the updated config\n    this.attributionManager = new AttributionManager(this.storageManager);\n\n    // Set debug mode\n    setDebugMode(!!this.config.debug);\n\n    // Update EventManager with fluidShop setting\n    this.eventManager.setFluidShop(this.config.fluidShop);\n\n    // Always use the default API endpoint\n    axios.defaults.baseURL = DEFAULT_CONFIG.API_ENDPOINT;\n\n    // Initialize fingerprint locally\n    this.fingerprint = this.getStoredFingerprint();\n    debug(\"Retrieved stored fingerprint:\", this.fingerprint);\n\n    if (this.fingerprint === null) {\n      debug(\"No stored fingerprint found, generating a new one\");\n      this.generateFingerprint()\n        .then((fingerprint) => {\n          this.storeFingerprint(fingerprint);\n          debug(\"Generated and stored new fingerprint:\", this.fingerprint);\n        })\n        .catch((error) => {\n          debug(\"Error generating fingerprint:\", error);\n        });\n    } else {\n      debug(\"Using existing stored fingerprint:\", this.fingerprint);\n    }\n\n    // Set fingerprint in utils if available\n    if (this.fingerprint) {\n      this.fingerPrintManager.setFingerprint(this.fingerprint);\n      debug(\"Set fingerprint in manager:\", this.fingerprint);\n    }\n\n    // Initialize session first - this is an async operation but we'll handle dependencies correctly\n    void this.initSession()\n      .then(() => {\n        // Check if session initialization was successful\n        const sessionToken = this.sessionManager.getSessionToken();\n        if (sessionToken) {\n          debug(\"Session initialized successfully:\", sessionToken);\n\n          // NOTE: We no longer automatically track the initial page visit here\n          // This allows FluidCore to control when initial tracking happens\n          // after server attribution manager is set up\n          debug(\"Session ready, waiting for external tracking trigger\");\n\n          // Resolve the initialization Promise only if session is ready\n          if (this.resolveInitialization) {\n            this.resolveInitialization();\n          }\n        } else {\n          debug(\n            \"Session initialization completed but no session token available\",\n          );\n\n          // Don't resolve initialization Promise without a session token\n          // Instead, reject it so callers know initialization failed\n          if (this.resolveInitialization) {\n            // Actually, for backward compatibility, still resolve but log the issue\n            // This allows the SDK to continue working even without a session\n            this.resolveInitialization();\n          }\n        }\n      })\n      .catch((error) => {\n        debug(\"Error initializing session:\", error);\n\n        // For backward compatibility, still resolve the initialization Promise\n        // This ensures calling code can continue, but session-dependent features won't work\n        if (this.resolveInitialization) {\n          this.resolveInitialization();\n        }\n      });\n\n    // Save current URL to avoid duplicate tracking\n    if (typeof window !== \"undefined\") {\n      this.lastPageUrl = window.location.href;\n    }\n\n    // Set up automatic page visit tracking for client-side navigation\n    if (typeof window !== \"undefined\") {\n      // Set up URL change detection\n      this.startNavigationTracking();\n\n      // Add unload event listener to flush queue on page exit\n      window.addEventListener(\"beforeunload\", () => {\n        this.stopNavigationTracking();\n        // Use beacon-based flushing for reliable delivery\n        void this.eventManager.flushQueueWithBeacon();\n      });\n    }\n\n    // Add additional event listeners for better mobile support\n    if (typeof document !== \"undefined\") {\n      // Handle page visibility changes (better mobile support)\n      document.addEventListener(\"visibilitychange\", () => {\n        if (document.visibilityState === \"hidden\") {\n          // Page is being hidden, flush with beacon\n          void this.eventManager.flushQueueWithBeacon();\n        }\n      });\n\n      // Handle page freeze (modern browsers)\n      window.addEventListener(\"freeze\", () => {\n        void this.eventManager.flushQueueWithBeacon();\n      });\n    }\n  }\n\n  /**\n   * Initialize the FairShare SDK\n   * @param config Configuration options\n   */\n  public initializeFairshare(config: FairshareConfig): void {\n    if (this.initialized) {\n      debug(\"FairShare already initialized\");\n      return;\n    }\n\n    this.initializeCore(config);\n    this.initialized = true;\n  }\n\n  /**\n   * Start tracking navigation changes for automatic page visit tracking\n   */\n  private startNavigationTracking(): void {\n    if (typeof window === \"undefined\") return;\n\n    // Track hash changes\n    window.addEventListener(\"hashchange\", this.boundHandleUrlChange);\n\n    // Track popstate events (back/forward buttons)\n    window.addEventListener(\"popstate\", this.boundHandleUrlChange);\n\n    // For client-side navigation (pushState/replaceState), use a polling approach\n    this.navigationIntervalId = window.setInterval(this.checkUrlChange, 300);\n  }\n\n  /**\n   * Stop tracking navigation changes\n   */\n  private stopNavigationTracking(): void {\n    if (typeof window === \"undefined\") return;\n\n    // Remove event listeners\n    window.removeEventListener(\"hashchange\", this.boundHandleUrlChange);\n    window.removeEventListener(\"popstate\", this.boundHandleUrlChange);\n\n    // Clear the interval\n    if (this.navigationIntervalId !== undefined) {\n      window.clearInterval(this.navigationIntervalId);\n      this.navigationIntervalId = undefined;\n    }\n  }\n\n  /**\n   * Bound version of handleUrlChange for use in event listeners\n   */\n  private boundHandleUrlChange = (): void => {\n    this.handleUrlChange();\n  };\n\n  /**\n   * Check if the URL has changed and handle it if it has\n   */\n  private checkUrlChange = (): void => {\n    if (typeof window === \"undefined\") return;\n\n    const currentUrl = window.location.href;\n    if (currentUrl !== this.lastPageUrl) {\n      this.handleUrlChange();\n    }\n  };\n\n  /**\n   * Handle URL changes and track page visits when the URL changes\n   */\n  private handleUrlChange(): void {\n    if (typeof window === \"undefined\") return;\n\n    const currentUrl = window.location.href;\n\n    // Only track if the URL has changed\n    if (currentUrl !== this.lastPageUrl) {\n      // First update the lastPageUrl to prevent duplicate tracking\n      this.lastPageUrl = currentUrl;\n\n      // Capture attribution first, then track the visit to ensure fresh attribution data\n      this.captureAttribution();\n    }\n  }\n\n  protected async initSession(): Promise<void> {\n    try {\n      // First check if we can get an existing session token\n      const existingToken = this.sessionManager.getSessionToken();\n\n      if (existingToken) {\n        debug(\"Using existing session token:\", existingToken);\n        this.sessionToken = existingToken;\n        return;\n      }\n\n      // If no existing token, create a new session\n      await this.sessionManager.initSession();\n      this.sessionToken = this.sessionManager.getSessionToken();\n\n      if (this.sessionToken) {\n        debug(\"Successfully initialized session:\", this.sessionToken);\n      } else {\n        debug(\n          \"Failed to initialize session - no token available after initialization\",\n        );\n      }\n    } catch (error) {\n      debug(\"Error during session initialization:\", error);\n      // Don't throw here to prevent blocking initialization of other components\n    }\n  }\n\n  public getSessionToken(): string | null {\n    // First check if we have a token in memory\n    if (this.sessionToken) {\n      return this.sessionToken;\n    }\n\n    // Then try to get it from the session manager\n    const token = this.sessionManager.getSessionToken();\n\n    // Update our cached token if one was found\n    if (token) {\n      this.sessionToken = token;\n    }\n\n    return token;\n  }\n\n  protected async createSession(): Promise<string | null> {\n    return this.sessionManager.createSession();\n  }\n\n  protected async generateFingerprint(): Promise<string> {\n    return this.fingerPrintManager.generateFingerprint();\n  }\n\n  protected storeFingerprint(fingerprint: string): void {\n    this.fingerPrintManager.storeFingerprint(fingerprint);\n  }\n\n  protected getStoredFingerprint(): string | null {\n    return this.fingerPrintManager.getStoredFingerprint();\n  }\n\n  /**\n   * Capture attribution data from the URL\n   * @returns The captured attribution data or null if not found\n   * @deprecated Server-side attribution is now handled via settings API.\n   * This method maintained for backward compatibility but may return null.\n   */\n  public captureAttribution(): AttributionData | null {\n    // Server attribution is managed externally via settings API\n    // Return current effective attribution if available\n    const attribution = this.attributionManager.getEffectiveAttribution();\n    debug(\"FairShare: Current effective attribution:\", attribution);\n    return attribution;\n  }\n\n  /**\n   * Get attribution data from the current URL\n   * @returns The attribution data from URL or null if not found\n   * @deprecated Server-side attribution is now handled via settings API.\n   * Use getEffectiveAttribution() instead for current attribution data.\n   */\n  public getAttribution(): AttributionData | null {\n    // Return current effective attribution from server attribution manager\n    return this.attributionManager.getEffectiveAttribution();\n  }\n\n  public trackFairshareEvent(event: TrackableEventWithData): void {\n    return this.eventManager.trackEvent(event);\n  }\n\n  /**\n   * Track a checkout started event using the specific EventManager method\n   * This ensures proper metadata building and processing\n   * @param data Checkout started event data\n   */\n  public trackCheckoutStarted(data: { cart_token: string }): void {\n    // The EventManager will rebuild metadata with proper attribution and session data\n    // We just need to provide the minimal structure that satisfies the API type\n    return this.eventManager.trackCheckoutStarted({\n      cart_token: data.cart_token,\n      metadata: {\n        fluid_shop: \"\", // This will be rebuilt by EventManager\n        fluid_session: \"\", // This will be rebuilt by EventManager\n      },\n    });\n  }\n\n  /**\n   * Track a checkout started event synchronously\n   * Returns a promise that resolves when the API request completes\n   * @param data Checkout started event data\n   */\n  public async trackCheckoutStartedSync(data: {\n    cart_token: string;\n  }): Promise<void> {\n    // The EventManager will rebuild metadata with proper attribution and session data\n    // We just need to provide the minimal structure that satisfies the API type\n    return this.eventManager.trackCheckoutStartedSync({\n      cart_token: data.cart_token,\n      metadata: {\n        fluid_shop: \"\", // This will be rebuilt by EventManager\n        fluid_session: \"\", // This will be rebuilt by EventManager\n      },\n    });\n  }\n\n  /**\n   * Flush all pending events in the queue\n   * @param sync Whether to wait for all events to complete processing before returning\n   * @param timeoutMs Maximum time to wait for events to complete (only applies when sync=true)\n   * @returns Promise that resolves when events are processed\n   */\n  public flushEvents(sync = true, timeoutMs = 3000): Promise<void> {\n    return this.eventManager.flushQueue(sync, timeoutMs);\n  }\n\n  /**\n   * Flush all pending events using navigator.sendBeacon for reliable delivery during page unload\n   * @returns Promise that resolves when events are processed with beacon\n   */\n  public flushEventsWithBeacon(): Promise<void> {\n    return this.eventManager.flushQueueWithBeacon();\n  }\n\n  protected getUserId(): string {\n    return this.eventManager.getUserId();\n  }\n\n  protected debug(message: string, ...args: unknown[]): void {\n    debug(message, ...args);\n  }\n\n  protected async retry<T>(\n    fn: () => Promise<T>,\n    attempts: number,\n    delay = 1000,\n  ): Promise<T> {\n    return retry(fn, attempts, delay);\n  }\n\n  public reset(): void {\n    // Clean up event listeners and intervals\n    this.stopNavigationTracking();\n\n    Object.values(STORAGE_KEYS).forEach((val) => {\n      this.storageManager.removeItem({ key: val });\n    });\n\n    Object.values(COOKIE_KEYS).forEach((val) => {\n      this.storageManager.removeItem({ key: val });\n    });\n\n    // Reset managers\n    if (this.fingerprint) {\n      this.fingerPrintManager.setFingerprint(\"\");\n    }\n    this.sessionManager.setSessionToken(null);\n    this.fingerprint = null;\n    this.lastPageUrl = null;\n  }\n\n  /**\n   * Get the initialization Promise\n   * @returns Promise that resolves when initialization is complete\n   */\n  public getInitializationPromise(): Promise<void> {\n    return this.initializationPromise;\n  }\n}\n","import type { AttributionData } from \"@fluid-app/api-client\";\n\nimport type { FairshareConfig, TrackableEventWithData } from \"./core/types\";\nimport { FairShareCore } from \"./core/FairShareCore\";\n\n// Singleton instance\nlet instance: FairShareCore | null = null;\n\n/**\n * Get the FairShare instance\n * @returns The FairShare instance\n * @throws Error if FairShare is not initialized\n */\nfunction getInstance(): FairShareCore {\n  if (!instance) {\n    try {\n      instance = FairShareCore.getInstance();\n    } catch (error) {\n      // Re-throw with a more descriptive message\n      console.error(\"FairShare error:\", error);\n      throw new Error(\n        \"FairShare not initialized. Call initializeFairshare first.\",\n      );\n    }\n  }\n  return instance;\n}\n\n/**\n * Initialize the FairShare SDK\n * @param config Configuration options\n * @returns Promise that resolves when initialization is complete\n */\nexport function initializeFairshare(config: FairshareConfig): Promise<void> {\n  // Reset any existing instance to ensure clean initialization\n  reset();\n\n  // Create and initialize the instance in one step\n  instance = FairShareCore.createInstance(config);\n\n  // Return the initialization Promise from FairShareCore\n  return instance.getInitializationPromise();\n}\n\n/**\n * Track a custom event\n * @param eventName Event name\n * @param properties Event properties\n * @param options Event options\n * @returns A promise that resolves when the event is tracked\n */\nexport function trackFairshareEvent(event: TrackableEventWithData): void {\n  return getInstance().trackFairshareEvent(event);\n}\n\n/**\n * Track a checkout started event specifically using the proper EventManager method\n * This ensures proper metadata building and processing\n * @param data Checkout started event data\n */\nexport function trackCheckoutStarted(data: { cart_token: string }): void {\n  return getInstance().trackCheckoutStarted(data);\n}\n\n/**\n * Track a checkout started event synchronously\n * Returns a promise that resolves when the API request completes\n * @param data Checkout started event data\n */\nexport function trackCheckoutStartedSync(data: {\n  cart_token: string;\n}): Promise<void> {\n  return getInstance().trackCheckoutStartedSync(data);\n}\n\n/**\n * Reset the SDK state\n */\nexport function reset(): void {\n  if (instance) {\n    instance.reset();\n    instance = null;\n  }\n  // Reset the singleton instance in the core class\n  FairShareCore.resetInstance();\n}\n\nexport function getSessionToken(): string {\n  try {\n    const fairshareInstance = getInstance();\n    const sessionToken = fairshareInstance.getSessionToken();\n\n    if (!sessionToken) {\n      // More descriptive error message that explains the possible causes\n      throw new Error(\n        \"Session token not found. This could happen if:\\n\" +\n          \"1. initializeFairshare() hasn't been called yet\\n\" +\n          \"2. Session initialization is still in progress (wait for the Promise to resolve)\\n\" +\n          \"3. Session creation failed (check network connectivity and fluidShop config)\\n\" +\n          \"4. Invalid fluidShop identifier provided in configuration\",\n      );\n    }\n    return sessionToken;\n  } catch (error) {\n    // Provide additional debug info based on the error type\n    if (\n      error instanceof Error &&\n      error.message.includes(\"FairShare not initialized\")\n    ) {\n      console.error(\n        \"Error: FairShare SDK not initialized. Call initializeFairshare() first.\",\n      );\n    } else {\n      console.error(\"Error retrieving session token:\", error);\n    }\n    throw error;\n  }\n}\n\nexport function getAttribution(): AttributionData | null {\n  return getInstance().getAttribution();\n}\n\n/**\n * Check if a session token is available without throwing an error\n * @returns true if session token is available, false otherwise\n */\nexport function hasSessionToken(): boolean {\n  try {\n    const fairshareInstance = getInstance();\n    const sessionToken = fairshareInstance.getSessionToken();\n    return !!sessionToken;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Get session token if available, otherwise return null\n * @returns session token string or null if not available\n */\nexport function getSessionTokenSafe(): string | null {\n  try {\n    const fairshareInstance = getInstance();\n    return fairshareInstance.getSessionToken();\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Flush all pending events in the queue\n * @param sync Whether to wait for all events to complete processing\n * @param timeoutMs Maximum time to wait for events to complete (only applies when sync=true)\n * @returns Promise that resolves when events are processed\n */\nexport function flushEvents(sync = true, timeoutMs = 3000): Promise<void> {\n  return getInstance().flushEvents(sync, timeoutMs);\n}\n\n/**\n * Flush all pending events using navigator.sendBeacon for reliable delivery during page unload\n * @returns Promise that resolves when events are processed with beacon\n */\nexport function flushEventsWithBeacon(): Promise<void> {\n  return getInstance().flushEventsWithBeacon();\n}\n\n// Export types\nexport type { FairshareConfig };\nexport type { AttributionData };\nexport type { TrackableEventWithData };\n\n// Export attribution types\nexport type { AttributionOverride } from \"./core/AttributionManager\";\nexport { AttributionManager } from \"./core/AttributionManager\";\n\n/**\n * Get the FairShare instance (exported for external use)\n * @returns The FairShare instance\n * @throws Error if FairShare is not initialized\n */\nexport { getInstance };\n"]}